#
# 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

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

# 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

# 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
	
# 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

#######################################################################
## 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-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
	home=`getent passwd "root" | 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
# 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"
elif [ "$userset" == "false" ]; then
	# if user is set, don't 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 --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 ]
			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
	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 $ignore $db > $vroot$dumpdir/${db}.sql"
		else
			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
			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 [ "$dbusername" != "" ]; 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