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.704 ]

Homepage: https://cutt.ly/4H7vrPh

Download backup.pl




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 ;)

  



Esconder código-fonte

#!/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: ',$_;
         }
      }
   }

Scripts recomendados

Listar arquivos de um diretório.

Eliminando caracteres indesejados

Remove comentarios de scripts

Shadow Post It

Usando ARGV como login


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts