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.958 ]
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: ',$_; } } }
Manipulação de Arquivos Orientada a Objetos
Listar arquivos de um diretório.
Script para adicionar e remover usuários no IMSPECTOR
Script que remove palavras de um arquivo.
Nenhum comentário foi encontrado.
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Linux Mint não conecta Wi-Fi sem fio (21)
Criar perfil temporário no Active Directory samba4-21 (2)
Meu Kubuntu não inicia, além do modo de recuperação (no meu dualboot (1)