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

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

wip

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