source: lliurex-sgdb/trunk/fuentes/install/usr/sbin/lliurex-sgbd @ 5237

Last change on this file since 5237 was 5237, checked in by jrpelegrina, 3 years ago

Fix pmb and moodle db user when backup is restored

  • Property svn:executable set to *
File size: 12.0 KB
Line 
1#!/bin/bash
2###########################################################
3#
4# This script helps to manage dbase installation and upgrade
5# include functionalies such as dbbackup, translation templates
6# dbuser creation, ...
7#
8###########################################################
9# OPTIONS
10#
11# --config package_name  -> generate a configfile to indicate database, dbuser , ... to be created
12# --template package_name -> generate a template file to personalize questions during instalation
13# --install package_name -> create database, dbuser, inject data, ... especified in configfile
14# --upgrade package_name -> used to preserve database during package upgrade (backup)
15# --remove package_name -> remove dbinclude file but preserve database
16# --purge package_name -> remove dbinclude file and database
17# --inject_sql package_name sql_file_with_path -> inject additional data in database
18# --is_include_present -> check if include file exists
19# --add_include_file -> create include file
20# --db_is_present -> check if database exists
21# --sql_mode -> change sql_mode variable to correct perfomance
22###########################################################
23
24PACKAGE_NAME=$2
25DEFAULT_SAMPLES_PATH="/usr/share/lliurex-sgbd/"
26CONFIG_FILE_PATH="/etc/lliurex-sgbd/"
27CONFIG_FILE=$CONFIG_FILE_PATH$PACKAGE_NAME".sgbd"
28
29DB_USER_PASS="`pwgen --capitalize --numerals 7 1`"
30
31INCLUDE_DB_FILE="debian-db.php"
32TEMPLATE="lliurex-sgbd"
33DB_IS_IN_MYSQL="NO"
34TEST=0
35
36debug=0
37NOW=$(date +"%Y.%m.%d.%H.%M")
38
39read_config_file(){
40        if [ -e $CONFIG_FILE ]; then
41                DB_NAME=$(sed -ne "/^\[parameters\]/,/^\[/s%^DB_NAME[^=]\+=[[:space:]]\+%%p" "$CONFIG_FILE")
42                DB_USER=$(sed -ne "/^\[parameters\]/,/^\[/s%^DB_USER[^=]\+=[[:space:]]\+%%p" "$CONFIG_FILE")
43                DB_PASS=$(sed -ne "/^\[parameters\]/,/^\[/s%^DB_PASS[^=]\+=[[:space:]]\+%%p" "$CONFIG_FILE")
44                MYSQL_DATA_FILE=$(sed -ne "/^\[parameters\]/,/^\[/s%^MYSQL_DATA_FILE[^=]\+=[[:space:]]\+%%p" "$CONFIG_FILE")
45                INCLUDE_PATH=$(sed -ne "/^\[parameters\]/,/^\[/s%^INCLUDE_PATH[^=]\+=[[:space:]]\+%%p" "$CONFIG_FILE")
46                BACKUP_PATH=$(sed -ne "/^\[parameters\]/,/^\[/s%^BACKUP_PATH[^=]\+=[[:space:]]\+%%p" "$CONFIG_FILE")
47                USE_TEMPLATE=$(sed -ne "/^\[parameters\]/,/^\[/s%^USE_TEMPLATE[^=]\+=[[:space:]]\+%%p" "$CONFIG_FILE")
48                if [ "$USE_TEMPLATE" = "YES" ] ; then
49                        TEMPLATE=$PACKAGE_NAME
50                fi
51                DB_PASS=$(echo $DB_PASS | tr -d ' ')
52       
53                if [ "$DB_PASS" != "" ] ; then
54                        DB_USER_PASS=$DB_PASS
55                fi
56
57                INCLUDE_FILE=$INCLUDE_PATH/$INCLUDE_DB_FILE
58                return 0
59        else
60                logger -s -t lliurex-sgbd "Config file for database not found!!, expecting ${CONFIG_FILE}"
61                return 1
62        fi
63}
64
65read_include_file(){
66
67        if [ -e "/etc/"$DB_NAME"/"$INCLUDE_DB_FILE ]; then
68               
69                DB_USER_PASS=$(cat "/etc/"$DB_NAME"/"$INCLUDE_DB_FILE |perl -nE "say for /dbpass=\'(.*)\';/")
70               
71        fi
72}
73
74inject_sql_file(){
75        cat $1 | mysql -u root -p$MYSQL_ROOT_PASS $DB_NAME
76}
77
78create_database(){
79        mysql -u root -p$MYSQL_ROOT_PASS -e "CREATE DATABASE $DB_NAME DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;"
80        if [ ! -z $MYSQL_DATA_FILE ]; then
81                inject_sql_file $MYSQL_DATA_FILE
82        fi
83}
84
85create_user(){
86        local sqlQuery
87        sqlQuery="GRANT ALL ON $DB_NAME.* TO $DB_USER@localhost IDENTIFIED BY '$DB_USER_PASS'; "
88        sqlQuery=$sqlQuery"FLUSH PRIVILEGES;"
89        mysql -u root -p$MYSQL_ROOT_PASS -e "$sqlQuery"
90}
91
92mysql_version_upper(){
93    local ret=1;
94    ver=$(mysqld --version 2>&1|egrep -o '\ [0-9]+\.[0-9]+\.[0-9]+')
95    is_maria=$(mysqld --version 2>&1|grep -io 'mariadb'|wc -l)
96    if [ $is_maria -gt 0 ]; then
97        type_db='maria';
98    else
99        type_db='mysql';
100    fi
101   
102    if [ "$type_db" = "maria" ]; then 
103        ret=0
104    else
105        if dpkg --compare-versions $ver gt "5.7.6"; then ret=0; fi;
106    fi
107
108
109    if [ $debug -eq 1 ]; then
110        if [ $ret -eq 0 ]; then
111            echo "Compare versions: Detected $type_db version $ver (mysql > 5.7.6 new user tables)"
112        else
113            echo "Compare versions: Detected $type_db version $ver (mysql < 5.7.6)"
114        fi
115    fi
116
117    return $ret
118}
119
120update_passwd() {
121        local sqlQuery
122       
123        if mysql_version_upper; then
124            #sqlQuery="UPDATE mysql.user SET authentication_string=PASSWORD('$passwd'),plugin='mysql_native_password',password_expired='N' WHERE User='root'; "
125            #sqlQuery="UPDATE mysql.user SET authentication_string=PASSWORD('$DB_USER_PASS'),plugin='mysql_native_password',password_expired='N' WHERE User='$DB_USER'; "
126            sqlQuery="UPDATE mysql.user SET authentication_string=PASSWORD('$DB_USER_PASS'),plugin='mysql_native_password' WHERE User='$DB_USER'; "
127
128       
129        else
130#            sqlQuery="UPDATE mysql.user SET Password=PASSWORD('$passwd') WHERE User='root'; "
131            sqlQuery="UPDATE mysql.user SET Password=PASSWORD('$DB_USER_PASS') WHERE User='$DB_USER'; "
132        fi
133        sqlQuery=$sqlQuery"FLUSH PRIVILEGES;"
134
135        mysql -u root -p$MYSQL_ROOT_PASS -e "$sqlQuery"
136}
137
138create_include_file(){
139        if [ ! -d  $INCLUDE_PATH ] ; then
140                mkdir $INCLUDE_PATH
141        fi
142        fecha=$(date)
143        echo "Creating include file: $INCLUDE_FILE"
144        echo "<?php"> $INCLUDE_FILE
145        echo "##">> $INCLUDE_FILE
146        echo "## database access settings in php format ">> $INCLUDE_FILE
147        echo "## automatically generated by lliurex-sgbd ">> $INCLUDE_FILE
148        echo "## on "$fecha >> $INCLUDE_FILE
149        echo "## ">> $INCLUDE_FILE
150        echo "\$dbuser='$DB_USER'; ">> $INCLUDE_FILE
151        echo "\$dbpass='$DB_USER_PASS'; ">> $INCLUDE_FILE
152        echo "\$basepath=''; ">> $INCLUDE_FILE
153        echo "\$dbname='$DB_NAME'; ">> $INCLUDE_FILE
154        echo "\$dbserver=''; ">> $INCLUDE_FILE
155        echo "\$dbport=''; ">> $INCLUDE_FILE
156        echo "\$dbtype='mysql'; ">> $INCLUDE_FILE
157        chmod 640 $INCLUDE_FILE || true
158        chgrp www-data $INCLUDE_FILE || true
159}
160
161database_backup(){
162        if [ ! -d  $BACKUP_PATH ] ; then
163                mkdir -p $BACKUP_PATH
164        fi
165        #NOW=$(date +"%Y.%m.%d.%H.%M") 
166        echo "Doing database backup: $BACKUP_PATH/backup.$NOW.sql"
167        mysqldump -u root -p$MYSQL_ROOT_PASS $DB_NAME > $BACKUP_PATH"/backup."$NOW".sql" 2>/dev/null
168}
169
170install_db(){
171        if [ $TEST -ne 0 ] ; then
172                # Existe la base de datos. Hacer copia base de datos"
173                database_backup
174                lliurex-sgbd-purge-question
175                if [ "$RET" = "true" ] ; then
176                        mysql -u root -p$MYSQL_ROOT_PASS -e "DROP DATABASE $DB_NAME;"
177                        create_database
178                fi
179        else
180                # No existe la base de datos
181                create_database
182        fi
183
184        SENTENCIA="SELECT user from mysql.user where user='$DB_USER'"
185        TEST=$(mysql -u root -p$MYSQL_ROOT_PASS -e "$SENTENCIA" | wc -l)
186
187        if [ $TEST -ne 0 ] ; then
188                # Existe usuario. Mantener usuario y cambiar contraseña
189                update_passwd
190        else
191                create_user
192        fi             
193}
194
195create_template_file(){
196        echo "Template: "$PACKAGE_NAME"/purge">> $NEW_TEMPLATE_FILE
197        echo "Type: boolean ">> $NEW_TEMPLATE_FILE
198        echo "Description: Do you want to purge "$PACKAGE_NAME"'s database?" >> $NEW_TEMPLATE_FILE
199        echo "Description-es.UTF-8: ¿Desea eliminar la base de datos de "$PACKAGE_NAME"?">> $NEW_TEMPLATE_FILE
200        echo "Description-qcv.UTF-8: Desitja eliminar la base de dades de "$PACKAGE_NAME"?">> $NEW_TEMPLATE_FILE
201}
202
203get_config_data(){
204        local nolog=0;
205        if [ "x$1" = "xnolog" ]; then
206                nolog=1
207        fi
208        if [[ $EUID -ne 0 ]]; then
209           echo "This script must be run as root" 1>&2
210           exit 1
211        fi
212
213        mysql_root_passwd --initialize
214        if [ $? -ne 0 ] ; then
215                echo "Error en mysql_root_passwd"
216                exit 1
217        fi
218        MYSQL_ROOT_PASS=$(mysql_root_passwd -g)
219       
220        rc=0
221        read_config_file
222        if [ $? -eq 1 ]; then
223                logger -s -t lliurex-sgbd "Trying to find '$PACKAGE_NAME' as DB_NAME"
224                local DB_NAME
225                DB_NAME=$PACKAGE_NAME
226        fi 
227        read_include_file
228        #old method: TEST=$(mysqlshow -u root -p$MYSQL_ROOT_PASS | grep " "$DB_NAME" " | wc -l)
229        #new method
230        mysql -u root -p${MYSQL_ROOT_PASS}  -e "show databases" | egrep ^$DB_NAME\$ >/dev/null|| rc=1
231
232        if [ ${rc} -eq 0 ]; then
233                if [ $nolog -ne 1 ]; then
234                        logger -s -t lliurex-sgbd "Database '$DB_NAME' FOUND "
235                fi
236                DB_IS_IN_MYSQL="YES"
237                touch /tmp/db_is_present
238                TEST=1
239        else
240                if [ $nolog -ne 1 ]; then
241                        logger -s -t lliurex-sgbd "Database '$DB_NAME' NOT found!"
242                fi
243                DB_IS_IN_MYSQL="NO"
244                TEST=0
245        fi
246}
247
248edit_sql_mode(){
249        MYSQLCNF_PATH="/etc/mysql/mysql.cnf"
250        MYSQLCNF_DIR=$(dirname ${MYSQLCNF_PATH})
251        SQLCONFIG_NEW='sql_mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"'
252
253    if [ -f ${MYSQLCNF_PATH}  ]; then
254        SQLCONFIG_OLD=$(sed -e '/sql_mode'/!d ${MYSQLCNF_PATH})
255       
256        if [ -z ${SQLCONFIG_OLD} ]; then
257
258                echo "Doing backup of file ${MYSQLCNF_PATH}"
259                cp ${MYSQLCNF_PATH} ${MYSQLCNF_DIR}"/mysql_"${NOW}".cnf"
260                echo "Adding sql_mode in file ${MYSQLCNF_PATH}"
261                MYSQLD=$(sed -e '/mysqld'/!d ${MYSQLCNF_PATH})
262                if [ -z ${MYSQLD} ]; then
263                        sed -i '$a[mysqld]' ${MYSQLCNF_PATH}
264                fi     
265                sed -i '$a'${SQLCONFIG_NEW} ${MYSQLCNF_PATH}
266            systemctl restart mysql
267        else
268                if [[ ${SQLCONFIG_OLD} == ${SQLCONFIG_NEW} ]]; then
269
270                        echo "NOTHING TO DO. File ${MYSQLCNF_PATH} already update"
271                else
272                        echo "Doing backup of file ${MYSQLCNF_PATH}"
273                        cp ${MYSQLCNF_PATH} ${MYSQLCNF_DIR}"/mysql_"${NOW}".cnf"
274                        echo "Adding new sql_mode configuration in file ${MYSQLCNF_PATH}"
275                        MYSQLD=$(sed -e '/mysqld'/!d ${MYSQLCNF_PATH})
276                        if [ -z ${MYSQLD} ]; then
277                                sed -i '$a[mysqld]' ${MYSQLCNF_PATH}
278                        fi     
279                        sed -i 's/'${SQLCONFIG_OLD}'/'${SQLCONFIG_NEW}'/g' ${MYSQLCNF_PATH}
280                        systemctl restart mysql
281                fi             
282        fi
283    else
284        echo "NOTHING TO DO. File ${MYSQLCNF_PATH} NOT FOUND"   
285    fi 
286}
287
288usage (){
289        echo "usage:  lliurex-sgbd --config package_name | --template package_name | --install package_name  | --upgrade package_name | --remove package_name | --purge package_name | --inject_sql package_name sql_file_with_path | --db_is_present package_name | --add_include_file package_name | --is_include_present package_name | --sql_mode package_name"
290}
291
292#main
293
294if [ $# -eq 0 ] ; then
295        usage
296        exit 1
297fi
298
299if [ $# -lt 2 ] ; then
300        echo ""
301        echo "Wrong parameters number!!"
302        echo ""
303        usage
304        exit 1
305fi
306
307case $1 in
308        --config) # generate config file
309                NEW_CONFIG_FILE=`pwd`"/"$PACKAGE_NAME".sgbd"
310                cp $DEFAULT_SAMPLES_PATH"sample.sgbd" $NEW_CONFIG_FILE
311                echo "generated file "$NEW_CONFIG_FILE", after modify, please move to /etc/lliurex-sgbd"
312        ;;
313        --template) # generate questions template
314                NEW_TEMPLATE_FILE=`pwd`"/"$PACKAGE_NAME".templates"
315                create_template_file
316                echo ""
317                echo "generated file "$NEW_TEMPLATE_FILE" remember to move it to your package debian directory"
318                echo "and execute debconf-gettextize debian/"$PACKAGE_NAME".templates"
319                echo "After that, remove obsolete files: master.old and localized templates (ie, templates.xx)"
320                echo ""
321                echo "More info: http://manpages.ubuntu.com/manpages/dapper/man7/po-debconf.7.html"
322                echo ""
323        ;;
324        --install) # install new database
325                get_config_data nolog
326                install_db
327                create_include_file
328                echo "Install complete"
329        ;;
330        --upgrade) # upgrade database
331                get_config_data
332                if [ $TEST -ne 0 ] ; then
333                        # Existe la base de datos. Hacer copia base de datos"
334                        update_passwd
335                        database_backup
336                fi
337                #si por algún motivo se ha perdido la configuració se vuelve a crear
338                if [ ! -e $INCLUDE_FILE ] ; then
339                        create_include_file
340                fi
341        ;;
342        --remove)
343                get_config_data
344                if [ -e $INCLUDE_FILE ] ; then
345                        rm -f $INCLUDE_FILE
346                fi
347        ;;
348        --purge)
349                get_config_data nolog
350                if [ $TEST -eq 0 ]; then
351                        echo "Database not found, exiting"
352                        exit 1
353                fi
354                /usr/sbin/lliurex-sgbd-purge-question $TEMPLATE
355                if [ $? -ne 0 ] ; then
356                        # Existe la base de datos. Hacer copia base de datos"
357                        database_backup
358                        mysql -u root -p$MYSQL_ROOT_PASS -e "DROP DATABASE $DB_NAME;" 2>/dev/null
359                        mysql -u root -p$MYSQL_ROOT_PASS -e "DROP USER $DB_USER@localhost;" 2>/dev/null
360                        mysql -u root -p$MYSQL_ROOT_PASS -e "flush privileges;" 2> /dev/null
361                fi
362
363                if [ -e $INCLUDE_FILE ] ; then
364                        rm -f $INCLUDE_FILE
365                fi
366                echo "Purge complete"
367        ;;
368        --inject_sql)
369                get_config_data
370                inject_sql_file $3
371        ;;
372        --is_include_present)
373                get_config_data > /dev/null
374                if [ -e $INCLUDE_FILE ] ; then
375                        echo "YES"
376                else
377                        echo "NO"
378                fi
379        ;;
380        --add_include_file)
381                get_config_data
382                create_include_file
383        ;;
384        --db_is_present)
385                [ ! -e /tmp/db_is_present ] ||  rm -f /tmp/db_is_present
386                get_config_data #> /dev/null
387                echo "$DB_IS_IN_MYSQL"
388        ;;
389
390        --sql_mode)
391                edit_sql_mode
392        ;;     
393
394        *)
395                usage
396        ;;
397esac
398
399exit 0
400
Note: See TracBrowser for help on using the repository browser.