#!/bin/bash
#
# __copy1__
# __copy2__
#
CMD=$(basename $0)
VERSION="1.0"
VERSTR="$VERSION (2013/12)"
LOGSYSLOG=false

#set -u

. /lib/ku-base/lock.sh
. /lib/ku-base/log.sh

cfgfile="/etc/$CMD.cfg"
debian_cfg="/etc/mysql/debian.cnf"



usage()
{
	echo "
usage:	$CMD [options]

options:
 -v|--verbose	be verbose
 -q|--quiet	be quiet
 -D|--debug [n]	set debug (with optional level)
 --help)	print out help
" >&2
	[ $# != 0 ] && {
		echo -e "\n$*\n" >&2
	}
	exit 127
}

print_help()
{
	echo "
$CMD $VERSTR

  searches apache2 virtualhost directories for a file named
  'mysql-autodump/dblist' and dump mysql databases listed
  inside, using debian maintenance user

  needs both config files $debian_cfg and
  $cfgfile to work

  you need to be root to run this command

" >&2
	usage
}

cleanup()
{
	rm -f $tmpfile
}

purgedumps()
{
	local dir=$1
	local dbname=$2
	local files=
	local nfiles=
	local rmfile=
	local rmfiles=

	(
		cd $dir || return $?
		while :
		do
			files=`ls -t ${dbname}-*$file_ext$compress_file_ext 2>/dev/null`
			[ "$files" == "" ] && return 0
			nfiles=`echo "$files" | wc -l`
			[ $nfiles -le $keepfiles ] && return 0
			rmfile=`echo "$files" | tail -1`
			rmfiles=$rmfile
			[ -f $rmfile-err.log ] && rmfiles="$rmfile $rmfile-err.log"
			ku_log " $db purge $rmfiles"
			rm -f $rmfiles
			[ -f $rmfile ] && {
				ku_log " $db error removing $rmfiles"
				return 1
			}
		done
	)
	return 0
}


compressfile()
{
	local file=$1
	local dir=`dirname $file`
	file=`basename $file`
	local errfile=$file-err-comp.log
	local outfile=$file$compress_file_ext

	[ "$compress_command" == "" ] && return 0
	[ "$compress_file_ext" == "" ] && return 0

	(
		cd $dir || return $?

		ku_log " $db compressing to $outfile"

		$compress_command $outfile $file >$tmpfile 2>&1 || {
			ku_log " $db error compressing file, see $errfile"
			mv $tmpfile $errfile
			return 1
		}
		chown --reference `dirname $file` $outfile
		chmod 600 $outfile
	)
	return 0
}

# (MAIN)

VERBOSE=true
VFlag="--verbose"
DEBUG=false
DEBUGLEVEL=0
DFlag=

while [ $# != 0 ]
do
  case $1 in
    -v|--verbose)	VERBOSE=true; VFlag="--verbose" ;;
    -q|--quiet)		VERBOSE=false; VFlag="--quiet" ;;
    -D|--debug)		[ $# -gt 1 ] && {
    				echo "$2" | grep -q '^[0-9]' && {
					DEBUGLEVEL=$2
					shift
				}
			}
			DEBUG=true; DFlag="-D"
			;;
    -h|--help)		print_help ;;
    --)			break ;;
    -*|"")		usage ;;
    *)			usage ;;
  esac
  shift
done
[ $# != 0 ] && usage

[ $(id -u) != 0 ] && {
	echo "you need to be root to run this command" >&2
	exit 1
}

[ -f $debian_cfg ] || exit 0
[ -f $cfgfile ] || exit 0

ku_lock "/var/lock/$CMD" || {
	exit 0
}

# config defaults
#
keepfiles="3"
file_ext=".sql"
compress_command="zip -rmo"
compress_file_ext=".zip"

# get config
#
. $cfgfile



user=`grep "user *= " $debian_cfg | tail -1 | sed -e 's/.*= *//'`
passwd=`grep "password *= " $debian_cfg | tail -1 | sed -e 's/.*= *//'`
vdir=`kusa-conf path.wwwdir 2>/dev/null`
tmpfile=`mktemp /tmp/$CMD-XXXXXXXXX` || exit $?


trap "ku_log '*INTR*'; ku_lock_remove; cleanup; exit 127" 1 2 3

[ "$vdir" != "" ] && {
	vdir="$vdir/vhosts"
	[ -d $vdir ] || vdir=
}

ku_cap_logfile
ku_log "started vdir='$vdir'"

# virtual hosts backup
#
[ "$vdir" != "" ] && {
	cd $vdir
	for dblist in `ls */mysql-autodump/dblist 2>/dev/null`
	do
		dumpdir=`dirname $dblist`
		sitedir=`dirname $dumpdir`

		[ -L $sitedir ] && continue

		for db in `sed -e 's/[ ,	]*#.*//' $dblist`
		do
			[ "$db" == "" ] && continue

			outfile="`pwd`/$dumpdir/$db-`date '+%Y%m%d-%H%M'`$file_ext"
			errfile="$outfile-err.log"
	
			ku_log " $db dump to $outfile"
			cp /dev/null $outfile
			chown --reference $dumpdir $outfile
			chmod 600 $outfile

			if mysqldump -u $user -p$passwd $db > $outfile 2>$tmpfile
			then
				compressfile $outfile
				purgedumps $dumpdir $db
			else
				ku_log " $db error dumping, see '$errfile'"
				mv $tmpfile $errfile
			fi


		done
	done
}

ku_log "ended"
ku_lock_remove
cleanup

exit 0
