summaryrefslogtreecommitdiff
path: root/.local/bin/backups/assimilate
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"