Rsync e Perl: Sincronização de arquivos com gestão de backup incremental integrada
Publicado por Bruno Rafael Santos (última atualização em 08/05/2012)
[ Hits: 7.865 ]
Homepage: https://cutt.ly/4H7vrPh
Olá pessoal
Este script usa o rsync para fazer a sincronização dos aquivos onde você definir ($to, $from) e também guarda os arquivos modificados em um diretório ($backup) separado, onde cada rodada do rsync recebe um subdiretório com a data em que foi feita. É como um backup incremental, mas com um full backup a cada rodada.
Além disto há um sistema de limpeza automática. A cada backup, uma sub-rotina especial limpa os backups que tenham uma idade especificada em dias (definida em $maxAge, o padrão é 90).
Tudo foi configurado de forma segura. Em caso de erro no rsync a limpeza de backup é cancelada. Se nenhum diretório de backup for definido, nenhuma função de backup será usada e assim por diante. Ele tem uma verbosidade bem chata, chega a ser uma verborragia, mas é assim porque o fiz assim para acompanhar o funcionamento do Perl.
Também tem um adicional. Uso o mesmo script para fazer vários backups de várias coisas diferentes. Então ele pode ser modificado, sem grandes esforços, para receber vários comportamentos diferentes, se estiver interessado em modificações sugiro uma visita na sub-rotina Behaviour().
Sintaxe:
script comportamento configurações
ex:
script sistema restore: restaura o sistema a partir do backup
script games test: roda o rsync em modo seguro, para testes
PS: eu sei que meu código é grande, sujo, tem cheiro de javascript e gosto de php ;)
#!/usr/bin/perl use 5.14.0; #use warnings; use strict; #-------------------------------------------------------------------------------------------------------------- # Backup regressivo com rsync # Autor: Bruno Rafael Santos # Versão: 12.04.31 # Plataforma: openSUSE 12.1 # Site: rafaelocremix.wordpress.com # ##Informações # Script para sincronização de sistemas de arquivos com suporte # a backup utilizando o rsync. O processo consiste de criar um # espelho do sistema de arquivos atual, salvar um backup # dos arquivos modificados e eliminar backups anteriores. # ##Argumentos # A maioria das opções são definidas diretamente do script. # Dois argumentos estão disponíveis: # # restore: # restaura a partir do backup atual e desativa a criação de backups. # # test: # executa em modo seguro, sem modificações dos arquivos. # # As demais opções definem os diretórios de origem e destino do # rsync. Para mais opções, basta adicionar um when ao primeiro foreach # de behaviour(). Note que os argumentos podem ser dados em qualquer ordem ;) #-------------------------------------------------------------------------------------------------------------- ##Declaração de variáveis e configurações: # aqui estão a maioria das variáveis do script. # destas, somente $maxAge (idade máxima dos backups) # e $today (data atual) são verdadeiramente globais. # As demais são configuradas pelo behaviour(). my ($from, $to, $maxAge, $today, $backup, $rsyncArg); $maxAge = 90; chomp ($today = localtime); ##Comandos: # aqui estão as principais chamadas do script. behaviour(); config(); !rsync() and cleanBackup(); ##Sub-rotinas: # aqui está o corpo das funções e esclarecimentos sobre cada uma. sub behaviour { # Define o comportamento do script em relação a origem e destino. # é aqui que novos comportamentos são definidos, basta seguir o exemplo # do system e games. Sugiro que use caminhos absolutos para o diretório de # backup, lembre-se que caso contrário, rsync o localiza dentro do $to. # Se nenhuma especificação for dada, as configurações abaixo serão usadas por padrão: $from = ''; $to = ''; $backup = ''; #foreach: responsável por controlar qual configuração de backup será usada. # o last em cada when é importante aqui para evitar que mais de uma # opção seja selecionada. foreach (@ARGV) { when (/system/) { say 'Fazendo backup dos arquivos pessoais'; $from = ''; $to = ''; $backup = ''; last; } when (/games/) { say 'Fazendo backup dos jogos'; $from = ''; $to = ''; $backup = ''; last; } } #if: garante que algo tenha sido selecionado. if ($from eq '' and $to eq '') { say 'Nenhuma configuração de sincronização escolhida, finalizando...'; exit 0; } return 0; } sub config { # Controla as demais reações do rsync. # Se o diretório backup for indefinido, o backup será desativado, # assim como a limpeza do backup. #foreach: define comportamentos adicionais para o rsync, depende das opções acima. foreach (@ARGV) { when (/test/) { say 'Executando em modo seguro, nenhuma modificação será feita'; $rsyncArg .= "--dry-run "; $backup = ''; } when (/restore/) { say 'Restaurando a partir do último estado'; ($from, $to) = ($to, $from); $backup = ''; } } unless ($backup eq '') { say "Backups serão armazenados no diretório $backup"; $rsyncArg .= qq(--backup --backup-dir="$backup/$today" ); } else { say 'Funções de backup e limpeza desativadas'; } return 0; } sub rsync { # Executa o rsync com as configurações dadas por Behaviour(). # e config(). Retorna a saída do rsync para uso do cleanBackup(). # Em caso de erro no rsync, o cleanBackup() é cancelado. say 'Executando a sincronização...'; $rsyncArg .= "--verbose --recursive --times --compress --links "; $rsyncArg .= "--one-file-system --human-readable --progress "; $rsyncArg .= "--compress-level=9 --delete-after --stats --fuzzy "; my $return = system qq(rsync $rsyncArg "$from" "$to"); say 'Sincronização concluída'; return $return; } sub cleanBackup { # Executa a limpeza do diretório de backup. Diretórios com mais dias de idade # que os definidos em $maxAge serão removidos. # Só executa se um diretório de backup for definido anteriormente. return 0 if ($backup eq ''); say 'Organizando a pasta de backup'; say 'Data de hoje: ',$today; say 'Limpando backups antigos...'; opendir my $dir, "$backup" or die "Impossível abir os arquivos, limpeza do backup cancelada\n"; my @list = readdir $dir; splice @list,0,2; chdir $dir; say "Removendo backups anteriores a $maxAge dias..."; foreach (@list) { if (-M > $maxAge and -d and !/\..*/) { system "rm -R '$_'"; say 'removendo: ',$_; } } }
Inserindo sites em Lista do Squid
Script para adicionar e remover usuários no IMSPECTOR
Listar arquivos de um diretório.
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Melhorando a precisão de valores flutuantes em python[AJUDA] (3)
Instalação Uefi com o instalador clássico do Mageia (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta