terça-feira, 18 de agosto de 2009

Backup Incremental com o Mutt + sSMTP + Gmail...

Um dia, mais cedo ou mais tarde, acontece. Pode ser por um arquivo corrompido ou deletado, ou por um disco danificado, ou por uma partição formatada, ou por inundação, incêndio, explosão, ou por qualquer outra coisa. Um dia você vai perder aquele(s) arquivo(s) super-hiper-importante(s), vai lembrar que o último backup existente é de uns 3 meses atrás e se arrepender de não ter parado 10 minutos no dia anterior para fazer uma simples cópia de tudo.

Há um bom tempo tenho feito grandes backups de todos meus arquivos, em CD/DVD e num velho disco removível. Só que entre um backup e outro havia um espaço de 1, 2, ..., n meses, e os novos arquivos criados e as modificações ficavam sem cópia por um bom tempo. Felizmente, nos últimos anos, não precisei recuperar arquivos, mas é bom estar prevenido. Pensei, pesquisei, e arquitetei um backup incremental usando o Mutt + sSMTP + Gmail + algumas coisinhas.

O Mutt é um cliente de e-mail, e sua principal característica neste projeto é que pode-se enviar por ele um e-mail através da linha de comando. O sSMTP é um servidor "simplificado" de correio eletrônico, necessário para ser utilizar o Mutt. O Gmail dispensa apresentação. O Tar é uma ferramenta em linha de comando para empacotar arquivos. O cron, o agendador de tarefas da família Unix.

Como misturei tudo??? Simples. Comecei criando um script em shell, com o comando tar fazendo um backup incremental.
tar -cvzf /pasta_para_backup/bck_diario_`date +%Y%m%d`.tgz --exclude=bck* --exclude=*.com --newer-mtime `date -d '2 day ago' +%Y-%m-%d` /pasta_para_backup/* >> /pasta_para_backup/bck_diario_`date +%Y%m%d`.log
Opções utilizadas:
-c, cria um novo arquivo;
-v, informa cada arquivo copiado. A listagem é redirecionada, gerando um arquivo de log (>> /pasta_para_backup/bck_diario_`date +%Y%m%d`.log);
-z, comprime o arquivo de backup gerado com o gzip;
-f, nome do novo arquivo de backup a ser criado. Utilizo o comando Date com o opção %Y%m%d para criar parte do nome do arquivo de backup e de log. Os nomes dos arquivos gerados hoje, por exemplo, foram bck_diario_20090818.tgz e bck_diario_20090818.log;
--exclude, exclui alguns arquivos do backup. O --exclude=bck* exclui a si mesmo, os demais arquivos de backups existentes e os arquivos de log, já que salvo tudo na mesma pasta onde realizo os backups. O Gmail recusa alguns tipos de anexos, mesmo dentro de um arquivo tgz, como executáveis, e arquivos compactados dentro de outros arquivos compactos. Utilizo a opção --exclude=*.com por que o Pidgin salva certificados com o nome do servidor, como por exemplo login.live.com. Esse arquivo não é um executável, é um simples certificado em ASCII, mas se tentar enviar para o Gmail, o e-mail vai ser recusado;
--newer-mtime, faz a cópia somente dos arquivos modificados e criados após a data informada. Eu utilizo date -d '2 day ago' +%Y-%m-%d para fornecer a data de dois dias atrás. O backup é feito diariamente. Escolhi dois dias para minimizar eventual falha num dia;
e, para terminar, o local onde devem ser procurados os arquivos. O /pasta_para_backup/* inclui as subpastas.

E para mandar os arquivos para o Gmail, utilizo o Mutt.
echo "Backup encerrado em `date`" | mutt -s "Backup `date +%Y%m%d`" -a /pasta_para_backup/bck_diario_`date +%Y%m%d`.tgz /pasta_para_backup/bck_diario_`date +%Y%m%d`.log -- email@do_destino.com.br
Um forma simples do chamar o Mutt na linha de comando para enviar uma mensagem é corpo_da_mensagem | mutt -s assunto_da_mensagem -a anexo_da_mensagem -- email@do_destino.com.br. Utilizo o comando Date da mesma forma que utilizo para criar o arquivo tar, por isso o bck_diario_`date +%Y%m%d`.tgz. Eu utilizo o Mutt, e o sSMTP, somente para essa função, então eles não estão corretamente configurados. Para que eles funcionem, é preciso configurar dois arquivos.

No arquivo de configuração do Mutt, o .muttrc, normalmente na raiz da pasta do usuário, é preciso, no mínimo, configurar a forma de envio dos e-mails.
set sendmail="/usr/sbin/ssmtp -auemail@do_remetente.com.br -apsenha_do_email"

No arquivo de configuração do sSMTP, o ssmtp.conf, em /etc/ssmtp/, as configurações do Gmail.
FromLineOverride=NO
Mailhub=smtp.gmail.com:465
UseTLS=YES
E para que isso funcione automaticamente, incluí uma linha no arquivo crontab, chamando o script uma vez por dia.

Basicamente, é isso.

O Mutt, por não estar totalmente configurado, cria um arquivo sent na pasta do usuário. Incluí um rm /pasta_para_backup/sent no final do shell script para exclui-lo.

Na dúvida se foi ou não foi, olho os logs mail.err, mail.info, mail.log, mail.warn e syslog, todos na pasta /var/log/.

F.M.