Script de backup + envio de e-mail

Publicado por rafael oliveira em 18/01/2017

[ Hits: 5.663 ]

 


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

Auditando acesso de usuários no Linux

Visão geral do Nmap

openSUSE 13.1 em UEFI

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

Leitura recomendada

Resolvendo waiting ou idle transaction no PostgreSQL

Livros de shell script (um é grátis)

Lendo registros formatados de arquivo de texto em bash

Comentando várias linhas em scripts bash

Backup em fita DLT: Selecionando diretórios através de arquivos de parâmetros

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts