1#!/bin/sh
2#
3# create snapshots of hammer2 directories
4
5if [ -r /etc/defaults/periodic.conf ]
6then
7    . /etc/defaults/periodic.conf
8    source_periodic_confs
9fi
10
11case "${PERIODIC}" in
12	weekly)
13	snap_dirs=${weekly_snapshot_hammer2_dirs:-"auto"}
14	snap_capacity=${weekly_snapshot_hammer2_capacity:-"90"}
15	snap_keep=${weekly_snapshot_hammer2_keep:-"auto"}
16	snap_keep_auto=6
17	snap_tag=${weekly_snapshot_hammer2_tag:-"weekly"}
18	snap_enable="${weekly_snapshot_hammer2_enable}"
19	;;
20	monthly)
21	snap_dirs=${monthly_snapshot_hammer2_dirs:-"auto"}
22	snap_capacity=${monthly_snapshot_hammer2_capacity:-"90"}
23	snap_keep=${monthly_snapshot_hammer2_keep:-"auto"}
24	snap_keep_auto=12
25	snap_tag=${monthly_snapshot_hammer2_tag:-"monthly"}
26	snap_enable="${monthly_snapshot_hammer2_enable}"
27	;;
28	*)
29	snap_dirs=${daily_snapshot_hammer2_dirs:-"auto"}
30	snap_capacity=${daily_snapshot_hammer2_capacity:-"90"}
31	snap_keep=${daily_snapshot_hammer2_keep:-"auto"}
32	snap_keep_auto=15
33	snap_tag=${daily_snapshot_hammer2_tag:-"daily"}
34	snap_enable="${daily_snapshot_hammer2_enable}"
35	;;
36esac
37
38rc=0
39
40case "${snap_enable}" in
41	[Yy][Ee][Ss])
42	echo ""
43	echo "HAMMER2 snapshots:"
44
45	if [ "${snap_dirs}" = "auto" ]; then
46		snap_dirs="$(mount -v -t hammer2 | awk '{ print $3; }')"
47	fi
48
49	for dir in ${snap_dirs}; do
50		echo -n "${dir}: "
51		if [ ! -d "${dir}" ]; then
52			echo "omitted, not a directory"
53			continue
54		fi
55		_df=$(df ${dir} | grep -oE "[0-9]+%")
56		_pcnt=${_df%%%}
57		if [ ${_pcnt} -gt ${snap_capacity} ]; then
58			echo "omitted, not enough free space"
59			continue
60		fi
61		hammer2 snapshot ${dir} ${dir}.${snap_tag}.$(date +%Y%m%d.%H:%M) \
62			|| rc=1
63		_keep=${snap_keep}
64		if [ "${_keep}" = "auto" ]; then
65			# adjust number of snapshots dynamically, according to free space
66			_keep=$(echo "scale=2;inc=((${snap_capacity}-${_pcnt})/50* \
67				${snap_keep_auto});scale=0;${snap_keep_auto}+inc/1" | bc)
68		fi
69		_keep=$((_keep+1))
70		for _stale in $(hammer2 -s ${dir} pfs-list | grep -v "^Type" | \
71				grep -oE "${dir}\.${snap_tag}\..*$" | \
72				sort -r | tail -n+${_keep}); do
73			hammer2 -s ${dir} pfs-delete ${_stale} || rc=1
74		done
75		echo "${dir}: $(hammer2 -s ${dir} pfs-list | grep -v "^Type" | \
76				grep -coE "${dir}\.${snap_tag}\..*$") snapshot(s)"
77	done
78	;;
79esac
80
81exit $rc
82