weekly-backup - backup agendado
Publicado por Pedro Fernandes (última atualização em 12/01/2022)
[ Hits: 1.661 ]
Homepage: https://github.com/PedroF37
Download 1640474098.weekly-backup (versão 2)
Script usa a ferramenta tar com a opção '-g', ou '--listed-incremental', para fazer 4 backups por mês os quais são:
1 backup completo uma vez no mês.
3 backups diferenciais nas restantes três semana (1 por semana!).
A opção -g do tar, cria um arquivo de snapshot com os metadados dos itens que estão no arquivamento.
Se usarmos sempre o mesmo arquivo como referência, esse arquivo vai sendo atualizado e cria backups incrementais
ao invés de diferenciais.
Mas, se em cada novo backup, copiarmos sempre o arquivo de snapshot original, e usarmos sempre a cópia do original,
então, as diferenças que vão constar, são as diferenças entre 'hoje' e o dia do primeiro backup (o backup completo).
É o que o script faz.
Antes de usar o script, por favor leia o cabeçalho todo do script.
Versão 2 - Enviado por Pedro Fernandes em 25/12/2021
Changelog: Script corrigido e escrito quase do zero, porque a aritmética com as datas (que no script original era o meio de saber se era ou não hora de fazer um backup completo), estava totalmente errada.
O script da forma como estava nunca fazia backup diferencial, fazia sempre backup completo.
Agora script vê se é ou não hora de fazer backup completo, simplesmente contando quantos "DiffBackups..." é que existem na pasta e se existirem 3 ou mais, então o script cria novamente o backup completo e começa do zero.
Download 1640474098.weekly-backup
#!/bin/bash
#
###########################################################
#
# SCRIPT weekly-backup
# AUTOR Pedro Fernandes
# EMAIL pedrobfernandes37@gmail.com
# DATA 17-05-2021
#
# ---------------------------------------------------------
#
# DESCRIÇÃO:
#
# Script para fazer backups semanais, usando a ferramenta
# tar. Scripts serão 1 backup completo (nível 0) por mês,
# e os restantes serão backups diferenciais (nível 1) por
# semana.
#
# ---------------------------------------------------------
#
# FUNCIONAMENTO:
#
# O script usa a opção '-g' do tar, para criar arquivo de
# snapshot, com os metadados dos itens incluidos no backup.
# Se usarmos sempre esse mesmo arquivo como referência o
# tar cria backups incrementais, porque a cada backup esse
# arquivo é atualizado. Mas, se em cada novo backup, nós
# fizermos uma cópia do arquivo original, e usarmos sempre
# uma cópia, então o backup vai conter as diferenças entre
# o dia atual e o dia do primeiro backup (o backup completo)
# É isso que o script faz.
#
# Atenção que script manda muito output, então se for
# por em crons e coisas dessas, não se esqueça de redirecionar
# as saídas e erros ok!!
#
# ---------------------------------------------------------
#
# PROCEDIMENTO:
#
# O script usa três variáveis, cada uma que retorna uma
# data:
#
# -DateBackup -> esta tem a data de 'hoje'
# -NextWeek -> esta tem a data da próxima semana
# -LastMonth -> esta tem a data do próximo mês
#
# **************************************************
#
# Com elas (variáveis) o script faz o seguinte:
#
# 1. Verifica se existe algum arquivo 'FullBackup*.snar'
# (.snar é a extensão do arquivo de snapshot).
#
# 2. Se não houver, o script cria um backup completo (Full)
# e o arquivo de snapshot correspondente. O arquivo chama-se:
# 'FullBackup-${DateBackup}.snar'
#
# 3. Se houver, o script usa a data no nome do arquivo, e
# compara com a data retornada pela variável LastMonth,
# que tem a data do mês passado, e vê se passou um mês
# ou mais.
#
# 4. Se tiver passado, o script cria uma pasta
# onde coloca todos os arquivos .snar e .t[gbx]z, e
# então começa de novo. Ou seja, cria o backup completo
# e seu arquivo de snapshot correspondente.
#
# 5. Se não tiver passado, então o script faz uma cópia
# do arquivo de snapshot original e usa essa cópia para
# fazer o backup diferencial. A cópia chama-se:
# 'DiffBackup-${DateBackup}-to-${NextWeek}.snar'
#
# ---------------------------------------------------------
#
# NOTAS:
#
# O script usa três variáveis que é para você configurar:
#
# 1. Compact - nesta variável, você diz se quer usar
# gzip, bzip, ou xz. São estes mesmos nomes,
# ou seja, você não coloca gz em vez de gzip
# nem bzip2 em vez de bzip. O script usa o
# case para ver qual está configurado mas, não
# fiz 'or' nenhum do tipo 'gzip | gz)', então se
# não tiver estes nomes vai dar erro.
#
# 2. BackupDestiny - nesta você especifica o diretório
# para os backups. (Caminho Absoluto)
# Você tem que criar o diretório ok?
# O script não cria para você!!
# Exemplo:
#
# BackupDestiny=/archive/pedro
#
# 3. ConfigFile - nesta você coloca o nome do arquivo com
# os itens para backup. O arquivo você põe
# o caminho absoluto e os itens para backup
# a mesma coisa. Exemplo:
#
# ConfigFile=/home/pedro/BackupList.txt
#
# Formato do arquivo:
#
# /home/pedro/Documentos
# /home/pedro/MEGAsync
# etc etc..
#
###########################################################
#
##### PARÂMETROS
#
### Você configura aqui
#
Compact=
ConfigFile=
BackupDestiny=
#
### Daqui em diante não precisa
### mexer mais ok?
#
DateBackup=$(date +%d-%m-%Y)
NextWeek=$(date -d "next week" +%d-%m-%Y)
LastMonth=$(date -d "last month" +%d-%m-%Y)
FullSnapshot=FullBackup-${DateBackup}.snar
DiffSnapshot=DiffBackup-${DateBackup}-to-${NextWeek}.snar
#
###########################################################
#
##### FUNÇÃO PARA MENSAGENS DE ERRO
#
function ErrorExit {
#
echo
echo "$@" >&2
echo Terminando script... >&2
exit 1
}
#
###########################################################
#
##### VERIFICAÇÕES
#
# Verificamos por existência de diretório, arquivo de
# configuração, permissões, etc...
#
[ -z "$BackupDestiny" ] && {
ErrorExit 'Não especificou pasta de destino dos backups.'
}
#
[ ! -d "$BackupDestiny" ] && {
ErrorExit "Pasta $BackupDestiny não existe."
}
#
[ ! -r "$BackupDestiny" ] || [ ! -w "$BackupDestiny" ] || [ ! -x "$BackupDestiny" ] && {
ErrorExit "Precisa de ter permissão para a pasta $BackupDestiny"
}
#
[ -z "$ConfigFile" ] && {
ErrorExit 'Não especificou arquivo com lista de itens para fazer backup.'
}
#
[ ! -f "$ConfigFile" ] && {
ErrorExit "$ConfigFile não existe ou não e arquivo regular."
}
#
[ ! -r "$ConfigFile" ] || [ ! -s "$ConfigFile" ] && {
ErrorExit "Não tem permissão de leitura para $ConfigFile ou arquivo está vazio."
}
#
if [ -z "$Compact" ]
then
ErrorExit "Não especificou o método de compactação"
else
case $Compact in
#
gzip)
Comp=-czf
OutFullArchive=FullBackup-${DateBackup}.tgz
OutDiffArchive=DiffBackup-${DateBackup}.tgz
;;
bzip)
Comp=-cjf
OutFullArchive=FullBackup-${DateBackup}.tbz
OutDiffArchive=DiffBackup-${DateBackup}.tbz
;;
xz)
Comp=-cJf
OutFullArchive=FullBackup-${DateBackup}.txz
OutDiffArchive=DiffBackup-${DateBackup}.txz
;;
*)
ErrorExit "Input Inválido"
#
esac
fi
#
###########################################################
#
##### LISTA DE ITENS PARA BACKUP
#
echo Compondo lista de itens para backup.
#
# Lê o arquivo de configuração. Entada padrão é
# ConfigFile. Line, vai guardando as linhas lidas
# até ao momento, para falar em que linha está
# o item inexistente, ou, o item ao qual usuário
# não tem permissão.
#
exec 3<&0
exec 0<$ConfigFile
Line=1
read Item
#
while [ $? -eq 0 ]
do
if [ -f "$Item" ] || [ -d "$Item" ]
then
#
# Vemos se tem permissão. Ou é dono
# ou é root. Se tiver permissão ok,
# se não, saímos do script.
#
if [ -O "$Item" ] || [ $UID -eq 0 ]
then
:
else
echo
echo '############################################################'
echo
echo Você não tem permissão para Item ${Item##*/} >&2
echo especificado na linha $Line de ${ConfigFile##*/} >&2
echo Terminando script... >&2
echo
echo '###########################################################'
exit 1
fi
#
# Juntamos itens em lista.
#
BackupList="$BackupList $Item"
else
#
# Se não existir o Item, simplesmente
# avisamos sem sair com erro. Usuário
# pode ter deletado arquivo/diretório e
# simplesmente esqueceu de atualizar
# ConfigFile.
#
echo
echo '##############################################################'
echo
echo O Item ${Item##*/} não existe.
echo Está especificado na linha $Line de ${ConfigFile##*/}.
echo Não iremos incluir no backup. Prosseguindo...
echo
echo '##############################################################'
fi
#
Line=$(($Line + 1))
read Item
done
exec 0<&3
#
echo
echo Composição de lista concluída.
echo
#
###########################################################
#
##### BACKUP
#
# Primeiro tentamos entrar em diretório
#
cd $BackupDestiny || {
ErrorExit "Não conseguimos entrar em $BackupDestiny"
}
#
# OK? Vamos ver se tem arquivo de snapshot. Se não
# tiver, criamos um Full. Se tiver, temos que descobrir
# se já passou um mês ou não. Se tiver passado um mês,
# criamos pasta para armazenar o backup full e os
# diferenciais e então começamos tudo de novo.
# Criamos o backup Full e o snapshot Full, na semana
# seguinte cria os diferenciais etc etc.
#
Match=$(ls FullBackup*.snar 2> /dev/null)
#
if [ -z "$Match" ]
then
echo
echo Iniciando backup...
tar -g $FullSnapshot $Comp $OutFullArchive $BackupList 2> /dev/null
else
#
Expired=$(echo "$LastMonth" | sed 's/-//g')
OutOfDate=$(echo "$Match" | cut -d '-' -f 2-4 | \
cut -d '.' -f 1 | sed 's/-//g')
#
if [ "$Expired" -ge "$OutOfDate" ]
then
mkdir Backup-$LastMonth
mv *.snar *.t[gbx]z Backup-$LastMonth
echo
echo Iniciando backup...
tar -g $FullSnapshot $Comp $OutFullArchive $BackupList 2> /dev/null
else
cp "$FullSnapshot" "$DiffSnapshot"
echo
echo Iniciando backup...
tar -g $DiffSnapshot $Comp $OutDiffArchive $BackupList 2> /dev/null
fi
fi
#
echo Backup concluido....
echo Terminando script...
exit 0
#
###########################################################
Backup de MySql para outro servidor FTP!
Script Backup com Log e envio por Email
Backups de servidor CentOS com cPanel/WHM para servidor VPS Windows Server 2008
Limpeza dos dados do rConfig (ferramenta open-source de gerenciamento de configuração
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Erro no suitable vídeo mode (10)
Navegar no Firefox sem passar pelo Google [RESOLVIDO] (2)
Pergunta: Meu teclado não está respondendo direito como e consertar? (3)
Erro: Lazarus 4.2 64 no Linux Mint não entra mais apos ajustar desktop... (1)









