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

Last change on this file since 1313 was 1313, checked in by mabarracus, 5 years ago

add debug flag

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