Subversion Repositories oZimbraBackup

Rev

Rev 4 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#!/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.7
# Updated: 2016-04-01 15:30
#

#### 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/backup/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() {
# Cleaning LDAP database from backup folder if exist.
if [ -f "$ZimDiffTmpPath/$ZimHome/data/ldap/mdb/db/data.mdb" ];
  then
    rm $ZimDiffTmpPath/$ZimHome/data/ldap/mdb/db/data.mdb
fi

# Making 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 --exclude 'data/ldap/mdb/db/data.mdb' $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 --exclude 'data/ldap/mdb/db/data.mdb' $ZimInstPath/$ZimHome $ZimFullTmpPath >> $ZimLogFile
   # Special LDAP DB copying needed.
   $ZimInstPath/$ZimHome/openldap/bin/mdb_copy $ZimInstPath/$ZimHome/data/ldap/mdb/db $ZimFullTmpPath/$ZimHome/data/ldap/mdb/db >> $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 --exclude 'data/ldap/mdb/db/data.mdb' $ZimInstPath/$ZimHome $ZimFullTmpPath

  # Stopping Zimbra
  zimbra_stop

  # Cold sync of zimbra folder
  rsync -avHK --delete --exclude 'data/ldap/mdb/db/data.mdb' $ZimInstPath/$ZimHome $ZimFullTmpPath
  # Special LDAP DB copying needed.
  $ZimInstPath/$ZimHome/openldap/bin/mdb_copy $ZimInstPath/$ZimHome/data/ldap/mdb/db $ZimFullTmpPath/$ZimHome/data/ldap/mdb/db

  # 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() {
# Checking if LDAP database folder exist and fix it.
if [ ! -f "$ZimDiffTmpPath/$ZimHome/data/ldap/mdb/db/data.mdb" ];
  then
    if [ ! -d "$ZimDiffTmpPath/$ZimHome/data/ldap/mdb/db" ]
          then
        mkdir -p $ZimDiffTmpPath/$ZimHome/data/ldap/mdb/db
    fi
else
  rm -R $ZimDiffTmpPath/$ZimHome/data/ldap/mdb/db/data.mdb
fi

# Make 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 --exclude 'data/ldap/mdb/db/data.mdb' --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 --exclude 'data/ldap/mdb/db/data.mdb' --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath >> $ZimLogFile
  # Special LDAP DB copying needed.
  $ZimInstPath/$ZimHome/openldap/bin/mdb_copy $ZimInstPath/$ZimHome/data/ldap/mdb/db $ZimDiffTmpPath/$ZimHome/data/ldap/mdb/db >> $ZimLogFile
  echo "`date "+%Y-%m-%d %H:%M:%S"` - Cold syncing to backup folder done." >> $ZimLogFile

  # Starting Zimbra
  zimbra_start

  # 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 --exclude 'data/ldap/mdb/db/data.mdb' --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath

  # Stopping Zimbra
  zimbra_stop

  # Cold sync of zimbra folder
  rsync -avHK --exclude 'data/ldap/mdb/db/data.mdb' --compare-dest=$ZimFullTmpPath/ $ZimInstPath/$ZimHome $ZimDiffTmpPath
  # Special LDAP DB copying needed.
  $ZimInstPath/$ZimHome/openldap/bin/mdb_copy $ZimInstPath/$ZimHome/data/ldap/mdb/db $ZimDiffTmpPath/$ZimHome/data/ldap/mdb/db
  # Starting Zimbra
  zimbra_start

  # 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 "$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 -l "$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 -l "$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 -l "$ZimInstPath/$ZimHome/bin/zmcontrol stop"

  # Sleep for 10 seconds to give shutdown some extra time before backup starts
  sleep 10

fi
}

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
}

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 "--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. 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
;;
--check)
pre_check
;;
--help)
script_help
;;
*)
script_help
;;
esac