#!/bin/sh

if [ -r /etc/defaults/periodic.conf ]; then
    . /etc/defaults/periodic.conf
    source_periodic_confs
fi

: ${zfs_snap_keep="1m"}

zfs_snap () {
	now=`date +"%Y%m%d-%H%M%S"`

	echo ""
	echo -n "Creating zfs snapshots:"

	if [ -z "$zfs_snap_filesystems" ]; then
		echo " \$zfs_snap_filesystems not set!"
		return 1
	fi

	for fs in $zfs_snap_filesystems; do
		keep_and_period="${fs#*:}"
		period="${keep_and_period#*:}"
		if [ -z "$period" -o "$period" = "$fs" -o \
                     "$period" = "$keep_and_period" ]; then
			period="0S"
		fi
		fs="${fs%%:*}"

		old=`date -v-"$period" +%s`
		if [ $? -ne 0 ]; then
			return $?
		fi
	
		found_younger=0
		while read line; do
			snap="${line%%	*}"

			fs2="${snap%%@zs2???????-??????}"
			if [ "$fs2" != "$fs" ]; then
				continue
			fi

			date=`zfs get -H -p creation "$snap"`
			if [ $? -ne 0 ]; then
				return $?
			fi

			date="${date##$snap	creation	}"
			date="${date%%	-}"

			if [ "$date" -ge "$old" ]; then
				found_younger=1
			fi
		done <<-EOF
			$(zfs list -t snap -r -H -p "$fs")
		EOF

		if [ $found_younger -eq 0 ]; then
			snap="$fs@zs$now"
			echo -n " $snap"
			zfs snap -r "$snap" || return $?
		fi
	done

	echo "."

	echo -n "Deleting zfs snapshots:"

	for fs in $zfs_snap_filesystems; do
		keep="${fs#*:}"
		keep="${keep%%:*}"
		if [ -z "$keep" -o "$keep" = "$fs" ]; then
			keep="$zfs_snap_keep"
		fi
		fs="${fs%%:*}"

		old=`date -v-"$keep" +%s`
		if [ $? -ne 0 ]; then
			return $?
		fi
	
		zfs list -t snap -r -H -p "$fs" | while read line; do
			snap="${line%%	*}"

			fs2="${snap%%@zs2???????-??????}"
			if [ "$fs2" != "$fs" ]; then
				continue
			fi

			date=`zfs get -H -p creation "$snap"`
			if [ $? -ne 0 ]; then
				return $?
			fi

			date="${date##$snap	creation	}"
			date="${date%%	-}"

			hold=`zfs holds -H "$snap"`
			if [ $? -ne 0 ]; then
				return $?
			fi

			if [ -z "$hold" -a "$date" -le "$old" ]; then
				echo -n " $snap"
				zfs destroy -r "$snap" || return $?
			fi

		done
	done

	echo "."

	return 0
}

case "$zfs_snap_enable" in
[Yy][Ee][Ss])
	zfs_snap
	ret=$?
	;;
*)
	ret=0
	;;
esac

return $ret
