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

Last change on this file since 3811 was 3811, checked in by Juanma, 3 years ago

Fixed update_passwd in lliurex-sgdb mysql version<5.7

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