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

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

wip

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