xref: /freebsd/usr.sbin/periodic/etc/daily/223.backup-zfs (revision 4b1d3a30914e176e9fd2c363db81c26124a8ee30)
1eefe831eSRobert Wing#!/bin/sh
2eefe831eSRobert Wing# Created by: Miroslav Lachman <000.fbsd@quip.cz>
3eefe831eSRobert Wing
4eefe831eSRobert Wing# Backup of zpool list, zfs list, zpool properties and zfs properties
5eefe831eSRobert Wing# for each filesystem. The backup will be stored in /var/backups.
6eefe831eSRobert Wing
7eefe831eSRobert Wing# If there is a global system configuration file, suck it in.
8eefe831eSRobert Wing#
9eefe831eSRobert Wingif [ -r /etc/defaults/periodic.conf ]
10eefe831eSRobert Wingthen
11eefe831eSRobert Wing	. /etc/defaults/periodic.conf
12eefe831eSRobert Wing	source_periodic_confs
13eefe831eSRobert Wingfi
14eefe831eSRobert Wing
15eefe831eSRobert Wingbak_dir=/var/backups
16*4b1d3a30SLexi Winterrc=0
17eefe831eSRobert Wing
18eefe831eSRobert Wingrotate() {
19eefe831eSRobert Wing	base_name=$1
20eefe831eSRobert Wing	show_diff=$2
21eefe831eSRobert Wing	file="$bak_dir/$base_name"
22eefe831eSRobert Wing
23eefe831eSRobert Wing	if [ -f "${file}.bak" ] ; then
24eefe831eSRobert Wing		if cmp -s "${file}.bak" "${file}.tmp"; then
25eefe831eSRobert Wing			rm "${file}.tmp"
26eefe831eSRobert Wing		else
27*4b1d3a30SLexi Winter			if [ -n "$show_diff" ]; then
28eefe831eSRobert Wing				rc=1
29*4b1d3a30SLexi Winter				diff ${daily_diff_flags} "${file}.bak" "${file}.tmp"
30*4b1d3a30SLexi Winter			fi
31eefe831eSRobert Wing			mv "${file}.bak" "${file}.bak2" || rc=3
32eefe831eSRobert Wing			mv "${file}.tmp" "${file}.bak" || rc=3
33eefe831eSRobert Wing		fi
34eefe831eSRobert Wing	else
35eefe831eSRobert Wing		rc=1
36eefe831eSRobert Wing		mv "${file}.tmp" "${file}.bak" || rc=3
37eefe831eSRobert Wing		[ -n "$show_diff" ] && cat "${file}.bak"
38eefe831eSRobert Wing	fi
39eefe831eSRobert Wing}
40eefe831eSRobert Wing
41*4b1d3a30SLexi Wintershow=""
42eefe831eSRobert Wingcase "$daily_backup_zfs_verbose" in
43eefe831eSRobert Wing	[Yy][Ee][Ss]) show="YES"
44eefe831eSRobert Wingesac
45eefe831eSRobert Wing
46eefe831eSRobert Wingcase "$daily_backup_zfs_enable" in
47eefe831eSRobert Wing	[Yy][Ee][Ss])
48eefe831eSRobert Wing
49eefe831eSRobert Wing	zpools=$(zpool list $daily_backup_zpool_list_flags)
50eefe831eSRobert Wing
51eefe831eSRobert Wing	if [ -z "$zpools" ]; then
52eefe831eSRobert Wing		echo 'daily_backup_zfs_enable is set to YES but no zpools found.'
53eefe831eSRobert Wing		rc=2
54eefe831eSRobert Wing	else
55eefe831eSRobert Wing		echo ""
56eefe831eSRobert Wing		echo "Backup of ZFS information for all imported pools";
57eefe831eSRobert Wing
58eefe831eSRobert Wing		echo "$zpools" > "$bak_dir/zpool_list.tmp"
59eefe831eSRobert Wing		rotate "zpool_list" $show
60eefe831eSRobert Wing
61eefe831eSRobert Wing		zfs list $daily_backup_zfs_list_flags > "$bak_dir/zfs_list.tmp"
62eefe831eSRobert Wing		rotate "zfs_list" $show
63eefe831eSRobert Wing	fi
64eefe831eSRobert Wing	;;
65eefe831eSRobert Wingesac
66eefe831eSRobert Wing
67eefe831eSRobert Wingcase "$daily_backup_zfs_props_enable" in
68eefe831eSRobert Wing	[Yy][Ee][Ss])
69eefe831eSRobert Wing
70eefe831eSRobert Wing	zfs get $daily_backup_zfs_get_flags > "$bak_dir/zfs_props.tmp"
71*4b1d3a30SLexi Winter	rotate "zfs_props" $show
72eefe831eSRobert Wing
73eefe831eSRobert Wing	zpool get $daily_backup_zpool_get_flags > "$bak_dir/zpool_props.tmp"
74*4b1d3a30SLexi Winter	rotate "zpool_props" $show
75eefe831eSRobert Wing	;;
76eefe831eSRobert Wingesac
77eefe831eSRobert Wing
78eefe831eSRobert Wingexit $rc
79