mysql: Put most of the code into a function.
authorMatthijs Kooijman <matthijs@stdin.nl>
Mon, 5 Jan 2009 15:33:17 +0000 (16:33 +0100)
committerMatthijs Kooijman <matthijs@stdin.nl>
Wed, 7 Jan 2009 20:49:35 +0000 (21:49 +0100)
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

index a6cd023ae7b422675c342775d9e3c1f3c4557464..066b87485bbba0f63ac048a5073456adc70c518e 100644 (file)
@@ -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 <<EOF
-# auto generated backupninja mysql conf
-[mysql]
-host=$dbhost
-user=$dbusername
-password="$dbpassword"
-
-[mysqldump]
-host=$dbhost
-user=$dbusername
-password="$dbpassword"
-
-[mysqlhotcopy]
-host=$dbhost
-user=$dbusername
-password="$dbpassword"
+   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 <<EOF
+   # auto generated backupninja mysql conf
+   [mysql]
+   host=$dbhost
+   user=$dbusername
+   password="$dbpassword"
+
+   [mysqldump]
+   host=$dbhost
+   user=$dbusername
+   password="$dbpassword"
+
+   [mysqlhotcopy]
+   host=$dbhost
+   user=$dbusername
+   password="$dbpassword"
 EOF
-       umask $oldmask
-        defaultsfile="--defaults-extra-file=$vhome/.my.cnf"
-fi
+      umask $oldmask
+      defaultsfile="--defaults-extra-file=$vhome/.my.cnf"
+   fi
 
-# if a user is not set, use $configfile, otherwise use $mycnf
-if [ "$user" == "" ]; then
-       user=root;
-       defaultsfile="--defaults-extra-file=$configfile"
-else
-       userset=true;
-       if [ $usevserver = yes ]
-       then
-           vuserhome=`$vexec getent passwd "$user" | @AWK@ -F: '{print $6}'`
-           if [ $? -eq 2 ]
-           then
-               fatal "User $user not found in /etc/passwd"
-           fi
-           userhome="$vroot$vuserhome"
-               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
+   # if a user is not set, use $configfile, otherwise use $mycnf
+   if [ "$user" == "" ]; then
+      user=root;
+      defaultsfile="--defaults-extra-file=$configfile"
+   else
+      userset=true;
+      if [ $usevserver = yes ]
+      then
+         vuserhome=`$vexec getent passwd "$user" | @AWK@ -F: '{print $6}'`
+         if [ $? -eq 2 ]
+         then
+            fatal "User $user not found in /etc/passwd"
+         fi
+         userhome="$vroot$vuserhome"
+      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
+      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