#!/bin/bash # ------------------------------------------------------------------------------ # Prepare backup environment # ------------------------------------------------------------------------------ # Location variables # Temporary directory to store the backup files before FTP'ing them to the FTP server BACKUP_DIR=/tmp/server123-backups # Access variables # The locations of the directories on the local server to be backed up BACKUP_DIRECTORIES="/var/log /var/spool /home /etc /bin /boot /usr/local /opt" # The name of the directory on the FTP server to FTP the backup files to FTP_DEST_DIR="/server123" FTP_HOST=192.168.1.1 FTP_USERNAME=ftp-username FTP_PASSWORD=ftp-password # Location of the interbase database files INTERBASE_DB_LOCATION=/home/databases INTERBASE_PASSWORD=interbase-password INTERBASE_USERNAME=interbase-sysdba-username # MySQL username and password MYSQL_PASSWORD=mysql-username MYSQL_USERNAME=mysql-username # NetFlow database name NETFLOW_DB=netflow NETFLOW_TBL=`date +%Y`"_"`date +%m | sed -e 's/^0//'`"_"`date +%d` # Location of VMWare virtual machine files VMWARE_LOCATION="/var/lib/vmware/Virtual\ Machines" # # Command variables # BASENAME=/bin/basename BZIP2=/usr/bin/bzip2 CHMOD=/bin/chmod DATE=/bin/date FIND=/usr/bin/find GBAK=/opt/firebird/bin/gbak GREP=/bin/grep HOSTNAME=/bin/hostname LS=/bin/ls MKDIR=/bin/mkdir MV=/bin/mv MYSQL=/usr/bin/mysql MYSQLDUMP=/usr/bin/mysqldump NCFTPPUT=/usr/bin/ncftpput RM=/bin/rm TAR=/bin/tar VMWARE_CMD=/usr/local/source/server-vmware/vmware-server-distrib/bin/vmware-cmd # # Script preparation # # Create backup location $MKDIR -p $BACKUP_DIR cd $BACKUP_DIR # Initialise dynamic variables DATE_STAMP=`$DATE +%Y_%m_%d-%H-%M-%S` SERVER=`$HOSTNAME` NCFTPPUT_ERRORS="/var/log/backup/ftp_"$DATE_STAMP".log" # # Define functions # function bk_compress { FILE=$1 $BZIP2 -z -q --best -s $FILE return $? } function bk_ftp { FILE=$1 $NCFTPPUT -u $FTP_USERNAME -p $FTP_PASSWORD \ -e $NCFTPPUT_ERRORS -m -v -z -r 5 -R $FTP_HOST $FTP_DEST_DIR/$SERVER/ \ $FILE return $? } function bk_dir { DIR=$1; DIR_NAME=${DIR//\//-} EXCLUDE_FILE=$BACKUP_DIR/exclude exec 6>&1 exec > $EXCLUDE_FILE $FIND $DIR/ -size +209715k -exec ls {} \; exec 1>&6 6>$- $TAR -cvf $SERVER$DIR_NAME.$DATE_STAMP.tar -X $EXCLUDE_FILE $DIR/* $RM $BACKUP_DIR/exclude } echo echo ------------------------------------------------------------------------------------------ echo Performing backup for $DATE_STAMP echo ------------------------------------------------------------------------------------------ echo function do_vmware { for vm in $(find $VM_LOCATION -name '*.vmx'); \ do echo -n "Backing up VMWare hosted machine - $vm ..."; \ # Get current state to return to after backup VM_STATE=`$VMWARE_CMD -q "$vm" getstate` if [ "$VM_STATE" == "on" ] ; then \ # Suspend the hosted virtual machine $VMWARE_CMD -q "$vm" suspend hard fi # Create tar ball of virtual machine $TAR -cvf "$vm.tar" "$vm" # Compress virtual machine file bk_compress "$vm.tar" && \ # FTP the tar ball bk_ftp "$vm.tar.bz2" && \ # Remove the file from the local server $RM "$vm.tar.bz2" && \ # Return virtual machine to previous state $VMWARE_CMD -q "$vm" start && \ echo "Ok" || \ echo "Failed"; \ done } # ------------------------------------------------------------------------------ # Perform a MySQL dump of all databases # ------------------------------------------------------------------------------ function do_mysql { for database in $($MYSQL -e "SHOW DATABASES" | $GREP "^\|" | $GREP -v Database); \ do echo -n "Backing up MySQL database - $database ..."; \ if [ "$database" == "$NETFLOW_DB" ]; then \ # Dump netflow database $MYSQLDUMP --user=$MYSQL_USERNAME --password=$MYSQL_PASSWORD --quick --force \ $database --table $NETFLOW_TBL > $database.$NETFLOW_TBL.$DATE_STAMP.mysql && \ # Compress netflow database bk_compress $database.$NETFLOW_TBL.$DATE_STAMP.mysql && \ # FTP netflow database bk_ftp $database.$NETFLOW_TBL.$DATE_STAMP.mysql.bz2 && \ # Remove the file from the local server $RM $database.$NETFLOW_TBL.$DATE_STAMP.mysql.bz2 && \ echo "Ok" || \ echo "Failed"; \ else # Dump database $MYSQLDUMP --user=$MYSQL_USERNAME --password=$MYSQL_PASSWORD --quick --force \ $database > $database.$DATE_STAMP.mysql && \ # Compress database bk_compress $database.$DATE_STAMP.mysql && \ # FTP database bk_ftp $database.$DATE_STAMP.mysql.bz2 && \ # Remove the file from the local server $RM $database.$DATE_STAMP.mysql.bz2 && \ echo "Ok" || \ echo "Failed"; \ fi done echo; echo; } # ------------------------------------------------------------------------------ # Perform a gbak of all InterBase databases # ------------------------------------------------------------------------------ function do_interbase { for filename in $($LS $INTERBASE_DB_LOCATION/*.gdb); \ do BACKUP_FILENAME=`$BASENAME $filename`; \ echo -n "Backing up InterBase database - $BACKUP_FILENAME ..."; \ # Backup the database $GBAK -b -user $INTERBASE_USERNAME -password $INTERBASE_PASSWORD \ localhost:/$filename $BACKUP_FILENAME.$DATE_STAMP.gbak && \ # Compress the database bk_compress $BACKUP_FILENAME.$DATE_STAMP.gbak && \ # FTP the database bk_ftp $BACKUP_FILENAME.$DATE_STAMP.gbak.bz2 && \ # Remove the file from the local server $RM $BACKUP_FILENAME.$DATE_STAMP.gbak.bz2 && \ echo "Ok" || \ echo "Failed"; \ done echo; echo; } # ------------------------------------------------------------------------------ # Perform a backup of the file system # ------------------------------------------------------------------------------ function do_files { for directory in $BACKUP_DIRECTORIES; do \ echo -n "Backing up files on - $directory ..."; \ # Create tar ball of directory DIRECTORY_NAME=${directory//\//-}; \ bk_dir $directory && \ # Compress the tar ball bk_compress $SERVER$DIRECTORY_NAME.$DATE_STAMP.tar && \ # FTP the tar ball bk_ftp $SERVER$DIRECTORY_NAME.$DATE_STAMP.tar.bz2 && \ # Remove the file from the local server $RM $SERVER$DIRECTORY_NAME.$DATE_STAMP.tar.bz2 && \ echo "Ok" || \ echo "Failed"; \ done echo; echo; } # ------------------------------------------------------------------------------ # Main script entry point # ------------------------------------------------------------------------------ do_mysql do_interbase do_vmware do_files # ------------------------------------------------------------------------------ # Perform cleanup # ------------------------------------------------------------------------------ cd / $RM -rf $BACKUP_DIR