aboutsummaryrefslogtreecommitdiff
path: root/backup/backup.sh
blob: 91acdfcdacb5e18250440eb25099ab9b76f83f52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/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
..