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.883 ]
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: ',$_; } } }
Script que procura uma palavra em um arquivo.
Script para adicionar e remover usuários no IMSPECTOR
Inserindo sites em Lista do Squid
FTP – Script para adicionar e remover usuários via WEB
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)