#!/bin/bash #Backup script for my two computers. Copies the nightly backup from #remote machine and does a local backup of this machine. TIME_FILE=/var/log/backup_time BACKUP_DIR=/ BASE_DIR=/mnt/backup LOG_FILE=/var/log/backup_error_log COUNT=3 DIR_NAME="$BASE_DIR/week_$(date +%U)_$(date +%Y)" #Only want root to be able to read backups. Otherwise it is a loop hole to #read all files in the system including /etc/shadow! umask 0077 #clear log file date > $LOG_FILE 2>&1 #Want to keep backup partition unmounted most of the time for safely reasons. if ! $( df | grep -q /mnt/backup &> /dev/null) then echo 'mounting /mnt/backup' >> $LOG_FILE 2>&1 if ! mount /mnt/backup >> $LOG_FILE 2>&1 then echo mount /mnt/backup failed exiting >> $LOG_FILE 2>&1 exit 1 fi fi #Do an differential backup if $1 is set if [ "$1" ]; then ATLAS_FILE=atlas-$(date +%a-%d-%b)-diff.tar echo differential backup >> $LOG_FILE 2>&1 cd $DIR_NAME >> $LOG_FILE 2>&1 tar c --newer=$TIME_FILE --one-file-system \ -f $(hostname -s)-$(date +%a-%d-%b)-diff.tar \ $BACKUP_DIR >> $LOG_FILE 2>&1 else ATLAS_FILE=atlas-$(date +%a-%d-%b)-full.tar for f in $(ls -1dt $BASE_DIR/week_* | tail --lines=+$COUNT) do echo removing old backups >> $LOG_FILE 2>&1 /bin/rm -fr $f >> $LOG_FILE 2>&1 done #Needs to be after directory clean up. if [ ! -d "$DIR_NAME" ] ; then echo creating directory $DIR_NAME >> $LOG_FILE 2>&1 mkdir $DIR_NAME >> $LOG_FILE 2>&1 fi cd $DIR_NAME >> $LOG_FILE 2>&1 echo full backup >> $LOG_FILE 2>&1 date > $TIME_FILE tar c --one-file-system -f $(hostname -s)-$(date +%a-%d-%b)-full.tar \ $BACKUP_DIR >> $LOG_FILE 2>&1 fi #Copy atlas backup to local directory DIR=/mnt/backup/week_$(date +%U)_$(date +%Y) FILE=backup.tar REMOTE_FILE=$DIR/$FILE BACKUP_FILE=$DIR/$ATLAS_FILE #Need a directory cat can write to. LOCAL_FILE=/mnt/backup/atlas_backup/$FILE #In theory the local user could read the file while it's being copied so #in a more security conscious situation you could set up a non-login user #account to do the following. p.s. Writing securely is inherently hard. su cat -c "scp catsurf@atlas:$REMOTE_FILE $LOCAL_FILE" >> $LOG_FILE 2>&1 #Only root should be able to read backups. chown root:root $LOCAL_FILE chmod 0600 $LOCAL_FILE mv $LOCAL_FILE $BACKUP_FILE >> $LOG_FILE 2>&1 #Won't umount /mnt/backup if this shell is executing in one of it's directories cd $HOME >> $LOG_FILE 2>&1 umount /mnt/backup >> $LOG_FILE 2>&1