diff options
| author | intrigeri <intrigeri@boum.org> | 2007-10-12 17:06:09 +0000 | 
|---|---|---|
| committer | intrigeri <intrigeri@boum.org> | 2007-10-12 17:06:09 +0000 | 
| commit | 579ea902ba24854b3c9acb307cda7e996e8e41a3 (patch) | |
| tree | 373ce0a2242050dad65b84950520c6d44a9445fc /handlers/mysql.in | |
| parent | be75e4e6c536882c14db9a41c61585e7a9c045f6 (diff) | |
| download | backupninja-579ea902ba24854b3c9acb307cda7e996e8e41a3.tar.gz backupninja-579ea902ba24854b3c9acb307cda7e996e8e41a3.tar.bz2 | |
fixed autotools build, broken since r466, inhandlers/Makefile.am
Diffstat (limited to 'handlers/mysql.in')
| -rw-r--r-- | handlers/mysql.in | 304 | 
1 files changed, 304 insertions, 0 deletions
| diff --git a/handlers/mysql.in b/handlers/mysql.in new file mode 100644 index 0000000..de4e4c3 --- /dev/null +++ b/handlers/mysql.in @@ -0,0 +1,304 @@ +# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*- +# +# mysql handler script for backupninja +# + +getconf backupdir /var/backups/mysql +getconf databases all +getconf ignores +getconf dbhost localhost +getconf hotcopy no +getconf sqldump no +getconf compress yes +getconf vsname + +# authentication: +getconf user +getconf dbusername +getconf dbpassword +getconf configfile /etc/mysql/debian.cnf + + +# Decide if the handler should operate on a vserver or on the host. +# 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 ? +      $VSERVERINFO -q $vsname RUNNING +      if [ $? -ne 0 ]; then +         fatal "The vserver $vsname is not running." +      fi +      # everything ok +      info "Using vserver '$vsname'." +      usevserver=yes +      vroot="$VROOTDIR/$vsname" +   else +      info "No vserver name specified, actions will be performed on the host." +   fi +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, $vroot will be empty if no vsname was specified +# and we will instead proceed to operate on the host +[ -d $vroot$backupdir ] || mkdir -p $vroot$backupdir +[ -d $vroot$backupdir ] || fatal "Backup directory '$vroot$backupdir'" +hotdir="$backupdir/hotcopy" +dumpdir="$backupdir/sqldump" + +if [ $usevserver = yes ] +then +	[ "$sqldump" == "no" -o -d $vroot$dumpdir ] || $VSERVER $vsname exec mkdir -p $dumpdir +	[ "$hotcopy" == "no" -o -d $vroot$hotdir ] || $VSERVER $vsname exec mkdir -p $hotdir +else +	[ "$sqldump" == "no" -o -d $dumpdir ] || mkdir -p $dumpdir +	[ "$hotcopy" == "no" -o -d $hotdir ] || mkdir -p $hotdir +fi + +####################################################################### +## 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) +# + +# 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 +    if [ $usevserver = yes ] +    then +    	vhome=`$VSERVER $vsname exec getent passwd "root" | @AWK@ -F: '{print $6}'` +	home="$vroot$vhome" +    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] +host=$dbhost +user=$dbusername +password="$dbpassword" + +[mysqldump] +host=$dbhost +user=$dbusername +password="$dbpassword" + +[mysqlhotcopy] +host=$dbhost +user=$dbusername +password="$dbpassword" +EOF +	umask $oldmask +	if [ $usevserver = yes ]  +	then +	    defaultsfile="--defaults-extra-file=$vhome/.my.cnf" +	else +	    defaultsfile="--defaults-extra-file=$mycnf" +	fi +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=`$VSERVER $vsname exec getent passwd "$user" | @AWK@ -F: '{print $6}'` +	    if [ $? -eq 2 ] +	    then +	    	fatal "User $user not found in /etc/passwd" +	    fi +    	    userhome="$vroot$vuserhome" +	else +	    userhome=`getent passwd "$user" | @AWK@ -F: '{print $6}'` +	    if [ $? -eq 2 ] +	    then +	    	fatal "User $user not found in /etc/passwd" +	    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=$userhome/.my.cnf" +	debug "using $defaultsfile" +fi + +####################################################################### +## HOT COPY + +if [ "$hotcopy" == "yes" ] +then +    info "Initializing hotcopy method" +    if [ "$databases" == "all" ] +    then +	if [ $usevserver = yes ] +	then +	    	info "dbhost: $dbhost" +		execstr="$VSERVER $vsname exec $MYSQLHOTCOPY -h $dbhost --quiet --allowold --regexp /.\*/./.\*/ $hotdir" +	else +		execstr="$MYSQLHOTCOPY --quiet --allowold --regexp /.\*/./.\*/ $hotdir" +	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 hotcopy of all mysql databases" +		else +			warning $output +			warning "Failed to hotcopy all mysql databases" +		fi +	fi +    else	 +	for db in $databases +	do +		if [ $usevserver = yes ] +		then +			execstr="$VSERVER $vsname exec $MYSQLHOTCOPY --allowold $db $hotdir" +		else +			execstr="$MYSQLHOTCOPY --allowold $db $hotdir" +		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 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 +	if [ $usevserver = yes ] +	then +	    debug 'echo show databases | $VSERVER $vsname exec su $user -c \"$MYSQL $defaultsfile\" | grep -v Database' +	    databases=`echo 'show databases' | $VSERVER $vsname exec su $user -c "$MYSQL $defaultsfile" | grep -v Database` +	    if [ $? -ne 0 ] +	    then +	        fatal "Authentication problem, maybe user/password is wrong or mysqld is not running?" +	    fi +	else +		databases=`echo 'show databases' | su $user -c "$MYSQL $defaultsfile" | grep -v Database` +		if [ $? -ne 0 ] +		then +		    fatal "Authentication problem, maybe user/password is wrong or mysqld is not running?" +		fi +	fi +fi + +	for db in $databases +	do +		if [ $usevserver = yes ] +		then +                   # Test to make sure mysqld is running, if it is not sqldump will not work +                   $VSERVER $vsname exec 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="$VSERVER $vsname exec $MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db | $GZIP > $vroot$dumpdir/${db}.sql.gz" +                   else +                      execstr="$VSERVER $vsname exec $MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db -r $vroot$dumpdir/${db}.sql" +                   fi +		else +                   # Test to make sure mysqld is running, if it is not sqldump will not work +                   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="$MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db | $GZIP > $dumpdir/${db}.sql.gz" +                   else +                      execstr="$MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db -r $dumpdir/${db}.sql" +                   fi +		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 + +return 0 | 
