]> code.delx.au - monosys/blobdiff - hacks/lib-ext-backup
Rename all the things
[monosys] / hacks / lib-ext-backup
diff --git a/hacks/lib-ext-backup b/hacks/lib-ext-backup
new file mode 100644 (file)
index 0000000..9009318
--- /dev/null
@@ -0,0 +1,108 @@
+#!/bin/bash
+
+function cryptsetup_open {
+    for DEVICE in /dev/disk/by-partlabel/ext*backup*; do
+        if ! [ -L "$DEVICE" ]; then
+            continue
+        fi
+        DISKNAME="$(basename "$DEVICE")"
+        CRYPTNAME="crypt-$DISKNAME"
+        echo "> cryptsetup luksOpen $DEVICE $CRYPTNAME"
+        cryptsetup luksOpen "$DEVICE" "$CRYPTNAME" --key-file "/etc/lukskeys/${DISKNAME}"
+        mkdir -p /run/ext-backup-crypt/
+        ln -sf "/dev/mapper/$CRYPTNAME" /run/ext-backup-crypt/
+    done
+}
+
+function cryptsetup_close {
+    for CRYPTDEVICE in /dev/mapper/crypt-ext*backup*; do
+        if ! [ -L "$CRYPTDEVICE" ]; then
+            continue
+        fi
+        CRYPTNAME="$(basename "$CRYPTDEVICE")"
+        echo "> cryptsetup luksClose $CRYPTNAME"
+        cryptsetup luksClose "$CRYPTNAME"
+        rm -f "/run/ext-backup-crypt/$CRYPTNAME"
+    done
+}
+
+function pool_import {
+    echo "> zpool import -d /run/ext-backup-crypt -a"
+    zpool import -d /run/ext-backup-crypt -a
+
+    ZPOOLNAME="$(zpool list -H -o name|grep 'ext.*backup'|head -n1)"
+    if [ -z "$ZPOOLNAME" ]; then
+        echo "Error! Could not find pool!"
+        return 1
+    fi
+
+    echo "> Found: $ZPOOLNAME"
+}
+
+function pool_export {
+    echo "> zpool export $ZPOOLNAME"
+    for _ in $(seq 60); do
+        zpool export "$ZPOOLNAME" && break
+        sleep 1
+    done
+}
+
+function pool_setup {
+    zfs set mountpoint="/mnt/$ZPOOLNAME" "$ZPOOLNAME"
+    chmod 0700 "/mnt/$ZPOOLNAME"
+    zfs set compression=lz4 "$ZPOOLNAME"
+    zfs set devices=off "$ZPOOLNAME"
+    zfs set exec=off "$ZPOOLNAME"
+    zfs set setuid=off "$ZPOOLNAME"
+    zfs set xattr=sa "$ZPOOLNAME"
+    zfs set acltype=posixacl "$ZPOOLNAME"
+}
+
+function pool_maybe_scrub {
+    local now
+    local last_scrub
+    local last_scrub_days_ago
+    now="$(date +%s)"
+    last_scrub="$(zpool status "$ZPOOLNAME"|sed -nE 's/scan: scrub repaired.* on (.*)/\1/p')"
+    last_scrub_days_ago=$(((now - $(date --date="${last_scrub:-1970-01-01}" +%s)) / 86400))
+
+    if [ $last_scrub_days_ago -lt 7 ]; then
+        return
+    fi
+
+    echo "> zpool scrub $ZPOOLNAME"
+    zpool scrub "$ZPOOLNAME"
+
+    while zpool status "$ZPOOLNAME" | grep -q "scrub in progress"; do
+        echo -n .
+        sleep 60
+    done
+    echo " done"
+}
+
+function syncoidw {
+    echo "> syncoid $1"
+    syncoid "$@" --identifier "$ZPOOLNAME"
+}
+
+function snapshot_cleanup {
+    echo "> Cleaning snapshots"
+    sanoid --configdir=/etc/sanoid/ext-backup --verbose --prune-snapshots
+
+    zfs list -t snapshot -H -o name -r "$ZPOOLNAME" \
+        | grep -F @syncoid_ \
+        | grep -Fv "@syncoid_$ZPOOLNAME" \
+        | xargs -rn1 zfs destroy -v
+}
+
+function main {
+    zfs get all -s local -H > /root/zfs-props.txt
+    cryptsetup_open
+    pool_import
+    pool_setup
+    snapshot_sync
+    snapshot_cleanup
+    pool_maybe_scrub
+    pool_export
+    cryptsetup_close
+}