2012/10/10

Script de backup Zimbra

As seguintes ações são executadas:
- Backup local ou remoto por compartilhamento cifs (Windows);
- Backup de aliases;
- Backup de listas;
- Backup dos emails, contatos e agenda no formato tgz;
- Backup de todos os domínios ou alguns;
- Geração de arquivo de log.

Script:

#!/bin/bash
# Marcio Jose Atanasio
# marcio.jose@atanasio.com.br
# Compuserv Informatica
# Versao 20121008

# LOCAL
BCKDIR="/opt/backup"
LOGFILE="/var/log/zmbackup.log"
# User "all" to backup all domains accounts or domains that want backup with space between.
DOMAINS="all"

# REMOTE
MNTREMOTE="//192.168.1.10/backup"
USER="cobaia"
PASSWD="cobaia"

REMOTE_BACKUP=0 # 0 - Backup will be saved in BCKDIR | 1 or others values - Backup will be saved in MNTLOCAL mounted in BCKDIR.

# ENVIROMENT
DT=`date +%Y"-"%m"-"%d`

function put_logger {
    echo `date +%Y"-"%m"-"%d" - "%H":"%M`" - $1" >> $LOGFILE
}

function backup_dir {
    if [ "$1" = "mount" ]; then
        if [ "$REMOTE_BACKUP" = "1" ]; then
            /bin/mount $MNTREMOTE $BCKDIR -o user=$USER,password=$PASSWD
            if [ "$?" = "0" ]; then
                put_logger "Montagem de $MNTREMOTE realizada com sucesso"
            else
                put_logger "Montagem de $MNTREMOTE falhou. O backup não será efetuado."
                exit 0
            fi
        fi
        if [ -d $BCKDIR/$DT ]; then
            rm -rf $BCKDIR/$DT
        fi
        /bin/mkdir $BCKDIR/$DT > /dev/null  2>&1
    fi
    if [ "$1" = "umount" ]; then
        if [ "$REMOTE_BACKUP" = "1" ]; then
            /bin/umount $BCKDIR
            put_logger "Desmontagem de $MNTREMOTE realizada com sucesso"
        fi
    fi
}       

function get_domains {
    if [ "$DOMAINS" = "all" ]; then
               DOMAINS=`/opt/zimbra/bin/zmprov gad | sort`
        echo $DOMAINS | sed s/" "/"\n"/g >> $BCKDIR/$DT/domains.txt
    fi
    put_logger "Lista dos domínios $DOMAINS salva."
}   

function get_lists {
    for DOM in `echo $DOMAINS`; do
        for LST in `/opt/zimbra/bin/zmprov gadl $DOM` ; do

            echo "Lista "$LST >> $BCKDIR/$DT/$DOM.lists.txt            /opt/zimbra/bin/zmprov gdl $LST | grep zimbraMailForwardingAddress | cut -d" " -f2 >> $BCKDIR/$DT/$DOM.lists.txt
            echo "" >> $BCKDIR/$DT/$DOM.lists.txt        done
        put_logger "Salvo lista de distribuição de $DOM."
    done
}

function get_aliases {
    for DOM in `echo $DOMAINS`; do
        for ACC in `/opt/zimbra/bin/zmprov -l gaa $DOM | sort`; do
                   ALIASES=`/opt/zimbra/bin/zmprov ga $ACC | grep zimbraMailAlias | cut -d: -f2`
                if [ ! -z "$ALIASES" ]; then
                        echo $ACC" - >"$ALIASES >> $BCKDIR/$DT/aliases.txt
                fi
        done
    done
}

function backup_accounts_aliases {
    for DOM in `echo $DOMAINS`; do
        put_logger "$DOM iniciando backup das contas e aliases."
        for ACC in `/opt/zimbra/bin/zmprov -l gaa $DOM | sort`; do
                    /opt/zimbra/bin/zmmailbox -z -m $ACC getRestURL '//?fmt=tgz' > $BCKDIR/$DT/$ACC.tgz
            put_logger "$ACC foi efetuado backup."
                   ALIASES=`/opt/zimbra/bin/zmprov ga $ACC | grep zimbraMailAlias | cut -d: -f2`
                if [ ! -z "$ALIASES" ]; then
                        echo $ACC" - >"$ALIASES  >> $BCKDIR/$DT/$ACC.alias.txt
                put_logger "$ACC tem aliases salvos."
                fi
        done
        put_logger "$DOM finalizado backup das contas e aliases."
    done
}

# START
put_logger "Início do backup"
put_logger "Efetuar montagem"
backup_dir mount
put_logger "Verificar domínios para efetuar backup"
get_domains
put_logger "Backup listas de distribuição dos domínios"
get_lists
put_logger "Backup das contas e aliases"
backup_accounts_aliases
put_logger "Efetuar desmontagem"
backup_dir umount
put_logger "Fim do backup"

3 comentários:

tonlisboa disse...

Olá...Muito bom o seu script. Parabéns...

Por acaso você tem um outro para restaurar??

Obrigado

Unknown disse...

Na função que gera as listas de distribuição, creio que vc tenha colocado a variável errada por engano ...
$DOM.lists.txt na verdade acho que seja $LST.lists.txt, para que seja criado um arquivo para cada lista e não um arquivo para todo o domínio!
No meu teste ficou ok!

mto bom o script!
[]'s

Marcio José Atanásio disse...

Obrigado Fabrício

Vou corrigir na postagem.

Até +