#!/usr/bin/bash
# $Id: dumpmysql, v 3.8 - 2013/12/28, gn Exp $
# UUID: c67bf02c-db97-4426-beae-1736050f8894
# Daily backup of MySQL databases 
#
# Copyright (C) 2004-2011 - Grozdan Nikolov
# License: GNU General Public License
#
# Please edit the file dumpmysql.cfg in /etc
# to fit your needs.
CFG="/etc/dumpmysql.cfg"
ERROR="/var/log/dumpmysql.error"
DATE=$(date +%Y%m%d)

# Include cfg file or exit
if [ -f $CFG ]; then 
	source $CFG
else
	echo "$CFG is missing... cannot continue!" >> $ERROR
	chmod 600 $ERROR
	exit 1
fi

# Set secure permissions
# on the cfg file
chmod 600 $CFG

# Check if ACTIVE is on
case "$ACTIVE" in
	y*|Y*) true ;;
	*|"") exit 1 ;;
esac

# Check for bzip2, gzip, lzma, xz
case "$OUTPUT" in
	g*|G*)
	if [ ! -x "$(which gzip 2>/dev/null)" ]; then 
		echo "Compression utility 'gzip' is missing... cannot continue!" >> $ERROR
		chmod 600 $ERROR
		exit 1
	fi
	;;
	b*|B*)
	if [ ! -x "$(which bzip2 2>/dev/null)" ]; then 
		echo "Compression utility 'bzip2' is missing... cannot continue!" >> $ERROR
		chmod 600 $ERROR
		exit 1
	fi
	;;
	l*|L*)
	if [ ! -x "$(which lzma 2>/dev/null)" ]; then
		echo "Compression utility 'lzma' is missing... cannot continue!" >> $ERROR
		chmod 600 $ERROR
		exit 1
	fi
	;;
	x*|X*)
	if [ ! -x "$(which xz 2>/dev/null)" ]; then
		echo "Compression utility 'xz' is missing... cannot continue!" >> $ERROR
		chmod 600 $ERROR
		exit 1
	fi
	;;
esac

# Make a backup directory 
# and change permissions
if [ -d "$DIR" ]; then 
	chown $USR:$GRP "$DIR" && chmod $DMOD "$DIR"
else
	mkdir -p "$DIR" && chown $USR:$GRP "$DIR" && chmod $DMOD "$DIR"
fi

cd "$DIR"
if [ "$?" != "0" ]; then 
	echo "Could not enter the backup directory!" >> $ERROR
	chmod 600 $ERROR
	exit 1
fi

# Set extensions
case "$OUTPUT" in
	p*|P*) ext=".sql" ;;
	g*|G*) ext=".sql.gz" ;;
	b*|B*) ext=".sql.bz2" ;;
	l*|L*) ext=".sql.lzma" ;;
	x*|X*) ext=".sql.xz" ;;
esac

# Set output for Snapshot 
# to selected format...
if [ "$METHOD" = "1" ]; then
	SNAPSHOT="$DIR/Snapshot-$DATE$ext"
fi

# Check for previously created 
# snapshots and remove them
if [ "$METHOD" = "1" ]; then
	test -f "$SNAPSHOT" && rm -f "$SNAPSHOT"
elif [ "$METHOD" = "2" ]; then
	for i in $DB-$DATE.{sql,sql.gz,sql.bz2,sql.lzma,sql.xz}; do
		test -e "$i" && rm -f "$i"
	done
fi

# Set compression variables
case "$OUTPUT" in
	g*|G*) COMPUTIL="gzip $COMPSTRENGTH" ;;
	b*|B*) COMPUTIL="bzip2 $COMPSTRENGTH" ;;
	l*|L*) COMPUTIL="lzma $COMPSTRENGTH" ;;
	x*|X*) COMPUTIL="xz $COMPSTRENGTH" ;;
esac

# Now backup the databases 
# and change permissions
case "$METHOD" in
	1)
	case "$OUTPUT" in
		p*|P*)
		nice -n 10 $MYSQLDUMP -u $RUN --password=$PASSWD -h $HOST --add-locks --lock-all-tables --add-drop-table -q -B $DB > "$SNAPSHOT" 2>/dev/null
		test -f "$SNAPSHOT" && chown $USR:$GRP "$SNAPSHOT" && chmod $FMOD "$SNAPSHOT"
		;;
		g*|G*|b*|B*|l*|L*|x*|X*)
		nice -n 10 $MYSQLDUMP -u $RUN --password=$PASSWD -h $HOST --add-locks --lock-all-tables --add-drop-table -q -B $DB \
		| nice -n 10 $COMPUTIL > "$SNAPSHOT" 2>/dev/null
		test -f "$SNAPSHOT" && chown $USR:$GRP "$SNAPSHOT" && chmod $FMOD "$SNAPSHOT"
	esac
	;;
	2)
	case "$OUTPUT" in
		p*|P*)
		for i in $DB; do
			nice -n 10 $MYSQLDUMP -u $RUN --password=$PASSWD -h $HOST --add-locks --lock-all-tables --add-drop-table -q \
			-B $i > "$i-$DATE$ext" 2>/dev/null
			test -f "$i-$DATE$ext" && chown $USR:$GRP "$i-$DATE$ext" && chmod $FMOD "$i-$DATE$ext"
		done
		;;
		g*|G*|b*|B*|l*|L*|x*|X*)
		for i in $DB; do
			nice -n 10 $MYSQLDUMP -u $RUN --password=$PASSWD -h $HOST --add-locks --lock-all-tables --add-drop-table -q \
			-B $i | nice -n 10 $COMPUTIL > "$i-$DATE$ext" 2>/dev/null
			test -f "$i-$DATE$ext" && chown $USR:$GRP "$i-$DATE$ext" && chmod $FMOD "$i-$DATE$ext"
		done
		;;
	esac
	;;
esac
 
# Check for snapshots which are ... days 
# old and remove them
case "$METHOD" in
	1)
	case "$DYS" in
		d*|D*|"") false ;;
		*)
		for i in $(find "$DIR" -name "Snapshot-*$ext" -ctime +$DYS -type f); do
			rm -f "$i"
		done
		;;
	esac
	;;
	2)
	case "$DYS" in
		d*|D*|"") false ;;
		*)
		for i in $DB; do
			rm -f "$(find "$DIR" -name "$i-*$ext" -ctime +$DYS -type f)"
		done
		;;
	esac
	;;
esac

exit 0
