well I was looking forward to preparing for disaster recovery in zimbra.I downloaded an open source backup script posted on the forum but I'm having some problem with it.the source code for the script is as follows:
Code:
#!/bin/bash
# This script will do various backups of Zimbra depending on wich you choose,
# most of them are cold backups except the msg backup which hot copies the 'store'
# folder for possible individual mail retrival. Be sure to change the variables below
# to point to where you got the zimbra folder and where you want it to be backed up to.
#
# This script must be run as root or a user with equal privileges or it will not work.
#
# Usage: ZimBackup.sh full - For full backup (Cold)
# ZimBackup.sh diff - For diffrential backup (Cold)
# ZimBackup.sh msgfull - For complete message backup (Hot)
# ZimBackup.sh msgdiff - For diffrential message backup (Hot)
#
# When you run this script via crontab be sure to add '> /dev/null 2>&1' at the end
# of the script like below or the tar command will fail for no apparent reason.
# 00 12 * * * ZimBackup.sh full > /dev/null 2>&1
#
# As of 2008-04-16 this script uses some extra software to extend this script,
# the scripts standard function will still function without these extra softwares but if you
# intend to use this scripts built in file transfer functions you must install the described software below.
#
# Required software: expect & any software dependencies for this package.
#
# Bits and pieces was adopted from a script created by Daniel W. Martin, 9 Sept 2007
# Free to use and free of any warranty! Marcus Uddenhed, 3 feb 2008
#
# Last updated: 2008-06-10
#### Global Settings ####
ZimInstPath=/opt # Installation path for Zimbra, exluding the zimbra folder.
ZimHome=zimbra # The Zimbra installation folder, exluding path to folder.
ZimBackupPath=/opt/backup # Backup folder where backup files should be placed.
ZimTempPath=/opt/backup/tmp # Temporary backup folder, should be placed as a subfolder to backup folder.
#### Log Settings ####
ZimLogEnable=no # Turns logging off or on.
ZimLogFileName=BackupZimbra.log # Log filename
ZimLogVerbose=no # Activates extra logging information
#### File Transfer Settings ####
# Enable Services (yes/no)
ZimFtpEnable=no # Enable/Disable ftp file transfer.
ZimScpEnable=no # Enable/Disable scp file transfer.
# Extra FTP Settings
ZimFtpOpt='' # Extra options for ftp file transfer, see manual for ftp command
# Extra SCP Settings
ZimScpOpt='' # Extra options for ftp file transfer, see manual for scp command
# Common Settings
ZimFilehostUser= # Username for file transfers
ZimFilehostPass= # Password for file transfers
ZimFilehostAddress= # Host address for file transfers
ZimFilehostFolder= # Folder on host where files will be placed during file transfer
#### File Delete Settings ####
ZimDeleteLocalFile=no # Enable/Disable backup file deletion efter sucessfull backup.
ZimDeleteTimeSet=0 # Set in minutes above 0 to keep a desired amount of files locally,
# be sure to match the time with your backup schedules.
##### Do not change anything below this line unless you know what you are doing #####
# Fetch backup type
ZimBackupType=$1
# Set filename for backup files
ZimFilenameSystemFull=ZimBackupSystemFull_`date +%Y%m%d%H%M`.tar.gz
ZimFilenameSystemDiff=ZimBackupSystemDiff_`date +%Y%m%d%H%M`.tar.gz
ZimFilenameMsgFull=ZimBackupMsgFull_`date +%Y%m%d%H%M`.tar.gz
ZimFilenameMsgDiff=ZimBackupMsgDiff_`date +%Y%m%d%H%M`.tar.gz
pre_check() {
# Check if expect is installed and file transfer is enabled, stops script if not
if [ $ZimFtpEnable = 'yes' ] || [ $ZimScpEnable = 'yes' ]
then
if [ ! -e /usr/bin/expect ]
then
echo "expect command is missing, this is required for file transfer options, script exiting..."
exit
fi
fi
# Create log file if not exist
if [ $ZimLogEnable = 'yes' ]
then
touch $ZimBackupPath/$ZimLogFileName
fi
# Check to see if the tmp folder exist, and create if not
mkdir -p $ZimTempPath
# Check which zimbra version that is installed, for recovery purpose
sudo -u zimbra $ZimInstPath/$ZimHome/bin/zmcontrol -v > $ZimTempPath/zimbra_version.txt
}
full_backup() {
if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ]
then
# Removing possible old zimbra backup folder
echo "`date +%Y%m%d%H%M%S` - Removing old backup folder from $ZimTempPath..." >> $ZimBackupPath/$ZimLogFileName
rm -r -f $ZimTempPath/$ZimHome >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Removing old backup folder from $ZimTempPath done" >> $ZimBackupPath/$ZimLogFileName
# Stopping Zimbra
echo "`date +%Y%m%d%H%M%S` - Zimbra services stopping..." >> $ZimBackupPath/$ZimLogFileName
/etc/init.d/zimbra stop >> $ZimBackupPath/$ZimLogFileName
sleep 20
echo "`date +%Y%m%d%H%M%S` - Zimbra services stopped." >> $ZimBackupPath/$ZimLogFileName
# Backing up zimbra folder
echo "`date +%Y%m%d%H%M%S` - Zimbra folder copying to backup..." >> $ZimBackupPath/$ZimLogFileName
cp -rv $ZimInstPath/$ZimHome $ZimTempPath/ >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Zimbra folder copied to backup." >> $ZimBackupPath/$ZimLogFileName
# Starting Zimbra
echo "`date +%Y%m%d%H%M%S` - Zimbra services starting..." >> $ZimBackupPath/$ZimLogFileName
/etc/init.d/zimbra start >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Zimbra services started." >> $ZimBackupPath/$ZimLogFileName
# Compressing backup for space reduction
echo "`date +%Y%m%d%H%M%S` - Compressing backup folder..." >> $ZimBackupPath/$ZimLogFileName
tar -zcvf $ZimBackupPath/$ZimFilenameSystemFull -C $ZimTempPath $ZimHome zimbra_version.txt >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Compressed backup folder." >> $ZimBackupPath/$ZimLogFileName
else
# Removing possible old zimbra backup folder
rm -r -f $ZimTempPath/$ZimHome
# Stopping Zimbra
/etc/init.d/zimbra stop
sleep 20
# Backing up zimbra folder
cp -rv $ZimInstPath/$ZimHome $ZimTempPath/
# Starting Zimbra
/etc/init.d/zimbra start
# Compressing backup for space reduction
tar -zcvf $ZimBackupPath/$ZimFilenameSystemFull -C $ZimTempPath $ZimHome zimbra_version.txt
fi
}
diff_backup() {
if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ]
then
# Hot sync before shutdown on zimbra folder
echo "`date +%Y%m%d%H%M%S` - Hot syncing to backup folder..." >> $ZimBackupPath/$ZimLogFileName
rsync -avHK --delete $ZimInstPath/$ZimHome $ZimTempPath/ >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Hot syncing to backup folder done." >> $ZimBackupPath/$ZimLogFileName
# Stopping Zimbra
echo "`date +%Y%m%d%H%M%S` - Zimbra services stopping..." >> $ZimBackupPath/$ZimLogFileName
/etc/init.d/zimbra stop >> $ZimBackupPath/$ZimLogFileName >> $ZimBackupPath/$ZimLogFileName
sleep 20
echo "`date +%Y%m%d%H%M%S` - Zimbra services stopped." >> $ZimBackupPath/$ZimLogFileName
# Cold sync of zimbra folder
echo "`date +%Y%m%d%H%M%S` - Cold syncing to backup folder..." >> $ZimBackupPath/$ZimLogFileName
rsync -avHK --delete $ZimInstPath/$ZimHome $ZimTempPath/ >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Cold syncing to backup folder done." >> $ZimBackupPath/$ZimLogFileName
# Starting Zimbra
echo "`date +%Y%m%d%H%M%S` - Zimbra services starting..." >> $ZimBackupPath/$ZimLogFileName
/etc/init.d/zimbra start >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Zimbra services started." >> $ZimBackupPath/$ZimLogFileName
# Compressing backup for space reduction and removing unpacked folder
echo "`date +%Y%m%d%H%M%S` - Compressing backup folder..." >> $ZimBackupPath/$ZimLogFileName
tar -zcvf $ZimBackupPath/$ZimFilenameSystemDiff -C $ZimTempPath $ZimHome zimbra_version.txt >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Compressed backup folder." >> $ZimBackupPath/$ZimLogFileName
else
# Hot sync before shutdown on zimbra folder
rsync -avHK --delete $ZimInstPath/$ZimHome $ZimTempPath/
# Stopping Zimbra
/etc/init.d/zimbra stop >> $ZimBackupPath/$ZimLogFileName
sleep 20
# Cold sync of zimbra folder
rsync -avHK --delete $ZimInstPath/$ZimHome $ZimTempPath/
# Starting Zimbra
/etc/init.d/zimbra start >> $ZimBackupPath/$ZimLogFileName
# Compressing backup for space reduction and removing unpacked folder
tar -zcvf $ZimBackupPath/$ZimFilenameSystemDiff -C $ZimTempPath $ZimHome zimbra_version.txt
fi
}
msgfull_backup() {
if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ]
then
# Removing possible old store backup folder
echo "`date +%Y%m%d%H%M%S` - Removing old backup folder from $ZimTempPath" >> $ZimBackupPath/$ZimLogFileName
rm -r -f $ZimTempPath/store >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Removing old backup folder from $ZimTempPath done" >> $ZimBackupPath/$ZimLogFileName
# Make dir for hot sync
echo "`date +%Y%m%d%H%M%S` - Creating backup folder..." >> $ZimBackupPath/$ZimLogFileName
mkdir -p $ZimTempPath/store >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Creating backup folder done." >> $ZimBackupPath/$ZimLogFileName
# Hot sync of mailbox messages
echo "`date +%Y%m%d%H%M%S` - Hot syncing to backup folder..." >> $ZimBackupPath/$ZimLogFileName
rsync -avHK --delete $ZimInstPath/$ZimHome/store/0 $ZimTempPath/store/ >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Hot syncing to backup folder done." >> $ZimBackupPath/$ZimLogFileName
# Compressing store folder for space reduction
echo "`date +%Y%m%d%H%M%S` - Compressing backup folder..." >> $ZimBackupPath/$ZimLogFileName
tar -zcvf $ZimBackupPath/$ZimFilenameMsgFull -C $ZimTempPath store zimbra_version.txt >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Compressed backup folder." >> $ZimBackupPath/$ZimLogFileName
else
# Removing possible old store backup folder
rm -r -f $ZimTempPath/store
# Make dir for hot sync
mkdir -p $ZimTempPath/store
# Hot sync of mailbox messages
rsync -avHK --delete $ZimInstPath/$ZimHome/store/0 $ZimTempPath/store/
# Compressing store folder for space reduction
tar -zcvf $ZimBackupPath/$ZimFilenameMsgFull -C $ZimTempPath store zimbra_version.txt
fi
}
msgdiff_backup() {
if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ]
then
# Make dir for hot sync
echo "`date +%Y%m%d%H%M%S` - Creating backup folder..." >> $ZimBackupPath/$ZimLogFileName
mkdir -p $ZimTempPath/store >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Creating backup folder done." >> $ZimBackupPath/$ZimLogFileName
# Hot sync of mailbox messages
echo "`date +%Y%m%d%H%M%S` - Hot syncing to backup folder..." >> $ZimBackupPath/$ZimLogFileName
rsync -avHK --delete $ZimInstPath/$ZimHome/store/0 $ZimTempPath/store/ >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Hot syncing to backup folder done." >> $ZimBackupPath/$ZimLogFileName
# Compressing store folder for space reduction
echo "`date +%Y%m%d%H%M%S` - Compressing backup folder..." >> $ZimBackupPath/$ZimLogFileName
tar -zcvf $ZimBackupPath/$ZimFilenameMsgDiff -C $ZimTempPath store zimbra_version.txt
echo "`date +%Y%m%d%H%M%S` - Compressed backup folder." >> $ZimBackupPath/$ZimLogFileName
else
# Make dir for hot sync
mkdir -p $ZimTempPath/store
# Hot sync of mailbox messages
rsync -avHK --delete $ZimInstPath/$ZimHome/store/0 $ZimTempPath/store/
# Compressing store folder for space reduction
tar -zcvf $ZimBackupPath/$ZimFilenameMsgDiff -C $ZimTempPath store zimbra_version.txt
fi
}
file_transfer() {
# Check which filename to use in file transfer
if [ $ZimBackupType == "full" ]
then
ZimFilenameTransfer=$ZimFilenameSystemFull
fi
if [ $ZimBackupType == "diff" ]
then
ZimFilenameTransfer=$ZimFilenameSystemDiff
fi
if [ $ZimBackupType == "msgfull" ]
then
ZimFilenameTransfer=$ZimFilenameMsgFull
fi
if [ $ZimBackupType == "msgdiff" ]
then
ZimFilenameTransfer=$ZimFilenameMsgDiff
fi
# Transfer with ftp
if [ $ZimFtpEnable == "yes" ]
then
if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ]
then
echo "`date +%Y%m%d%H%M%S` - Sending file via ftp to offsite storage..." >> $ZimBackupPath/$ZimLogFileName
# Make a temporary script for expect commands
touch $ZimTempPath/ftp.exp
# Fill script with commands
echo '#!/usr/bin/expect --' >> $ZimTempPath/ftp.exp
echo 'set timeout -1' >> $ZimTempPath/ftp.exp
echo 'spawn ftp '$ZimFilehostAddress >> $ZimTempPath/ftp.exp
echo 'expect ):' >> $ZimTempPath/ftp.exp
echo 'send '$ZimFilehostUser'\r' >> $ZimTempPath/ftp.exp
echo 'expect :' >> $ZimTempPath/ftp.exp
echo 'send '$ZimFilehostPass'\r' >> $ZimTempPath/ftp.exp
echo 'expect >' >> $ZimTempPath/ftp.exp
echo 'send '$ZimFtpOpt'\r' >> $ZimTempPath/ftp.exp
echo 'send "send '$ZimBackupPath/$ZimFilenameTransfer $ZimFilehostFolder/$ZimFilenameTransfer'\r"' >> $ZimTempPath/ftp.exp
echo 'expect >' >> $ZimTempPath/ftp.exp
echo 'send quit\r' >> $ZimTempPath/ftp.exp
echo 'expect closed' >> $ZimTempPath/ftp.exp
# Run expect with created script
expect $ZimTempPath/ftp.exp >> $ZimBackupPath/$ZimLogFileName
# Delete temporary expect script
rm $ZimTempPath/ftp.exp
echo "`date +%Y%m%d%H%M%S` - Sending file via ftp to offsite storage done." >> $ZimBackupPath/$ZimLogFileName
else
# Make a temporary script for expect commands
touch $ZimTempPath/ftp.exp
# Fill script with commands
echo '#!/usr/bin/expect --' >> $ZimTempPath/ftp.exp
echo 'set timeout -1' >> $ZimTempPath/ftp.exp
echo 'spawn ftp '$ZimFilehostAddress >> $ZimTempPath/ftp.exp
echo 'expect ):' >> $ZimTempPath/ftp.exp
echo 'send '$ZimFilehostUser'\r' >> $ZimTempPath/ftp.exp
echo 'expect :' >> $ZimTempPath/ftp.exp
echo 'send '$ZimFilehostPass'\r' >> $ZimTempPath/ftp.exp
echo 'expect >' >> $ZimTempPath/ftp.exp
echo 'send '$ZimFtpOpt'\r' >> $ZimTempPath/ftp.exp
echo 'send "send '$ZimBackupPath/$ZimFilenameTransfer $ZimFilehostFolder/$ZimFilenameTransfer'\r"' >> $ZimTempPath/ftp.exp
echo 'expect >' >> $ZimTempPath/ftp.exp
echo 'send quit\r' >> $ZimTempPath/ftp.exp
echo 'expect closed' >> $ZimTempPath/ftp.exp
# Run expect with created script
expect $ZimTempPath/ftp.exp
# Delete temporary expect script
rm $ZimTempPath/ftp.exp
fi
fi
# Transfer with scp
if [ $ZimScpEnable == "yes" ]
then
if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ]
then
echo "`date +%Y%m%d%H%M%S` - Sending file via scp to offsite storage..." >> $ZimBackupPath/$ZimLogFileName
# Make a temporary script for expect commands
touch $ZimTempPath/scp.exp
# Fill script with commands
echo '#!/usr/bin/expect --' >> $ZimTempPath/scp.exp
echo 'set timeout -1' >> $ZimTempPath/scp.exp
echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimFilenameTransfer $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimTempPath/scp.exp
echo 'expect :' >> $ZimTempPath/scp.exp
echo 'send '$ZimFilehostPass'\r' >> $ZimTempPath/scp.exp
echo 'expect closed' >> $ZimTempPath/scp.exp
# Run expect with created script
expect $ZimTempPath/scp.exp >> $ZimBackupPath/$ZimLogFileName
# Delete temporary expect script
rm $ZimTempPath/scp.exp
echo "`date +%Y%m%d%H%M%S` - Sending file via scp to offsite storage done." >> $ZimBackupPath/$ZimLogFileName
else
# Make a temporary script for expect commands
touch $ZimTempPath/scp.exp
# Fill script with commands
echo '#!/usr/bin/expect --' >> $ZimTempPath/scp.exp
echo 'set timeout -1' >> $ZimTempPath/scp.exp
echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimFilenameTransfer $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimTempPath/scp.exp
echo 'expect :' >> $ZimTempPath/scp.exp
echo 'send '$ZimFilehostPass'\r' >> $ZimTempPath/scp.exp
echo 'expect closed' >> $ZimTempPath/scp.exp
# Run expect with created script
expect $ZimTempPath/scp.exp
# Delete temporary expect script
rm $ZimTempPath/scp.exp
fi
fi
# Remove local file(s) if ZimDeleteLocalFile is set to 'yes'
if [ $ZimDeleteLocalFile == "yes" ]
then
if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ]
then
echo "`date +%Y%m%d%H%M%S` - Deleting local file(s)..." >> $ZimBackupPath/$ZimLogFileName
find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + >> $ZimBackupPath/$ZimLogFileName
echo "`date +%Y%m%d%H%M%S` - Deleting local file(s) done." >> $ZimBackupPath/$ZimLogFileName
else
find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} +
fi
fi
}
log_start() {
if [ $ZimLogEnable = 'yes' ]
then
echo "" >> $ZimBackupPath/$ZimLogFileName
echo "-------------------------------------------------------" >> $ZimBackupPath/$ZimLogFileName
echo "Backup Started: `date +%Y%m%d%H%M%S` Type: $ZimBackupType" >> $ZimBackupPath/$ZimLogFileName
fi
}
log_end() {
if [ $ZimLogEnable = 'yes' ]
then
echo "Backup Finished: `date +%Y%m%d%H%M%S` Type: $ZimBackupType" >> $ZimBackupPath/$ZimLogFileName
echo "-------------------------------------------------------" >> $ZimBackupPath/$ZimLogFileName
fi
}
case $1 in
full)
pre_check
log_start
full_backup
file_transfer
log_end
;;
diff)
pre_check
log_start
diff_backup
file_transfer
log_end
;;
msgfull)
pre_check
log_start
msgfull_backup
file_transfer
log_end
;;
msgdiff)
pre_check
log_start
msgdiff_backup
file_transfer
log_end
;;
*)
echo "Usage: ZimColdBackup.sh {full|diff|msgfull|msgdiff}"
;;
esac while running this script I'm facing the following Errors in the middle of the backup:
Code:
[:416: ==: unexpected operator
[:416: ==: unexpected operator
[:416: ==: unexpected operator
and the script stops abruptly...can anybody give a hand at this.also if we are to ftp the backup to a remote location ,how do we specify the paths in the scripts .ie proper format.
regards!