Script de backup + envio de e-mail

Publicado por rafael oliveira em 18/01/2017

[ Hits: 9.427 ]

 


Script de backup + envio de e-mail



Recentemente precisei criar um script de backup com algumas exigências... não entrarei muito em detalhes sobre os recursos utilizados, a ideia é compartilhar e passar um overview do que faz o script.

As exigências:
  1. Realizar backup logo após que a mídia externa for conectada (HDD externo)
  2. Deletar dados no diretório de backup com 15 dias ou mais
  3. Realizar backup para diretório em servidor remoto
  4. Enviar mensagem de e-mail notificando o administrador dos servidores

As soluções:

1. Existem algumas maneiras de obter informações de um device via Udev ... no meu caso utilizei o seguinte:

# udevadm info --query=all --name=/dev/sdc

Obs.: as linhas iniciadas com "P" (PATH) mostram o caminho absoluto do device, "S" (SYMLINK) links simbólicos para o device e "E" (ENVIRONMENT) variáveis de ambiente que podemos usar nas regras do Udev.

/etc/udev/rules.d/90-CustomUdev.rules
ACTION=="add", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="5758323145393436444B4134", SYMLINK+="BackupUSB"
ACTION=="add", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="5758323145393436444B4134", RUN+="SEU SCRIPT"

Quando plugado o HDD (ACTION=="add") com número serial (ENV{ID_SERIAL_SHORT}=="5758323145393436444B4134") e seja um block device (SUBSYSTEM=="block"), crie um link simbólico em /dev com nome BackupUSB (SYMLINK+="BackupUSB) e execute o script RUN+="SEU SCRIPT".

2. Tal comando encontra-se em função dentro do script, mas seguindo a ordem das exigências ... o comando é:

# /bin/find $BKPDIR -maxdepth 1 -type d -not -name lost+found -ctime 15 -exec rm -rfv '{}' \;

Procura somente (-maxdepth 1) em $BKPDIR diretórios (-type d) mas não o diretório "lost+found" (-not -name lost+found) e deleta diretórios com 15 dias ou mais ( -ctime 15 -exec rm -rfv '{}' \; )

3. O backup para servidor remoto será feito via SMB/CIFS, que nada mais é do que uma pasta compartilhada no Windows. Para isso é preciso instalar o pacote cifs-utils.

Crie um arquivo e insira as seguintes informações:

username=USUARIO
password=SENHA

Teste com:

mount.cifs -o credentials=ArquivoComUsuarioeSenha //IpServidor/NomedoCompartilhamento /mnt

Exemplo:

# mount.cifs -o credentials=/root/windows //192.168.4.2/BackupDB /mnt/SERVIDOR/

4. Para envio de e-mail foi instalado o "mutt.x86_64".

Crie o arquivo "/root/.muttrc" e insira o seguinte conteúdo:

set from = "meuemail@gmail.com"
set realname = "Descricao"
set imap_user = "meuemail@gmail.com"
set imap_pass = "senha"

##REMOTE GMAIL FOLDERS
set folder = "imaps://imap.gmail.com:993"
set spoolfile = "+INBOX"
set postponed ="+[Google Mail]/Drafts"
#set trash = "+[Google Mail]/Trash"

##SMTP Settings to sent email
set smtp_url = "smtp://meuemail@smtp.gmail.com:587/"
set smtp_pass = "senha"

##LOCAL FOLDERS FOR CACHED HEADERS AND CERTIFICATES
set header_cache =~/.mutt/cache/headers
set message_cachedir =~/.mutt/cache/bodies
set certificate_file =~/.mutt/certificates

##SECURING
set move = no #Stop asking to "move read messages to mbox"!
set imap_keepalive = 900

##Sort by newest conversation first.
set sort = reverse-threads
set sort_aux = last-date-received

##Set editor to create new email
set editor='nano'

Obs.: acesse seu email via "mutt", confirme os certificados e após isso não será mais solicitado confirmação. Para acessar digite "mutt" e enter.

Antes do script...

Para a montagem do HD e do compartilhamento foi instalado "autofs.x86_64" que faz a montagem sobre demanda.

Dentro de "/etc/auto.master" adicione as seguintes linhas:

/mnt/SERVIDOR /etc/auto.CIFS --timeout=120
/mnt/HD_EXTERNO /etc/auto.HD_EXTERNO --timeout=120

Crie os diretórios "/mnt/SERVIDOR' e "/mnt/HD_EXTERNO".

Crie o arquivo "/etc/auto.CIFS" e "/etc/auto.HD_EXTERNO" e adicione as linhas abaixo:

/etc/auto.CIFS:

windows_backup         -fstype=cifs,rw,username=USUARIO,password=SENHA    ://IPServidor/Compartilhamento

/etc/auto.HD_EXTERNO:

hd_backup      -fstype=ext4,rw,sync,nosuid,noexec            :UUID="a4a6b614-7ed8-4a94-a7ed-c1df57ccf311"

Script para HD:

LANG=C
DATE=$(date +%d-%m-%Y)
TIME=$(date +%H-%M)
WEEKDAY=$(date +%A)
BASEDIR="/var/backup"
BKPDIR="/mnt/HD_EXTERNO/hd_backup"
LOGDIR="/var/log/rsync"
IPDB="192.168.4.18"

backup (){

/bin/find $BKPDIR -maxdepth 1 -type d -not -name lost+found -ctime 15 -exec rm -rfv '{}' \;

                if [ -d $BKPDIR/$DATE ];then

                        /bin/rsync -avz --progress -h --delete --log-file=$LOGDIR/$DATE-HD.log $BASEDIR/ $BKPDIR/$DATE/
                        /bin/echo "Backup DB realizado no servidor $IPDB" \
                        | /bin/mutt emaildestino@gmail -s "Backup da manha para HD externo," -a $LOGDIR/$DATE-HD.log -b copiaoculta@gmail.com
                else
                        /bin/umask 006 ; /bin/mkdir -m 1770 $BKPDIR/$DATE
                        /bin/rsync -avz --progress -h --log-file=$LOGDIR/$DATE-HD.log $BASEDIR/ $BKPDIR/$DATE/
                        /bin/echo "Backup DB realizado no servidor $IPDB" \
                        | /bin/mutt emaildestino@gmail.com -s "Script de Backup para HD externo" -a $LOGDIR/$DATE-HD.log -b copiaoculta@gmail.com
                fi
}

if [ $(/bin/lsusb -d 1058:0820 &> /dev/null)$? -eq 0 ] && [ -L /dev/disk/by-uuid/a4a6b614-7ed8-4a94-a7ed-c1df57ccf311 ]; then

        echo -e "HD externo conectado, Iniciando script as $TIME  \n"

                if [ $(/bin/ls $BKPDIR &> /dev/null)$? -eq 0 ]; then

                        backup

                else
                        /bin/systemctl status autofs.service

                                case $? in
                        3)

                                if [ $(/bin/systemctl start autofs.service)$? -eq 0 ] && \
                                        [ $(/bin/systemctl status autofs.service|grep -i error)$? -eq 1 ]; then

                                        sleep 5
                                                backup
                                        exit
                                fi
                        ;;

                        0)

                                /bin/echo "`/bin/systemctl status autofs.service`" \
                                | /bin/mutt emaildestino@gmail.com -e "set content_type=text/html" -s "ERRO no Daemon AutoFS" \
                                -b copiaoculta@gmail.com -a alerta.gif
                                        exit
                        ;;

                        *)exit

                                esac



                fi

else

        /bin/echo "HDD nao conectado ou mau conectado" \
        | /bin/mutt emaildestino@gmail.com -e "set content_type=text/html" -s "ERRO NO BACKUP !!!" -a alerta.gif -b copiaoculta@gmail.com
        exit

fi

Script para servidor:

LANG=C
DATE=$(date +%d-%m-%Y)
TIME=$(date +%H-%M)
WEEKDAY=$(date +%A)
BASEDIR="/var/backup"
BKPDIR="/mnt/SERVIDOR/windows_backup"
LOGDIR="/var/log/rsync"
IPDB="192.168.4.18"
IPSRV="192.168.4.2"

backup (){

/bin/find $BKPDIR -maxdepth 1 -type d -ctime 15 -exec rm -rv '{}' \;
                        /bin/umask 006 ; /bin/mkdir -m 1770 $BKPDIR/$DATE
                        /bin/rsync -avz --progress -h --log-file=$LOGDIR/$DATE-SRVWIN.log $BASEDIR/ $BKPDIR/$DATE/
                        /bin/echo "Backup DB realizado no servidor $IPDB -> $IPSRV" \
                        | /bin/mutt emaildestino@gmail.com -s "Script de Backup para $IPSRV" -a $LOGDIR/$DATE-SRVWIN.log -b copiaoculta@gmail.com
}

if [ $(/bin/ping -c 2 $IPSRV &> /dev/null)$? -eq 0 ] ; then

        echo -e "$IPSRV esta UP , Iniciando backup as $TIME \n"

                if [ $(/bin/ls $BKPDIR &> /dev/null)$? -eq 0 ]; then

                        backup

                else
                        /bin/systemctl status autofs.service

                                case $? in
                        3)

                                if [ $(/bin/systemctl start autofs.service)$? -eq 0 ] && \
                                        [ $(/bin/systemctl status autofs.service|grep -i error)$? -eq 1 ]; then

                                        sleep 5
                                                backup
                                        exit
                                fi
                        ;;

                        0)

                                /bin/echo "`/bin/systemctl status autofs.service`" \
                                | /bin/mutt emaildestino@gmail.com -e "set content_type=text/html" -s "ERRO no Daemon AutoFS" \
                                -b copiaoculta@gmail.com -a alerta.gif
                                        exit
                        ;;

                        *)exit

                                esac



                fi

else

        /bin/echo "Sem conexao com $IPSRV" \
        | /bin/mutt emaildestino@gmail.com -e "set content_type=text/html" -s "ERRO NO BACKUP !!!" -a alerta.gif -b copiaoculta@gmail.com
        exit

fi

Outras dicas deste autor

Visão geral do Nmap

Configurando parâmetros ajustáveis do sistema de arquivos ext*

Auditando acesso de usuários no Linux

openSUSE 13.1 em UEFI

Leitura recomendada

ShellDocTemplate - Template para documentação de códigos em Shell Script

Imprimindo repetidamente uma palavra ou frase na tela

Instale pacotes pelo apt através de uma lista

Excluindo arquivos por data: find + xargs + rm

Controle de usuários logados

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts