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

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

support for mariadb

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