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

Last change on this file since 1298 was 1298, checked in by mabarracus, 4 years ago

support for mariadb

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