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.738 ]
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
Script para adicionar e remover usuários no IMSPECTOR
Nenhum comentário foi encontrado.
Como escolher o melhor escalonador de CPU para melhorar o desempenho da máquina
Curiosidade sobre DOOM Guy e Isabelle de Animal Crossing
Inicializando servidor Ubuntu na AWS e rodando apache em Container
Instalando TeamViewer no Debian 12
Conheça o Octopi, outro frontend para o Pacman com acesso ao AUR (Arch Linux e derivados)
Terminal transparente no Debian 12 com interface i3wm usando Xfce4-Terminal e Compton
Eu estou com problemas para usar o QBASIC no Dosbox X (3)
Tibia não pode ser aberto em virtual machine (14)
Após atualização do Ubuntu 22.04.4 LTS perdi a instalação da placa de ... (3)
Não consigo iniciar o Linux normalmente (5)
Notebook com Ubuntu 22.04.4 se reinicia após curtos períodos. (3)