source: lliurex-sgdb/trunk/fuentes/install/usr/sbin/mysql_root_passwd @ 1291

Last change on this file since 1291 was 1291, checked in by mabarracus, 5 years ago

wip

  • Property svn:executable set to *
File size: 8.6 KB
Line 
1#!/bin/bash
2
3set -e
4
5user="root"
6passwd_file="/root/.my.cnf"
7utf8_cnf="/etc/mysql/conf.d/utf8_charset.cnf"
8mysqlSock="/var/run/mysqld/mysqld.sock"
9passwd="null"
10sqltest="$(mktemp /tmp/lliurex-sgbdXXXX)"
11debug=0
12limit=10
13alive=2
14
15mysql_version_upper(){
16    local ret=1;
17    ver=$(mysql --version|egrep -o '[45]\.[0-9]+\.[0-9]+')
18    if dpkg --compare-versions $ver gt "5.7.6"; then ret=0; fi;
19   
20    if [ $debug -eq 1 ]; then
21        if [ $ret -eq 0 ]; then
22            echo "Compare versions: Detected new mysql > 5.7.6"
23        else
24            echo "Compare versions: Detected old mysql < 5.7.6"
25        fi
26    fi
27
28    return $ret
29}
30
31is_mysql_alive(){
32        local ret=1
33        alive=1
34        tst=$(ps ax|grep mysqld|grep -v grep|wc -l)
35        if [ -e $mysqlSock ] && [ $tst -gt 0 ]; then
36                ret=0
37                alive=0
38        fi
39        if [ $debug -eq 1 ] ; then
40            if [ $ret -eq 0 ]; then
41                echo "mysqld esta vivo!"
42            else
43                echo "mysqld esta muerto!"
44            fi
45        fi
46        return $ret
47}
48
49do_create_passwd(){
50        passwd="`pwgen --capitalize --numerals 7 1`"
51        do_write_mycnf > "$passwd_file"
52        chmod 600 $passwd_file
53
54        return 0
55}
56
57do_get_passwd(){
58        passwd=$(sed -ne "/^\[mysql\]/,/^\[/s%^password[^=]\+=[[:space:]]\+%%p" "$passwd_file")
59
60        if [ $debug -eq 1 ] ; then
61                echo "pass root Mysql:"$passwd
62        fi
63
64        return 0       
65}
66
67do_write_passSql() {
68        local sqlQuery
69       
70        if mysql_version_upper; then
71            sqlQuery="UPDATE mysql.user SET authentication_string=PASSWORD('$passwd'),plugin='mysql_native_password',password_expired='N' WHERE User='root'; "
72            # NEED TO CHANGE AUTH PLUGIN abobe fails when --skip-grant-tables
73            #sqlQuery="ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$passwd'; "
74           
75        else
76            sqlQuery="UPDATE mysql.user SET Password=PASSWORD('$passwd') WHERE User='root'; "
77        fi
78        sqlQuery=$sqlQuery"FLUSH PRIVILEGES;"
79
80        echo $sqlQuery
81
82        return 0
83}
84
85do_write_mycnf(){
86        echo -e "[mysql]"
87        echo -e "user       = "$user
88        echo -e "password   = "$passwd
89        echo -e ""
90        echo -e "[mysqladmin]"
91        echo -e "user       = "$user
92        echo -e "password   = "$passwd
93        echo -e ""
94        echo -e "[mysqldump]"
95        echo -e "user       = "$user
96        echo -e "password   = "$passwd
97
98        return 0
99}
100
101do_write_utf8_cnf(){
102        echo -e "[mysqld]"
103        echo -e "character-set-server=utf8"
104        echo -e "collation-server=utf8_general_ci"
105        echo -e "init-connect='SET NAMES utf8'"
106        echo -e ""
107        echo -e "[client]"
108        echo -e "default-character-set=utf8"
109        echo -e ""
110       
111        return 0
112}
113
114do_create_utf8_cnf(){
115       
116        do_write_utf8_cnf > "$utf8_cnf"
117        return 0
118       
119}
120
121is_mycnf_present(){
122        if [ ! -e "$passwd_file" ] ; then
123                # root my.cnf file does not exists
124                # generate password for root
125                return 1
126        fi
127
128        return 0
129}
130
131is_utf8_present(){
132        if [ ! -e "$utf8_cnf" ] ; then
133                return 1
134        fi
135
136        return 0
137}
138
139on_systemd(){
140    local ret=1
141
142    tst=$(which systemd)
143    if [ -n $tst ]; then 
144        ret=0
145    fi
146    if [ $debug -eq 1 ]; then 
147        if [ $ret -eq 0 ]; then
148            echo "I'm on a systemd system"
149        else
150            echo "I'm not on a systemd system"
151        fi
152    fi
153   
154    return $ret
155}
156mysql_process(){
157        local timeout
158
159        if [ $debug -eq 1 ] ; then
160                echo "************************entering mysql mode "$1
161        fi     
162
163        case "$1" in
164                "start")
165                        if [ $debug -eq 1 ] ; then
166                                echo "arrancando"
167                        fi
168                        if on_systemd; then
169                            systemctl $1 mysql >/dev/null 2>/dev/null || true
170                        else
171                            service mysql $1 >/dev/null 2>/dev/null || true
172                        fi
173                        timeout=0
174                        while  true  ; do
175                                is_mysql_alive || true 
176                                if [ $alive -eq 0 ] ; then break ; fi
177                                if [ $timeout -eq $limit ] ; then
178                                        echo "Error al arrancar"
179                                        exit 1
180                                fi
181                                timeout=$(($timeout+1))
182                                sleep 1
183                                if [ $debug -eq 1 ] ; then
184                                        echo "time out: "$timeout       
185                                fi     
186                        done
187                        if [ $debug -eq 1 ] ; then
188                                echo "arrancado"
189                        fi
190                ;;
191                "stop")
192                        if [ $debug -eq 1 ] ; then
193                                echo "parando"
194                        fi
195                        if on_systemd; then
196                            systemctl $1 mysql >/dev/null 2>/dev/null || true
197                        else
198                            service mysql $1 >/dev/null 2>/dev/null || true
199                        fi
200                        killall -KILL mysqld >/dev/null 2>/dev/null || true
201                        timeout=0
202                        while  true  ; do
203                                is_mysql_alive || true 
204                                if [ $alive -eq 1 ] ; then break ; fi
205                                if [ $timeout -eq $limit ] ; then
206                                        echo "Error al parar"
207                                        exit 1
208                                fi
209                                timeout=$(($timeout+1))
210                                sleep 1
211                                if [ $debug -eq 1 ] ; then
212                                        echo "time out: "$timeout       
213                                fi
214                        done
215                        if [ $debug -eq 1 ] ; then
216                                echo "parado"
217                        fi
218                        ;;
219                *)      echo "Error en param"
220                        ;;
221        esac
222        return 0
223}
224
225mysql_safe_process(){
226        local timeout
227
228        if [ $debug -eq 1 ] ; then
229                echo "+++++++++++++++++++++++entering mysql safe mode "$1
230        fi     
231
232        case "$1" in
233                "start")
234                        if [ $debug -eq 1 ] ; then
235                                echo "arrancando"
236                        fi
237                        /usr/bin/mysqld_safe --skip-grant-tables >/dev/null 2>/dev/null &
238                        timeout=0
239                        while  true  ; do
240                                is_mysql_alive || true 
241                                if [ $alive -eq 0 ] ; then break ; fi
242                                if [ $timeout -eq $limit ] ; then
243                                        echo "Error al arrancar safe"
244                                        exit 1
245                                fi
246                                timeout=$(($timeout+1))
247                                sleep 1
248                                if [ $debug -eq 1 ] ; then
249                                        echo "time out: "$timeout
250                                fi
251                                       
252                        done
253                        if [ $debug -eq 1 ] ; then
254                                echo "arrancado"
255                        fi
256                ;;
257                "stop")
258                        if [ $debug -eq 1 ] ; then
259                                echo "parando"
260                        fi
261                        killall -KILL  mysqld >/dev/null 2>/dev/null >/dev/null || true
262                        killall -KILL  mysqld_safe >/dev/null 2>/dev/null >/dev/null || true
263                        timeout=0
264                        while  true  ; do
265                                is_mysql_alive || true 
266                                if [ $alive -eq 1 ] ; then break ; fi
267                                if [ $timeout -eq $limit ] ; then
268                                        echo "Error al parar safe"
269                                        exit 1
270                                fi
271                                if [ $timeout -gt 1 ] ; then
272                                    if on_systemd; then
273                                        systemctl stop mysql >/dev/null 2>/dev/null ||true
274                                    else
275                                        service mysql start >/dev/null 2>/dev/null || true
276                                        service mysql stop >/dev/null 2>/dev/null || true
277                                    fi
278                                fi
279                                timeout=$(($timeout+1))
280                                sleep 1
281                                if [ $debug -eq 1 ] ; then
282                                        echo "time out: "$timeout
283                                fi
284                        done
285                        if [ $debug -eq 1 ] ; then
286                                echo "parado"
287                        fi
288                        ;;
289                *)      echo "Error en param"
290                        ;;
291        esac
292        return 0
293}
294
295test_password(){
296        #with sudo always test passwd is ok, must use other user than root
297        if sudo --user nobody mysql -u $user -p$passwd < $sqltest 2>/dev/null; then
298                if [ $debug -eq 1 ] ; then
299                        echo "test passwd ok"
300                fi 
301                #rm -f $sqltest
302                return 0
303        fi
304        return 1
305}
306
307configure (){
308
309        need_restart=0
310
311        if ! is_utf8_present; then
312                do_create_utf8_cnf
313                need_restart=1
314               
315        fi
316               
317
318        if is_mycnf_present && is_mysql_alive ; then
319                do_get_passwd
320                if test_password ; then
321                        if [ $debug -eq 1 ] ; then
322                                echo "initial test passed. exit"
323                        fi
324                       
325                        if [ $need_restart -eq 1 ]; then
326                            if on_systemd; then
327                                systemctl restart mysql
328                            else
329                                service mysql restart
330                            fi
331                        fi
332                       
333                        exit 0
334                fi     
335        fi
336
337        mysql_safe_process stop 2>/dev/null
338        mysql_process start 2>/dev/null
339
340        if is_mycnf_present ; then
341                # If my.cnf file exists then sync in mysql
342                do_get_passwd
343                if [ $debug -eq 1 ] ; then
344                        echo "mycnf_present"
345                fi 
346        else
347                # If not present my.cnf then we create a passwd
348                # and a my.cnf file
349                do_create_passwd
350                if [ $debug -eq 1 ] ; then
351                        echo "mycnf_not_present"
352                fi 
353        fi
354
355        # Test mysql password
356        if is_mysql_alive ; then
357                if [ $debug -eq 1 ] ; then
358                        echo "mysql alive"
359                fi 
360                if test_password ; then
361                        exit 0
362                fi
363                if [ $debug -eq 1 ] ; then
364                        echo "Mysql password not synced with mycnf file"
365                fi 
366        else
367                echo " * Mysql database server is not running"
368                exit 0
369        fi
370
371        echo " * Mysql database server running, setting Safe Mode"
372
373        mysql_process stop 2>/dev/null
374
375        if [ $debug -eq 1 ] ; then     
376                if is_mysql_alive ; then
377                        echo "mysqld not killed"
378                fi
379        fi
380        # Mysql is started in safe mode
381
382        mysql_safe_process start 2>/dev/null
383
384        if [ $debug -eq 1 ] ; then
385                echo "mysql_safe mode"
386        fi
387
388        if is_mysql_alive ; then
389                # Sql statement to set password created
390                sqlTemp=$(do_write_passSql)
391                # Password is assigned in mysql
392                if [ $debug -eq 1 ] ; then
393                        echo $sqlTemp
394                fi
395                echo "$sqlTemp" | mysql                 
396                echo " * Mysql root password assigned"
397        else
398                echo " * Mysql root password cannot be assigned"
399                echo " * Root password assigment deferred to next execution of this utility"
400                echo "   or next reboot of the machine"
401                exit 1
402        fi
403
404        mysql_safe_process stop 2>/dev/null
405       
406        mysql_process start
407
408        return 0
409}
410
411# main
412if [[ $EUID -ne 0 ]]; then
413   echo "This script must be run as root" 1>&2
414   exit 1
415fi
416
417if [ $# -eq 2 ] ; then
418        if [ $2 == "-d" ] ; then
419                debug=1
420        fi
421fi
422
423
424case "$1" in
425        "-a"|"--alive_mysql")
426                if is_mysql_alive ; then
427                        echo "YES"
428                else
429                        echo "NO"
430                fi
431                ;;
432        "-i"|"--initialize")
433                configure
434                ;;
435        "-g"|"--get_password")
436                do_get_passwd
437                echo $passwd
438                ;;
439        "-p"|"--present_mycnf")
440                if is_mycnf_present ; then
441                        echo "YES"
442                else
443                        echo "NO"
444                fi
445                ;;
446        *)      echo "usage:  mysql_root_passwd -a (--alive_mysql) | -i (--initialize) | -g (--get_password) | -p (--present_mycnf)"
447                ;;
448esac
449
450exit 0
Note: See TracBrowser for help on using the repository browser.