#
# mysql handler script for backupninja
#

getconf backupdir /var/backups/mysql
getconf configfile /etc/mysql/debian.cnf
getconf databases all
getconf compress yes
getconf dbusername
getconf dbpassword
getconf dbhost localhost
getconf hotcopy yes
getconf sqldump no
getconf user root
getconf vsname

# If vservers are configured, decide if the handler should
# use them or if it should just operate on the host

if [ "$VSERVERS" = "yes" ]
then
	if [ ! -z $vsname ]
	then		
		info "Using vserver '$vsname'"
		usevserver=1
	else
		info "No vserver name specified, actions will be performed on the host"
	fi
fi

# Check to make sure that the specified vserver exists
if [ $usevserver ]
then
	vroot="$VROOTDIR/$vsname"
	[ -d $vroot ] || fatal "vserver '$vsname' does not exist at '$vroot'"
fi
	
# create backup dirs, the 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'"
hotdir="$backupdir/hotcopy"
dumpdir="$backupdir/sqldump"

if [ $usevserver ]
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

# create .my.cnf
# only if dbusername and dbpassword specified.
# we create a tmp file because we don't want to have to
# specify the password on the command line.

defaultsfile=""
if [ "$dbusername" != "" -a "$dbpassword" != "" ]; then
	mycnf="/tmp/backupninja.$$.my.cnf"
	if [ -f $mycnf ]; then
		debug "rm $mycnf"
		rm $mycnf
	fi
	oldmask=`umask`
	umask 077
	cat > $mycnf <<EOF
# auto generated backupninja mysql conf
[mysql]
user=$dbusername
password=$dbpassword

[mysqldump]
user=$dbusername
password=$dbpassword

[mysqlhotcopy]
user=$dbusername
password=$dbpassword
EOF
	umask $oldmask
	defaultsfile="--defaults-file $mycnf"
else
	# otherwise, use $configfile
	defaultsfile="--defaults-file $configfile"
fi

## HOT COPY

if [ "$hotcopy" == "yes" ]; then 
	if [ "$databases" == "all" ]; then
		if [ $usevserver ]
		then
			execstr="$VSERVER $vsname exec $MYSQLHOTCOPY $defaultsfile --quiet --allowold --regexp /.\*/./.\*/ $hotdir"
		else
			execstr="$MYSQLHOTCOPY $defaultsfile --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 ]
			then
				execstr="$VSERVER $vsname exec $MYSQLHOTCOPY $defaultsfile --allowold $db $hotdir"
			else
				execstr="$MYSQLHOTCOPY $defaultsfile --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
	if [ "$databases" == "all" ]; then
		if [ $usevserver ]
		then
			databases=`echo 'show databases' | $VSERVER $vsname exec su $user -c "$MYSQL $defaultsfile" | grep -v Database`
		else
			databases=`echo 'show databases' | su $user -c "$MYSQL $defaultsfile" | grep -v Database`
		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"
		else
			execstr="$MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $db > $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
	
	if [ "$compress" == "yes" ]; then
		output=`$GZIP -f $vroot$dumpdir/*.sql 2>&1`
		debug $output
	fi
fi

# clean up tmp config file
if [ -f "$mycnf" ]; then
	debug "rm $mycnf"
	rm $mycnf
fi

return 0