4 REMOTE_DIR=/tmp/backmeupscotty/test
5 ARCHIVE_KEEPNBACKUPS=30
7 BACKUP_RUNEVERYNTHDAY=1
10 echo $(basename $0) | tr '[:lower:]' '[:upper:]'
17 function scottyerror {
18 echo $(upperme): $@ >&2
25 if [ $sshret -eq 255 ]; then
26 scottyerror "SSH connection failed!"
33 function grepbackups {
34 ssh255 $REMOTE_HOST "ls $REMOTE_DIR" | grep -E '[0-9]+-[0-9]+'
37 function isIncomplete {
38 if ( ssh255 $REMOTE_HOST '[ -d '$REMOTE_DIR/incomplete' ]' ); then
46 if [ $(( ( $(date +%s) / (60*60*24) ) % $BACKUP_RUNEVERYNTHDAY )) -eq 0 ];
54 function latestTooOld {
55 for oldbackup in $(grepbackups); do
56 tstamp=$(echo $oldbackup | cut -d'-' -f1)
58 if [ $(( $(date +%s) - $tstamp )) -lt \
59 $(( $BACKUP_RUNEVERYNTHDAY*24*60*60 )) ]
71 scottyinfo Syncing $SYNC_SRC to $REMOTE_HOST:$REMOTE_DIR @$timestamp
73 if [ ! -d "$SYNC_SRC" ]; then
74 scottyerror Source dir $SYNC_SRC does not exist. Not syncing!
78 if [ $(ls -A "$SYNC_SRC" | wc -l) -eq 0 ]; then
79 scottyerror Source dir $SYNC_SRC is empty. Not syncing!
83 dir_current=$REMOTE_DIR/current
84 dir_incomplete=$REMOTE_DIR/incomplete
85 dir_timestamped=$REMOTE_DIR/$timestamp-$(date -d @$timestamp +%Y%m%d%H%M%S)
87 if [ -z $SYNC_EXC ]; then
90 rsync_exclude=$(eval echo --exclude={$SYNC_EXC} | tr -d {})
93 if (ssh255 $REMOTE_HOST '[ ! -d '$REMOTE_DIR' ]'); then
94 scottyinfo Creating destination directory $REMOTE_HOST:$REMOTE_DIR
95 ssh255 $REMOTE_HOST "mkdir $REMOTE_DIR"
99 scottyerror Continuing old incomplete backup
102 scottyinfo Starting rsync
104 -v -aHAX --numeric-ids --delete --delete-excluded \
105 --link-dest=$dir_current \
107 $SYNC_SRC/ $REMOTE_HOST:$dir_incomplete/
109 if [ $? -eq 0 ]; then
110 scottyinfo Timestamping completed backup and linking to current backup
111 ssh255 $REMOTE_HOST \
112 "mv $dir_incomplete $dir_timestamped && rm -f $dir_current && ln -s $(basename $dir_timestamped) $dir_current"
115 while [ $(grepbackups | wc -l) -gt $ARCHIVE_KEEPNBACKUPS ]; do
116 oldestbackup=$(grepbackups | head -1)
117 oldestbackuptstamp=$(echo $oldestbackup | cut -d'-' -f1)
119 if [ $oldestbackuptstamp -lt $(( $(date +%s) - $ARCHIVE_KEEPNDAYS*60*60*24 )) ]; then
120 scottyinfo Removing old backup $oldestbackup
121 ssh255 $REMOTE_HOST rm -r "$REMOTE_DIR/$oldestbackup"
128 function deleteLock {
129 if ! rmdir /tmp/$(basename $0).lock; then
130 scottyerror "Could not delete lockfile /tmp/$(basename $0).lock!"
135 scottyinfo "Preparing for sync"
138 function cleanup_abort {
139 scottyerror "Caught exit signal! Cleaning up..."
143 if [ $(jobs -p) ]; then
144 scottyerror TERMinating remaining child processes...
154 scottyinfo "No cleanup function was defined."
158 scottyinfo "No prepare function was defined."
161 function cleanup_normal {
168 Usage: $(basename $0) [OPTION]...
171 -q Only output errors
172 -n Run only on nth day
173 -h Print out this help
177 function backmeupscotty {
178 while getopts "qn:h" opt; do
184 BACKUP_RUNEVERYNTHDAY=$OPTARG
193 ssh255 $REMOTE_HOST exit
196 scottyinfo "This is the nth day."
197 elif latestTooOld; then
198 scottyinfo "The latest backup is too old."
200 scottyinfo "No backup has to be done. Exiting."
204 scottyinfo "Performing backup."
206 trap cleanup_abort EXIT
211 trap cleanup_normal EXIT
216 if ! mkdir /tmp/$(basename $0).lock; then
217 scottyerror "Another instance of $(basename $0) is still running!"