From 0e9425a2389e4126728579e9a6e20c793933efdb Mon Sep 17 00:00:00 2001
From: Max Christian Pohle
Date: Sat, 11 Jul 2020 17:07:38 +0200
Subject: The script now searched for a dataset first

---
 systemd-zfs-partition-backup.sh                  | 117 +++++++++++++----------
 systemd-zfs-partition-backup/AUR/PKGBUILD        |   5 +-
 systemd-zfs-partition-backup/AUR/getsha256sum.sh |  21 ++++
 3 files changed, 90 insertions(+), 53 deletions(-)
 create mode 100755 systemd-zfs-partition-backup/AUR/getsha256sum.sh

diff --git a/systemd-zfs-partition-backup.sh b/systemd-zfs-partition-backup.sh
index 91acdfc..e40c241 100755
--- a/systemd-zfs-partition-backup.sh
+++ b/systemd-zfs-partition-backup.sh
@@ -1,75 +1,90 @@
 #!/usr/bin/bash
-logger "================================================================================"
+# Written in 2020 by Max Christian Pohle <webmaster@coderonline.de>
 
-# BACKUP_NAME=$ID_SERIAL-part$ID_PART_ENTRY_NUMBER
-BACKUP_NAME=$(echo $1 | sed -e 's/\\x2d/-/g')
-MOUNT_TARGET=/media/$BACKUP_NAME
+# check for a configuration file and source it in if its there
+test -f /etc/default/systemd-zfs-partition-backup &&\
+   source /etc/default/systemd-zfs-partition-backup
+
+DISK_NAME=$1
+DISK_NAME_ESCAPED=$(systemd-escape "$DISK_NAME")
+
+logger "Disk: $DISK_NAME"
+logger "    : $DISK_NAME_ESCAPED (escaped)"
+
+function beep() {
+    test -f /usr/bin/beep &&\
+        env -u SUDO_GID -u SUDO_COMMAND -u SUDO_USER -u SUDO_UID /usr/bin/beep $@
+}
 
 function fail() {
-    logger -s -t "$0" "Backup '$1' -> '$2' failed."
-    sudo -u max beep -f 40 -l 500
+    # logger -s -t "$0" "Backup '$1' -> '$2' failed."
+    logger -s "$@"
+    beep -f 40 -l 500
     # sudo -u max beep -f 523 -l 150 -n -f 54 -l 600
 }
 
 function start() {
-    DEVNAME=$(echo $1 | sed 's/-/\\x2d/')
-    systemctl restart media-$DEVNAME.automount
-
-    logger -t "$0" "Backup '$1' -> '$2' started."
-    sudo -u max beep -f 147 -l 120 -n -f 294 -l 200 -n -f 831
+    systemctl start media-$DISK_NAME_ESCAPED.automount ||\
+        (fail "could not start disk with service media-$DISK_NAME_ESCAPED.automount"; exit 1)
 }
 
 function stop() {
-    DEVNAME=$(echo $1 | sed 's/-/\\x2d/')
-    systemctl stop media-$DEVNAME.automount
-
-    logger -t "$0" "Backup '$1' -> '$2' finished."
-    sudo -u max beep -f 831 -l 120 -n -f 294 -l 200 -n -f 147
+    systemctl stop media-$DISK_NAME_ESCAPED.automount ||\
+        (fail "could not stop disk with service media-$DISK_NAME_ESCAPED.automount"; exit 1)
 }
 
-function zfs_snapshot() {
-    zfs diff $LAST_SNAPSHOT > $ZFS_PATH/backup-differences.txt
-    zfs snap media-backup/$BACKUP_NAME@$(date +%Y-%m-%d--%H-%M)
-    echo "Here comes a list of changes since your last backup: $LAST_SNAPSHOT" | mailx -A typesafe -a $ZFS_PATH/backup-differences.txt -s 'Backup overview' max@entwicklerseite.de
-}
 
-start $1
+# iterate over all datasets
+for i in $(zfs list -H -o name);
+do
+    # compare the 'tail' of the PATH against the disk name...
+    if [ "$(basename $i)" == "$DISK_NAME" ]; then
+        start $DISK_NAME
+
+        DISK_MOUNTPOINT="/media/$DISK_NAME"
+        if ! findmnt $DISK_MOUNTPOINT; then
+            logger -s "Expected to find disk '$DISK_NAME' mounted under '$DISK_MOUNTPOINT'. But it is not there. Aborting backup."
+            beep -f 40 -l 500
+            exit 1
+        fi
+
+        DATASET=$i
+        DATASET_LAST_SNAPSHOT=$(zfs list -t snap -o name -s creation "$DATASET"  | tail -n1) ||\
+            (fail "we could not find a previous backup. Backup may still be possible (first time backup?)")
+
+        ZFS_MOUNTPOINT=$(zfs get mountpoint -H -o value "$DATASET") ||\
+            (fail "could not determine mountpoint for dataset '$DATASET'"; exit 1)
+
+        # sanity check: is it really mounted?
+        findmnt -no source "$ZFS_MOUNTPOINT" ||\
+            (fail "Dataset $DATASET is not mounted at $ZFS_MOUNTPOINT" ; exit 1)
 
-if ! findmnt $MOUNT_TARGET; then
-    logger "$MOUNT_TARGET is not mounted. Cannot back it up."
-    exit 0
-fi
+        logger -s "Backup from '$DISK_MOUNTPOINT' -> '$ZFS_MOUNTPOINT' possible. Starting in 10 seconds..."
 
-logger ">> Inspecting $BACKUP_NAME"
-ZFS_PATH=$(zfs get mountpoint -H -o value media-backup/$BACKUP_NAME) || fail "$MOUNT_TARGET" "(no zfs dataset found)"
-ZFS_MOUNTPATH=$(findmnt -no source $ZFS_PATH)                        || fail "$ZFS_PATH (not mounted)" "(no association)"
-LAST_SNAPSHOT=$(zfs list -t snap -o name -s creation media-backup/$BACKUP_NAME | tail -n1)
+        beep -f 147 -l 120 -n -f 294 -l 200 -n -f 831
 
+        set -x
+        rsync -ahoi -x --delete --info=all \
+            "$DISK_MOUNTPOINT" "$ZFS_MOUNTPOINT" \
+            2>&1 | tee $ZFS_MOUNTPOINT/backup-report.txt
+        set +x
 
-# Make sure, that we are really writing where a mountpoint is
-if [ "$ZFS_PATH" == "/$ZFS_MOUNTPATH" ]; then
-    sudo -u max beep -f 831
-    logger "We can start $MOUNT_TARGET -> $ZFS_PATH"
-    rsync -ahoi -x --delete --info=all \
-        "/media/$BACKUP_NAME/"      \
-        "$ZFS_PATH"                 \
-        2>&1 | tee $ZFS_PATH/backup-report.txt && zfs_snapshot
+        zfs snap $DATASET@$(date +%Y-%m-%d--%H-%M-%S) ||\
+            (fail "Backup successful, but a snapshot of the dataset '$DATASET' was impossible :(")
 
-else
-    fail $ZFS_PATH $ZFS_MOUNTPATH
-    exit 1
-fi
 
+        if [ -n "$SYSTEMD_ZFS_PARTITION_BACKUP_DIFF_FILENAME" ]; then
+            zfs diff $DATASET_LAST_SNAPSHOT > $ZFS_MOUNTPOINT_VERIFIED/"$SYSTEMD_ZFS_PARTITION_BACKUP_DIFF_FILENAME"
 
+            if [ -n "$SYSTEMD_ZFS_PARTITION_BACKUP_EMAIL" ]; then
+                logger -s "Here comes a list of changes since your last backup: $LAST_SNAPSHOT" |\
+                    mailx -A typesafe -a $ZFS_MOUNTPOINT_VERIFIED/"$SYSTEMD_ZFS_PARTITION_BACKUP_DIFF_FILENAME" -s 'Backup overview' "$SYSTEMD_ZFS_PARTITION_BACKUP_EMAIL"
+            fi
+        fi
 
-stop $1
+        stop $DISK_NAME
 
-# sleep a second so that /dev/disk/by-id/*-part become available
-# sleep 1
+        beep -f 831 -l 120 -n -f 294 -l 200 -n -f 147
+    fi
+done
 
-# DISK=$(readlink -f /dev/disk/by-id/$ID_BUS-$ID_SERIAL)
-# if ! [ -e "$DISK" ]; then
-#     fail
-#     logger "$DISK: Disk not there :("
-#     exit 1
-# fi
diff --git a/systemd-zfs-partition-backup/AUR/PKGBUILD b/systemd-zfs-partition-backup/AUR/PKGBUILD
index f9d7315..918497f 100644
--- a/systemd-zfs-partition-backup/AUR/PKGBUILD
+++ b/systemd-zfs-partition-backup/AUR/PKGBUILD
@@ -12,8 +12,9 @@ depends=(
   'kbd'
   'mkinitcpio'
 )
-source=("http://git.entwicklerseite.de/zfs-bash-tools/snapshot/zfs-bash-tools-master.tar.bz2")
-sha256sums=('a734c145709687c5621f430d3baec3105977984dfbb35348beab4b793aeb8e1b')
+source=("http://git.entwicklerseite.de/zfs-bash-tools/snapshot/zfs-bash-tools-master.tar.gz")
+sha256sums=('80c5a14dbbccc1f0164557cf2f4f31ab45c3b08aa577e60a54d198bac01ca91b')
+echo "test"
 
 package() {
     install -D zfs-bash-tools-master/${pkgname}.sh                                    ../pkg/${pkgname}/usr/bin/${pkgname}.sh
diff --git a/systemd-zfs-partition-backup/AUR/getsha256sum.sh b/systemd-zfs-partition-backup/AUR/getsha256sum.sh
new file mode 100755
index 0000000..92760b3
--- /dev/null
+++ b/systemd-zfs-partition-backup/AUR/getsha256sum.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/bash
+# source PKGBUILD
+# function allsha() {
+#     for i in $source
+#     do
+#         printf "'%s' " "$(wget -q -O- "$i" | sha256sum | awk '/-$/{ print $1 }')"
+#     done
+# }
+# 
+# allsha | tee /tmp/output.txt
+
+
+ARCHIVE=$(mktemp --suffix=.tar.bz2)
+
+cd $(git rev-parse --show-toplevel)
+git archive -o "$ARCHIVE" master
+cd - > /dev/null
+
+cat $ARCHIVE | sha256sum | awk '/-$/{ print $1 }'
+rm $ARCHIVE
+
-- 
cgit v1.2.3