]> code.delx.au - monosys/blob - hacks/lib-ext-backup
f90faba007b2719b37a8b2a6eecf0f00b88b4dfb
[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
84 function syncoidw {
85 echo "> syncoid $1"
86 syncoid "$@" --identifier "$ZPOOLNAME"
87 }
88
89 function snapshot_cleanup {
90 echo "> Cleaning snapshots"
91 sanoid --configdir=/etc/sanoid/ext-backup --verbose --prune-snapshots
92
93 zfs list -t snapshot -H -o name -r "$ZPOOLNAME" \
94 | grep -F @syncoid_ \
95 | grep -Fv "@syncoid_$ZPOOLNAME" \
96 | xargs -rn1 zfs destroy -v
97 }
98
99 function main {
100 zfs get all -s local -H > /root/zfs-props.txt
101 cryptsetup_open
102 pool_import
103 pool_setup
104 snapshot_sync
105 snapshot_cleanup
106 pool_maybe_scrub
107 pool_export
108 cryptsetup_close
109 }