]> code.delx.au - monosys/blob - hacks/lib-ext-backup
lib-ext-backup: exit 1 on scrub failure
[monosys] / hacks / lib-ext-backup
1 #!/bin/bash
2
3 function cryptsetup_open {
4 for DEVICE in /dev/disk/by-partlabel/ext*backup*; do
5 if ! [ -L "$DEVICE" ]; then
6 continue
7 fi
8 DISKNAME="$(basename "$DEVICE")"
9 CRYPTNAME="crypt-$DISKNAME"
10 echo "> cryptsetup luksOpen $DEVICE $CRYPTNAME"
11 cryptsetup luksOpen "$DEVICE" "$CRYPTNAME" --key-file "/etc/lukskeys/${DISKNAME}"
12 mkdir -p /run/ext-backup-crypt/
13 ln -sf "/dev/mapper/$CRYPTNAME" /run/ext-backup-crypt/
14 done
15 }
16
17 function cryptsetup_close {
18 for CRYPTDEVICE in /dev/mapper/crypt-ext*backup*; do
19 if ! [ -L "$CRYPTDEVICE" ]; then
20 continue
21 fi
22 CRYPTNAME="$(basename "$CRYPTDEVICE")"
23 echo "> cryptsetup luksClose $CRYPTNAME"
24 cryptsetup luksClose "$CRYPTNAME"
25 rm -f "/run/ext-backup-crypt/$CRYPTNAME"
26 done
27 }
28
29 function pool_import {
30 echo "> zpool import -d /run/ext-backup-crypt -a"
31 zpool import -d /run/ext-backup-crypt -a
32
33 ZPOOLNAME="$(zpool list -H -o name|grep 'ext.*backup'|head -n1)"
34 if [ -z "$ZPOOLNAME" ]; then
35 echo "Error! Could not find pool!"
36 return 1
37 fi
38
39 echo "> Found: $ZPOOLNAME"
40 }
41
42 function pool_export {
43 echo "> zpool export $ZPOOLNAME"
44 for _ in $(seq 60); do
45 zpool export "$ZPOOLNAME" && break
46 sleep 1
47 done
48 }
49
50 function pool_setup {
51 zpool set failmode=continue "$ZPOOLNAME"
52 zfs set mountpoint="/mnt/$ZPOOLNAME" "$ZPOOLNAME"
53 chmod 0700 "/mnt/$ZPOOLNAME"
54 zfs set compression=lz4 "$ZPOOLNAME"
55 zfs set devices=off "$ZPOOLNAME"
56 zfs set exec=off "$ZPOOLNAME"
57 zfs set setuid=off "$ZPOOLNAME"
58 zfs set xattr=sa "$ZPOOLNAME"
59 zfs set acltype=posixacl "$ZPOOLNAME"
60 }
61
62 function pool_maybe_scrub {
63 local now
64 local last_scrub
65 local last_scrub_days_ago
66 now="$(date +%s)"
67 last_scrub="$(zpool status "$ZPOOLNAME"|sed -nE 's/scan: scrub repaired.* on (.*)/\1/p')"
68 last_scrub_days_ago=$(((now - $(date --date="${last_scrub:-1970-01-01}" +%s)) / 86400))
69
70 if [ $last_scrub_days_ago -lt 7 ]; then
71 return
72 fi
73
74 echo "> zpool scrub $ZPOOLNAME"
75 zpool scrub "$ZPOOLNAME"
76
77 while zpool status "$ZPOOLNAME" | grep -q "scrub in progress"; do
78 echo -n .
79 sleep 60
80 done
81 echo " done"
82
83 if zpool list -H -o health "$ZPOOLNAME" | grep -qv ONLINE; then
84 zpool status -v "$ZPOOLNAME"
85 return 1
86 fi
87 }
88
89 function syncoidw {
90 echo "> syncoid $1"
91 syncoid "$@" --identifier "$ZPOOLNAME"
92 }
93
94 function snapshot_cleanup {
95 echo "> Cleaning snapshots"
96 sanoid --configdir=/etc/sanoid/ext-backup --verbose --prune-snapshots
97
98 zfs list -t snapshot -H -o name -r "$ZPOOLNAME" \
99 | grep -F @syncoid_ \
100 | grep -Fv "@syncoid_$ZPOOLNAME" \
101 | xargs -rn1 zfs destroy -v
102 }
103
104 function main {
105 zfs get all -s local -H > /root/zfs-props.txt
106 cryptsetup_open
107 pool_import
108 pool_setup
109 snapshot_sync
110 snapshot_cleanup
111 pool_maybe_scrub
112 pool_export
113 cryptsetup_close
114 }