#!/bin/bash # # April 2002 Pete Nesbitt # script to backup different (mounted) file systems or directories and send to remote host. # to dump directories you must not specify dump.conf updates, which this script does. # both local & remote system must be set up to allow this machine to run "batch mode" ssh to remote system. This will allow the scp operation without intervention. # Global Variables DATE=`date +%d` DAY=`date +%a` DATEFULL=`date +%b%d-%Y` MAILRECIPIENT="petern@ola.bc.ca" HOSTBASIC=`hostname|cut -d. -f1` FILESYSTEMS="/tmp/fslist.tmp" df -h |grep -v -i Filesystem|grep -v none|cut -d/ -f3,4|awk '// { print $6 } '> $FILESYSTEMS # Local System Specific Variables # DUMP_TEMP="/var/tmp/dump$HOSTBASIC" # local temporary storage of dump & gz file DUMP_TEMP="/tmp/dump$HOSTBASIC" DUMP_ARCHIVE="/usr/local/dump-archive/" # archive area for a few full backups # Target Specific Variables # TARGET_HOST=lindev1 TARGET_HOST=192.219.60.22 # TARGET_DIR=$TARGET_HOST:/zone1/rdump_temp TARGET_DIR=$TARGET_HOST:e:/backup_chin # e drive on a windows box # run once for each filesystem/dir (this loop ends at end of file) for i in "/home/pete/temp/home-test" # "/app" "/home" do SOURCE_DIR=$i # is it a file system or a directory grep $i $FILESYSTEMS > /tmp/fstest if [ ! -s /tmp/fstest ]; then /sbin/dump -f $DUMP_TEMP $SOURCE_DIR else # determine dump level (target is full monthly on 1st or 2nd/3rd if falls on weekend) FULLBU="false" if [ $DATE == 01 ]; then /sbin/dump -0u -f $DUMP_TEMP $SOURCE_DIR FULLBU="true" elif [ $DAY == Mon ]; then if [ $DATE == 02 ] -o [ $DATE == 03 ]; then /sbin/dump -0u -f $DUMP_TEMP $SOURCE_DIR FULLBU="true" fi else # incremental backup using a modified Tower of Hanoi algorithm, 3 2 5 4 7 6 9 8 9 9 ... if [ $DATE == 02 ]; then /sbin/dump -3u -f $DUMP_TEMP $SOURCE_DIR elif [ $DATE == 03 ]; then /sbin/dump -2u -f $DUMP_TEMP $SOURCE_DIR elif [ $DATE == 04 ]; then /sbin/dump -5u -f $DUMP_TEMP $SOURCE_DIR elif [ $DATE == 05 ]; then /sbin/dump -4u -f $DUMP_TEMP $SOURCE_DIR elif [ $DATE == 06 ]; then /sbin/dump -7u -f $DUMP_TEMP $SOURCE_DIR elif [ $DATE == 07 ]; then /sbin/dump -6u -f $DUMP_TEMP $SOURCE_DIR elif [ $DATE == 08 ]; then /sbin/dump -9u -f $DUMP_TEMP $SOURCE_DIR elif [ $DATE == 09 ]; then /sbin/dump -8u -f $DUMP_TEMP $SOURCE_DIR else /sbin/dump -9u -f $DUMP_TEMP $SOURCE_DIR fi fi fi # compress, copy (over-write old on target) and remove old dump file, email results SIZE=`ls -l $DUMP_TEMP|awk '/ / { print $5 } '` MAILMESSAGE=/tmp/message.txt MAILSUBJECT=/tmp/subject.txt if [ -s $DUMP_TEMP ]; then mv $DUMP_TEMP $DUMP_TEMP`echo $SOURCE_DIR|sed -e s/'\/'/_/g` DUMP_TEMP2="$DUMP_TEMP`echo $SOURCE_DIR|sed -e s/'\/'/_/g`" gzip -9 $DUMP_TEMP2 GZSIZE=`ls -l $DUMP_TEMP2.gz|awk '/ / { print $5 } '` scp $DUMP_TEMP2.gz backup@$TARGET_DIR/ echo "$SOURCE_DIR on $HOSTBASIC successfully backedup and dump sent to OS_5" > $MAILMESSAGE echo " " >> $MAILMESSAGE echo "$SIZE bytes were dumped before gzip compression" >> $MAILMESSAGE echo " " >> $MAILMESSAGE echo "$GZSIZE bytes were sent over the network" >> $MAILMESSAGE echo "`hostname` dump success" > $MAILSUBJECT else echo "$SOURCE_DIR on $HOSTBASIC failed backup. No file to send to OS_5" > $MAILMESSAGE echo " " >> $MAILMESSAGE echo "This is probably because no files changed" >> $MAILMESSAGE echo " " >> $MAILMESSAGE echo "Before gzip compression, the dump file was $SIZE bytes" >> $MAILMESSAGE echo "$HOSTBASIC dump failed" > $MAILSUBJECT fi echo "`cat $MAILMESSAGE`" | mail -s "`cat $MAILSUBJECT`" $MAILRECIPIENT # keep a local copy of last 3 Full BU's if [ "$FULLBU" = "true" ]; then mv $DUMP_TEMP2.gz $DUMP_ARCHIVE/$DUMP_TEMP2_FULL_$DATEFULL.gz cd $DUMP_ARCHIVE if [ $PWD != $DUMP_ARCHIVE ] ;then echo "The Remote Backup script could not save the Full backup locally. Could not change to dir $DUMP_ARCHIVE on $HOSTBASIC. The file $DUMP_TEMP2.gz should be manually removed."|mail -s "WARNING Backup Failed on $HOSTBASIC" $MAILRECIPIENT exit fi find . -ctime +96 |grep ".gz"|xargs rm -f # based on monthly full bu else rm -f $DUMP_TEMP2.gz fi rm -f $MAILSUBJECT rm -f $MAILMESSAGE rm -f $FILESYSTEMS done # end of do-done loop to cover each file system exit