#!/usr/bin/bash logger "================================================================================" # BACKUP_NAME=$ID_SERIAL-part$ID_PART_ENTRY_NUMBER BACKUP_NAME=$(echo $1 | sed -e 's/\\x2d/-/g') MOUNT_TARGET=/media/$BACKUP_NAME function fail() { logger -s -t "$0" "Backup '$1' -> '$2' failed." sudo -u max 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 } 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 } 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 if ! findmnt $MOUNT_TARGET; then logger "$MOUNT_TARGET is not mounted. Cannot back it up." exit 0 fi 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) # 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 else fail $ZFS_PATH $ZFS_MOUNTPATH exit 1 fi stop $1 # sleep a second so that /dev/disk/by-id/*-part become available # sleep 1 # DISK=$(readlink -f /dev/disk/by-id/$ID_BUS-$ID_SERIAL) # if ! [ -e "$DISK" ]; then # fail # logger "$DISK: Disk not there :(" # exit 1 # fi