| /branches/1.0.x/changelog.txt |
|---|
| 0,0 → 1,33 |
| 2012-09-30 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (core): Added an option to temporarily disable off-site file transfer with "--no-send" parameter. |
| 2012-01-02 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (Logging): Added logging for file transfer in simple log mode. |
| 2011-04-21 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (core): Changed how Zimbra startup & shutdown is called within the script. |
| 2011-04-19 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (core): Reworked code for differential backups. |
| 2010-08-06 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (pre_check): Fixed wrong variable name for SCP checking. |
| 2010-07-10 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (Help): Fixed typo. |
| 2010-07-02 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (text): Fixed typo. |
| * changelog.txt (text): fixed wrong file format. |
| 2010-06-15 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (diff) fixed faulty differential backups. |
| /branches/1.0.x/license.txt |
|---|
| 0,0 → 1,20 |
| Copyright (c) 2011, oSource Development |
| All rights reserved. |
| Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: |
| * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. |
| * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer |
| in the documentation and/or other materials provided with the distribution. |
| * Neither the name of the oSource Development nor the names of its contributors may be used to endorse or promote products |
| derived from this software without specific prior written permission. |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
| BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
| SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| /branches/1.0.x/oZimbraBackup.sh |
|---|
| 0,0 → 1,746 |
| #!/bin/bash |
| # |
| # This script will do various backups of Zimbra depending on which you choose, |
| # most of them are cold backups except the msg backup which hot copies the 'store' |
| # folder for possible individual mail retrieval. 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. |
| # |
| # 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 * * * oZimbraBackup.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 software's but if you |
| # intend to use this scripts built in file transfer functions you must install the described software below. |
| # |
| # Required software: rsync for normal operation and ftp or scp & expect for file transfer capabillities. |
| # |
| # Bits and pieces was adopted from a script created by Daniel W. Martin, 9 Sept 2007 |
| # Licensed under BSDL license, see license.txt for information. |
| # |
| # Developer: oSource Development(as of 2009-07-01) |
| # DevTeam: Marcus Uddenhed |
| # Version: 1.0.6 |
| # Updated: 2014-05-18 16:00 |
| # |
| #### Global Settings #### |
| ZimInstPath=/opt # Installation path for Zimbra, excluding the Zimbra folder. |
| ZimHome=zimbra # The Zimbra installation folder, excluding path to folder. |
| ZimBackupPath=/opt/backup # Root folder for backup where backup files will be placed. |
| #### Log Settings #### |
| ZimLogEnable=yes # Turns logging on or off(yes/no). |
| ZimLogLogRotate=no # Enables log rotating(yes/no) |
| ZimLogRotateInt=day # How often should we rotate logs(day, week or month) |
| ZimLogPath=/opt/logs # Folder for log files |
| ZimLogVerbose=no # Activates extra logging information(yes/no) |
| #### File Transfer Settings #### |
| # Enable Services (yes/no) |
| ZimFtpEnable=no # Enable/Disable ftp file transfer(yes/no) |
| ZimScpEnable=no # Enable/Disable scp file transfer(yes/no) |
| # Extra FTP Settings |
| ZimFtpOpt='' # Extra options for ftp file transfer, see manual for ftp command |
| # Extra SCP Settings |
| ZimScpOpt='' # Extra options for scp 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 compressed backup file deletion after successful backup(yes/no) |
| 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 |
| pre_check() { |
| # Set default abort value |
| ZimAbort=0 |
| # Check for rsync |
| if [ ! -e /usr/bin/rsync ] |
| then |
| echo "Cannot find rsync software..." |
| ZimAbort=1 |
| fi |
| # Check for tar |
| if [ ! -e /bin/tar ] |
| then |
| echo "Cannot find tar software..." |
| ZimAbort=1 |
| fi |
| # Check for gzip |
| if [ ! -e /bin/gzip ] |
| then |
| if [ ! -e /usr/bin/gzip ] |
| then |
| echo "Cannot find gzip software..." |
| ZimAbort=1 |
| fi |
| fi |
| # Check if expect, ftp & scp is installed when file transfer is set to yes |
| if [ $ZimFtpEnable = 'yes' ] || [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/expect ] |
| then |
| echo "cannot find expect command..." |
| ZimAbort=1 |
| fi |
| if [ $ZimFtpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/ftp ] |
| then |
| echo "Cannot find ftp command..." |
| ZimAbort=1 |
| fi |
| fi |
| if [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/scp ] |
| then |
| echo "Cannot find scp command..." |
| ZimAbort=1 |
| fi |
| fi |
| fi |
| if [ $ZimAbort = '1' ] |
| then |
| echo "Please install above software, script exiting..." |
| exit |
| fi |
| } |
| pre_load() { |
| # Get temporary folder layout |
| temp_folders |
| # Get backup file format |
| backup_file |
| # Get log file format |
| log_file |
| # Check to see if the backup folder exist, create if not |
| mkdir -p $ZimBackupPath |
| # Check which zimbra version that is installed, for recovery purposes |
| sudo -u zimbra $ZimInstPath/$ZimHome/bin/zmcontrol -v > $ZimBackupPath/zimbra_version.txt |
| } |
| full_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..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressed backup folder." >> $ZimLogFile |
| # Cleaning differential folder. |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning differential backup folder..." |
| rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaned differential backup folder." |
| else |
| # Hot sync before shutdown on zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt |
| # Cleaning differential folder. |
| rm -r -f $ZimDiffTmpPath/* |
| fi |
| } |
| diff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| #rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Syncing backup folders |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders..." >> $ZimLogFile |
| #cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Hot sync before shutdown on zimbra folder |
| #rm -R $ZimDiffTmpPath/* |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Syncing files from diff to full backup folder |
| #cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt |
| fi |
| } |
| msgfull_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning differential backup folder..." |
| rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaned differential backup folder." |
| else |
| # Hot syncing to backup folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt |
| # Cleaning differential folder |
| rm -r -f $ZimMsgDiffTmpPath/* |
| fi |
| } |
| msgdiff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| #rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Cleaning backup folder |
| #rm -r -f $ZimMsgDiffTmpPath/* |
| # Hot syncing to backup folder |
| rsync -avHK --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt |
| fi |
| } |
| file_transfer() { |
| # Transfer with ftp |
| if [ $ZimFtpEnable == "yes" ] |
| then |
| if [ "$2" = "--no-send" ] |
| then |
| # If --no-send is set ignore sending file to off site. |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Backup not sending backup file to external storage, --no-send is set." >> $ZimLogFile |
| echo "Not sending backup to external storage, --no-send is set." |
| else |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage done." >> $ZimLogFile |
| else |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage done." >> $ZimLogFile |
| fi |
| fi |
| fi |
| # Transfer with scp |
| if [ $ZimScpEnable == "yes" ] |
| then |
| if [ "$2" = "--no-send" ] |
| then |
| # If --no-send is set ignore sending file to off site. |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Backup not sending backup file to external storage, --no-send is set." >> $ZimLogFile |
| echo "Not sending backup to external storage, --no-send is set." |
| else |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage done." >> $ZimLogFile |
| else |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage done." >> $ZimLogFile |
| fi |
| fi |
| fi |
| # Remove local file(s) if ZimDeleteLocalFile is set to 'yes' |
| if [ $ZimDeleteLocalFile == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s)..." >> $ZimLogFile |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s) done." >> $ZimLogFile |
| else |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + |
| fi |
| fi |
| } |
| log_start() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup start time to log |
| echo "" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| echo "Backup Started: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| fi |
| } |
| log_end() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup stop time to log |
| echo "Backup Finished: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| fi |
| } |
| zimbra_start() { |
| if [ "$2" = "--no-start" ] |
| then |
| # If --no-start is set ignore starting Zimbra |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services not starting, --no-start is set." >> $ZimLogFile |
| echo "Zimbra services not starting, --no-start is set." |
| else |
| # Starting Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services starting..." >> $ZimLogFile |
| # Starting Zimbra |
| su zimbra -c -l "zmcontrol start" >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services started." >> $ZimLogFile |
| else |
| # Starting Zimbra |
| su zimbra -c -l "zmcontrol start" |
| fi |
| fi |
| } |
| zimbra_stop() { |
| # Stopping Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopping..." >> $ZimLogFile |
| # Stopping Zimbra |
| su zimbra -c -l "zmcontrol stop" >> $ZimLogFile |
| # Sending task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopped." >> $ZimLogFile |
| # Sleep for 10 seconds to give shutdown some extra time before backup starts |
| sleep 10 |
| else |
| # Stopping Zimbra |
| su zimbra -c -l "zmcontrol stop" |
| # Sleep for 10 seconds to give shutdown some extra time before backup starts |
| sleep 10 |
| fi |
| } |
| full_restore() { |
| echo "Full Restore under development" |
| } |
| diff_restore() { |
| echo "Diff Restore under development" |
| } |
| backup_file() { |
| # Checks what backup is choosen and sets file-name appropiate |
| # Full system backup |
| if [ "$ZimBackupType" = "--full" ] |
| then |
| ZimBackupFile=ZimBackupSystemFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential system backup |
| if [ "$ZimBackupType" = "--diff" ] |
| then |
| ZimBackupFile=ZimBackupSystemDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Full message backup |
| if [ "$ZimBackupType" = "--msg-full" ] |
| then |
| ZimBackupFile=ZimBackupMsgFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential message backup |
| if [ "$ZimBackupType" = "--msg-diff" ] |
| then |
| ZimBackupFile=ZimBackupMsgDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| } |
| log_file() { |
| # Check to see if the log folder exist, create if not |
| mkdir -p $ZimLogPath |
| # Check log intervall and decide which file-name to use |
| if [ "$ZimLogLogRotate" = "yes" ] |
| then |
| # Set log file-name to day |
| if [ "$ZimLogRotateInt" = "day" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| fi |
| # Set log file-name to week |
| if [ "$ZimLogRotateInt" = "week" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| fi |
| # Set log file-name to month |
| if [ "$ZimLogRotateInt" = "month" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| fi |
| else |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackup.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackup.log |
| fi |
| } |
| temp_folders() { |
| # Create & set temp folders under $ZimBackupPath |
| ZimFullTmpPath=$ZimBackupPath/tf |
| ZimDiffTmpPath=$ZimBackupPath/td |
| ZimMsgFullTmpPath=$ZimBackupPath/tmf |
| ZimMsgDiffTmpPath=$ZimBackupPath/tmd |
| mkdir -p $ZimFullTmpPath |
| mkdir -p $ZimDiffTmpPath |
| mkdir -p $ZimMsgFullTmpPath |
| mkdir -p $ZimMsgDiffTmpPath |
| } |
| restore_guide() { |
| echo "Restore Guide" |
| } |
| script_help() { |
| # Show help for script |
| echo "oZimBackup.sh Usage:" |
| echo "" |
| echo "--full For full backup (Cold)" |
| echo "--diff For differential backup (Cold)" |
| echo "--msg-full For complete message backup (Hot)" |
| echo "--msg-diff For differential message backup (Hot)" |
| echo "--check Check if needed software is installed, depends" |
| echo " on script configuration" |
| echo "--restore-guide Shows a short guide on how to restore Zimbra" |
| #echo "--full-restore Does a complete restore" |
| #echo "--diff-restore Restores a differential backup" |
| echo "--help Shows this help" |
| echo "" |
| echo "--no-start Tells Zimbra to stay offline after backup" |
| #echo "<file to restore> File to restore from" |
| echo "" |
| echo "Ex. Full backup:" |
| echo " oZimBackup.sh --full" |
| echo "" |
| #echo "Ex. Complete restore:" |
| #echo " oZimBackup.sh --full-restore /path/to/file/zimbackup.tar.gz" |
| echo "" |
| echo "Ex. Full differential backup leaving Zimbra in offline mode:" |
| echo " oZimBackup.sh --diff --no-start" |
| echo "" |
| } |
| case $1 in |
| --full) |
| pre_check |
| pre_load |
| log_start |
| full_backup |
| file_transfer |
| log_end |
| ;; |
| --diff) |
| pre_check |
| pre_load |
| log_start |
| diff_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-full) |
| pre_check |
| pre_load |
| log_start |
| msgfull_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-diff) |
| pre_check |
| pre_load |
| log_start |
| msgdiff_backup |
| file_transfer |
| log_end |
| ;; |
| --full-restore) |
| full_restore |
| ;; |
| --diff-restore) |
| diff_restore |
| ;; |
| --restore-guide) |
| restore_guide |
| ;; |
| --check) |
| pre_check |
| ;; |
| --help) |
| script_help |
| ;; |
| *) |
| script_help |
| ;; |
| esac |
| /branches/1.0.x/readme.txt |
|---|
| 0,0 → 1,36 |
| oZimBackup v1.0.6 2012-09-30 |
| ---------------------------- |
| Overview: |
| --------- |
| oZimbraBackup is a backup script for Zimbra Collaboration Suite - Open Source Edition. |
| Purpose: |
| -------- |
| The ability to take different types of backup and sending them off site. |
| The script has the following features: |
| * Full backup. |
| * Differential backup. |
| * Full message store backup. |
| * Differential message store backup. |
| * Backup packaging. |
| * Off site transfer via SCP or FTP. |
| * Logging with log file rotation. |
| Notes: |
| ------ |
| This script utilize rsync, tar & gzip for basic functionality but needs scp, ftp & expect for file transfers. |
| The script is pre-configured with some basic options. Open up the script in a text editor of your choice and change the options to suite your needs. |
| Has been tested with version 7.1.1 of Zimbra Collaboration Suite - OSE but should even work with the latest 5.x and 6.x OSE branch. |
| Disclaimer: |
| ----------- |
| This software is released with the BSDL license and the license is in the license.txt file that should accompany this software. |
| Contact: |
| -------- |
| http://dev.osource.se/ |
| http://dev.osource.se/software/ozimbrabackup/ |
| /tags/1.0.0/oZimbraBackup_1.0.0.tar.gz |
|---|
| Cannot display: file marked as a binary type. |
| svn:mime-type = application/octet-stream |
| Property changes: |
| Added: svn:mime-type |
| +application/octet-stream |
| \ No newline at end of property |
| /tags/1.0.0/src/changelog.txt |
|---|
| 0,0 → 1,13 |
| oZimbraBackup.sh Version 1.0 (2010-06-15) |
| =============================================== |
| Our first versioned release. |
| Features: |
| * Full backup. |
| * Differential backup. |
| * Full message backup. |
| * Differential message backup. |
| * Logging cababilites. |
| * Offsite backup storage via FTP or SCP |
| Bugs: |
| * Our unversioned script had faulty differential backups. [Fixed] |
| /tags/1.0.0/src/license.txt |
|---|
| 0,0 → 1,20 |
| Copyright (c) 2010, oSource Development |
| All rights reserved. |
| Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: |
| * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. |
| * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer |
| in the documentation and/or other materials provided with the distribution. |
| * Neither the name of the oSource Development nor the names of its contributors may be used to endorse or promote products |
| derived from this software without specific prior written permission. |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
| BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
| SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| /tags/1.0.0/src/oZimbraBackup.sh |
|---|
| 0,0 → 1,700 |
| #!/bin/bash |
| # This script will do various backups of Zimbra depending on which you choose, |
| # most of them are cold backups except the msg backup which hot copies the 'store' |
| # folder for possible individual mail retrieval. 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. |
| # |
| # 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 * * * oZimBackup.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 software's but if you |
| # intend to use this scripts built in file transfer functions you must install the described software below. |
| # |
| # Required software: rsync for normal operation and ftp or scp & expect for file transfer capabillities. |
| # |
| # Bits and pieces was adopted from a script created by Daniel W. Martin, 9 Sept 2007 |
| # Licensed under BSDL license, see license.txt for information. |
| # |
| # Developer: oSource Development(as of 2009-07-01) |
| # DevTeam: Marcus Uddenhed |
| # Version: 1.0.0 |
| # Last updated: 2010-06-15 20:27 |
| #### Global Settings #### |
| ZimInstPath=/opt # Installation path for Zimbra, excluding the Zimbra folder. |
| ZimHome=zimbra # The Zimbra installation folder, excluding path to folder. |
| ZimBackupPath=/opt/backup # Root folder for backup where backup files will be placed. |
| #### Log Settings #### |
| ZimLogEnable=yes # Turns logging on or off(yes/no). |
| ZimLogLogRotate=no # Enables log rotating(yes/no) |
| ZimLogRotateInt=day # How often should we rotate logs(day, week or month) |
| ZimLogPath=/opt/logs # Folder for log files |
| ZimLogVerbose=no # Activates extra logging information(yes/no) |
| #### File Transfer Settings #### |
| # Enable Services (yes/no) |
| ZimFtpEnable=no # Enable/Disable ftp file transfer(yes/no) |
| ZimScpEnable=no # Enable/Disable scp file transfer(yes/no) |
| # 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 compressed backup file deletion after successful backup(yes/no) |
| 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 |
| pre_check() { |
| # Set default abort value |
| ZimAbort=0 |
| # Check for rsync |
| if [ ! -e /usr/bin/rsync ] |
| then |
| echo "Cannot find rsync software..." |
| ZimAbort=1 |
| fi |
| # Check for tar |
| if [ ! -e /bin/tar ] |
| then |
| echo "Cannot find tar software..." |
| ZimAbort=1 |
| fi |
| # Check for gzip |
| if [ ! -e /bin/gzip ] |
| then |
| if [ ! -e /usr/bin/gzip ] |
| then |
| echo "Cannot find gzip software..." |
| ZimAbort=1 |
| fi |
| fi |
| # Check if expect, ftp & scp is installed when file transfer is set to yes |
| if [ $ZimFtpEnable = 'yes' ] || [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/expect ] |
| then |
| echo "cannot find expect command..." |
| ZimAbort=1 |
| fi |
| if [ $ZimFtpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/ftp ] |
| then |
| echo "Cannot find ftp command..." |
| ZimAbort=1 |
| fi |
| fi |
| if [ $ZimFtpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/scp ] |
| then |
| echo "Cannot find scp command..." |
| ZimAbort=1 |
| fi |
| fi |
| fi |
| if [ $ZimAbort = '1' ] |
| then |
| echo "Please install above software, script exiting..." |
| exit |
| fi |
| } |
| pre_load() { |
| # Get temporary folder layout |
| temp_folders |
| # Get backup file format |
| backup_file |
| # Get log file format |
| log_file |
| # Check to see if the backup folder exist, create if not |
| mkdir -p $ZimBackupPath |
| # Check which zimbra version that is installed, for recovery purposes |
| sudo -u zimbra $ZimInstPath/$ZimHome/bin/zmcontrol -v > $ZimBackupPath/zimbra_version.txt |
| } |
| full_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..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressed backup folder." >> $ZimLogFile |
| else |
| # Hot sync before shutdown on zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt |
| fi |
| } |
| diff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Syncing backup folders |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders..." >> $ZimLogFile |
| cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Hot sync before shutdown on zimbra folder |
| rm -R $ZimDiffTmpPath/* |
| rsync -avHK --delete --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --delete --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Syncing files from diff to full backup folder |
| cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt |
| fi |
| } |
| msgfull_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Hot syncing to backup folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt |
| fi |
| } |
| msgdiff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Cleaning backup folder |
| rm -r -f $ZimMsgDiffTmpPath/* |
| # Hot syncing to backup folder |
| rsync -avHK --delete --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt |
| fi |
| } |
| file_transfer() { |
| # Transfer with ftp |
| if [ $ZimFtpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage done." >> $ZimLogFile |
| else |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| fi |
| fi |
| # Transfer with scp |
| if [ $ZimScpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage done." >> $ZimLogFile |
| else |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| fi |
| fi |
| # Remove local file(s) if ZimDeleteLocalFile is set to 'yes' |
| if [ $ZimDeleteLocalFile == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s)..." >> $ZimLogFile |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s) done." >> $ZimLogFile |
| else |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + |
| fi |
| fi |
| } |
| log_start() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup start time to log |
| echo "" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| echo "Backup Started: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| fi |
| } |
| log_end() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup stop time to log |
| echo "Backup Finished: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| fi |
| } |
| zimbra_start() { |
| if [ "$2" = "--no-start" ] |
| then |
| # If --no-start is set ignore starting Zimbra |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services not starting, --no-start is set." >> $ZimLogFile |
| echo "Zimbra services not starting, --no-start is set." |
| else |
| # Starting Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services starting..." >> $ZimLogFile |
| # Starting Zimbra |
| sudo -u zimbra /opt/zimbra/bin/zmcontrol start >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services started." >> $ZimLogFile |
| else |
| # Starting Zimbra |
| sudo -u zimbra /opt/zimbra/bin/zmcontrol start |
| fi |
| fi |
| } |
| zimbra_stop() { |
| # Stopping Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopping..." >> $ZimLogFile |
| # Stopping Zimbra |
| #/etc/init.d/zimbra stop >> $ZimLogFile |
| sudo -u zimbra /opt/zimbra/bin/zmcontrol stop >> $ZimLogFile |
| # Sending task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopped." >> $ZimLogFile |
| # Sleep for to give shutdown some extra time before backup starts |
| sleep 10 |
| else |
| # Stopping Zimbra |
| sudo -u zimbra /opt/zimbra/bin/zmcontrol stop |
| fi |
| } |
| full_restore() { |
| echo "Full Restore under development" |
| } |
| diff_restore() { |
| echo "Diff Restore under development" |
| } |
| backup_file() { |
| # Checks what backup is choosen and sets file-name appropiate |
| # Full system backup |
| if [ "$ZimBackupType" = "--full" ] |
| then |
| ZimBackupFile=ZimBackupSystemFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential system backup |
| if [ "$ZimBackupType" = "--diff" ] |
| then |
| ZimBackupFile=ZimBackupSystemDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Full message backup |
| if [ "$ZimBackupType" = "--msg-full" ] |
| then |
| ZimBackupFile=ZimBackupMsgFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential message backup |
| if [ "$ZimBackupType" = "--msg-diff" ] |
| then |
| ZimBackupFile=ZimBackupMsgDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| } |
| log_file() { |
| # Check to see if the log folder exist, create if not |
| mkdir -p $ZimLogPath |
| # Check log intervall and decide which file-name to use |
| if [ "$ZimLogLogRotate" = "yes" ] |
| then |
| # Set log file-name to day |
| if [ "$ZimLogRotateInt" = "day" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| fi |
| # Set log file-name to week |
| if [ "$ZimLogRotateInt" = "week" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| fi |
| # Set log file-name to month |
| if [ "$ZimLogRotateInt" = "month" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| fi |
| else |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackup.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackup.log |
| fi |
| } |
| temp_folders() { |
| # Create & set temp folders under $ZimBackupPath |
| ZimFullTmpPath=$ZimBackupPath/tf |
| ZimDiffTmpPath=$ZimBackupPath/td |
| ZimMsgFullTmpPath=$ZimBackupPath/tmf |
| ZimMsgDiffTmpPath=$ZimBackupPath/tmd |
| mkdir -p $ZimFullTmpPath |
| mkdir -p $ZimDiffTmpPath |
| mkdir -p $ZimMsgFullTmpPath |
| mkdir -p $ZimMsgDiffTmpPath |
| } |
| restore_guide() { |
| echo "Restore Guide" |
| } |
| script_help() { |
| # Show help for script |
| echo "oZimBackup.sh Usage:" |
| echo "" |
| echo "--full For full backup (Cold)" |
| echo "--diff For differential backup (Cold)" |
| echo "--msg-full For complete message backup (Hot)" |
| echo "--msg-diff For differential message backup (Hot)" |
| echo "--check Check if needed software is installed, depends" |
| echo " on script configuration" |
| echo "--restore-guide Shows a short guide on how to restore Zimbra" |
| #echo "--full-restore Does a complete restore" |
| #echo "--diff-restore Restores a differential backup" |
| echo "--help Shows this help" |
| echo "" |
| echo "--no-start Tells Zimbra to stay offline after backup" |
| #echo "<file to restore> File to restore from" |
| echo "" |
| echo "Ex. Full backup:" |
| echo " oZimBackup.sh --full" |
| echo "" |
| #echo "Ex. Complete restore:" |
| #echo " oZimBackup.sh --full-restore /path/to/file/zimbackup.tar.gz" |
| echo "" |
| echo "Ex. Full differential backup leaving Zimbra in offline mode:" |
| echo " oZimBackup.sh --diff --no-start" |
| echo "" |
| } |
| case $1 in |
| --full) |
| pre_check |
| pre_load |
| log_start |
| full_backup |
| file_transfer |
| log_end |
| ;; |
| --diff) |
| pre_check |
| pre_load |
| log_start |
| diff_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-full) |
| pre_check |
| pre_load |
| log_start |
| msgfull_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-diff) |
| pre_check |
| pre_load |
| log_start |
| msgdiff_backup |
| file_transfer |
| log_end |
| ;; |
| --full-restore) |
| full_restore |
| ;; |
| --diff-restore) |
| diff_restore |
| ;; |
| --restore-guide) |
| restore_guide |
| ;; |
| --check) |
| pre_check |
| ;; |
| --help) |
| script_help |
| ;; |
| *) |
| script_help |
| ;; |
| esac |
| /tags/1.0.0/src/readme.txt |
|---|
| 0,0 → 1,57 |
| oZimBackup v1.0.0 |
| ----------------- |
| 1. About. |
| 2. Requirements. |
| 3. Installation. |
| 4. Backup Scheduling. |
| 5. Support. |
| 1. About. |
| --------- |
| oZimbraBackup is a backup script for Zimbra Collaboration Suite - Open Source Edition. |
| The main functionality is the ability to take different types of backup and sending them off site. |
| The script has the following features: |
| * Full backup. |
| * Differential backup. |
| * Full message store backup. |
| * Differential message store backup. |
| * Backup packaging. |
| * Off site transfer via SCP or FTP. |
| * Logging with log file rotation. |
| The script is pre-configured with some basic options. Open up the script in a text editor of your choice and change the options to suite your needs. |
| The script has been tested with version 6.0.6 of Zimbra Collaboration Suite - OSE but should even work with the latest 5.x OSE branch. |
| 2. Requirements. |
| ---------------- |
| This script utilize rsync, tar & gzip for basic functionality but needs scp, ftp & expect for file transfers. |
| 3. Installation. |
| ---------------- |
| To install this script, simply put it where you want it and add it to crontab, make sure it is executable. |
| You can make it executable by doing this as root: |
| chmod +x oZimBackup.sh |
| 4. Backup Scheduling. |
| --------------------- |
| The scheduling of backups is highly individual depending on server load, amount of users a.s.o. |
| Some possible examples of scheduling with crontab: |
| # m h dom mon dow command |
| 00 3 * * * /opt/scripts/oZimbraBackup.sh --full > /dev/null 2>&1 |
| 00 12 * * * /opt/scripts/oZimbraBackup.sh --msg-full > /dev/null 2>&1 |
| 00 6,16,23 * * * /opt/scripts/oZimbraBackup.sh --msg-diff > /dev/null 2>&1 |
| 5. Support. |
| ----------- |
| Visit us at http://dev.osource.se/ for support and bug reporting. |
| /tags/1.0.1/oZimbraBackup_1.0.1.tar.gz |
|---|
| Cannot display: file marked as a binary type. |
| svn:mime-type = application/octet-stream |
| Property changes: |
| Added: svn:mime-type |
| +application/octet-stream |
| \ No newline at end of property |
| /tags/1.0.1/src/changelog.txt |
|---|
| 0,0 → 1,17 |
| 2010-08-06 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.se (pre_check): Fixed wrong variable name for SCP checking. |
| 2010-07-10 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (Help): Fixed typo. |
| 2010-07-02 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (text): Fixed typo. |
| * changelog.txt (text): fixed wrong file format. |
| 2010-06-15 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (diff) fixed faulty differential backups. |
| /tags/1.0.1/src/license.txt |
|---|
| 0,0 → 1,20 |
| Copyright (c) 2010, oSource Development |
| All rights reserved. |
| Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: |
| * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. |
| * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer |
| in the documentation and/or other materials provided with the distribution. |
| * Neither the name of the oSource Development nor the names of its contributors may be used to endorse or promote products |
| derived from this software without specific prior written permission. |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
| BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
| SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| /tags/1.0.1/src/oZimbraBackup.sh |
|---|
| 0,0 → 1,700 |
| #!/bin/bash |
| # This script will do various backups of Zimbra depending on which you choose, |
| # most of them are cold backups except the msg backup which hot copies the 'store' |
| # folder for possible individual mail retrieval. 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. |
| # |
| # 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 * * * oZimbraBackup.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 software's but if you |
| # intend to use this scripts built in file transfer functions you must install the described software below. |
| # |
| # Required software: rsync for normal operation and ftp or scp & expect for file transfer capabillities. |
| # |
| # Bits and pieces was adopted from a script created by Daniel W. Martin, 9 Sept 2007 |
| # Licensed under BSDL license, see license.txt for information. |
| # |
| # Developer: oSource Development(as of 2009-07-01) |
| # DevTeam: Marcus Uddenhed |
| # Version: 1.0.1 |
| # Last updated: 2010-08-06 11:13 |
| #### Global Settings #### |
| ZimInstPath=/opt # Installation path for Zimbra, excluding the Zimbra folder. |
| ZimHome=zimbra # The Zimbra installation folder, excluding path to folder. |
| ZimBackupPath=/opt/backup # Root folder for backup where backup files will be placed. |
| #### Log Settings #### |
| ZimLogEnable=yes # Turns logging on or off(yes/no). |
| ZimLogLogRotate=no # Enables log rotating(yes/no) |
| ZimLogRotateInt=day # How often should we rotate logs(day, week or month) |
| ZimLogPath=/opt/logs # Folder for log files |
| ZimLogVerbose=no # Activates extra logging information(yes/no) |
| #### File Transfer Settings #### |
| # Enable Services (yes/no) |
| ZimFtpEnable=no # Enable/Disable ftp file transfer(yes/no) |
| ZimScpEnable=no # Enable/Disable scp file transfer(yes/no) |
| # Extra FTP Settings |
| ZimFtpOpt='' # Extra options for ftp file transfer, see manual for ftp command |
| # Extra SCP Settings |
| ZimScpOpt='' # Extra options for scp 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 compressed backup file deletion after successful backup(yes/no) |
| 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 |
| pre_check() { |
| # Set default abort value |
| ZimAbort=0 |
| # Check for rsync |
| if [ ! -e /usr/bin/rsync ] |
| then |
| echo "Cannot find rsync software..." |
| ZimAbort=1 |
| fi |
| # Check for tar |
| if [ ! -e /bin/tar ] |
| then |
| echo "Cannot find tar software..." |
| ZimAbort=1 |
| fi |
| # Check for gzip |
| if [ ! -e /bin/gzip ] |
| then |
| if [ ! -e /usr/bin/gzip ] |
| then |
| echo "Cannot find gzip software..." |
| ZimAbort=1 |
| fi |
| fi |
| # Check if expect, ftp & scp is installed when file transfer is set to yes |
| if [ $ZimFtpEnable = 'yes' ] || [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/expect ] |
| then |
| echo "cannot find expect command..." |
| ZimAbort=1 |
| fi |
| if [ $ZimFtpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/ftp ] |
| then |
| echo "Cannot find ftp command..." |
| ZimAbort=1 |
| fi |
| fi |
| if [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/scp ] |
| then |
| echo "Cannot find scp command..." |
| ZimAbort=1 |
| fi |
| fi |
| fi |
| if [ $ZimAbort = '1' ] |
| then |
| echo "Please install above software, script exiting..." |
| exit |
| fi |
| } |
| pre_load() { |
| # Get temporary folder layout |
| temp_folders |
| # Get backup file format |
| backup_file |
| # Get log file format |
| log_file |
| # Check to see if the backup folder exist, create if not |
| mkdir -p $ZimBackupPath |
| # Check which zimbra version that is installed, for recovery purposes |
| sudo -u zimbra $ZimInstPath/$ZimHome/bin/zmcontrol -v > $ZimBackupPath/zimbra_version.txt |
| } |
| full_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..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressed backup folder." >> $ZimLogFile |
| else |
| # Hot sync before shutdown on zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt |
| fi |
| } |
| diff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Syncing backup folders |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders..." >> $ZimLogFile |
| cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Hot sync before shutdown on zimbra folder |
| rm -R $ZimDiffTmpPath/* |
| rsync -avHK --delete --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --delete --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Syncing files from diff to full backup folder |
| cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt |
| fi |
| } |
| msgfull_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Hot syncing to backup folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt |
| fi |
| } |
| msgdiff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Cleaning backup folder |
| rm -r -f $ZimMsgDiffTmpPath/* |
| # Hot syncing to backup folder |
| rsync -avHK --delete --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt |
| fi |
| } |
| file_transfer() { |
| # Transfer with ftp |
| if [ $ZimFtpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage done." >> $ZimLogFile |
| else |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| fi |
| fi |
| # Transfer with scp |
| if [ $ZimScpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage done." >> $ZimLogFile |
| else |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| fi |
| fi |
| # Remove local file(s) if ZimDeleteLocalFile is set to 'yes' |
| if [ $ZimDeleteLocalFile == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s)..." >> $ZimLogFile |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s) done." >> $ZimLogFile |
| else |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + |
| fi |
| fi |
| } |
| log_start() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup start time to log |
| echo "" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| echo "Backup Started: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| fi |
| } |
| log_end() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup stop time to log |
| echo "Backup Finished: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| fi |
| } |
| zimbra_start() { |
| if [ "$2" = "--no-start" ] |
| then |
| # If --no-start is set ignore starting Zimbra |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services not starting, --no-start is set." >> $ZimLogFile |
| echo "Zimbra services not starting, --no-start is set." |
| else |
| # Starting Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services starting..." >> $ZimLogFile |
| # Starting Zimbra |
| sudo -u zimbra /opt/zimbra/bin/zmcontrol start >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services started." >> $ZimLogFile |
| else |
| # Starting Zimbra |
| sudo -u zimbra /opt/zimbra/bin/zmcontrol start |
| fi |
| fi |
| } |
| zimbra_stop() { |
| # Stopping Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopping..." >> $ZimLogFile |
| # Stopping Zimbra |
| #/etc/init.d/zimbra stop >> $ZimLogFile |
| sudo -u zimbra /opt/zimbra/bin/zmcontrol stop >> $ZimLogFile |
| # Sending task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopped." >> $ZimLogFile |
| # Sleep for to give shutdown some extra time before backup starts |
| sleep 10 |
| else |
| # Stopping Zimbra |
| sudo -u zimbra /opt/zimbra/bin/zmcontrol stop |
| fi |
| } |
| full_restore() { |
| echo "Full Restore under development" |
| } |
| diff_restore() { |
| echo "Diff Restore under development" |
| } |
| backup_file() { |
| # Checks what backup is choosen and sets file-name appropiate |
| # Full system backup |
| if [ "$ZimBackupType" = "--full" ] |
| then |
| ZimBackupFile=ZimBackupSystemFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential system backup |
| if [ "$ZimBackupType" = "--diff" ] |
| then |
| ZimBackupFile=ZimBackupSystemDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Full message backup |
| if [ "$ZimBackupType" = "--msg-full" ] |
| then |
| ZimBackupFile=ZimBackupMsgFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential message backup |
| if [ "$ZimBackupType" = "--msg-diff" ] |
| then |
| ZimBackupFile=ZimBackupMsgDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| } |
| log_file() { |
| # Check to see if the log folder exist, create if not |
| mkdir -p $ZimLogPath |
| # Check log intervall and decide which file-name to use |
| if [ "$ZimLogLogRotate" = "yes" ] |
| then |
| # Set log file-name to day |
| if [ "$ZimLogRotateInt" = "day" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| fi |
| # Set log file-name to week |
| if [ "$ZimLogRotateInt" = "week" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| fi |
| # Set log file-name to month |
| if [ "$ZimLogRotateInt" = "month" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| fi |
| else |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackup.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackup.log |
| fi |
| } |
| temp_folders() { |
| # Create & set temp folders under $ZimBackupPath |
| ZimFullTmpPath=$ZimBackupPath/tf |
| ZimDiffTmpPath=$ZimBackupPath/td |
| ZimMsgFullTmpPath=$ZimBackupPath/tmf |
| ZimMsgDiffTmpPath=$ZimBackupPath/tmd |
| mkdir -p $ZimFullTmpPath |
| mkdir -p $ZimDiffTmpPath |
| mkdir -p $ZimMsgFullTmpPath |
| mkdir -p $ZimMsgDiffTmpPath |
| } |
| restore_guide() { |
| echo "Restore Guide" |
| } |
| script_help() { |
| # Show help for script |
| echo "oZimBackup.sh Usage:" |
| echo "" |
| echo "--full For full backup (Cold)" |
| echo "--diff For differential backup (Cold)" |
| echo "--msg-full For complete message backup (Hot)" |
| echo "--msg-diff For differential message backup (Hot)" |
| echo "--check Check if needed software is installed, depends" |
| echo " on script configuration" |
| echo "--restore-guide Shows a short guide on how to restore Zimbra" |
| #echo "--full-restore Does a complete restore" |
| #echo "--diff-restore Restores a differential backup" |
| echo "--help Shows this help" |
| echo "" |
| echo "--no-start Tells Zimbra to stay offline after backup" |
| #echo "<file to restore> File to restore from" |
| echo "" |
| echo "Ex. Full backup:" |
| echo " oZimBackup.sh --full" |
| echo "" |
| #echo "Ex. Complete restore:" |
| #echo " oZimBackup.sh --full-restore /path/to/file/zimbackup.tar.gz" |
| echo "" |
| echo "Ex. Full differential backup leaving Zimbra in offline mode:" |
| echo " oZimBackup.sh --diff --no-start" |
| echo "" |
| } |
| case $1 in |
| --full) |
| pre_check |
| pre_load |
| log_start |
| full_backup |
| file_transfer |
| log_end |
| ;; |
| --diff) |
| pre_check |
| pre_load |
| log_start |
| diff_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-full) |
| pre_check |
| pre_load |
| log_start |
| msgfull_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-diff) |
| pre_check |
| pre_load |
| log_start |
| msgdiff_backup |
| file_transfer |
| log_end |
| ;; |
| --full-restore) |
| full_restore |
| ;; |
| --diff-restore) |
| diff_restore |
| ;; |
| --restore-guide) |
| restore_guide |
| ;; |
| --check) |
| pre_check |
| ;; |
| --help) |
| script_help |
| ;; |
| *) |
| script_help |
| ;; |
| esac |
| /tags/1.0.1/src/readme.txt |
|---|
| 0,0 → 1,40 |
| oZimBackup v1.0.1 2010-07-02 |
| ---------------------------- |
| Overview: |
| --------- |
| oZimbraBackup is a backup script for Zimbra Collaboration Suite - Open Source Edition. |
| Purpose: |
| -------- |
| The ability to take different types of backup and sending them off site. |
| The script has the following features: |
| * Full backup. |
| * Differential backup. |
| * Full message store backup. |
| * Differential message store backup. |
| * Backup packaging. |
| * Off site transfer via SCP or FTP. |
| * Logging with log file rotation. |
| Issue Summary: |
| -------------- |
| No issues at this time. |
| Notes: |
| ------ |
| This script utilize rsync, tar & gzip for basic functionality but needs scp, ftp & expect for file transfers. |
| The script is pre-configured with some basic options. Open up the script in a text editor of your choice and change the options to suite your needs. |
| Has been tested with version 6.0.7 of Zimbra Collaboration Suite - OSE but should even work with the latest 5.x OSE branch. |
| Disclaimer: |
| ----------- |
| This software is released with the BSDL license and the license is in the license.txt file that should accompany this software. |
| Contact: |
| -------- |
| http://dev.osource.se/ |
| http://dev.osource.se/software/ozimbrabackup/ |
| /tags/1.0.3/oZimbraBackup_1.0.3.tar.gz |
|---|
| Cannot display: file marked as a binary type. |
| svn:mime-type = application/octet-stream |
| Property changes: |
| Added: svn:mime-type |
| +application/octet-stream |
| \ No newline at end of property |
| /tags/1.0.3/src/changelog.txt |
|---|
| 0,0 → 1,21 |
| 2011-04-19 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (core): Reworked code for differential backups. |
| 2010-08-06 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (pre_check): Fixed wrong variable name for SCP checking. |
| 2010-07-10 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (Help): Fixed typo. |
| 2010-07-02 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (text): Fixed typo. |
| * changelog.txt (text): fixed wrong file format. |
| 2010-06-15 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (diff) fixed faulty differential backups. |
| /tags/1.0.3/src/license.txt |
|---|
| 0,0 → 1,20 |
| Copyright (c) 2010, oSource Development |
| All rights reserved. |
| Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: |
| * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. |
| * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer |
| in the documentation and/or other materials provided with the distribution. |
| * Neither the name of the oSource Development nor the names of its contributors may be used to endorse or promote products |
| derived from this software without specific prior written permission. |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
| BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
| SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| /tags/1.0.3/src/oZimbraBackup.sh |
|---|
| 0,0 → 1,717 |
| #!/bin/bash |
| # This script will do various backups of Zimbra depending on which you choose, |
| # most of them are cold backups except the msg backup which hot copies the 'store' |
| # folder for possible individual mail retrieval. 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. |
| # |
| # 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 * * * oZimbraBackup.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 software's but if you |
| # intend to use this scripts built in file transfer functions you must install the described software below. |
| # |
| # Required software: rsync for normal operation and ftp or scp & expect for file transfer capabillities. |
| # |
| # Bits and pieces was adopted from a script created by Daniel W. Martin, 9 Sept 2007 |
| # Licensed under BSDL license, see license.txt for information. |
| # |
| # Developer: oSource Development(as of 2009-07-01) |
| # DevTeam: Marcus Uddenhed |
| # Version: 1.0.3 |
| # Last updated: 2011-04-19 09:35 |
| #### Global Settings #### |
| ZimInstPath=/opt # Installation path for Zimbra, excluding the Zimbra folder. |
| ZimHome=zimbra # The Zimbra installation folder, excluding path to folder. |
| ZimBackupPath=/opt/backup # Root folder for backup where backup files will be placed. |
| #### Log Settings #### |
| ZimLogEnable=yes # Turns logging on or off(yes/no). |
| ZimLogLogRotate=no # Enables log rotating(yes/no) |
| ZimLogRotateInt=day # How often should we rotate logs(day, week or month) |
| ZimLogPath=/opt/logs # Folder for log files |
| ZimLogVerbose=no # Activates extra logging information(yes/no) |
| #### File Transfer Settings #### |
| # Enable Services (yes/no) |
| ZimFtpEnable=no # Enable/Disable ftp file transfer(yes/no) |
| ZimScpEnable=no # Enable/Disable scp file transfer(yes/no) |
| # Extra FTP Settings |
| ZimFtpOpt='' # Extra options for ftp file transfer, see manual for ftp command |
| # Extra SCP Settings |
| ZimScpOpt='' # Extra options for scp 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 compressed backup file deletion after successful backup(yes/no) |
| 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 |
| pre_check() { |
| # Set default abort value |
| ZimAbort=0 |
| # Check for rsync |
| if [ ! -e /usr/bin/rsync ] |
| then |
| echo "Cannot find rsync software..." |
| ZimAbort=1 |
| fi |
| # Check for tar |
| if [ ! -e /bin/tar ] |
| then |
| echo "Cannot find tar software..." |
| ZimAbort=1 |
| fi |
| # Check for gzip |
| if [ ! -e /bin/gzip ] |
| then |
| if [ ! -e /usr/bin/gzip ] |
| then |
| echo "Cannot find gzip software..." |
| ZimAbort=1 |
| fi |
| fi |
| # Check if expect, ftp & scp is installed when file transfer is set to yes |
| if [ $ZimFtpEnable = 'yes' ] || [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/expect ] |
| then |
| echo "cannot find expect command..." |
| ZimAbort=1 |
| fi |
| if [ $ZimFtpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/ftp ] |
| then |
| echo "Cannot find ftp command..." |
| ZimAbort=1 |
| fi |
| fi |
| if [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/scp ] |
| then |
| echo "Cannot find scp command..." |
| ZimAbort=1 |
| fi |
| fi |
| fi |
| if [ $ZimAbort = '1' ] |
| then |
| echo "Please install above software, script exiting..." |
| exit |
| fi |
| } |
| pre_load() { |
| # Get temporary folder layout |
| temp_folders |
| # Get backup file format |
| backup_file |
| # Get log file format |
| log_file |
| # Check to see if the backup folder exist, create if not |
| mkdir -p $ZimBackupPath |
| # Check which zimbra version that is installed, for recovery purposes |
| sudo -u zimbra $ZimInstPath/$ZimHome/bin/zmcontrol -v > $ZimBackupPath/zimbra_version.txt |
| } |
| full_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..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressed backup folder." >> $ZimLogFile |
| # Cleaning differential folder. |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning differential backup folder..." |
| rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaned differential backup folder." |
| else |
| # Hot sync before shutdown on zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt |
| # Cleaning differential folder. |
| rm -r -f $ZimDiffTmpPath/* |
| fi |
| } |
| diff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| #rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Syncing backup folders |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders..." >> $ZimLogFile |
| #cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Hot sync before shutdown on zimbra folder |
| #rm -R $ZimDiffTmpPath/* |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Syncing files from diff to full backup folder |
| #cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt |
| fi |
| } |
| msgfull_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning differential backup folder..." |
| rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaned differential backup folder." |
| else |
| # Hot syncing to backup folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt |
| # Cleaning differential folder |
| rm -r -f $ZimMsgDiffTmpPath/* |
| fi |
| } |
| msgdiff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| #rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Cleaning backup folder |
| #rm -r -f $ZimMsgDiffTmpPath/* |
| # Hot syncing to backup folder |
| rsync -avHK --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt |
| fi |
| } |
| file_transfer() { |
| # Transfer with ftp |
| if [ $ZimFtpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage done." >> $ZimLogFile |
| else |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| fi |
| fi |
| # Transfer with scp |
| if [ $ZimScpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage done." >> $ZimLogFile |
| else |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| fi |
| fi |
| # Remove local file(s) if ZimDeleteLocalFile is set to 'yes' |
| if [ $ZimDeleteLocalFile == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s)..." >> $ZimLogFile |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s) done." >> $ZimLogFile |
| else |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + |
| fi |
| fi |
| } |
| log_start() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup start time to log |
| echo "" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| echo "Backup Started: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| fi |
| } |
| log_end() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup stop time to log |
| echo "Backup Finished: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| fi |
| } |
| zimbra_start() { |
| if [ "$2" = "--no-start" ] |
| then |
| # If --no-start is set ignore starting Zimbra |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services not starting, --no-start is set." >> $ZimLogFile |
| echo "Zimbra services not starting, --no-start is set." |
| else |
| # Starting Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services starting..." >> $ZimLogFile |
| # Starting Zimbra |
| su zimbra -c "$ZimInstPath/$ZimHome/bin/zmcontrol start" >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services started." >> $ZimLogFile |
| else |
| # Starting Zimbra |
| su zimbra -c "$ZimInstPath/$ZimHome/bin/zmcontrol start" |
| fi |
| fi |
| } |
| zimbra_stop() { |
| # Stopping Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopping..." >> $ZimLogFile |
| # Stopping Zimbra |
| su zimbra -c "$ZimInstPath/$ZimHome/bin/zmcontrol stop" >> $ZimLogFile |
| # Sending task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopped." >> $ZimLogFile |
| # Sleep for 10 seconds to give shutdown some extra time before backup starts |
| sleep 10 |
| else |
| # Stopping Zimbra |
| su zimbra -c "$ZimInstPath/$ZimHome/bin/zmcontrol stop" |
| # Sleep for 10 seconds to give shutdown some extra time before backup starts |
| sleep 10 |
| fi |
| } |
| full_restore() { |
| echo "Full Restore under development" |
| } |
| diff_restore() { |
| echo "Diff Restore under development" |
| } |
| backup_file() { |
| # Checks what backup is choosen and sets file-name appropiate |
| # Full system backup |
| if [ "$ZimBackupType" = "--full" ] |
| then |
| ZimBackupFile=ZimBackupSystemFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential system backup |
| if [ "$ZimBackupType" = "--diff" ] |
| then |
| ZimBackupFile=ZimBackupSystemDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Full message backup |
| if [ "$ZimBackupType" = "--msg-full" ] |
| then |
| ZimBackupFile=ZimBackupMsgFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential message backup |
| if [ "$ZimBackupType" = "--msg-diff" ] |
| then |
| ZimBackupFile=ZimBackupMsgDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| } |
| log_file() { |
| # Check to see if the log folder exist, create if not |
| mkdir -p $ZimLogPath |
| # Check log intervall and decide which file-name to use |
| if [ "$ZimLogLogRotate" = "yes" ] |
| then |
| # Set log file-name to day |
| if [ "$ZimLogRotateInt" = "day" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| fi |
| # Set log file-name to week |
| if [ "$ZimLogRotateInt" = "week" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| fi |
| # Set log file-name to month |
| if [ "$ZimLogRotateInt" = "month" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| fi |
| else |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackup.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackup.log |
| fi |
| } |
| temp_folders() { |
| # Create & set temp folders under $ZimBackupPath |
| ZimFullTmpPath=$ZimBackupPath/tf |
| ZimDiffTmpPath=$ZimBackupPath/td |
| ZimMsgFullTmpPath=$ZimBackupPath/tmf |
| ZimMsgDiffTmpPath=$ZimBackupPath/tmd |
| mkdir -p $ZimFullTmpPath |
| mkdir -p $ZimDiffTmpPath |
| mkdir -p $ZimMsgFullTmpPath |
| mkdir -p $ZimMsgDiffTmpPath |
| } |
| restore_guide() { |
| echo "Restore Guide" |
| } |
| script_help() { |
| # Show help for script |
| echo "oZimBackup.sh Usage:" |
| echo "" |
| echo "--full For full backup (Cold)" |
| echo "--diff For differential backup (Cold)" |
| echo "--msg-full For complete message backup (Hot)" |
| echo "--msg-diff For differential message backup (Hot)" |
| echo "--check Check if needed software is installed, depends" |
| echo " on script configuration" |
| echo "--restore-guide Shows a short guide on how to restore Zimbra" |
| #echo "--full-restore Does a complete restore" |
| #echo "--diff-restore Restores a differential backup" |
| echo "--help Shows this help" |
| echo "" |
| echo "--no-start Tells Zimbra to stay offline after backup" |
| #echo "<file to restore> File to restore from" |
| echo "" |
| echo "Ex. Full backup:" |
| echo " oZimBackup.sh --full" |
| echo "" |
| #echo "Ex. Complete restore:" |
| #echo " oZimBackup.sh --full-restore /path/to/file/zimbackup.tar.gz" |
| echo "" |
| echo "Ex. Full differential backup leaving Zimbra in offline mode:" |
| echo " oZimBackup.sh --diff --no-start" |
| echo "" |
| } |
| case $1 in |
| --full) |
| pre_check |
| pre_load |
| log_start |
| full_backup |
| file_transfer |
| log_end |
| ;; |
| --diff) |
| pre_check |
| pre_load |
| log_start |
| diff_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-full) |
| pre_check |
| pre_load |
| log_start |
| msgfull_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-diff) |
| pre_check |
| pre_load |
| log_start |
| msgdiff_backup |
| file_transfer |
| log_end |
| ;; |
| --full-restore) |
| full_restore |
| ;; |
| --diff-restore) |
| diff_restore |
| ;; |
| --restore-guide) |
| restore_guide |
| ;; |
| --check) |
| pre_check |
| ;; |
| --help) |
| script_help |
| ;; |
| *) |
| script_help |
| ;; |
| esac |
| /tags/1.0.3/src/readme.txt |
|---|
| 0,0 → 1,36 |
| oZimBackup v1.0.1 2010-07-02 |
| ---------------------------- |
| Overview: |
| --------- |
| oZimbraBackup is a backup script for Zimbra Collaboration Suite - Open Source Edition. |
| Purpose: |
| -------- |
| The ability to take different types of backup and sending them off site. |
| The script has the following features: |
| * Full backup. |
| * Differential backup. |
| * Full message store backup. |
| * Differential message store backup. |
| * Backup packaging. |
| * Off site transfer via SCP or FTP. |
| * Logging with log file rotation. |
| Notes: |
| ------ |
| This script utilize rsync, tar & gzip for basic functionality but needs scp, ftp & expect for file transfers. |
| The script is pre-configured with some basic options. Open up the script in a text editor of your choice and change the options to suite your needs. |
| Has been tested with version 6.0.7 of Zimbra Collaboration Suite - OSE but should even work with the latest 5.x OSE branch. |
| Disclaimer: |
| ----------- |
| This software is released with the BSDL license and the license is in the license.txt file that should accompany this software. |
| Contact: |
| -------- |
| http://dev.osource.se/ |
| http://dev.osource.se/software/ozimbrabackup/ |
| /tags/1.0.4/oZimbraBackup_1.0.4.tar.gz |
|---|
| Cannot display: file marked as a binary type. |
| svn:mime-type = application/octet-stream |
| Property changes: |
| Added: svn:mime-type |
| +application/octet-stream |
| \ No newline at end of property |
| /tags/1.0.4/src/changelog.txt |
|---|
| 0,0 → 1,24 |
| 2011-04-21 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup (core): Changed how Zimbra startup & shutdown is called within the script. |
| 2011-04-19 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (core): Reworked code for differential backups. |
| 2010-08-06 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (pre_check): Fixed wrong variable name for SCP checking. |
| 2010-07-10 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (Help): Fixed typo. |
| 2010-07-02 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (text): Fixed typo. |
| * changelog.txt (text): fixed wrong file format. |
| 2010-06-15 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (diff) fixed faulty differential backups. |
| /tags/1.0.4/src/license.txt |
|---|
| 0,0 → 1,20 |
| Copyright (c) 2011, oSource Development |
| All rights reserved. |
| Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: |
| * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. |
| * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer |
| in the documentation and/or other materials provided with the distribution. |
| * Neither the name of the oSource Development nor the names of its contributors may be used to endorse or promote products |
| derived from this software without specific prior written permission. |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
| BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
| SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| /tags/1.0.4/src/oZimbraBackup.sh |
|---|
| 0,0 → 1,716 |
| #!/bin/bash |
| # This script will do various backups of Zimbra depending on which you choose, |
| # most of them are cold backups except the msg backup which hot copies the 'store' |
| # folder for possible individual mail retrieval. 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. |
| # |
| # 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 * * * oZimbraBackup.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 software's but if you |
| # intend to use this scripts built in file transfer functions you must install the described software below. |
| # |
| # Required software: rsync for normal operation and ftp or scp & expect for file transfer capabillities. |
| # |
| # Bits and pieces was adopted from a script created by Daniel W. Martin, 9 Sept 2007 |
| # Licensed under BSDL license, see license.txt for information. |
| # |
| # Developer: oSource Development(as of 2009-07-01) |
| # DevTeam: Marcus Uddenhed |
| # Version: 1.0.4 |
| # Last updated: 2011-04-21 22:32 |
| #### Global Settings #### |
| ZimInstPath=/opt # Installation path for Zimbra, excluding the Zimbra folder. |
| ZimHome=zimbra # The Zimbra installation folder, excluding path to folder. |
| ZimBackupPath=/opt/backup # Root folder for backup where backup files will be placed. |
| #### Log Settings #### |
| ZimLogEnable=yes # Turns logging on or off(yes/no). |
| ZimLogLogRotate=no # Enables log rotating(yes/no) |
| ZimLogRotateInt=day # How often should we rotate logs(day, week or month) |
| ZimLogPath=/opt/logs # Folder for log files |
| ZimLogVerbose=no # Activates extra logging information(yes/no) |
| #### File Transfer Settings #### |
| # Enable Services (yes/no) |
| ZimFtpEnable=no # Enable/Disable ftp file transfer(yes/no) |
| ZimScpEnable=no # Enable/Disable scp file transfer(yes/no) |
| # Extra FTP Settings |
| ZimFtpOpt='' # Extra options for ftp file transfer, see manual for ftp command |
| # Extra SCP Settings |
| ZimScpOpt='' # Extra options for scp 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 compressed backup file deletion after successful backup(yes/no) |
| 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 |
| pre_check() { |
| # Set default abort value |
| ZimAbort=0 |
| # Check for rsync |
| if [ ! -e /usr/bin/rsync ] |
| then |
| echo "Cannot find rsync software..." |
| ZimAbort=1 |
| fi |
| # Check for tar |
| if [ ! -e /bin/tar ] |
| then |
| echo "Cannot find tar software..." |
| ZimAbort=1 |
| fi |
| # Check for gzip |
| if [ ! -e /bin/gzip ] |
| then |
| if [ ! -e /usr/bin/gzip ] |
| then |
| echo "Cannot find gzip software..." |
| ZimAbort=1 |
| fi |
| fi |
| # Check if expect, ftp & scp is installed when file transfer is set to yes |
| if [ $ZimFtpEnable = 'yes' ] || [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/expect ] |
| then |
| echo "cannot find expect command..." |
| ZimAbort=1 |
| fi |
| if [ $ZimFtpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/ftp ] |
| then |
| echo "Cannot find ftp command..." |
| ZimAbort=1 |
| fi |
| fi |
| if [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/scp ] |
| then |
| echo "Cannot find scp command..." |
| ZimAbort=1 |
| fi |
| fi |
| fi |
| if [ $ZimAbort = '1' ] |
| then |
| echo "Please install above software, script exiting..." |
| exit |
| fi |
| } |
| pre_load() { |
| # Get temporary folder layout |
| temp_folders |
| # Get backup file format |
| backup_file |
| # Get log file format |
| log_file |
| # Check to see if the backup folder exist, create if not |
| mkdir -p $ZimBackupPath |
| # Check which zimbra version that is installed, for recovery purposes |
| sudo -u zimbra $ZimInstPath/$ZimHome/bin/zmcontrol -v > $ZimBackupPath/zimbra_version.txt |
| } |
| full_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..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressed backup folder." >> $ZimLogFile |
| # Cleaning differential folder. |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning differential backup folder..." |
| rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaned differential backup folder." |
| else |
| # Hot sync before shutdown on zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt |
| # Cleaning differential folder. |
| rm -r -f $ZimDiffTmpPath/* |
| fi |
| } |
| diff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| #rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Syncing backup folders |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders..." >> $ZimLogFile |
| #cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Hot sync before shutdown on zimbra folder |
| #rm -R $ZimDiffTmpPath/* |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Syncing files from diff to full backup folder |
| #cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt |
| fi |
| } |
| msgfull_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning differential backup folder..." |
| rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaned differential backup folder." |
| else |
| # Hot syncing to backup folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt |
| # Cleaning differential folder |
| rm -r -f $ZimMsgDiffTmpPath/* |
| fi |
| } |
| msgdiff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| #rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Cleaning backup folder |
| #rm -r -f $ZimMsgDiffTmpPath/* |
| # Hot syncing to backup folder |
| rsync -avHK --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt |
| fi |
| } |
| file_transfer() { |
| # Transfer with ftp |
| if [ $ZimFtpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage done." >> $ZimLogFile |
| else |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| fi |
| fi |
| # Transfer with scp |
| if [ $ZimScpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage done." >> $ZimLogFile |
| else |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| fi |
| fi |
| # Remove local file(s) if ZimDeleteLocalFile is set to 'yes' |
| if [ $ZimDeleteLocalFile == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s)..." >> $ZimLogFile |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s) done." >> $ZimLogFile |
| else |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + |
| fi |
| fi |
| } |
| log_start() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup start time to log |
| echo "" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| echo "Backup Started: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| fi |
| } |
| log_end() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup stop time to log |
| echo "Backup Finished: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| fi |
| } |
| zimbra_start() { |
| if [ "$2" = "--no-start" ] |
| then |
| # If --no-start is set ignore starting Zimbra |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services not starting, --no-start is set." >> $ZimLogFile |
| echo "Zimbra services not starting, --no-start is set." |
| else |
| # Starting Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services starting..." >> $ZimLogFile |
| # Starting Zimbra |
| su zimbra -c -l "zmcontrol start" >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services started." >> $ZimLogFile |
| else |
| # Starting Zimbra |
| su zimbra -c -l "zmcontrol start" |
| fi |
| fi |
| } |
| zimbra_stop() { |
| # Stopping Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopping..." >> $ZimLogFile |
| # Stopping Zimbra |
| su zimbra -c -l "zmcontrol stop" >> $ZimLogFile |
| # Sending task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopped." >> $ZimLogFile |
| # Sleep for 10 seconds to give shutdown some extra time before backup starts |
| sleep 10 |
| else |
| # Stopping Zimbra |
| su zimbra -c -l "zmcontrol stop" |
| # Sleep for 10 seconds to give shutdown some extra time before backup starts |
| sleep 10 |
| fi |
| } |
| full_restore() { |
| echo "Full Restore under development" |
| } |
| diff_restore() { |
| echo "Diff Restore under development" |
| } |
| backup_file() { |
| # Checks what backup is choosen and sets file-name appropiate |
| # Full system backup |
| if [ "$ZimBackupType" = "--full" ] |
| then |
| ZimBackupFile=ZimBackupSystemFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential system backup |
| if [ "$ZimBackupType" = "--diff" ] |
| then |
| ZimBackupFile=ZimBackupSystemDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Full message backup |
| if [ "$ZimBackupType" = "--msg-full" ] |
| then |
| ZimBackupFile=ZimBackupMsgFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential message backup |
| if [ "$ZimBackupType" = "--msg-diff" ] |
| then |
| ZimBackupFile=ZimBackupMsgDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| } |
| log_file() { |
| # Check to see if the log folder exist, create if not |
| mkdir -p $ZimLogPath |
| # Check log intervall and decide which file-name to use |
| if [ "$ZimLogLogRotate" = "yes" ] |
| then |
| # Set log file-name to day |
| if [ "$ZimLogRotateInt" = "day" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| fi |
| # Set log file-name to week |
| if [ "$ZimLogRotateInt" = "week" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| fi |
| # Set log file-name to month |
| if [ "$ZimLogRotateInt" = "month" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| fi |
| else |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackup.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackup.log |
| fi |
| } |
| temp_folders() { |
| # Create & set temp folders under $ZimBackupPath |
| ZimFullTmpPath=$ZimBackupPath/tf |
| ZimDiffTmpPath=$ZimBackupPath/td |
| ZimMsgFullTmpPath=$ZimBackupPath/tmf |
| ZimMsgDiffTmpPath=$ZimBackupPath/tmd |
| mkdir -p $ZimFullTmpPath |
| mkdir -p $ZimDiffTmpPath |
| mkdir -p $ZimMsgFullTmpPath |
| mkdir -p $ZimMsgDiffTmpPath |
| } |
| restore_guide() { |
| echo "Restore Guide" |
| } |
| script_help() { |
| # Show help for script |
| echo "oZimBackup.sh Usage:" |
| echo "" |
| echo "--full For full backup (Cold)" |
| echo "--diff For differential backup (Cold)" |
| echo "--msg-full For complete message backup (Hot)" |
| echo "--msg-diff For differential message backup (Hot)" |
| echo "--check Check if needed software is installed, depends" |
| echo " on script configuration" |
| echo "--restore-guide Shows a short guide on how to restore Zimbra" |
| #echo "--full-restore Does a complete restore" |
| #echo "--diff-restore Restores a differential backup" |
| echo "--help Shows this help" |
| echo "" |
| echo "--no-start Tells Zimbra to stay offline after backup" |
| #echo "<file to restore> File to restore from" |
| echo "" |
| echo "Ex. Full backup:" |
| echo " oZimBackup.sh --full" |
| echo "" |
| #echo "Ex. Complete restore:" |
| #echo " oZimBackup.sh --full-restore /path/to/file/zimbackup.tar.gz" |
| echo "" |
| echo "Ex. Full differential backup leaving Zimbra in offline mode:" |
| echo " oZimBackup.sh --diff --no-start" |
| echo "" |
| } |
| case $1 in |
| --full) |
| pre_check |
| pre_load |
| log_start |
| full_backup |
| file_transfer |
| log_end |
| ;; |
| --diff) |
| pre_check |
| pre_load |
| log_start |
| diff_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-full) |
| pre_check |
| pre_load |
| log_start |
| msgfull_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-diff) |
| pre_check |
| pre_load |
| log_start |
| msgdiff_backup |
| file_transfer |
| log_end |
| ;; |
| --full-restore) |
| full_restore |
| ;; |
| --diff-restore) |
| diff_restore |
| ;; |
| --restore-guide) |
| restore_guide |
| ;; |
| --check) |
| pre_check |
| ;; |
| --help) |
| script_help |
| ;; |
| *) |
| script_help |
| ;; |
| esac |
| /tags/1.0.4/src/readme.txt |
|---|
| 0,0 → 1,36 |
| oZimBackup v1.0.4 2010-04-21 |
| ---------------------------- |
| Overview: |
| --------- |
| oZimbraBackup is a backup script for Zimbra Collaboration Suite - Open Source Edition. |
| Purpose: |
| -------- |
| The ability to take different types of backup and sending them off site. |
| The script has the following features: |
| * Full backup. |
| * Differential backup. |
| * Full message store backup. |
| * Differential message store backup. |
| * Backup packaging. |
| * Off site transfer via SCP or FTP. |
| * Logging with log file rotation. |
| Notes: |
| ------ |
| This script utilize rsync, tar & gzip for basic functionality but needs scp, ftp & expect for file transfers. |
| The script is pre-configured with some basic options. Open up the script in a text editor of your choice and change the options to suite your needs. |
| Has been tested with version 6.x.x & 7.x.x of Zimbra Collaboration Suite - OSE but should even work with the latest 5.x OSE branch. |
| Disclaimer: |
| ----------- |
| This software is released with the BSDL license and the license is in the license.txt file that should accompany this software. |
| Contact: |
| -------- |
| http://dev.osource.se/ |
| http://dev.osource.se/software/ozimbrabackup/ |
| /tags/1.0.5/oZimbraBackup_1.0.5.tar.gz |
|---|
| Cannot display: file marked as a binary type. |
| svn:mime-type = application/octet-stream |
| Property changes: |
| Added: svn:mime-type |
| +application/octet-stream |
| \ No newline at end of property |
| /tags/1.0.5/src/changelog.txt |
|---|
| 0,0 → 1,29 |
| 2012-01-02 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (Logging): Added logging for file transfer in simple log mode. |
| 2011-04-21 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (core): Changed how Zimbra startup & shutdown is called within the script. |
| 2011-04-19 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (core): Reworked code for differential backups. |
| 2010-08-06 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (pre_check): Fixed wrong variable name for SCP checking. |
| 2010-07-10 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (Help): Fixed typo. |
| 2010-07-02 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (text): Fixed typo. |
| * changelog.txt (text): fixed wrong file format. |
| 2010-06-15 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (diff) fixed faulty differential backups. |
| /tags/1.0.5/src/license.txt |
|---|
| 0,0 → 1,20 |
| Copyright (c) 2011, oSource Development |
| All rights reserved. |
| Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: |
| * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. |
| * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer |
| in the documentation and/or other materials provided with the distribution. |
| * Neither the name of the oSource Development nor the names of its contributors may be used to endorse or promote products |
| derived from this software without specific prior written permission. |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
| BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
| SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| /tags/1.0.5/src/oZimbraBackup.sh |
|---|
| 0,0 → 1,730 |
| #!/bin/bash |
| # This script will do various backups of Zimbra depending on which you choose, |
| # most of them are cold backups except the msg backup which hot copies the 'store' |
| # folder for possible individual mail retrieval. 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. |
| # |
| # 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 * * * oZimbraBackup.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 software's but if you |
| # intend to use this scripts built in file transfer functions you must install the described software below. |
| # |
| # Required software: rsync for normal operation and ftp or scp & expect for file transfer capabillities. |
| # |
| # Bits and pieces was adopted from a script created by Daniel W. Martin, 9 Sept 2007 |
| # Licensed under BSDL license, see license.txt for information. |
| # |
| # Developer: oSource Development(as of 2009-07-01) |
| # DevTeam: Marcus Uddenhed |
| # Version: 1.0.5 |
| # Last updated: 2012-01-02 23:15 |
| #### Global Settings #### |
| ZimInstPath=/opt # Installation path for Zimbra, excluding the Zimbra folder. |
| ZimHome=zimbra # The Zimbra installation folder, excluding path to folder. |
| ZimBackupPath=/opt/backup # Root folder for backup where backup files will be placed. |
| #### Log Settings #### |
| ZimLogEnable=yes # Turns logging on or off(yes/no). |
| ZimLogLogRotate=no # Enables log rotating(yes/no) |
| ZimLogRotateInt=day # How often should we rotate logs(day, week or month) |
| ZimLogPath=/opt/logs # Folder for log files |
| ZimLogVerbose=no # Activates extra logging information(yes/no) |
| #### File Transfer Settings #### |
| # Enable Services (yes/no) |
| ZimFtpEnable=no # Enable/Disable ftp file transfer(yes/no) |
| ZimScpEnable=no # Enable/Disable scp file transfer(yes/no) |
| # Extra FTP Settings |
| ZimFtpOpt='' # Extra options for ftp file transfer, see manual for ftp command |
| # Extra SCP Settings |
| ZimScpOpt='' # Extra options for scp 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 compressed backup file deletion after successful backup(yes/no) |
| 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 |
| pre_check() { |
| # Set default abort value |
| ZimAbort=0 |
| # Check for rsync |
| if [ ! -e /usr/bin/rsync ] |
| then |
| echo "Cannot find rsync software..." |
| ZimAbort=1 |
| fi |
| # Check for tar |
| if [ ! -e /bin/tar ] |
| then |
| echo "Cannot find tar software..." |
| ZimAbort=1 |
| fi |
| # Check for gzip |
| if [ ! -e /bin/gzip ] |
| then |
| if [ ! -e /usr/bin/gzip ] |
| then |
| echo "Cannot find gzip software..." |
| ZimAbort=1 |
| fi |
| fi |
| # Check if expect, ftp & scp is installed when file transfer is set to yes |
| if [ $ZimFtpEnable = 'yes' ] || [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/expect ] |
| then |
| echo "cannot find expect command..." |
| ZimAbort=1 |
| fi |
| if [ $ZimFtpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/ftp ] |
| then |
| echo "Cannot find ftp command..." |
| ZimAbort=1 |
| fi |
| fi |
| if [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/scp ] |
| then |
| echo "Cannot find scp command..." |
| ZimAbort=1 |
| fi |
| fi |
| fi |
| if [ $ZimAbort = '1' ] |
| then |
| echo "Please install above software, script exiting..." |
| exit |
| fi |
| } |
| pre_load() { |
| # Get temporary folder layout |
| temp_folders |
| # Get backup file format |
| backup_file |
| # Get log file format |
| log_file |
| # Check to see if the backup folder exist, create if not |
| mkdir -p $ZimBackupPath |
| # Check which zimbra version that is installed, for recovery purposes |
| sudo -u zimbra $ZimInstPath/$ZimHome/bin/zmcontrol -v > $ZimBackupPath/zimbra_version.txt |
| } |
| full_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..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressed backup folder." >> $ZimLogFile |
| # Cleaning differential folder. |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning differential backup folder..." |
| rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaned differential backup folder." |
| else |
| # Hot sync before shutdown on zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt |
| # Cleaning differential folder. |
| rm -r -f $ZimDiffTmpPath/* |
| fi |
| } |
| diff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| #rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Syncing backup folders |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders..." >> $ZimLogFile |
| #cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Hot sync before shutdown on zimbra folder |
| #rm -R $ZimDiffTmpPath/* |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Syncing files from diff to full backup folder |
| #cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt |
| fi |
| } |
| msgfull_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning differential backup folder..." |
| rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaned differential backup folder." |
| else |
| # Hot syncing to backup folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt |
| # Cleaning differential folder |
| rm -r -f $ZimMsgDiffTmpPath/* |
| fi |
| } |
| msgdiff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| #rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Cleaning backup folder |
| #rm -r -f $ZimMsgDiffTmpPath/* |
| # Hot syncing to backup folder |
| rsync -avHK --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt |
| fi |
| } |
| file_transfer() { |
| # Transfer with ftp |
| if [ $ZimFtpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage done." >> $ZimLogFile |
| else |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage done." >> $ZimLogFile |
| fi |
| fi |
| # Transfer with scp |
| if [ $ZimScpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage done." >> $ZimLogFile |
| else |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage done." >> $ZimLogFile |
| fi |
| fi |
| # Remove local file(s) if ZimDeleteLocalFile is set to 'yes' |
| if [ $ZimDeleteLocalFile == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s)..." >> $ZimLogFile |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s) done." >> $ZimLogFile |
| else |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + |
| fi |
| fi |
| } |
| log_start() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup start time to log |
| echo "" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| echo "Backup Started: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| fi |
| } |
| log_end() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup stop time to log |
| echo "Backup Finished: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| fi |
| } |
| zimbra_start() { |
| if [ "$2" = "--no-start" ] |
| then |
| # If --no-start is set ignore starting Zimbra |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services not starting, --no-start is set." >> $ZimLogFile |
| echo "Zimbra services not starting, --no-start is set." |
| else |
| # Starting Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services starting..." >> $ZimLogFile |
| # Starting Zimbra |
| su zimbra -c -l "zmcontrol start" >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services started." >> $ZimLogFile |
| else |
| # Starting Zimbra |
| su zimbra -c -l "zmcontrol start" |
| fi |
| fi |
| } |
| zimbra_stop() { |
| # Stopping Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopping..." >> $ZimLogFile |
| # Stopping Zimbra |
| su zimbra -c -l "zmcontrol stop" >> $ZimLogFile |
| # Sending task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopped." >> $ZimLogFile |
| # Sleep for 10 seconds to give shutdown some extra time before backup starts |
| sleep 10 |
| else |
| # Stopping Zimbra |
| su zimbra -c -l "zmcontrol stop" |
| # Sleep for 10 seconds to give shutdown some extra time before backup starts |
| sleep 10 |
| fi |
| } |
| full_restore() { |
| echo "Full Restore under development" |
| } |
| diff_restore() { |
| echo "Diff Restore under development" |
| } |
| backup_file() { |
| # Checks what backup is choosen and sets file-name appropiate |
| # Full system backup |
| if [ "$ZimBackupType" = "--full" ] |
| then |
| ZimBackupFile=ZimBackupSystemFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential system backup |
| if [ "$ZimBackupType" = "--diff" ] |
| then |
| ZimBackupFile=ZimBackupSystemDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Full message backup |
| if [ "$ZimBackupType" = "--msg-full" ] |
| then |
| ZimBackupFile=ZimBackupMsgFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential message backup |
| if [ "$ZimBackupType" = "--msg-diff" ] |
| then |
| ZimBackupFile=ZimBackupMsgDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| } |
| log_file() { |
| # Check to see if the log folder exist, create if not |
| mkdir -p $ZimLogPath |
| # Check log intervall and decide which file-name to use |
| if [ "$ZimLogLogRotate" = "yes" ] |
| then |
| # Set log file-name to day |
| if [ "$ZimLogRotateInt" = "day" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| fi |
| # Set log file-name to week |
| if [ "$ZimLogRotateInt" = "week" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| fi |
| # Set log file-name to month |
| if [ "$ZimLogRotateInt" = "month" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| fi |
| else |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackup.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackup.log |
| fi |
| } |
| temp_folders() { |
| # Create & set temp folders under $ZimBackupPath |
| ZimFullTmpPath=$ZimBackupPath/tf |
| ZimDiffTmpPath=$ZimBackupPath/td |
| ZimMsgFullTmpPath=$ZimBackupPath/tmf |
| ZimMsgDiffTmpPath=$ZimBackupPath/tmd |
| mkdir -p $ZimFullTmpPath |
| mkdir -p $ZimDiffTmpPath |
| mkdir -p $ZimMsgFullTmpPath |
| mkdir -p $ZimMsgDiffTmpPath |
| } |
| restore_guide() { |
| echo "Restore Guide" |
| } |
| script_help() { |
| # Show help for script |
| echo "oZimBackup.sh Usage:" |
| echo "" |
| echo "--full For full backup (Cold)" |
| echo "--diff For differential backup (Cold)" |
| echo "--msg-full For complete message backup (Hot)" |
| echo "--msg-diff For differential message backup (Hot)" |
| echo "--check Check if needed software is installed, depends" |
| echo " on script configuration" |
| echo "--restore-guide Shows a short guide on how to restore Zimbra" |
| #echo "--full-restore Does a complete restore" |
| #echo "--diff-restore Restores a differential backup" |
| echo "--help Shows this help" |
| echo "" |
| echo "--no-start Tells Zimbra to stay offline after backup" |
| #echo "<file to restore> File to restore from" |
| echo "" |
| echo "Ex. Full backup:" |
| echo " oZimBackup.sh --full" |
| echo "" |
| #echo "Ex. Complete restore:" |
| #echo " oZimBackup.sh --full-restore /path/to/file/zimbackup.tar.gz" |
| echo "" |
| echo "Ex. Full differential backup leaving Zimbra in offline mode:" |
| echo " oZimBackup.sh --diff --no-start" |
| echo "" |
| } |
| case $1 in |
| --full) |
| pre_check |
| pre_load |
| log_start |
| full_backup |
| file_transfer |
| log_end |
| ;; |
| --diff) |
| pre_check |
| pre_load |
| log_start |
| diff_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-full) |
| pre_check |
| pre_load |
| log_start |
| msgfull_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-diff) |
| pre_check |
| pre_load |
| log_start |
| msgdiff_backup |
| file_transfer |
| log_end |
| ;; |
| --full-restore) |
| full_restore |
| ;; |
| --diff-restore) |
| diff_restore |
| ;; |
| --restore-guide) |
| restore_guide |
| ;; |
| --check) |
| pre_check |
| ;; |
| --help) |
| script_help |
| ;; |
| *) |
| script_help |
| ;; |
| esac |
| /tags/1.0.5/src/readme.txt |
|---|
| 0,0 → 1,36 |
| oZimBackup v1.0.5 2012-01-02 |
| ---------------------------- |
| Overview: |
| --------- |
| oZimbraBackup is a backup script for Zimbra Collaboration Suite - Open Source Edition. |
| Purpose: |
| -------- |
| The ability to take different types of backup and sending them off site. |
| The script has the following features: |
| * Full backup. |
| * Differential backup. |
| * Full message store backup. |
| * Differential message store backup. |
| * Backup packaging. |
| * Off site transfer via SCP or FTP. |
| * Logging with log file rotation. |
| Notes: |
| ------ |
| This script utilize rsync, tar & gzip for basic functionality but needs scp, ftp & expect for file transfers. |
| The script is pre-configured with some basic options. Open up the script in a text editor of your choice and change the options to suite your needs. |
| Has been tested with version 7.1.1 of Zimbra Collaboration Suite - OSE but should even work with the latest 5.x and 6.x OSE branch. |
| Disclaimer: |
| ----------- |
| This software is released with the BSDL license and the license is in the license.txt file that should accompany this software. |
| Contact: |
| -------- |
| http://dev.osource.se/ |
| http://dev.osource.se/software/ozimbrabackup/ |
| /trunk/changelog.txt |
|---|
| 0,0 → 1,29 |
| 2012-01-02 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (Logging): Added logging for file transfer in simple log mode. |
| 2011-04-21 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (core): Changed how Zimbra startup & shutdown is called within the script. |
| 2011-04-19 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (core): Reworked code for differential backups. |
| 2010-08-06 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (pre_check): Fixed wrong variable name for SCP checking. |
| 2010-07-10 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (Help): Fixed typo. |
| 2010-07-02 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (text): Fixed typo. |
| * changelog.txt (text): fixed wrong file format. |
| 2010-06-15 Marcus Uddenhed <marcus@osource.se> |
| * oZimbraBackup.sh (diff) fixed faulty differential backups. |
| /trunk/license.txt |
|---|
| 0,0 → 1,20 |
| Copyright (c) 2011, oSource Development |
| All rights reserved. |
| Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: |
| * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. |
| * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer |
| in the documentation and/or other materials provided with the distribution. |
| * Neither the name of the oSource Development nor the names of its contributors may be used to endorse or promote products |
| derived from this software without specific prior written permission. |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
| BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
| SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| /trunk/oZimbraBackup.sh |
|---|
| 0,0 → 1,730 |
| #!/bin/bash |
| # This script will do various backups of Zimbra depending on which you choose, |
| # most of them are cold backups except the msg backup which hot copies the 'store' |
| # folder for possible individual mail retrieval. 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. |
| # |
| # 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 * * * oZimbraBackup.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 software's but if you |
| # intend to use this scripts built in file transfer functions you must install the described software below. |
| # |
| # Required software: rsync for normal operation and ftp or scp & expect for file transfer capabillities. |
| # |
| # Bits and pieces was adopted from a script created by Daniel W. Martin, 9 Sept 2007 |
| # Licensed under BSDL license, see license.txt for information. |
| # |
| # Developer: oSource Development(as of 2009-07-01) |
| # DevTeam: Marcus Uddenhed |
| # Version: 1.0.5 |
| # Last updated: 2012-01-02 23:15 |
| #### Global Settings #### |
| ZimInstPath=/opt # Installation path for Zimbra, excluding the Zimbra folder. |
| ZimHome=zimbra # The Zimbra installation folder, excluding path to folder. |
| ZimBackupPath=/opt/backup # Root folder for backup where backup files will be placed. |
| #### Log Settings #### |
| ZimLogEnable=yes # Turns logging on or off(yes/no). |
| ZimLogLogRotate=no # Enables log rotating(yes/no) |
| ZimLogRotateInt=day # How often should we rotate logs(day, week or month) |
| ZimLogPath=/opt/logs # Folder for log files |
| ZimLogVerbose=no # Activates extra logging information(yes/no) |
| #### File Transfer Settings #### |
| # Enable Services (yes/no) |
| ZimFtpEnable=no # Enable/Disable ftp file transfer(yes/no) |
| ZimScpEnable=no # Enable/Disable scp file transfer(yes/no) |
| # Extra FTP Settings |
| ZimFtpOpt='' # Extra options for ftp file transfer, see manual for ftp command |
| # Extra SCP Settings |
| ZimScpOpt='' # Extra options for scp 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 compressed backup file deletion after successful backup(yes/no) |
| 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 |
| pre_check() { |
| # Set default abort value |
| ZimAbort=0 |
| # Check for rsync |
| if [ ! -e /usr/bin/rsync ] |
| then |
| echo "Cannot find rsync software..." |
| ZimAbort=1 |
| fi |
| # Check for tar |
| if [ ! -e /bin/tar ] |
| then |
| echo "Cannot find tar software..." |
| ZimAbort=1 |
| fi |
| # Check for gzip |
| if [ ! -e /bin/gzip ] |
| then |
| if [ ! -e /usr/bin/gzip ] |
| then |
| echo "Cannot find gzip software..." |
| ZimAbort=1 |
| fi |
| fi |
| # Check if expect, ftp & scp is installed when file transfer is set to yes |
| if [ $ZimFtpEnable = 'yes' ] || [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/expect ] |
| then |
| echo "cannot find expect command..." |
| ZimAbort=1 |
| fi |
| if [ $ZimFtpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/ftp ] |
| then |
| echo "Cannot find ftp command..." |
| ZimAbort=1 |
| fi |
| fi |
| if [ $ZimScpEnable = 'yes' ] |
| then |
| if [ ! -e /usr/bin/scp ] |
| then |
| echo "Cannot find scp command..." |
| ZimAbort=1 |
| fi |
| fi |
| fi |
| if [ $ZimAbort = '1' ] |
| then |
| echo "Please install above software, script exiting..." |
| exit |
| fi |
| } |
| pre_load() { |
| # Get temporary folder layout |
| temp_folders |
| # Get backup file format |
| backup_file |
| # Get log file format |
| log_file |
| # Check to see if the backup folder exist, create if not |
| mkdir -p $ZimBackupPath |
| # Check which zimbra version that is installed, for recovery purposes |
| sudo -u zimbra $ZimInstPath/$ZimHome/bin/zmcontrol -v > $ZimBackupPath/zimbra_version.txt |
| } |
| full_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..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressed backup folder." >> $ZimLogFile |
| # Cleaning differential folder. |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning differential backup folder..." |
| rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaned differential backup folder." |
| else |
| # Hot sync before shutdown on zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome $ZimFullTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tf zimbra_version.txt |
| # Cleaning differential folder. |
| rm -r -f $ZimDiffTmpPath/* |
| fi |
| } |
| diff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| #rm -r -f $ZimDiffTmpPath/* >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile |
| # Starting Zimbra |
| zimbra_start |
| # Syncing backup folders |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders..." >> $ZimLogFile |
| #cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Syncing backup folders done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Hot sync before shutdown on zimbra folder |
| #rm -R $ZimDiffTmpPath/* |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Stopping Zimbra |
| zimbra_stop |
| # Cold sync of zimbra folder |
| rsync -avHK --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath |
| # Starting Zimbra |
| zimbra_start |
| # Syncing files from diff to full backup folder |
| #cp -R $ZimDiffTmpPath/* $ZimFullTmpPath/ |
| # Compressing backup for space reduction |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath td zimbra_version.txt |
| fi |
| } |
| msgfull_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning differential backup folder..." |
| rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaned differential backup folder." |
| else |
| # Hot syncing to backup folder |
| rsync -avHK --delete $ZimInstPath/$ZimHome/store $ZimMsgFullTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmf zimbra_version.txt |
| # Cleaning differential folder |
| rm -r -f $ZimMsgDiffTmpPath/* |
| fi |
| } |
| msgdiff_backup() { |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Cleaning backup folder |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder..." >> $ZimLogFile |
| #rm -r -f $ZimMsgDiffTmpPath/* >> $ZimLogFile |
| #echo "`date "+%Y-%m-%d %H:%M:%S"` - Cleaning backup folder done." >> $ZimLogFile |
| # Hot syncing to backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder..." >> $ZimLogFile |
| rsync -avHK --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Hot syncing to backup folder done." >> $ZimLogFile |
| # Compressing backup folder |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder..." >> $ZimLogFile |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt >> $ZimLogFile |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Compressing backup folder done." >> $ZimLogFile |
| else |
| # Cleaning backup folder |
| #rm -r -f $ZimMsgDiffTmpPath/* |
| # Hot syncing to backup folder |
| rsync -avHK --compare-dest=$ZimMsgFullTmpPath/ $ZimInstPath/$ZimHome/store $ZimMsgDiffTmpPath |
| # Compressing backup folder |
| tar -zcvpf $ZimBackupPath/$ZimBackupFile -C $ZimBackupPath tmd zimbra_version.txt |
| fi |
| } |
| file_transfer() { |
| # Transfer with ftp |
| if [ $ZimFtpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage done." >> $ZimLogFile |
| else |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/ftp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/ftp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/ftp.exp |
| echo 'spawn ftp '$ZimFilehostAddress >> $ZimBackupPath/ftp.exp |
| echo 'expect ):' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostUser'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect :' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send '$ZimFtpOpt'\r' >> $ZimBackupPath/ftp.exp |
| echo 'send "send '$ZimBackupPath/$ZimBackupFile $ZimFilehostFolder/$ZimBackupFile'\r"' >> $ZimBackupPath/ftp.exp |
| echo 'expect >' >> $ZimBackupPath/ftp.exp |
| echo 'send quit\r' >> $ZimBackupPath/ftp.exp |
| echo 'expect closed' >> $ZimBackupPath/ftp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/ftp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/ftp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via ftp to off-site storage done." >> $ZimLogFile |
| fi |
| fi |
| # Transfer with scp |
| if [ $ZimScpEnable == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp >> $ZimLogFile |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage done." >> $ZimLogFile |
| else |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage..." >> $ZimLogFile |
| # Make a temporary script for expect commands |
| touch $ZimBackupPath/scp.exp |
| # Fill script with commands |
| echo '#!/usr/bin/expect --' >> $ZimBackupPath/scp.exp |
| echo 'set timeout -1' >> $ZimBackupPath/scp.exp |
| echo 'spawn scp '$ZimScpOpt $ZimBackupPath/$ZimBackupFile $ZimFilehostUser'@'$ZimFilehostAddress':'$ZimFilehostFolder >> $ZimBackupPath/scp.exp |
| echo 'expect :' >> $ZimBackupPath/scp.exp |
| echo 'send '$ZimFilehostPass'\r' >> $ZimBackupPath/scp.exp |
| echo 'expect closed' >> $ZimBackupPath/scp.exp |
| # Run expect with created script |
| expect $ZimBackupPath/scp.exp |
| # Delete temporary expect script |
| rm $ZimBackupPath/scp.exp |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Sending file via scp to off-site storage done." >> $ZimLogFile |
| fi |
| fi |
| # Remove local file(s) if ZimDeleteLocalFile is set to 'yes' |
| if [ $ZimDeleteLocalFile == "yes" ] |
| then |
| if [ $ZimLogEnable = 'yes' ] && [ $ZimLogVerbose = 'yes' ] |
| then |
| # Send task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s)..." >> $ZimLogFile |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Deleting local file(s) done." >> $ZimLogFile |
| else |
| # Remove backup files matching criteria |
| find $ZimBackupPath -maxdepth 1 -type f -mmin +$ZimDeleteTimeSet -name ZimBackup\*.tar.gz -exec rm {} + |
| fi |
| fi |
| } |
| log_start() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup start time to log |
| echo "" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| echo "Backup Started: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| fi |
| } |
| log_end() { |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending backup stop time to log |
| echo "Backup Finished: `date "+%Y-%m-%d %H:%M:%S"` Type: $ZimBackupType" >> $ZimLogFile |
| echo "-------------------------------------------------------" >> $ZimLogFile |
| fi |
| } |
| zimbra_start() { |
| if [ "$2" = "--no-start" ] |
| then |
| # If --no-start is set ignore starting Zimbra |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services not starting, --no-start is set." >> $ZimLogFile |
| echo "Zimbra services not starting, --no-start is set." |
| else |
| # Starting Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services starting..." >> $ZimLogFile |
| # Starting Zimbra |
| su zimbra -c -l "zmcontrol start" >> $ZimLogFile |
| # Send task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services started." >> $ZimLogFile |
| else |
| # Starting Zimbra |
| su zimbra -c -l "zmcontrol start" |
| fi |
| fi |
| } |
| zimbra_stop() { |
| # Stopping Zimbra |
| if [ $ZimLogEnable = 'yes' ] |
| then |
| # Sending task start time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopping..." >> $ZimLogFile |
| # Stopping Zimbra |
| su zimbra -c -l "zmcontrol stop" >> $ZimLogFile |
| # Sending task stop time to log |
| echo "`date "+%Y-%m-%d %H:%M:%S"` - Zimbra services stopped." >> $ZimLogFile |
| # Sleep for 10 seconds to give shutdown some extra time before backup starts |
| sleep 10 |
| else |
| # Stopping Zimbra |
| su zimbra -c -l "zmcontrol stop" |
| # Sleep for 10 seconds to give shutdown some extra time before backup starts |
| sleep 10 |
| fi |
| } |
| full_restore() { |
| echo "Full Restore under development" |
| } |
| diff_restore() { |
| echo "Diff Restore under development" |
| } |
| backup_file() { |
| # Checks what backup is choosen and sets file-name appropiate |
| # Full system backup |
| if [ "$ZimBackupType" = "--full" ] |
| then |
| ZimBackupFile=ZimBackupSystemFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential system backup |
| if [ "$ZimBackupType" = "--diff" ] |
| then |
| ZimBackupFile=ZimBackupSystemDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Full message backup |
| if [ "$ZimBackupType" = "--msg-full" ] |
| then |
| ZimBackupFile=ZimBackupMsgFull_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| # Differential message backup |
| if [ "$ZimBackupType" = "--msg-diff" ] |
| then |
| ZimBackupFile=ZimBackupMsgDiff_`date +%Y%m%d%H%M`.tar.gz |
| fi |
| } |
| log_file() { |
| # Check to see if the log folder exist, create if not |
| mkdir -p $ZimLogPath |
| # Check log intervall and decide which file-name to use |
| if [ "$ZimLogLogRotate" = "yes" ] |
| then |
| # Set log file-name to day |
| if [ "$ZimLogRotateInt" = "day" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupDay_`date +%Y-%m-%d`.log |
| fi |
| # Set log file-name to week |
| if [ "$ZimLogRotateInt" = "week" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupWeek_`date +%Y-%V`.log |
| fi |
| # Set log file-name to month |
| if [ "$ZimLogRotateInt" = "month" ] |
| then |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackupMonth_`date +%Y-%m`.log |
| fi |
| else |
| # If file do not exist create it |
| touch $ZimLogPath/ZimBackup.log |
| # Set correct file-name |
| ZimLogFile=$ZimLogPath/ZimBackup.log |
| fi |
| } |
| temp_folders() { |
| # Create & set temp folders under $ZimBackupPath |
| ZimFullTmpPath=$ZimBackupPath/tf |
| ZimDiffTmpPath=$ZimBackupPath/td |
| ZimMsgFullTmpPath=$ZimBackupPath/tmf |
| ZimMsgDiffTmpPath=$ZimBackupPath/tmd |
| mkdir -p $ZimFullTmpPath |
| mkdir -p $ZimDiffTmpPath |
| mkdir -p $ZimMsgFullTmpPath |
| mkdir -p $ZimMsgDiffTmpPath |
| } |
| restore_guide() { |
| echo "Restore Guide" |
| } |
| script_help() { |
| # Show help for script |
| echo "oZimBackup.sh Usage:" |
| echo "" |
| echo "--full For full backup (Cold)" |
| echo "--diff For differential backup (Cold)" |
| echo "--msg-full For complete message backup (Hot)" |
| echo "--msg-diff For differential message backup (Hot)" |
| echo "--check Check if needed software is installed, depends" |
| echo " on script configuration" |
| echo "--restore-guide Shows a short guide on how to restore Zimbra" |
| #echo "--full-restore Does a complete restore" |
| #echo "--diff-restore Restores a differential backup" |
| echo "--help Shows this help" |
| echo "" |
| echo "--no-start Tells Zimbra to stay offline after backup" |
| #echo "<file to restore> File to restore from" |
| echo "" |
| echo "Ex. Full backup:" |
| echo " oZimBackup.sh --full" |
| echo "" |
| #echo "Ex. Complete restore:" |
| #echo " oZimBackup.sh --full-restore /path/to/file/zimbackup.tar.gz" |
| echo "" |
| echo "Ex. Full differential backup leaving Zimbra in offline mode:" |
| echo " oZimBackup.sh --diff --no-start" |
| echo "" |
| } |
| case $1 in |
| --full) |
| pre_check |
| pre_load |
| log_start |
| full_backup |
| file_transfer |
| log_end |
| ;; |
| --diff) |
| pre_check |
| pre_load |
| log_start |
| diff_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-full) |
| pre_check |
| pre_load |
| log_start |
| msgfull_backup |
| file_transfer |
| log_end |
| ;; |
| --msg-diff) |
| pre_check |
| pre_load |
| log_start |
| msgdiff_backup |
| file_transfer |
| log_end |
| ;; |
| --full-restore) |
| full_restore |
| ;; |
| --diff-restore) |
| diff_restore |
| ;; |
| --restore-guide) |
| restore_guide |
| ;; |
| --check) |
| pre_check |
| ;; |
| --help) |
| script_help |
| ;; |
| *) |
| script_help |
| ;; |
| esac |
| /trunk/readme.txt |
|---|
| 0,0 → 1,36 |
| oZimBackup v1.0.5 2012-01-02 |
| ---------------------------- |
| Overview: |
| --------- |
| oZimbraBackup is a backup script for Zimbra Collaboration Suite - Open Source Edition. |
| Purpose: |
| -------- |
| The ability to take different types of backup and sending them off site. |
| The script has the following features: |
| * Full backup. |
| * Differential backup. |
| * Full message store backup. |
| * Differential message store backup. |
| * Backup packaging. |
| * Off site transfer via SCP or FTP. |
| * Logging with log file rotation. |
| Notes: |
| ------ |
| This script utilize rsync, tar & gzip for basic functionality but needs scp, ftp & expect for file transfers. |
| The script is pre-configured with some basic options. Open up the script in a text editor of your choice and change the options to suite your needs. |
| Has been tested with version 7.1.1 of Zimbra Collaboration Suite - OSE but should even work with the latest 5.x and 6.x OSE branch. |
| Disclaimer: |
| ----------- |
| This software is released with the BSDL license and the license is in the license.txt file that should accompany this software. |
| Contact: |
| -------- |
| http://dev.osource.se/ |
| http://dev.osource.se/software/ozimbrabackup/ |