r213@um: micah | 2005-12-27 09:14:18 -0500
[matthijs/upstream/backupninja.git] / handlers / mysql
index d5c0370e733c9252c217e574cfd0c1a2af0fea89..49f80a8545816fedb760fe1d148745f5bc8526eb 100644 (file)
@@ -4,6 +4,7 @@
 
 getconf backupdir /var/backups/mysql
 getconf databases all
+getconf ignores
 getconf dbhost localhost
 getconf hotcopy no
 getconf sqldump no
@@ -16,14 +17,6 @@ getconf dbusername
 getconf dbpassword
 getconf configfile /etc/mysql/debian.cnf
 
-if [ "$user" == "" ]; then
-       userset=false;
-       user=root;
-else
-       userset=true;
-       userhome=`grep "^$user:" /etc/passwd | awk -F: '{print $6}'`
-       [ -f $userhome/.my.cnf ] || fatal "Can't find config file in $userhome/.my.cnf"
-fi
 
 # If vservers are configured, decide if the handler should
 # use them or if it should just operate on the host
@@ -39,14 +32,39 @@ then
        fi
 fi
 
-# Check to make sure that the specified vserver exists
+# If needed, make sure that the specified vserver exists and is running.
 if [ $usevserver ]
 then
+       info "Examining vserver '$vsname'"
+       # does it exist ?
        vroot="$VROOTDIR/$vsname"
        [ -d $vroot ] || fatal "vserver '$vsname' does not exist at '$vroot'"
+       # is it running ?
+       $VSERVERINFO -q $vsname RUNNING
+       if [ $? -ne 0 ]
+       then
+               fatal "vserver $vsname is not running."
+       fi
+fi
+
+if [ "$user" == "" ]; then
+       userset=false;
+       user=root;
+else
+       userset=true;
+       userhome=`getent passwd "$user" | awk -F: '{print $6}'`
+       [ -f $userhome/.my.cnf ] || fatal "Can't find config file in $userhome/.my.cnf"
 fi
+
+## Prepare ignore part of the command
+## This only works for mysqldump at the moment
+
+ignore=''
+for i in $ignores; do
+       ignore="$ignore --ignore-table=$i"
+done
        
-# create backup dirs, the vroot variable will be empty if no vsname was specified
+# create backup dirs, vroot variable will be empty if no vsname was specified
 # and will proceed to operate on the host
 [ -d $vroot$backupdir ] || mkdir -p $vroot$backupdir
 [ -d $vroot$backupdir ] || fatal "Backup directory '$vroot$backupdir'"
@@ -80,19 +98,26 @@ fi
 # specify the password on the command line.
 
 defaultsfile=""
-if [ "$dbusername" != "" -a "$dbpassword" != "" ]; then
-       home=`grep '^root:' /etc/passwd | awk -F: '{print $6}'`
-       [ -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
+if [ "$dbusername" != "" -a "$dbpassword" != "" ]
+then
+    if [ $usevserver ]
+    then
+       home=`$VSERVER $vsname exec getent passwd "root" | awk -F: '{print $6}'`
+    else
+       home=`getent passwd "root" | awk -F: '{print $6}'`
+    fi
+    [ -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]
 user=$dbusername
@@ -168,17 +193,25 @@ if [ "$sqldump" == "yes" ]; then
                if [ $usevserver ]
                then
                        databases=`echo 'show databases' | $VSERVER $vsname exec su $user -c "$MYSQL $defaultsfile" | grep -v Database`
+                       if [ $? -ne 0 ]
+                       then
+                           fatal "Something unexpected happened, the defaults file may have gone missing or is corrupt"
+                       fi
                else
                        databases=`echo 'show databases' | su $user -c "$MYSQL $defaultsfile" | grep -v Database`
+                       if [ $? -ne 0 ]
+                       then
+                           fatal "Something unexpected happened, the defaults file may have gone missing or is corrupt"
+                       fi
                fi
        fi
 
        for db in $databases; do
                if [ $usevserver ]
                then
-                       execstr="$VSERVER $vsname exec $MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $db > $vroot$dumpdir/${db}.sql"
+                       execstr="$VSERVER $vsname exec $MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db > $vroot$dumpdir/${db}.sql"
                else
-                       execstr="$MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $db > $dumpdir/${db}.sql"
+                       execstr="$MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db > $dumpdir/${db}.sql"
                fi
                debug "su $user -c '$execstr'"
                if [ ! $test ]; then