show all threads
[tridge/junkcode.git] / mybackup.sh
1 #!/bin/sh
2 # a incremental rsync backup script
3
4
5 # config information
6 LOCKFILE=/var/lock/backup.lock
7 LOGFILE=/var/log/backup.log
8 EXCLUDE_FILE=/etc/backup_excludes
9 NUM_INCREMENTAL=3
10 BACKUP_DIR=/backup
11 RSYNC_OPTS="--bwlimit=500 --exclude-from=$EXCLUDE_FILE --ignore-errors --delete --delete-excluded -axv --backup --timeout=3600"
12
13
14
15 ##################################
16 # support functions
17
18
19 ##################################
20 # backup one directory
21 backup_one() {
22     path="$1"
23     name="$2"
24     DAY=`date +%j`
25     DAY=`expr $DAY % $NUM_INCREMENTAL`
26     IDIR=$BACKUP_DIR/incremental/$name/$DAY
27
28     rm -rf $IDIR
29     mkdir -p $IDIR
30
31     mkdir -p $BACKUP_DIR/$name
32     date
33     echo Backing up $name to $path and $IDIR
34     rsync $RSYNC_OPTS --backup-dir=$IDIR $path $BACKUP_DIR/$name/
35 }
36
37
38 ############################
39 # grab a lock file. Not atomic, but close :)
40 # tries to cope with NFS
41 lock_file() {
42         lck="$1"
43         machine=`cat "$lck" 2> /dev/null | cut -d: -f1`
44         pid=`cat "$lck" 2> /dev/null | cut -d: -f2`
45
46         if [ -f "$lck" ] && 
47             ( [ $machine != $host ] || kill -0 $pid ) 2> /dev/null; then
48                 echo "lock file $lck is valid for $machine:$pid"
49                 return 1
50         fi
51         /bin/rm -f "$lck"
52         echo "$host:$$" > "$lck"
53         return 0
54 }
55
56 ############################
57 # unlock a lock file
58 unlock_file() {
59         lck="$1"
60         /bin/rm -f "$lck"
61 }
62
63
64
65
66 (
67   if ! lock_file $LOCKFILE; then
68     exit 1
69   fi
70
71   trap "unlock_file $LOCKFILE" EXIT
72
73   ########################
74   # list of backups to perform
75   backup_one / root
76   backup_one /home/ home
77
78   unlock_file backup.lock
79
80 ) >> $LOGFILE 2>&1
81