#!/bin/bash
#
# This script will make a simple backup of the most critical partitions,
# using the "dump" facility, into the backup partition. It will stop the
# webserver, and recurse the sites directories making a tar mini-backup of
# the database dirs. It will the restart the webserver, and start the
# "dump" backup.
#

if [ "$2" = "nodumpdate" ]; then
   UPDATEDDATE=""
else
   UPDATEDDATE="-u"
fi

if [ "$1" = "full" ]; then
   DLEVEL="0"
   BTYPE="full"
elif [ "$1" = "inc" ]; then
   DLEVEL="1"
   BTYPE="inc"
else
   echo "Usage: $0 full|inc [nodumpdate]" 
   exit 1
fi


#
# Configuration Parameters
#

BACKUPPART="/backup"
BACKUPDIR="current"
DUMPLOGARCH="$BACKUPPART/backup.dump.log.gz"
FSTODUMP="/ /var /home /mnt/hdb1 /usr"
DUMPFILESMODE="0644"
DUMPFILESOWN="root.root"

#
# Start
# 

echo
echo "#####################################################################"
echo "Starting backup."
echo "#####################################################################"
echo


#
#  Make full system backup
#

echo "Phase 1: ### Full System Dump Backup ###"
echo "Phase 1: Using backup partition: $BACKUPPART"
echo "Phase 1: Filesystems to dump: $FSTODUMP"

echo -n "Phase 1: Remounting backup partition read-write ... "
if ( mount $BACKUPPART -o remount,rw &> /dev/null ) then
   echo "done."
else
   echo "failure!"
   echo "Phase 1:  There were problems remounting $BACKUPPART in read-write mode!"
   echo "Phase 1: Aborting Full System Dump Backup."
   echo "Phase 1: Aborted, done."
   echo "-------------------------------------------------------------------------------"
   exit 1
fi

echo -n "Phase 1: Checking backup partition for correct dir structure ... "
if [ -d $BACKUPPART/$BACKUPDIR -a -w $BACKUPPART/$BACKUPDIR ]; then
   echo "done."

   echo -n "Phase 1: Checking backup partition for available space ... "
   SREQ=`for i in $FSTODUMP;do dump -$DLEVEL -S $i 2> /dev/null;done|awk '{x=x+$1/1048576} END {printf "%6.0f\n", x}'`
   SAVAILFREE=`df --block-size=1048576 |grep -Ew $BACKUPPART|awk '{printf "%6.0f\n", $4}'`
   SAVAILDEL=`du -s --block-size=1048576 $BACKUPPART/$BACKUPDIR/. |awk '{printf "%6.0f\n", $1}'`
   SAVAIL=`expr $SAVAILFREE + $SAVAILDEL`

   if [ `expr $SAVAIL - $SREQ` -gt "0" ]; then
      echo "done."
      echo "Phase 1:  Available: $SAVAIL MB Required: $SREQ MB."
   else
      echo "no enough space!"
      echo "Phase 1:  There is not enough space left in $BACKUPPART for the backup!"
      echo "Phase 1:  Available: $SAVAIL MB Required: $SREQ MB."
      echo -n "Phase 1: Remounting backup partition read-only ... "
      if ( mount $BACKUPPART -o remount,ro &> /dev/null ) then
         echo "done."
      else
         echo "failure!"
         echo "Phase 1:  There were problems remounting $BACKUPPART in read-only mode!"
         echo "Phase 1: Aborting Full System Dump Backup."
         echo "Phase 1: Aborted, done."
         echo "-------------------------------------------------------------------------------"
         exit 1
      fi
      echo "Phase 1: Aborting Full System Dump Backup."
      echo "Phase 1: Aborted, done."
      echo "-------------------------------------------------------------------------------"
      exit 1
   fi

   echo -n "Phase 1: Deleting old files ... "
   if [ `ls -la $BACKUPPART/$BACKUPDIR/|wc -l` -gt "3" ]; then
      rm -f $BACKUPPART/$BACKUPDIR/* &> /dev/null
      echo "done."
   else
      echo "no old files to delete."
   fi

   echo "Phase 1: Dumping filesystems ... "
   for FS in $FSTODUMP
   do
      if [ "$FS" = "/" ]; then
         FSNAME="root"
      else
         FSNAME=`echo $FS|tr / _|cut -b 2-`
      fi
      sync
      echo -n "Phase 1:  Starting dump of $FSNAME ( $FS ) ... "
      if ( dump -$DLEVEL $UPDATEDDATE -z -M -s 27306 -f $BACKUPPART/$BACKUPDIR/$FSNAME.$BTYPE. $FS &> $BACKUPPART/$BACKUPDIR/$FSNAME.log ) then
         echo "done."
      else
         echo "problems!"
         echo "Phase 1:  There where problems with the dump of $FSNAME ( $FS )."
         echo "Phase 1:  Check logfile $BACKUPPART/$BACKUPDIR/$FSNAME.log for more info"
         echo "Phase 1:  Also check log archive file $DUMPLOGARCH."
      fi
      cat $BACKUPPART/$BACKUPDIR/$FSNAME.log |gzip >> $DUMPLOGARCH
      echo "-------------------------------------------------------------------------------" |gzip >> $DUMPLOGARCH
   done

   echo -n "Phase 1: Setting ownership and permissions of dump files ... "
   chmod $DUMPFILESMODE $BACKUPPART/$BACKUPDIR/* $DUMPLOGARCH &> /dev/null
   chown $DUMPFILESOWN $BACKUPPART/$BACKUPDIR/* $DUMPLOGARCH &> /dev/null
   echo "done."

   echo -n "Phase 1: Compressing dump log files ... "
   gzip $BACKUPPART/$BACKUPDIR/*.log &> /dev/null
   echo "done."
   sync

else
   echo "problems!"
   echo "Phase 1:  There are problems with the directory structure."
   echo "Phase 1:  Check dirs: $BACKUPPART/$BACKUPDIR"
   echo -n "Phase 1: Remounting backup partition read-only ... "
   if ( mount $BACKUPPART -o remount,ro &> /dev/null ) then
      echo "done."
   else
      echo "failure!"
      echo "Phase 1:  There were problems remounting $BACKUPPART in read-only mode!"
      echo "Phase 1: Aborting Full System Dump Backup."
      echo "Phase 1: Aborted, done."
      echo "-------------------------------------------------------------------------------"
      exit 1
   fi
   echo "Phase 1: Aborting Full System Dump Backup."
   echo "Phase 1: Aborted, done."
   echo "-------------------------------------------------------------------------------"
   exit 1
fi

echo -n "Phase 1: Remounting backup partition read-only ... "
if ( mount $BACKUPPART -o remount,ro &> /dev/null ) then 
   echo "done."
else
   echo "failure!"
   echo "Phase 1:  There were problems remounting $BACKUPPART in read-only mode!"
   echo "Phase 1: Aborting Full System Dump Backup."
   echo "Phase 1: Aborted, done."
   echo "-------------------------------------------------------------------------------"
   exit 1
fi

echo "Phase 1: End of Full System Dump Backup."
echo "Phase 1: Done."
echo "-------------------------------------------------------------------------------"
