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

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

wip

  • Property svn:executable set to *
File size: 9.0 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                        killall -KILL mysqld >/dev/null 2>/dev/null || true
215                        timeout=0
216                        while  true  ; do
217                                is_mysql_alive || true
218                                if [ $alive -eq 1 ] ; then break ; fi
219                                if [ $timeout -eq $limit ] ; then
220                                        echo "Error al parar"
221                                        exit 1
222                                fi
223                                timeout=$(($timeout+1))
224                                sleep 1
225                                if [ $debug -eq 1 ] ; then
226                                        echo "time out: "$timeout       
227                                fi
228                        done
229                        if [ $debug -eq 1 ] ; then
230                                echo "parado"
231                        fi
232                        ;;
233                *)      echo "Error en param"
234                        ;;
235        esac
236        return 0
237}
238
239mysql_safe_process(){
240        local timeout
241
242        if [ $debug -eq 1 ] ; then
243                echo "+++++++++++++++++++++++entering mysql safe mode "$1
244        fi     
245
246        case "$1" in
247                "start")
248                        if [ $debug -eq 1 ] ; then
249                                echo "arrancando"
250                        fi
251                        /usr/bin/mysqld_safe --skip-grant-tables >/dev/null 2>/dev/null &
252                        timeout=0
253                        while  true  ; do
254                                is_mysql_alive || true
255                                if [ $alive -eq 0 ] ; then break ; fi
256                                if [ $timeout -eq $limit ] ; then
257                                        echo "Error al arrancar safe"
258                                        exit 1
259                                fi
260                                timeout=$(($timeout+1))
261                                sleep 1
262                                if [ $debug -eq 1 ] ; then
263                                        echo "time out: "$timeout
264                                fi
265                                       
266                        done
267                        if [ $debug -eq 1 ] ; then
268                                echo "arrancado"
269                        fi
270                ;;
271                "stop")
272                        if [ $debug -eq 1 ] ; then
273                                echo "parando"
274                        fi
275                        killall -KILL  mysqld >/dev/null 2>/dev/null >/dev/null || true
276                        killall -KILL  mysqld_safe >/dev/null 2>/dev/null >/dev/null || true
277                        timeout=0
278                        while  true  ; do
279                                is_mysql_alive || true
280                                if [ $alive -eq 1 ] ; then break ; fi
281                                if [ $timeout -eq $limit ] ; then
282                                        echo "Error al parar safe"
283                                        exit 1
284                                fi
285                                if [ $timeout -gt 1 ] ; then
286                                    if on_systemd; then
287                                        systemctl stop mysql >/dev/null 2>/dev/null ||true
288                                    else
289                                        service mysql start >/dev/null 2>/dev/null || true
290                                        service mysql stop >/dev/null 2>/dev/null || true
291                                    fi
292                                fi
293                                timeout=$(($timeout+1))
294                                sleep 1
295                                if [ $debug -eq 1 ] ; then
296                                        echo "time out: "$timeout
297                                fi
298                        done
299                        if [ $debug -eq 1 ] ; then
300                                echo "parado"
301                        fi
302                        ;;
303                *)      echo "Error en param"
304                        ;;
305        esac
306        return 0
307}
308
309test_password(){
310        #with sudo always test passwd is ok, must use other user than root
311        if sudo --user nobody mysql -u $user -p$passwd < $sqltest 2>/dev/null; then
312                if [ $debug -eq 1 ] ; then
313                        echo "test passwd ok"
314                fi 
315                #rm -f $sqltest
316                return 0
317        fi
318        return 1
319}
320
321configure (){
322
323        need_restart=0
324
325        if ! is_utf8_present; then
326                do_create_utf8_cnf
327                need_restart=1
328               
329        fi
330               
331
332        if is_mycnf_present && is_mysql_alive ; then
333                do_get_passwd
334                if test_password ; then
335                        if [ $debug -eq 1 ] ; then
336                                echo "initial test passed. exit"
337                        fi
338                       
339                        if [ $need_restart -eq 1 ]; then
340                            if on_systemd; then
341                                systemctl restart mysql
342                            else
343                                service mysql restart
344                            fi
345                        fi
346                       
347                        exit 0
348                fi     
349        fi
350
351        mysql_safe_process stop 2>/dev/null
352        mysql_process start 2>/dev/null
353
354        if is_mycnf_present ; then
355                # If my.cnf file exists then sync in mysql
356                do_get_passwd
357                if [ $debug -eq 1 ] ; then
358                        echo "mycnf_present"
359                fi
360        else
361                # If not present my.cnf then we create a passwd
362                # and a my.cnf file
363                do_create_passwd
364                if [ $debug -eq 1 ] ; then
365                        echo "mycnf_not_present"
366                fi
367        fi
368
369        # Test mysql password
370        if is_mysql_alive ; then
371                if [ $debug -eq 1 ] ; then
372                        echo "mysql alive"
373                fi
374                if test_password ; then
375                        exit 0
376                fi
377                if [ $debug -eq 1 ] ; then
378                        echo "Mysql password not synced with mycnf file"
379                fi
380        else
381                echo " * Mysql database server is not running"
382                exit 0
383        fi
384
385        echo " * Mysql database server running, setting Safe Mode"
386
387        mysql_process stop 2>/dev/null
388
389        if [ $debug -eq 1 ] ; then     
390                if is_mysql_alive ; then
391                        echo "mysqld not killed"
392                fi
393        fi
394        # Mysql is started in safe mode
395
396        mysql_safe_process start 2>/dev/null
397
398        if [ $debug -eq 1 ] ; then
399                echo "mysql_safe mode"
400        fi
401
402        if is_mysql_alive ; then
403                # Sql statement to set password created
404                do_write_passSql
405                sqlTemp=$SQLQUERY_UPDATE
406                # Password is assigned in mysql
407                if [ $debug -eq 1 ] ; then
408                        echo $sqlTemp
409                fi
410                echo "$sqlTemp" | mysql                 
411                echo " * Mysql root password assigned"
412        else
413                echo " * Mysql root password cannot be assigned"
414                echo " * Root password assigment deferred to next execution of this utility"
415                echo "   or next reboot of the machine"
416                exit 1
417        fi
418
419        mysql_safe_process stop 2>/dev/null
420       
421        mysql_process start
422
423        return 0
424}
425
426# main
427if [[ $EUID -ne 0 ]]; then
428   echo "This script must be run as root" 1>&2
429   exit 1
430fi
431
432if [ $# -eq 2 ] ; then
433        if [ $2 == "-d" ] ; then
434                debug=1
435        fi
436fi
437
438
439case "$1" in
440        "-a"|"--alive_mysql")
441                if is_mysql_alive ; then
442                        echo "YES"
443                else
444                        echo "NO"
445                fi
446                ;;
447        "-i"|"--initialize")
448                configure
449                ;;
450        "-g"|"--get_password")
451                do_get_passwd
452                echo $passwd
453                ;;
454        "-p"|"--present_mycnf")
455                if is_mycnf_present ; then
456                        echo "YES"
457                else
458                        echo "NO"
459                fi
460                ;;
461        *)      echo "usage:  mysql_root_passwd -a (--alive_mysql) | -i (--initialize) | -g (--get_password) | -p (--present_mycnf)"
462                ;;
463esac
464
465exit 0
Note: See TracBrowser for help on using the repository browser.