]> code.delx.au - monosys/blob - hacks/lib-ext-backup
Rename all the things
[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 zfs set mountpoint="/mnt/$ZPOOLNAME" "$ZPOOLNAME"
52 chmod 0700 "/mnt/$ZPOOLNAME"
53 zfs set compression=lz4 "$ZPOOLNAME"
54 zfs set devices=off "$ZPOOLNAME"
55 zfs set exec=off "$ZPOOLNAME"
56 zfs set setuid=off "$ZPOOLNAME"
57 zfs set xattr=sa "$ZPOOLNAME"
58 zfs set acltype=posixacl "$ZPOOLNAME"
59 }
60
61 function pool_maybe_scrub {
62 local now
63 local last_scrub
64 local last_scrub_days_ago
65 now="$(date +%s)"
66 last_scrub="$(zpool status "$ZPOOLNAME"|sed -nE 's/scan: scrub repaired.* on (.*)/\1/p')"
67 last_scrub_days_ago=$(((now - $(date --date="${last_scrub:-1970-01-01}" +%s)) / 86400))
68
69 if [ $last_scrub_days_ago -lt 7 ]; then
70 return
71 fi
72
73 echo "> zpool scrub $ZPOOLNAME"
74 zpool scrub "$ZPOOLNAME"
75
76 while zpool status "$ZPOOLNAME" | grep -q "scrub in progress"; do
77 echo -n .
78 sleep 60
79 done
80 echo " done"
81 }
82
83 function syncoidw {
84 echo "> syncoid $1"
85 syncoid "$@" --identifier "$ZPOOLNAME"
86 }
87
88 function snapshot_cleanup {
89 echo "> Cleaning snapshots"
90 sanoid --configdir=/etc/sanoid/ext-backup --verbose --prune-snapshots
91
92 zfs list -t snapshot -H -o name -r "$ZPOOLNAME" \
93 | grep -F @syncoid_ \
94 | grep -Fv "@syncoid_$ZPOOLNAME" \
95 | xargs -rn1 zfs destroy -v
96 }
97
98 function main {
99 zfs get all -s local -H > /root/zfs-props.txt
100 cryptsetup_open
101 pool_import
102 pool_setup
103 snapshot_sync
104 snapshot_cleanup
105 pool_maybe_scrub
106 pool_export
107 cryptsetup_close
108 }