blob: fd6ed7f63ae35f835c1fb83feba56bf5446130f3 (
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
|
#!/bin/sh
# Full system backup with borg
# Validate argument - should either be onsite or offsite to specify location
ERRMSG="error: please specify either onsite or offsite"
[ $# -ne 1 ] && echo $ERRMSG && exit 1
[ "$1" != "onsite" -a "$1" != "offsite" ] && echo $ERRMSG && exit 1
# Set variables
LOCATION="$1"
SUDO_OPTS="--preserve-env=BORG_PASSCOMMAND,PASSWORD_STORE_DIR"
CREATE_OPTS="--warning --stats --show-rc --exclude-caches --one-file-system"
LOG="$HOME/.config/borg/log"
# Hack to get repository passphrase from pass
# The passcommand will be invoked as root, so use sudo to run it as the user calling the script
# who owns the password store. The environmental variable PASSWORD_STORE_DIR is passed through
# SUDO_OPTS to the borg commands, and then passed to this command from the borg command
# by the same means. This allows custom password store locations to work with this script.
export BORG_PASSCOMMAND="sudo $SUDO_OPTS -u $USER pass Borg-Backup/$(hostname)-$LOCATION"
# Create variables and function to monitor exit status
WARNING=0
ERROR=0
check_rc() {
rc=$1
[ $1 -eq 1 ] && WARNING=1
[ $1 -eq 2 ] && ERROR=1
}
# Start backup
echo -e "\n$LOCATION $(date)\n" >> $LOG
notify-send "beginning $LOCATION backup"
# Backup root partition
sudo $SUDO_OPTS borg create $CREATE_OPTS \
--exclude '/dev/*' \
--exclude '/proc/*' \
--exclude '/sys/*' \
--exclude '/tmp/*' \
--exclude '/mnt/*' \
--exclude '/media/*' \
"/mnt/$LOCATION-backup/$(hostname)::root-{now:%Y-%m-%d}" / 2>>$LOG
check_rc $?
# Backup boot parition
sudo $SUDO_OPTS borg create $CREATE_OPTS \
"/mnt/$LOCATION-backup/$(hostname)::boot-{now:%Y-%m-%d}" /boot 2>>$LOG
check_rc $?
# Send notifications based on return codes of archives
[ $WARNING -eq 1 ] && notify-send "One or more archives produced a warning" \
"Please check the log at $LOG"
[ $ERROR -eq 1 ] && notify-send -u critical \
"One or more archives produced an error and was unable to complete" \
"Please check the log at $LOG"
[ $WARNING -eq 0 -a $ERROR -eq 0 ] && notify-send "$LOCATION backup complete"
|