o que acham dessa rotina?

1. o que acham dessa rotina?

charles fábio kiefer
xibo

(usa Ubuntu)

Enviado em 25/10/2012 - 10:12h

o que voces acham dessa rotina de backup, ela pode ser facilmente adaptada a qualquer servidor ubuntu?


Versão 0.5

#!/bin/bash
# Script.......: scriptbackup.sh
# name.........: Gera backup de pastas relacionadas e configuradas
# Author.......: Charles Fábio kiefer aka @xibo
# Co-Authores..: Geraldo T. Albuquerque aka @AprendiNoLinux
# Employees....: @danniel-lara, @alexandregms @lucasdona @andrecanhadas
# charset......: UTF-8
# endofline....: Linux
# since........: 2012-04-26 13:13 (GMT -03:00)
# license......: GPL 3
# system.......: GNU bash, version 3.x
# version......: alfa 0.5
# more.........: Script vai tentar gerar backup de forma inteligente.
#-----------------------------------------------------------------------------#
VERSION="Alfa 0.5"
#-----------------------------------------------------------------------------#
# Observações: [Incluir no Help do Script também]
# O script procura por uma pasta "$PASTA_DESTINO", onde serão guardados os
# "tarballs" das pastas compactadas. Nessa pasta ele procura por um arquivo
# chamado "pastas.conf", onde estão armazenados os caminhos completos para
# as pastas a serem "backupeadas".
# Este arquivo tem o seguinte formato:
# /etc ?????
# /var/cache/bind ?????
# Com um caminho completo por linha.
# Para inserir no crontab:
# crontab -e <-- abre o crontab para edição;
# Lá no arquivo, insira a linha:
# 00 23 * * 4 /backup.sh
# que irá executar o programa "/backup.sh", toda(* *) quinta-feira(4) às
# 23 horas
# Quando incluir no cron deve informar o caminho completo para o script, ex:
# /dir_do_script/scriptbackup.sh
# ou fazer um cd /dir_do_script ; ./scriptbackup.sh
#-----------------------------------------------------------------------------#
#set -x # Liga Debug de tudo.
#trap read DEBUG
DEBUG=9 # 0=Inativo 1,2,3,4,5,6,7,8 e 9 ativam o debug. Em produção DEBUG=0
###############################################################################
# CHANGE LOG
###############################################################################
#-----------------------------------------------------------------------------#
# Alfa 0.5
# ========
# - 2012-04-26 - Incluido função de Ajuda. Falta incluir orientações.
# - 2012-04-26 - Ajustes em funções que atualizam o log do dia.
# - 2012-04-26 - Removido mensagens de alerta ao executar o comando tar.
#-----------------------------------------------------------------------------#
# Alfa 0.4
# ========
# - 2012-04-26 - Gravar cabeçalho para início de backup.
# - 2012-04-26 - Gravar Rodapé com final do backup.
# - 2012-04-26 - Teste realizados na data de hoje e até agora OK.
#-----------------------------------------------------------------------------#
# Alfa 0.3
# ========
# - 2012-04-25 - Outras funções incluídas.
# - 2012-04-25 - Reformulação da lógica.
# - 2012-04-25 - Novos testes para garantir registro de falhas.
#-----------------------------------------------------------------------------#
# Alfa 0.2
# ========
# - 2012-04-25 - Novas funções incluídas.
# - 2012-04-25 - Preparação para trabalhar no cron.
# - 2012-04-25 - Inicializando novas variáveis de controle.
# - 2012-04-25 - Correção de Bug reportado.
# - 2012-04-25 - linha: 77: Syntax error: end of file unexpected (expecting "fi")
#-----------------------------------------------------------------------------#
# Alfa 0.1
# ========
# 2012-04-25 - Criado script por @xibo
#-----------------------------------------------------------------------------#
# Área reservada para variáveis globais caso haja necessidade.
#-----------------------------------------------------------------------------#
#-----------------------------------------------------------------------------#
# FOLDER_TARGET_BACKUP - Permite que possa ser enviado via parâmetro o nome
# da pasta que irá receber o próximo backup a ser realizado.
# Caso não passe parâmetro, vai assumir o /home/Backup como padrão.
#-----------------------------------------------------------------------------#
FOLDER_TARGET_BACKUP=${1:-"/tmp/Backup"} # Comentar esta e descomentar abaixo.
# FOLDER_TARGET_BACKUP=${1:-"/home/Backup"} Mudei para testar na minha máquina.
#-----------------------------------------------------------------------------#
# tempo(em numero de dias) que os arquivos ficarão guardados na pasta de backup
#-----------------------------------------------------------------------------#
TEMPO_LIMITE=20
#-----------------------------------------------------------------------------#
# Arquivo que conterá todas mensagens de log usadas no Script.
# Nos testes como usuário comum vai dar pau de permissão.
# Temporariamente mudando para o tmp.
#-----------------------------------------------------------------------------#
#LOG_MENSAGENS="/var/log/messages"
LOG_MENSAGENS="/tmp/var/log/messages"
#-----------------------------------------------------------------------------#
# Arquivo de configuração que possui os endereços dos diretórios e arquivos
# que serão incluídos no backup. Este arquivo é fundamental.
# Caso não exista, você deve monta-lo da maneira que desejar.
# Vide exemplos no help. FIXME: Na área de Help incluir exemplo do arquivo.
# FIXME: É recomendável que o arquivo pasta.conf não esteja no diretório dos
# backup realizados. (Sugestão)
# Abaixo variável que contém o diretório e o arquivo pasta.conf
# Desta forma você poderá configurar ou automatizar novas necessidades.
# Note: Se for mudar o diretório, altere trocando o que está em
# ${FOLDER_TARGET_BACKUP} por um diretório, ex: /tmp/minhas_configs
#-----------------------------------------------------------------------------#
#PASTA_CONFIG="${FOLDER_TARGET_BACKUP}/pastas.conf"
PASTA_CONFIG="/tmp/config_backup/pastas.conf"
LOG_BACKUP_DIARIO="/tmp/config_backup/log_$(date +%Y-%m-%d).log" # Grava logs de backup.
#-----------------------------------------------------------------------------#
# Nome do arquivo diário de backup para cada pasta.
# Ele vai assumir um prefixo BKP_AAAA-MM-DD.tar.gz
#-----------------------------------------------------------------------------#
NOME_ARQ_BKP="bkp_$(date +%Y-%m-%d_%H-%M-%S).tar.gz"
#-----------------------------------------------------------------------------#
PROGNAME=$(echo $(basename "$0") | sed 's:.sh::') # Nome do aplicativo.
USER_INTERRUPT=13 # Interrupção solicitada pelo usuário.
#-----------------------------------------------------------------------------#
# Área reservada para todas as funções que o script irá precisar.
#-----------------------------------------------------------------------------#

function ajuda()
{
clear
cat <<'eof'



Ajuda sobre Script de Backup.
=============================

Incluir todas orientações para usar este Script.

Fim da Ajuda.
eof
exit
}



function StartBackup()
{
msg_start_bkp1="###############################################################################"
grava_log "${msg_start_bkp1}" "${LOG_BACKUP_DIARIO}"
msg_start_bkp2="################## BACKUP INICIADO EM: $(date +%Y-%m-%d_%H-%M-%S) ####################"
grava_log "${msg_start_bkp2}" "${LOG_BACKUP_DIARIO}"
grava_log "${msg_start_bkp1}" "${LOG_BACKUP_DIARIO}"
}

function FinalBackup()
{
msg_start_bkp1="###############################################################################"
msg_start_bkp2="################## BACKUP TERMINADO EM:$(date +%Y-%m-%d_%H-%M-%S) ####################"
grava_log "${msg_start_bkp2}" "${LOG_BACKUP_DIARIO}"
grava_log "${msg_start_bkp1}" "${LOG_BACKUP_DIARIO}"
}

#-----------------------------------------------------------------------------#
# INÍCIO >>> function Debug()
# PARAM:
# 1 - Nível de erro.
# 2 - Grava log ou mensagens para debug (precisa de ajustes)
#-----------------------------------------------------------------------------#
function Debug()
{

#-------------------------------------------------------------------------#
# Só vai mostrar o Debug se for maior que 0.
# Se no programa principal deixar o DEBUG com 1, mensagem de Debug que
# forem do grupo 2 não serão mostradas.
# Caso queira mesmo ver todas as mensagens, configure o DEBUG=9
#-------------------------------------------------------------------------#

DEBUG=${DEBUG:-0} # Caso não exista a variável.

[ "$1" -le ${DEBUG} ] || return

local prefixo arquivar # Arquivar log foi desabilitada.

case "$1" in
1) prefixo="{TTEXTO}33[33m-- $*{TTEXTO}33[m";;
2) prefixo="{TTEXTO}33[32m---- $*{TTEXTO}33[m";;
3) prefixo="{TTEXTO}33[31m------ $*{TTEXTO}33[m";;
4) prefixo="{TTEXTO}33[34m------ $*{TTEXTO}33[m";;
5) prefixo="{TTEXTO}33[41;33;1m---------- $*{TTEXTO}33[m";;
*) echo -e "Mensagem não categorizada: {TTEXTO}33[41;33;1m$*{TTEXTO}33[m"; return;;
esac
shift
if [ "$1" == "DEBUG-" ]; then
set -x # Liga Debug de tudo.
trap read DEBUG # Aguarda comando do usuário [ENTER] para prosseguir.
shift
fi
if [ "$1" == "DEBUG+" ]; then
set +x # Desliga Debug de tudo.
trap "" DEBUG # Desativa necessidade do [ENTER] para prosseguir.
shift
fi

echo -e "$prefixo"

# Recebe parâmetros com os erros.
# 1 - Nível do erro.
# 1 - Mensagens genéricas de localização ("Estou neste local")
# 2 - Mensagens para localizar fluxo ("Entrei no loop")
# 3 - Mensagens com conteúdo de variáveis importantes.
# 4 - Mensagens com conteúdo de variáveis secundárias.
# 5 - Mensagens de conteúdo CRÍTICO e possíveis erros fatais.
# 2 - A sua mensagem digitada na linha do script.
# Você pode digitar várias mensagens.
# Esteja ciente que a saída do Debug irá mostrar todos juntas.

}
#-----------------------------------------------------------------------------#
#FIM >>> function Debug() RETORNA: NADA.
#-----------------------------------------------------------------------------#

function FN_control_c()
{
DEBUG=9
set +x
echo
echo "#################################################"
echo "## Encerrando Script de backup $(basename "$0") !!!! "
echo "#################################################"
echo
# Preciso gerar o arquivo de trava só para os serviços rodando.
DEBUG=0 # Se quiser saber o que está sendo encerrado deixe com 9.
# Se quiser apagar arquivos, aqui deve receber a função ou comandos.
trap "" TERM INT HUP SIGINT SIGTERM
exit 0
}

function folder_not_exist()
{
# FIXME: Precisa ativar função que testa poder de gravação da nova pasta.
Debug 1 "Tentando criar a pasta:$FOLDER_TARGET_BACKUP [F:$FUNCNAME L:$LINENO]"
# TODO: Seria interessante gerar uma função para os logs de mensagens.

lc_msglog="** ATENÇÂO: Pasta de backup não existe. Data: $(date +%d-%m-%Y)"
grava_log "${lc_msglog}" "${LOG_MENSAGENS}"
grava_log "${lc_msglog}" "${LOG_BACKUP_DIARIO}"

mkdir -p $FOLDER_TARGET_BACKUP #se não existir, criar...
msg_criando="Pasta :$FOLDER_TARGET_BACKUP criada."
Debug 1 "${msg_criando} [F:$FUNCNAME L:$LINENO]"
grava_log "${msg_criando}" "${LOG_BACKUP_DIARIO}"

}

function file_config_not_exist()
{
Debug 3 "arquivo de configuração ${PASTA_CONFIG}, não existe. [L:$LINENO]"
Debug 3 "Deve ser criado antes. Use o Help: ${PROGNAME}.sh --help [L:$LINENO]"
lc_msglog="** ERRO: arquivo de configuração ${PASTA_CONFIG}, não existe."
grava_log "${lc_msglog}" "${LOG_MENSAGENS}"
grava_log "${lc_msglog}" "${LOG_BACKUP_DIARIO}"
lc_msglog="** Deve ser criado, com um nome completo de pasta por linha."
grava_log "${lc_msglog}" "${LOG_MENSAGENS}"
grava_log "${lc_msglog}" "${LOG_BACKUP_DIARIO}"
# Mosta o Help sobre Script
ajuda | less
exit
}

function grava_log()
{
# Recebe a mensagem que irá gravar no log.
local lc_gravar_no_log="$1"
local lc_arq_log="$2" # Nome do arquivo de log.

if [ -f ${lc_arq_log} ]; then

if [ -w ${lc_arq_log} ]; then

echo "${lc_gravar_no_log}" >> ${lc_arq_log}

else
# FIXME: Trocar para um log alternativo caso ocorra este problema.
Debug 5 "Arquivo de log ${lc_arq_log} NÃO TEM PERMISSÃO DE ESCRITA. [F:$FUNCNAME L:$LINENO]"

fi
else
Debug 5 "Arquivo de log ${lc_arq_log} não existe. ERRO FATAL. [F:$FUNCNAME L:$LINENO]"
# FIXME: Trocar para um log alternativo caso ocorra este problema.
# Forçando a gravação porque sei que será registrado.
echo "${lc_gravar_no_log}" >> ${lc_arq_log}
fi

}

function config_linha_dir_not_found()
{
# Entrou na função porque o diretório informado no arquivo de pastas
# não existe. Grava em log diário em separado na pasta de configs.
local lc_dir_de_backup="$1" msg_erro_pasta
Debug 4 "Não achou a pasta: ${lc_dir_de_backup} [F:$FUNCNAME L:$LINENO]"
Debug 4 "Confira o arquivo: ${PASTA_CONFIG} [F:$FUNCNAME L:$LINENO]"
msg_erro_pasta="A pasta:${lc_dir_de_backup} dentro do arquivo"
msg_erro_pasta="$msg_erro_pasta de configuração ${PASTA_CONFIG} "
msg_erro_pasta="$msg_erro_pasta não EXISTE. Verifique por favor"
grava_log "${msg_erro_pasta}" "${LOG_BACKUP_DIARIO}"
}

function gera_bkp_tar()
{
# É neste momento que o arquivo de backup será gerado.
local lc_dir_de_backup="$1" Linha_Target_config Arq_Tar
Linha_Target_config="${FOLDER_TARGET_BACKUP}${lc_dir_de_backup}"
if [ ! -d "${Linha_Target_config}" ]; then
# Vamos criar o clone do diretório porque não existe.
mkdir -p "${Linha_Target_config}"
fi
# Vai até o diretório raiz do backup.
cd ${FOLDER_TARGET_BACKUP}
Arq_Tar="${Linha_Target_config}/${NOME_ARQ_BKP}"

msg_start_bkp1="###############################################################################"
msg_start_bkp2="######## Diretório: ${lc_dir_de_backup}"
grava_log "${msg_start_bkp2}" "${LOG_BACKUP_DIARIO}"

Debug 4 "Executando Backup: ${lc_dir_de_backup} [F:$FUNCNAME L:$LINENO]"


tar -zcvf ${NOME_ARQ_BKP} ${lc_dir_de_backup} 2>/dev/null >> ${LOG_BACKUP_DIARIO}
mv ${NOME_ARQ_BKP} ${Linha_Target_config}

grava_log "${msg_start_bkp1}" "${LOG_BACKUP_DIARIO}"

return
}

function ConfTarGzExiste()
{
Existe_tar_gz_raiz=$(ls ${FOLDER_TARGET_BACKUP}/*.tar.gz 2>/dev/null | wc -l 2>/dev/null)
if [ "${Existe_tar_gz_raiz}" -gt 0 ];then
msg_faill_bkp="Ainda existem arquivos *tar.gz "
msg_faill_bkp="${msg_faill_bkp} no diretório:${FOLDER_TARGET_BACKUP}"
Debug 1 "${msg_faill_bkp} [L:$LINENO]"
grava_log "${msg_faill_bkp}" "${LOG_BACKUP_DIARIO}"
FN_control_c # Aborta processamento.
fi
}

function ConfJaFezBackupHoje()
{
# Conferindo se já fez Backup hoje.
Backup_do_dia="$FOLDER_TARGET_BACKUP/bkp_ok_$(date +%Y-%m-%d).txt"
if [ -f ${Backup_do_dia} ]; then
msg_bkp_hoje="Backup do dia já foi feito:${Backup_do_dia} "
Debug 1 "${msg_bkp_hoje} [L:$LINENO]"
grava_log "${msg_bkp_hoje}" "${LOG_BACKUP_DIARIO}"
msg_start_bkp1="###############################################################################"
grava_log "${msg_start_bkp1}" "${LOG_BACKUP_DIARIO}"
# Registra saída do script.
FN_control_c # Abortando o trabalho.
fi
}
#-----------------------------------------------------------------------------#
# FIM da Área reservada às funções do script.
#-----------------------------------------------------------------------------#

###############################################################################
###############################################################################
# CORPO CENTRAL DO SCRIPT SERÁ INICIADO. VARIÁVEIS GLOBAIS E FUNÇÕES CARREGADAS.
###############################################################################
###############################################################################

#-----------------------------------------------------------------------------#
# Quando quiser encerrar o programa, pressione CTRL+C
#-----------------------------------------------------------------------------#
trap FN_control_c $USER_INTERRUPT TERM INT HUP SIGINT SIGTERM
#-----------------------------------------------------------------------------#
if [ ${FOLDER_TARGET_BACKUP} == "ajuda" ]; then
ajuda | less
exit
fi
#-----------------------------------------------------------------------------#
# Faz teste para verificar se existe a pasta para receber o backup pronto.
#-----------------------------------------------------------------------------#
if [ ! -d ${FOLDER_TARGET_BACKUP} ]; # testa se existe o diretorio "$PASTA_DESTINO"
then
folder_not_exist # Função que irá tomar conta da criação da pasta.
fi

if [ ! -f ${PASTA_CONFIG} ];
then
file_config_not_exist # Carrega a função caso não exista o arquivo.
exit 1
fi

#-----------------------------------------------------------------------------#
# Toda vez que a rotina de backup for inicializada vai gravar cabeçalho.
# Quando for finalizada, vai gravar rodapé no arquivo de log diário.
#-----------------------------------------------------------------------------#
StartBackup # Grava cabeçalho de início de backup.

#-----------------------------------------------------------------------------#
# A estratégia para compor o nome dos arquivos.
# No meu arquivo de exemplo, pastas.conf está preenchido com:
# /home/administrador/Documentos
# /home/administrador/Downloads
# /home/administrador/html
# /home/administrador/Imagens
# /home/administrador/Modelos
#
# Notem que se eu colocar uma linha assim: /home/administrador fará todas
# pastas. Tenha cuidado ao registrar o que deseja fazer backup para não duplicar
# Vamos para a estratégia dos nomes.
# No meu caso, sei que o backup vai ser enviado para: /tmp/Backup
# Então vou criar 5 diretórios automáticamente dentro de /tmp/Backup
# Desta forma você terá um espelho com os arquivos compactados.
# Exemplo:
# /tmp/Backup/home/administrador/Documentos/bkp_2005-09-16.tar.gz
# /tmp/Backup/home/administrador/Downloads/bkp_2005-09-16.tar.gz
# /tmp/Backup/home/administrador/html/bkp_2005-09-16.tar.gz
# /tmp/Backup/home/administrador/Imagens/bkp_2005-09-16.tar.gz
# /tmp/Backup/home/administrador/Modelos/bkp_2005-09-16.tar.gz
# O próprio diretório será a composição dos nomes.
# Caso não goste desta estratégia, altere as variáveis.
# Lembre-se, tudo que está sendo feito neste script é configurável.
# Quando em produção, remova todos estes comentários.
#-----------------------------------------------------------------------------#

#-----------------------------------------------------------------------------#
# Verifica se existe algum arquivo *.tar.gz no raiz do backup.
# Se encontrou algum arquivo neste local é sinal de problema.
# Só poderá fazer o backup se apagar este arquivo.
# FIXME: É importante gerar um registro no log de erros no backup.
# Claro que pode tomar uma atitude apagando os arquivos *.tar.gz do dir.
#-----------------------------------------------------------------------------#
ConfTarGzExiste # Se achar arquivo vai abortar.
#-----------------------------------------------------------------------------#

#-----------------------------------------------------------------------------#
# Quando o backup é terminado de forma normal, gera um registro de finalização.
# Este registro será usado para evitar que seja feito outro backup no mesmo dia.
#-----------------------------------------------------------------------------#
ConfJaFezBackupHoje # Conferindo se já fez Backup hoje.

lc_linha=
while read lc_linha ; do
# pega o nome da pasta.
lc_dir_de_backup=${lc_linha}

#-------------------------------------------------------------------------#
# Faz um teste básico para saber se o diretório informado existe.
# Se não existir, vai gravar no arquivo de log de erros de backup.
# A estratégia me obriga a gravar o log no mesmo diretório do aquivo de
# configuração para obrigar uma revisão.
#-------------------------------------------------------------------------#
if [ ! -d "${lc_dir_de_backup}" ]; then
Debug 1 "Erro grave, config está errado: ${lc_dir_de_backup} [L:$LINENO]"
config_linha_dir_not_found "${lc_dir_de_backup}"
FN_control_c # Saída do Script.
else
# O diretório a ser feito backup existe.
gera_bkp_tar "${lc_linha}"
fi
done < "${PASTA_CONFIG}" # Diretório + o arquivo que contém a configuração.
Debug 1 "Saindo do while [Linha:$LINENO]"

msg_fim_bkp="BACKUP finalizado em $(date +%Y-%m-%d)"
Backup_do_dia="$FOLDER_TARGET_BACKUP/bkp_ok_$(date +%Y-%m-%d).txt"
Debug 1 "${msg_fim_bkp} no:${Backup_do_dia} [L:$LINENO]"


# Gravando arquivo com fim de backup.
echo ${msg_fim_bkp} > ${Backup_do_dia}
FinalBackup # Fecha o arquivo de log do dia com a finalização do backup.

exit 0

#-----------------------------------------------------------------------------#
# guarda em $DELETADOS os nomes dos arquivos que não foram alterados há mais
# de $TEMPO_LIMITE dias e q contenham a extensao .tar.gz
# FIXME: Passar para uma função. Não testei esta parte.
# Precisa de ajustes porque a estratégia de diretórios mudou.
#DELETADOS=`find $FOLDER_TARGET_BACKUP/ -atime +$20 | grep .tar.gz`
#rm -f $DELETADOS
#echo "Foram deletados os seguintes arquivos: " >> $FOLDER_TARGET_BACKUP/removed.log
#echo $DELETADOS >> $FOLDER_TARGET_BACKUP/removed.log
#-----------------------------------------------------------------------------#



  


2. Re: o que acham dessa rotina?

Daniel Lara Souza
danniel-lara

(usa Fedora)

Enviado em 25/10/2012 - 12:30h

minha opinião
poderia ficar mais simples



3. Re: o que acham dessa rotina?

charles fábio kiefer
xibo

(usa Ubuntu)

Enviado em 25/10/2012 - 13:33h

danniel-lara escreveu:

minha opinião
poderia ficar mais simples


eu ja tentei rodar ele varias vezes e não consegui.


4. Re: o que acham dessa rotina?

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 25/10/2012 - 22:25h

danniel-lara escreveu:

minha opinião
poderia ficar mais simples


Daniel...

# Employees....: @danniel-lara, @alexandregms @lucasdona @andrecanhadas



;-), o @AprendiNoLinux colocou seu nome dos créditos ;-)


5. Re: o que acham dessa rotina?

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 25/10/2012 - 22:26h

xibo escreveu:

eu ja tentei rodar ele varias vezes e não consegui.


Como tentou executar? Que erro aparece?


6. Re: o que acham dessa rotina?

charles fábio kiefer
xibo

(usa Ubuntu)

Enviado em 26/10/2012 - 13:31h

rai3mb escreveu:

xibo escreveu:

eu ja tentei rodar ele varias vezes e não consegui.


Como tentou executar? Que erro aparece?


não lembro...tentei no outro servidor que eu tinha....teria que especificar as pastas novamente.
to sem paciencia...heheheh






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts