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 -# 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