summaryrefslogtreecommitdiff
path: root/bin/backup
blob: 9e737035e8aaeb92afd5ee575909ac785fffc00f (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
#!/bin/sh

# A backup a day keeps the doctor away.

usage() {
	echo "Usage: $0 [-nv] [[[user@]host]:dir]

Incremental backup using rsync(1). If run as root, a full system
backup is performed. Otherwise, the user's home directory is backed.

Options:
-n	dry-run
-v	verbose

Files:
- $HOME/.backupignore	exclude files from user backup (non root)
- /etc/backupignore		exclude files from system backup (root)

Environment:
- BACKUP	backup directory"
}

while getopts :nv opt; do
	case $opt in
	(n|v) optv="$opt$optv" ;;
	(*) usage; exit 1 ;;
	esac
done
shift $((OPTIND - 1))

BACKUP=${1:-$BACKUP}
[ "$BACKUP" ] || { usage; exit 1; }

[ "$USER" = root ] &&
	ignore=/etc/backupignore volumes='/ /boot' ||
	ignore="$HOME/.backupignore" volumes="$HOME"
[ -f "$ignore" ] && ignore="--exclude-from=$ignore" || ignore=

now=$(date +%F)
opt_link=''
past=$(rsync --list-only "$BACKUP/" 2>/dev/null | awk '{print $NF}' | sort -r)
for f in $past
do
	case $f in
		([0-9][0-9][0-9][0-9]-*) ;;
		(*) continue ;;
	esac
	[ "$f" = "$now" ] && continue
	opt_link="--link-dest=../$f"
	break
done

echo "# Backup $volumes to $BACKUP/$now"
exec rsync -HSXxa$optv $ignore $opt_link $volumes "$BACKUP/$now"