From 7def766ed663e49f86595c85bdc5424d1de95787 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Mon, 5 Jan 2009 16:33:17 +0100 Subject: [PATCH] mysql: Put most of the code into a function. This prepares for calling the function multiple times for multiple vservers. Since this increases the indentation of most of the file anyway, I'm also making the indentation of the file internally consistent as well. --- handlers/mysql.in | 434 +++++++++++++++++++++++----------------------- 1 file changed, 221 insertions(+), 213 deletions(-) diff --git a/handlers/mysql.in b/handlers/mysql.in index a6cd023..066b874 100644 --- a/handlers/mysql.in +++ b/handlers/mysql.in @@ -48,235 +48,243 @@ fi ignore='' for i in $ignores $nodata; do - ignore="$ignore --ignore-table=$i" + ignore="$ignore --ignore-table=$i" done -if [ $usevserver = yes ]; then - vroot="$VROOTDIR/$vsname" - vexec="$VSERVER $vsname exec" -else - vroot="" - vexec="" - vsname="" -fi +function make_backup() { + vsname="$1" + if [ -n "$vsname" ]; then + vroot="$VROOTDIR/$vsname" + vexec="$VSERVER $vsname exec" + else + vroot="" + vexec="" + fi -interpolated=`interpolate "$backupdir" "$vsname"` + interpolated=`interpolate "$backupdir" "$vsname"` -# create backup dirs, $vroot will be empty if no vsname was specified -# and we will instead proceed to operate on the host -[ -d $vroot$interpolated ] || mkdir -p $vroot$interpolated -[ -d $vroot$interpolated ] || fatal "Backup directory '$vroot$backupdir'" + # create backup dirs, $vroot will be empty if no vsname was specified + # and we will instead proceed to operate on the host + [ -d $vroot$interpolated ] || mkdir -p $vroot$interpolated + [ -d $vroot$interpolated ] || fatal "Backup directory '$vroot$backupdir'" -hotdir="$interpolated/hotcopy" -dumpdir="$interpolated/sqldump" + hotdir="$interpolated/hotcopy" + dumpdir="$interpolated/sqldump" -[ "$sqldump" == "no" -o -d $vroot$dumpdir ] || mkdir -p $vroot$dumpdir -[ "$hotcopy" == "no" -o -d $vroot$hotdir ] || mkdir -p $vroot$hotdir + [ "$sqldump" == "no" -o -d $vroot$dumpdir ] || mkdir -p $vroot$dumpdir + [ "$hotcopy" == "no" -o -d $vroot$hotdir ] || mkdir -p $vroot$hotdir -####################################################################### -## AUTHENTICATION + ####################################################################### + ## AUTHENTICATION -# -# one of three authentication methods: -# 1. setting the user, so that /home/user/.my.cnf is used. -# 2. specifying the user and password in the handler config, -# which generates a temporary .my.cnf in /root/.my.cnf -# 3. specify the config file with --defaults-extra-file -# (this option DOESN'T WORK WITH MYSQLHOTCOPY) -# + # + # one of three authentication methods: + # 1. setting the user, so that /home/user/.my.cnf is used. + # 2. specifying the user and password in the handler config, + # which generates a temporary .my.cnf in /root/.my.cnf + # 3. specify the config file with --defaults-extra-file + # (this option DOESN'T WORK WITH MYSQLHOTCOPY) + # + + # create .my.cnf + # only if dbusername and dbpassword specified. + # we create a tmp file because we don't want to + # specify the password on the command line. -# create .my.cnf -# only if dbusername and dbpassword specified. -# we create a tmp file because we don't want to -# specify the password on the command line. - -defaultsfile="" - -if [ "$dbusername" != "" -a "$dbpassword" != "" ] -then - vhome=`$vexec getent passwd "root" | @AWK@ -F: '{print $6}'` - home=$vroot$vhome - - [ -d $home ] || fatal "Can't find root's home directory ($home)." - - mycnf="$home/.my.cnf" - - if [ -f $mycnf ] - then - # rename temporarily - tmpcnf="$home/my.cnf.disable" - debug "mv $mycnf $tmpcnf" - mv $mycnf $tmpcnf - fi - - oldmask=`umask` - umask 077 - cat > $mycnf < $mycnf <&1` - code=$? - if [ "$code" == "0" ] - then - debug $output - info "Successfully finished hotcopy of all mysql databases" - else - warning $output - warning "Failed to hotcopy all mysql databases" - fi - fi - else - for db in $databases - do - execstr="$vexec $MYSQLHOTCOPY -h $dbhost --allowold $db $hotdir" - - debug 'su $user -c \"$execstr\"' - if [ ! $test ] - then - output=`su $user -c "$execstr" 2>&1` - code=$? - if [ "$code" == "0" ] - then - debug $output - info "Successfully finished hotcopy of mysql database $db" - else - warning $output - warning "Failed to hotcopy mysql database $db" - fi - fi - done - fi -fi + debug "User home set to: $userhome" + [ -f $userhome/.my.cnf ] || fatal "Can't find config file in $userhome/.my.cnf" + defaultsfile="--defaults-extra-file=$vuserhome/.my.cnf" + debug "using $defaultsfile" + fi + + ####################################################################### + ## HOT COPY + + if [ "$hotcopy" == "yes" ] + then + info "Initializing hotcopy method" + if [ "$databases" == "all" ] + then + info "dbhost: $dbhost" + execstr="$vexec $MYSQLHOTCOPY -h $dbhost --quiet --allowold --regexp /.\*/./.\*/ $hotdir" + + debug "su $user -c \"$execstr\"" + if [ ! $test ] + then + output=`su $user -c "$execstr" 2>&1` + code=$? + if [ "$code" == "0" ] + then + debug $output + info "Successfully finished hotcopy of all mysql databases" + else + warning $output + warning "Failed to hotcopy all mysql databases" + fi + fi + else + for db in $databases + do + execstr="$vexec $MYSQLHOTCOPY -h $dbhost --allowold $db $hotdir" + + debug 'su $user -c \"$execstr\"' + if [ ! $test ] + then + output=`su $user -c "$execstr" 2>&1` + code=$? + if [ "$code" == "0" ] + then + debug $output + info "Successfully finished hotcopy of mysql database $db" + else + warning $output + warning "Failed to hotcopy mysql database $db" + fi + fi + done + fi + fi -########################################################################## -## SQL DUMP - -if [ "$sqldump" == "yes" ] -then - info "Initializing SQL dump method" - if [ "$databases" == "all" ] - then - debug "$vexec su $user -c \"$MYSQL $defaultsfile -N -B -e 'show databases'\" | sed 's/|//g;/\+----/d'" - # -N removes the column title and -B should remove the ASCII table borders, but doesn't always so we use sed to make sure. - databases=`$vexec su $user -c "$MYSQL $defaultsfile -N -B -e 'show databases'" | sed 's/|//g;/\+----/d'` - if [ $? -ne 0 ] - then - fatal "Authentication problem, maybe user/password is wrong or mysqld is not running?" - fi - fi - - for db in $databases - do - DUMP_BASE="$MYSQLDUMP $defaultsfile $sqldumpoptions" - - # Dumping structure and data - DUMP="$DUMP_BASE $ignore $db" - - # If requested, dump only the table structure for this database - if echo "$nodata" | grep -E '(^|[[:space:]])'"$db\." >/dev/null + ########################################################################## + ## SQL DUMP + + if [ "$sqldump" == "yes" ] + then + info "Initializing SQL dump method" + if [ "$databases" == "all" ] + then + debug "$vexec su $user -c \"$MYSQL $defaultsfile -N -B -e 'show databases'\" | sed 's/|//g;/\+----/d'" + # -N removes the column title and -B should remove the ASCII table borders, but doesn't always so we use sed to make sure. + databases=`$vexec su $user -c "$MYSQL $defaultsfile -N -B -e 'show databases'" | sed 's/|//g;/\+----/d'` + if [ $? -ne 0 ] then - # Get the structure of the tables, without data - DUMP_STRUCT="$DUMP_BASE --no-data $db" - for qualified_table in $nodata - do - table=$( expr match "$qualified_table" "$db\.\([^\w]*\)" ) - DUMP_STRUCT="$DUMP_STRUCT $table" - done - DUMP="( $DUMP; $DUMP_STRUCT )" + fatal "Authentication problem, maybe user/password is wrong or mysqld is not running?" fi - # Test to make sure mysqld is running, if it is not sqldump will not work - $vexec su $user -c "$MYSQLADMIN $defaultsfile ping" - if [ $? -ne 0 ]; then - fatal "Either you have an authentication problem, or mysqld doesn't appear to be running!" - fi - if [ "$compress" == "yes" ]; then - execstr="$vexec $DUMP | $GZIP > $vroot$dumpdir/${db}.sql.gz" - else - execstr="$vexec $DUMP -r $vroot$dumpdir/${db}.sql" - fi - - debug "su $user -c \"$execstr\"" - if [ ! $test ] - then - output=`su $user -c "$execstr" 2>&1` - code=$? - if [ "$code" == "0" ] - then - debug $output - info "Successfully finished dump of mysql database $db" - else - warning $output - warning "Failed to dump mysql databases $db" - fi - fi - done -fi + fi + + for db in $databases + do + DUMP_BASE="$MYSQLDUMP $defaultsfile $sqldumpoptions" + + # Dumping structure and data + DUMP="$DUMP_BASE $ignore $db" + + # If requested, dump only the table structure for this database + if echo "$nodata" | grep -E '(^|[[:space:]])'"$db\." >/dev/null + then + # Get the structure of the tables, without data + DUMP_STRUCT="$DUMP_BASE --no-data $db" + for qualified_table in $nodata + do + table=$( expr match "$qualified_table" "$db\.\([^\w]*\)" ) + DUMP_STRUCT="$DUMP_STRUCT $table" + done + DUMP="( $DUMP; $DUMP_STRUCT )" + fi + # Test to make sure mysqld is running, if it is not sqldump will not work + $vexec su $user -c "$MYSQLADMIN $defaultsfile ping" + if [ $? -ne 0 ]; then + fatal "Either you have an authentication problem, or mysqld doesn't appear to be running!" + fi + if [ "$compress" == "yes" ]; then + execstr="$vexec $DUMP | $GZIP > $vroot$dumpdir/${db}.sql.gz" + else + execstr="$vexec $DUMP -r $vroot$dumpdir/${db}.sql" + fi + + debug "su $user -c \"$execstr\"" + if [ ! $test ] + then + output=`su $user -c "$execstr" 2>&1` + code=$? + if [ "$code" == "0" ] + then + debug $output + info "Successfully finished dump of mysql database $db" + else + warning $output + warning "Failed to dump mysql databases $db" + fi + fi + done + fi + + # clean up tmp config file + if [ "$dbusername" != "" -a "$dbpassword" != "" ] + then + ## clean up tmp config file + debug "rm $mycnf" + rm $mycnf + if [ -f "$tmpcnf" ] + then + debug "mv $tmpcnf $mycnf" + mv $tmpcnf $mycnf + fi + fi +} -# clean up tmp config file -if [ "$dbusername" != "" -a "$dbpassword" != "" ] -then - ## clean up tmp config file - debug "rm $mycnf" - rm $mycnf - if [ -f "$tmpcnf" ] - then - debug "mv $tmpcnf $mycnf" - mv $tmpcnf $mycnf - fi +if [ $usevserver = yes ]; then + make_backup "$vsname" +else + make_backup "" fi return 0 -- 2.30.2