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:
- Realizar backup logo após que a mídia externa for conectada (HDD externo)
- Deletar dados no diretório de backup com 15 dias ou mais
- Realizar backup para diretório em servidor remoto
- 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.
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:
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 realname = “Descricao”
set imap_user = “[email protected]”
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://[email protected]: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/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:
/etc/auto.HD_EXTERNO:
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 [email protected] 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 [email protected] -s "Script de Backup para HD externo" -a $LOGDIR/$DATE-HD.log -b [email protected] 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 [email protected] -e "set content_type=text/html" -s "ERRO no Daemon AutoFS" \ -b [email protected] -a alerta.gif exit ;; *)exit esac fi else /bin/echo "HDD nao conectado ou mau conectado" \ | /bin/mutt [email protected] -e "set content_type=text/html" -s "ERRO NO BACKUP !!!" -a alerta.gif -b [email protected] 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 [email protected] -s "Script de Backup para $IPSRV" -a $LOGDIR/$DATE-SRVWIN.log -b [email protected] } 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 [email protected] -e "set content_type=text/html" -s "ERRO no Daemon AutoFS" \ -b [email protected] -a alerta.gif exit ;; *)exit esac fi else /bin/echo "Sem conexao com $IPSRV" \ | /bin/mutt [email protected] -e "set content_type=text/html" -s "ERRO NO BACKUP !!!" -a alerta.gif -b [email protected] exit fi