#!/bin/sh -e

mark=".plesk.mounted"
dest_d="/usr/local/psa"
dest_f="handlers"
dest="/usr/local/psa/handlers"
src="/usr/local/psa/handlers.default"
rsync="rsync -aq"

trap "stop;exit 1" HUP PIPE INT QUIT TERM

stop()
{
	[ -e "$dest/spool/$mark" ] || return 0
	if [ ! -d "$src" ]; then
# looks like stop after hard shutdown. Copy remaining files
		echo "It seems hard shutdown occured. Recommended to run mchk" 
		mkdir -p $src
		$rsync --exclude "$mark" --exclude "hooks" "$dest/" "$src/"
	fi
	cd $dest_d
    for c in before-local before-queue before-remote info spool;do 
    	umount -l ./$dest_f/$c || echo "Never mind" 
    done
	$rsync --delete --exclude "hooks" --exclude "spool" "$src/" "$dest/" || true
    rm -f ./spool/$mark
	rm -rf $src
}

sync_to_tmpfs()
{
	[ -d $src -a -e "$dest/spool/$mark" ] || return 1
	$rsync --delete --exclude "hooks" --exclude "spool" --exclude "$mark" "$src/" "$dest/"
}

sync_from_tmpfs()
{
	[ -d $src -a -e "$dest/spool/$mark" ] || return 0
    $rsync --delete --exclude "hooks" --exclude "spool" --exclude $mark "$dest/" "$src/"
}

if ! command -v restorecon >/dev/null; then
	restorecon()
	{
		:
	}
fi

start()
{
# Mount tmpfs if not exists. Remove directory, otherwise
	[ ! -e "$dest/spool/$mark" ] || return 0
	if [ -d "$src" ]; then # It seems was hard shutdown
		echo "It seems hard shutdown occured. Recommended to run mchk or mail restore" 
	else
		for c in before-local  before-queue before-remote info; do
		    	mkdir -p "$src/$c"
		    	restorecon "$src/$c"
		    	$rsync --delete "$dest/$c/" "$src/$c/"
		done
	fi
    ret=0 
    for c in before-local  before-queue before-remote info; do
    	mkdir -p "$dest/$c" \
	&& mount -t tmpfs tmpfs $dest/$c \
	&& restorecon -R $dest/$c \
	&& $rsync --delete "$src/$c/" "$dest/$c/" || ret=1
    done
    mount -t tmpfs -o mode=0770,gid=popuser tmpfs $dest/spool || ret=1
    restorecon -R $dest/spool || ret=1
	touch "$dest/spool/$mark"
    return $ret
}

usage()
{
	echo "Usage: $0 <start|stop>"
	echo ""
	echo "Create or destroy tmpfs work tree for mail handlers"
	echo "for speed purposes"
	exit 1
}

case $1 in 
	start)
		start || stop
	;;
	stop)
		stop
	;;
	refresh)
		sync_from_tmpfs
	;;
	*)
		usage
	;;
esac
