2
0
Эх сурвалжийг харах

reinstall option for transition to new database structures introduced

Jiri Kuthan 22 жил өмнө
parent
commit
1ecf596ecd
2 өөрчлөгдсөн 133 нэмэгдсэн , 57 устгасан
  1. 6 1
      INSTALL
  2. 127 56
      scripts/ser_mysql.sh

+ 6 - 1
INSTALL

@@ -280,7 +280,12 @@ proceed, you need to make sure MySQL is installed on your box.
     or
     dpkg -i <package_name>
 3) create MySQL tables
-    /usr/sbin/ser_mysql.sh create
+	- if you have a previously installed SER on your system, use
+    	/usr/sbin/ser_mysql.sh create
+	  to convert your SER database into new structures
+	- otherwise, if this is your very first installation, use
+    	/usr/sbin/ser_mysql.sh create
+	  to create SER database structures
    (you will be promted for password of MySql "root" user)
 4) configure ser to use SQL
     uncomment all lines in configuration file ser.cfg which are related to 

+ 127 - 56
scripts/ser_mysql.sh

@@ -18,6 +18,7 @@
 # 2003-01-25: USER_ID changed to user everywhere (janakj)
 # 2003-01-24: Changed realm column of subscriber and pending
 #             tables to domain (janakj)
+# 2003-04-14  reinstall introduced (jiri)
 #
 
 #################################################################
@@ -29,10 +30,11 @@ USERNAME=ser
 DEFAULT_PW=heslo
 ROUSER=serro
 RO_PW=47serro11
-CMD="mysql -h $DBHOST -p -u "
-BACKUP_CMD="mysqldump -h $DBHOST -p -c -t -u "
-TABLE_TYPE="TYPE=MyISAM"
 SQL_USER="root"
+CMD="mysql -h $DBHOST -u$SQL_USER "
+DUMP_CMD="mysqldump -h $DBHOST -u$SQL_USER -c -t "
+BACKUP_CMD="mysqldump -h $DBHOST -u$SQL_USER -c "
+TABLE_TYPE="TYPE=MyISAM"
 # user name column
 USERCOL="username"
 
@@ -48,6 +50,7 @@ usage: $COMMAND create
        $COMMAND backup (dumps current database to stdout)
 	   $COMMAND restore <file> (restores tables from a file)
        $COMMAND copy <new_db> (creates a new db from an existing one)
+       $COMMAND reinstalls (updates to a new SER database)
 
        if you want to manipulate database as other MySql user than
        root, want to change database name from default value "$DBNAME",
@@ -57,43 +60,87 @@ usage: $COMMAND create
 EOF
 } #usage
 
-ser_backup()  # pars: <database name> <sql_user>
+
+# read password 
+prompt_pw() 
 {
-if [ $# -ne 2 ] ; then
-	echo "ser_drop function takes two params"
-	exit 1
-fi
-$BACKUP_CMD $2 $1
+	savetty=`stty -g`
+	printf "MySql password for $SQL_USER: "
+	stty -echo
+	read PW
+	stty $savetty
+	echo
 }
 
-ser_restore() #pars: <database name> <sql_user> <filename>
+# execute sql command
+sql_query()
 {
-if [ $# -ne 3 ] ; then
-	echo "ser_drop function takes two params"
+	$CMD "-p$PW" "$@"
+}
+
+# dump all rows
+ser_dump()  # pars: <database name> 
+{
+	if [ $# -ne 1 ] ; then
+		echo "ser_dump function takes one param"
+		exit 1
+	fi
+	$DUMP_CMD "-p$PW" $1
+}
+
+
+# copy a database to database_bak
+ser_backup() # par: <database name> 
+{
+	if [ $# -ne 1 ] ; then
+		echo  "ser_backup function takes one param"
+		exit 1
+	fi
+	BU=/tmp/mysql_bup.$$
+	$BACKUP_CMD "-p$PW" $1 > $BU
+	if [ "$?" -ne 0 ] ; then
+		echo "ser backup dump failed"
+		exit 1
+	fi
+#XX
+	ser_drop $1_bak 
+#XX
+	sql_query <<EOF
+	create database $1_bak;
+EOF
+
+	ser_restore $1_bak $BU
+	if [ "$?" -ne 0 ]; then
+		echo "ser backup/restore failed"
+		rm $BU
+		exit 1
+	fi
+}
+
+ser_restore() #pars: <database name> <filename>
+{
+if [ $# -ne 2 ] ; then
+	echo "ser_restore function takes two params"
 	exit 1
 fi
-$CMD $2 $1 < $3
+sql_query $1 < $2
 }
 
-ser_drop()  # pars: <database name> <sql_user>
+ser_drop()  # pars: <database name> 
 {
-if [ $# -ne 2 ] ; then
+if [ $# -ne 1 ] ; then
 	echo "ser_drop function takes two params"
 	exit 1
 fi
 
-$CMD $2 << EOF
+sql_query << EOF
 drop database $1;
 EOF
 } #ser_drop
 
-ser_create () # pars: <database name> <sql_user> [<no_init_user>]
+ser_create () # pars: <database name> [<no_init_user>]
 {
-
-#test
-#cat > /tmp/sss <<EOF
-
-if [ $# -eq 2 ] ; then
+if [ $# -eq 1 ] ; then
 	# by default we create initial user
 	INITIAL_USER="INSERT INTO subscriber 
 		($USERCOL, password, first_name, last_name, phone, 
@@ -105,17 +152,17 @@ if [ $# -eq 2 ] ; then
 		'0239482f19d262f3953186a725a6f53b', 'iptel.org', 
 		'a84e8abaa7e83d1b45c75ab15b90c320', 
 		'65e397cda0aa8e3202ea22cbd350e4e9', 'admin' );"
-elif [ $# -eq 3 ] ; then
+elif [ $# -eq 2 ] ; then
 	# if 3rd param set, don't create any initial user
 	INITIAL_USER=""
 else
-	echo "ser_create function takes two or three params"
+	echo "ser_create function takes one or two params"
 	exit 1
 fi
 
 echo "creating database $1 ..."
 
-$CMD $2 <<EOF
+sql_query <<EOF
 create database $1;
 use $1;
 
@@ -511,33 +558,57 @@ EOF
 } # ser_create
 
 
+export PW
+prompt_pw
+
 case $1 in
-	renew)
-		# backup, drop, restore -- experimental; thought to
-		# deal with upgrade to new structures which include
-		# new tables or columns (troubles can appear if columns
-		# renamed); not tested too much yet
+	reinstall)
+
+		#1 create a backup database (named *_bak)
+		echo "creating backup database"
+		ser_backup $DBNAME 
+		if [ "$?" -ne 0 ] ; then
+			echo "reinstall: ser_backup failed"
+			exit 1
+		fi
+		#2 dump original database and change names in it
+		echo "dumping table content ($DBNAME)"
 		tmp_file=/tmp/ser_mysql.$$
-		ser_backup $DBNAME $SQL_USER > $tmp_file
-		ret=$?
-		if [ "$ret" -ne 0 ]; then
-			rm $tmp_file
-			exit $ret
+		ser_dump $DBNAME  > $tmp_file
+		if [ "$?" -ne 0 ] ; then
+			echo "reinstall: dumping original db failed"
+			exit 1
 		fi
-		ser_drop $DBNAME $SQL_USER
-		ret=$?
-		if [ "$ret" -ne 0 ]; then
-			exit $ret
+		sed "s/[uU][sS][eE][rR]_[iI][dD]/user/g" $tmp_file |
+			sed "s/[uU][sS][eE][rR]/$USERCOL/g" |
+			sed "s/[rR][eE][aA][lL][mM]/domain/g"> ${tmp_file}.2
+		#3 drop original database
+		echo "dropping table ($DBNAME)"
+		ser_drop $DBNAME 
+		if [ "$?" -ne 0 ] ; then
+			echo "reinstall: dropping table failed"
+			rm $tmp_file*
+			exit 1
 		fi
-		ser_create $DBNAME $SQL_USER no_init_user
-		ret=$?
-		if [ "$ret" -ne 0 ]; then
-			exit $ret
+		#4 change names in table definition and restore
+		echo "creating new structures"
+		ser_create $DBNAME no_init_user
+		if [ "$?" -ne 0 ] ; then
+			echo "reinstall: creating new table failed"
+			rm $tmp_file*
+			exit 1
 		fi
-		ser_restore $DBNAME $SQL_USER $tmp_file
-		ret=$?
-		rm $tmp_file
-		exit $ret
+		#5 restoring table content
+		echo "restoring table content" 
+		ser_restore $DBNAME ${tmp_file}.2
+		if [ "$?" -ne 0 ] ; then
+			echo "reinstall: restoring table failed"
+			rm $tmp_file*
+			exit 1
+		fi
+#XX
+#		rm $tmp_file*
+		exit 0
 		;;
 	copy)
 		# copy database to some other name
@@ -547,26 +618,26 @@ case $1 in
 			exit 1
 		fi
 		tmp_file=/tmp/ser_mysql.$$
-		ser_backup $DBNAME $SQL_USER > $tmp_file
+		ser_dump $DBNAME  > $tmp_file
 		ret=$?
 		if [ "$ret" -ne 0 ]; then
 			rm $tmp_file
 			exit $ret
 		fi
-		ser_create $1 $SQL_USER no_init_user
+		ser_create $1 no_init_user
 		ret=$?
 		if [ "$ret" -ne 0 ]; then
 			rm $tmp_file
 			exit $ret
 		fi
-		ser_restore $1 $SQL_USER $tmp_file
+		ser_restore $1 $tmp_file
 		ret=$?
 		rm $tmp_file
 		exit $ret
 		;;
 	backup)
 		# backup current database
-		ser_backup $DBNAME $SQL_USER
+		ser_dump $DBNAME 
 		exit $?
 		;;
 	restore)
@@ -576,7 +647,7 @@ case $1 in
 			usage
 			exit 1
 		fi
-		ser_restore $DBNAME $SQL_USER $1
+		ser_restore $DBNAME $1
 		exit $?
 		;;
 	create)
@@ -585,22 +656,22 @@ case $1 in
 		if [ $# -eq 1 ] ; then
 			DBNAME="$1"
 		fi
-		ser_create $DBNAME $SQL_USER
+		ser_create $DBNAME 
 		exit $?
 		;;
 	drop)
 		# delete ser database
-		ser_drop $DBNAME $SQL_USER
+		ser_drop $DBNAME 
 		exit $?
 		;;
 	reinit)
 		# delete database and create a new one
-		ser_drop $DBNAME $SQL_USER
+		ser_drop $DBNAME 
 		ret=$?
 		if [ "$ret" -ne 0 ]; then
 			exit $ret
 		fi
-		ser_create $DBNAME $SQL_USER
+		ser_create $DBNAME 
 		exit $?
 		;;
 	*)