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

Last change on this file since 1301 was 1301, checked in by mabarracus, 3 years ago

wip

  • Property svn:executable set to *
File size: 9.4 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_UPDATE=$sqlQuery"FLUSH PRIVILEGES;"
92
93        return 0
94}
95
96do_write_mycnf(){
97        echo -e "[mysql]"
98        echo -e "user       = "$user
99        echo -e "password   = "$passwd
100        echo -e ""
101        echo -e "[mysqladmin]"
102        echo -e "user       = "$user
103        echo -e "password   = "$passwd
104        echo -e ""
105        echo -e "[mysqldump]"
106        echo -e "user       = "$user
107        echo -e "password   = "$passwd
108
109        return 0
110}
111
112do_write_utf8_cnf(){
113        echo -e "[mysqld]"
114        echo -e "character-set-server=utf8"
115        echo -e "collation-server=utf8_general_ci"
116        echo -e "init-connect='SET NAMES utf8'"
117        echo -e ""
118        echo -e "[client]"
119        echo -e "default-character-set=utf8"
120        echo -e ""
121       
122        return 0
123}
124
125do_create_utf8_cnf(){
126       
127        do_write_utf8_cnf > "$utf8_cnf"
128        return 0
129       
130}
131
132is_mycnf_present(){
133        if [ ! -e "$passwd_file" ] ; then
134                # root my.cnf file does not exists
135                # generate password for root
136                return 1
137        fi
138
139        return 0
140}
141
142is_utf8_present(){
143        if [ ! -e "$utf8_cnf" ] ; then
144                return 1
145        fi
146
147        return 0
148}
149
150on_systemd(){
151    local ret=1
152
153    tst=$(which systemd)
154    if [ -n $tst ]; then
155        ret=0
156    fi
157    if [ $debug -eq 1 ]; then
158        if [ $ret -eq 0 ]; then
159            echo "I'm on a systemd system"
160        else
161            echo "I'm not on a systemd system"
162        fi
163    fi
164   
165    return $ret
166}
167mysql_process(){
168        local timeout
169
170        if [ $debug -eq 1 ] ; then
171                echo "************************entering mysql mode "$1
172        fi     
173
174        case "$1" in
175                "start")
176                        if [ $debug -eq 1 ] ; then
177                                echo "arrancando"
178                        fi
179                        if on_systemd; then
180                            #sometimes when isn't fully systemd service fails if not is stopped before
181                            systemctl stop mysql >/dev/null 2>/dev/null || true
182                            systemctl $1 mysql >/dev/null 2>/dev/null || true
183                        else
184                            service mysql stop >/dev/null 2>/dev/null || true
185                            service mysql $1 >/dev/null 2>/dev/null || true
186                        fi
187                        timeout=0
188                        while  true  ; do
189                                is_mysql_alive || true
190                                if [ $alive -eq 0 ] ; then break ; fi
191                                if [ $timeout -eq $limit ] ; then
192                                        echo "Error al arrancar"
193                                        exit 1
194                                fi
195                                timeout=$(($timeout+1))
196                                sleep 1
197                                if [ $debug -eq 1 ] ; then
198                                        echo "time out: "$timeout       
199                                fi     
200                        done
201                        if [ $debug -eq 1 ] ; then
202                                echo "arrancado"
203                        fi
204                ;;
205                "stop")
206                        if [ $debug -eq 1 ] ; then
207                                echo "parando"
208                        fi
209                        if on_systemd; then
210                            systemctl $1 mysql >/dev/null 2>/dev/null || true
211                        else
212                            service mysql $1 >/dev/null 2>/dev/null || true
213                        fi
214
215                        killall -TERM mysqld_safe mysqld >/dev/null 2>/dev/null || true
216                        sleep 1
217                        killall -KILL mysqld_safe mysqld >/dev/null 2>/dev/null || true
218                        timeout=0
219                        while  true  ; do
220                                is_mysql_alive || true
221                                if [ $alive -eq 1 ] ; then break ; fi
222                                if [ $timeout -eq $limit ] ; then
223                                        echo "Error al parar"
224                                        exit 1
225                                fi
226                                timeout=$(($timeout+1))
227                                sleep 1
228                                if [ $debug -eq 1 ] ; then
229                                        echo "time out: "$timeout       
230                                fi
231                        done
232                        if [ $debug -eq 1 ] ; then
233                                echo "parado"
234                        fi
235                        ;;
236                *)      echo "Error en param"
237                        ;;
238        esac
239        return 0
240}
241
242mysql_safe_process(){
243        local timeout
244
245        if [ $debug -eq 1 ] ; then
246                echo "+++++++++++++++++++++++entering mysql safe mode "$1
247        fi     
248
249        case "$1" in
250                "start")
251                        if [ $debug -eq 1 ] ; then
252                                echo "arrancando"
253                        fi
254                        /usr/bin/mysqld_safe --skip-grant-tables >/dev/null 2>/dev/null &
255                        timeout=0
256                        while  true  ; do
257                                is_mysql_alive || true
258                                if [ $alive -eq 0 ] ; then break ; fi
259                                if [ $timeout -eq $limit ] ; then
260                                        echo "Error al arrancar safe"
261                                        exit 1
262                                fi
263                                timeout=$(($timeout+1))
264                                sleep 1
265                                if [ $debug -eq 1 ] ; then
266                                        echo "time out: "$timeout
267                                fi
268                                       
269                        done
270                        if [ $debug -eq 1 ] ; then
271                                echo "arrancado"
272                        fi
273                ;;
274                "stop")
275                        if [ $debug -eq 1 ] ; then
276                                echo "parando"
277                        fi
278                        killall -TERM  mysqld_safe mysqld >/dev/null 2>/dev/null >/dev/null || true
279                        sleep 1
280                        killall -KILL  mysqld_safe mysqld >/dev/null 2>/dev/null >/dev/null || true
281                        timeout=0
282                        while  true  ; do
283                                is_mysql_alive || true
284                                if [ $alive -eq 1 ] ; then break ; fi
285                                if [ $timeout -eq $limit ] ; then
286                                        echo "Error al parar safe"
287                                        exit 1
288                                fi
289                                if [ $timeout -gt 1 ] ; then
290                                    if on_systemd; then
291                                        systemctl start mysql >/dev/null 2>/dev/null ||true
292                                        systemctl stop mysql >/dev/null 2>/dev/null ||true
293                                    else
294                                        service mysql start >/dev/null 2>/dev/null || true
295                                        service mysql stop >/dev/null 2>/dev/null || true
296                                    fi
297                                fi
298                                timeout=$(($timeout+1))
299                                killall -TERM  mysqld_safe mysqld >/dev/null 2>/dev/null >/dev/null || true
300                                sleep 1
301                                killall -KILL  mysqld_safe mysqld >/dev/null 2>/dev/null >/dev/null || true
302                                if [ $debug -eq 1 ] ; then
303                                        echo "time out: "$timeout
304                                fi
305                        done
306                        if [ $debug -eq 1 ] ; then
307                                echo "parado"
308                        fi
309                        ;;
310                *)      echo "Error en param"
311                        ;;
312        esac
313        return 0
314}
315
316test_password(){
317        #with sudo always test passwd is ok, must use other user than root
318        if sudo --user nobody mysql -u $user -p$passwd < $sqltest 2>/dev/null; then
319                if [ $debug -eq 1 ] ; then
320                        echo "test passwd ok"
321                fi 
322                #rm -f $sqltest
323                return 0
324        fi
325        return 1
326}
327
328configure (){
329
330        need_restart=0
331
332        if ! is_utf8_present; then
333                do_create_utf8_cnf
334                need_restart=1
335               
336        fi
337               
338
339        if is_mycnf_present && is_mysql_alive ; then
340                do_get_passwd
341                if test_password ; then
342                        if [ $debug -eq 1 ] ; then
343                                echo "initial test passed. exit"
344                        fi
345                       
346                        if [ $need_restart -eq 1 ]; then
347                            if on_systemd; then
348                                systemctl restart mysql
349                            else
350                                service mysql restart
351                            fi
352                        fi
353                       
354                        exit 0
355                fi     
356        fi
357
358        mysql_safe_process stop 2>/dev/null
359        mysql_process start 2>/dev/null
360
361        if is_mycnf_present ; then
362                # If my.cnf file exists then sync in mysql
363                do_get_passwd
364                if [ $debug -eq 1 ] ; then
365                        echo "mycnf_present"
366                fi
367        else
368                # If not present my.cnf then we create a passwd
369                # and a my.cnf file
370                do_create_passwd
371                if [ $debug -eq 1 ] ; then
372                        echo "mycnf_not_present"
373                fi
374        fi
375
376        # Test mysql password
377        if is_mysql_alive ; then
378                if [ $debug -eq 1 ] ; then
379                        echo "mysql alive"
380                fi
381                if test_password ; then
382                        exit 0
383                fi
384                if [ $debug -eq 1 ] ; then
385                        echo "Mysql password not synced with mycnf file"
386                fi
387        else
388                echo " * Mysql database server is not running"
389                exit 0
390        fi
391
392        echo " * Mysql database server running, setting Safe Mode"
393
394        mysql_process stop 2>/dev/null
395
396        if [ $debug -eq 1 ] ; then     
397                if is_mysql_alive ; then
398                        echo "mysqld not killed"
399                fi
400        fi
401        # Mysql is started in safe mode
402
403        mysql_safe_process start 2>/dev/null
404
405        if [ $debug -eq 1 ] ; then
406                echo "mysql_safe mode"
407        fi
408
409        if is_mysql_alive ; then
410                # Sql statement to set password created
411                do_write_passSql
412                sqlTemp=$SQLQUERY_UPDATE
413                # Password is assigned in mysql
414                if [ $debug -eq 1 ] ; then
415                        echo $sqlTemp
416                fi
417                echo "$sqlTemp" | mysql                 
418                echo " * Mysql root password assigned"
419        else
420                echo " * Mysql root password cannot be assigned"
421                echo " * Root password assigment deferred to next execution of this utility"
422                echo "   or next reboot of the machine"
423                exit 1
424        fi
425
426        mysql_safe_process stop 2>/dev/null
427       
428        mysql_process start
429
430        return 0
431}
432
433# main
434if [[ $EUID -ne 0 ]]; then
435   echo "This script must be run as root" 1>&2
436   exit 1
437fi
438
439if [ $# -eq 2 ] ; then
440        if [ $2 == "-d" ] ; then
441                debug=1
442        fi
443fi
444
445
446case "$1" in
447        "-a"|"--alive_mysql")
448                if is_mysql_alive ; then
449                        echo "YES"
450                else
451                        echo "NO"
452                fi
453                ;;
454        "-i"|"--initialize")
455                configure
456                ;;
457        "-g"|"--get_password")
458                do_get_passwd
459                echo $passwd
460                ;;
461        "-p"|"--present_mycnf")
462                if is_mycnf_present ; then
463                        echo "YES"
464                else
465                        echo "NO"
466                fi
467                ;;
468        *)      echo "usage:  mysql_root_passwd -a (--alive_mysql) | -i (--initialize) | -g (--get_password) | -p (--present_mycnf)"
469                ;;
470esac
471
472exit 0
Note: See TracBrowser for help on using the repository browser.