mysql: No longer prepend vroot to the backupdir.
[matthijs/upstream/backupninja-vserver.git] / handlers / mysql.in
index 066b87485bbba0f63ac048a5073456adc70c518e..db4159d412a87bc111af4c0dd97fd0184e311df1 100644 (file)
@@ -13,6 +13,7 @@ getconf sqldump no
 getconf sqldumpoptions "--lock-tables --complete-insert --add-drop-table --quick --quote-names"
 getconf compress yes
 getconf vsname
+getconf vsnames
 
 # authentication:
 getconf user
@@ -25,22 +26,30 @@ getconf configfile /etc/mysql/debian.cnf
 # In the former case, check that $vsname exists and is running.
 local usevserver=no
 local vroot
-if [ $vservers_are_available = yes ]; then
-   if [ -n "$vsname" ]; then
-      # does it exist ?
-      if ! vservers_exist "$vsname" ; then
-         fatal "The vserver given in vsname ($vsname) does not exist."
-      fi
-      # is it running ?
-      vservers_running $vsname || fatal "The vserver $vsname is not running."
-      # everything ok
-      info "Using vserver '$vsname'."
-      usevserver=yes
+
+if [ -n "$vsname" ]; then
+   if [ -z "$vsnames" ]; then
+      warning "Using deprecated 'vsname' configuration variable"
+      vsnames="$vsname"
+      info "Prepending '%v' to backupdir to emulate legacy behaviour"
+      backupdir="%v/$backupdir"
    else
-      info "No vserver name specified, actions will be performed on the host."
+      warning "Ignoring (deprecated) vsname configuration variable, since vsnames is given"
    fi
+fi
+
+if [ $vservers_are_available = yes -a -n "$vsnames" ]; then
+   if [ "$vsnames" = all ]; then
+      vsnames="$found_vservers"
+   else
+      if ! vservers_exist "$vsnames" ; then
+         fatal "At least one of the vservers listed in vsnames ($vsnames) does not exist."
+      fi
+   fi
+   info "Using vservers '$vsnames'"
+   usevserver=yes
 else
-   [ -z "$vsname" ] || warning 'vservers support disabled in backupninja.conf, vsname configuration line will be ignored'
+   [ -z "$vsnames" ] || warning 'vservers support disabled in backupninja.conf, vsnames configuration line will be ignored'
 fi
 
 ## Prepare ignore part of the command
@@ -53,26 +62,31 @@ done
 
 function make_backup() {
    vsname="$1"
-   if [ -n "$vsname" ]; then
-      vroot="$VROOTDIR/$vsname"
-      vexec="$VSERVER $vsname exec"
-   else
+   if [ -z "$vsname" ]; then
+      info "Running on host"
       vroot=""
       vexec=""
+   else
+      if ! vservers_running "$vsname"; then
+         error "vserver $vsname is not running!"
+         return 1
+      fi
+      info "Running on vserver $vsname"
+      vroot="$VROOTDIR/$vsname"
+      vexec="$VSERVER $vsname exec"
    fi
 
    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
+   [ -d $interpolated ] || mkdir -p $interpolated
+   [ -d $interpolated ] || fatal "Failed to create backup directory '$interpolated'"
 
    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 $dumpdir ] || mkdir -p $dumpdir
+   [ "$hotcopy" == "no" -o -d $hotdir ] || mkdir -p $hotdir
 
    #######################################################################
    ## AUTHENTICATION
@@ -160,46 +174,51 @@ EOF
 
    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 ]
+      if starts_with "$hotdir" "$vroot"; then
+         info "Initializing hotcopy method"
+         vhotdir=`strip_prefix "$hotdir" "$vroot"`
+         if [ "$databases" == "all" ]
          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"
+            info "dbhost: $dbhost"
+            execstr="$vexec $MYSQLHOTCOPY -h $dbhost --quiet --allowold --regexp /.\*/./.\*/ $vhotdir"
 
-            debug 'su $user -c \"$execstr\"'
+            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"
+                    debug $output
+                    info "Successfully finished hotcopy of all mysql databases"
                else
-                  warning $output
-                  warning "Failed to hotcopy mysql database $db"
+                    warning $output
+                    warning "Failed to hotcopy all mysql databases"
                fi
             fi
-         done
+         else
+            for db in $databases
+            do
+               execstr="$vexec $MYSQLHOTCOPY -h $dbhost --allowold $db $vhotdir"
+
+               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
+      else
+         error "hotcopy method can only be used when the backupdir ($hotdir) is within the vserver ($vroot)"
       fi
    fi
 
@@ -245,9 +264,9 @@ EOF
                       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"
+                      execstr="$vexec $DUMP | $GZIP > $dumpdir/${db}.sql.gz"
                    else
-                      execstr="$vexec $DUMP -r $vroot$dumpdir/${db}.sql"
+                      execstr="$vexec $DUMP -r $dumpdir/${db}.sql"
                    fi
 
                    debug "su $user -c \"$execstr\""
@@ -282,7 +301,9 @@ EOF
 }
 
 if [ $usevserver = yes ]; then
-   make_backup "$vsname"
+   for vserver in $vsnames; do
+      make_backup "$vserver"
+   done
 else
    make_backup ""
 fi