Rotina de backup via FTP com limpeza de arquivos remotos

De Wiki Hackstore

Crie um script seguindo o exemplo abaixo, alterando as variáveis:

Credenciais de autenticação

Crie um arquivo contendo seus dados de credenciais:

vi /backup/conf/backup-ftp.conf
DIR="${FULLDIR}"
FILE="${FILIAL}-${DATA}.tar.gz"
HOST="10.199.199.2"
USER="user01"
PASSWD="pass01"


Variaveis de ambiente

Crie um arquivo contendo as váriaveis de ambiente para o backup:

vi /backup/conf/backup.conf
##@@@@@@@@@@@@@##
EMAIL_ERRO="1"
EMAIL_SUCESSO="1"
##@@@@@@@@@@@@@##

# Variaveis globais
DATEMT=$(date +'%Y-%m')
DATA=$(date +'%Y-%m-%d')
ROOTDIR="/backup"
ERRORLOG="$ROOTDIR/logs/backup-error.log"
BKPLOG="$ROOTDIR/logs/backup.log"
LOGMAIL="$ROOTDIR/logs/backup-mailpy.log"
BKPDIR="$ROOTDIR"
FULLDIR="$BKPDIR/files"
ERROR="0"
MAILSCRIPT="$ROOTDIR/bin/mail.py"
SUCESSO="SUCESSO"
FALHA="FALHA"
FILIAL="mwtdb01"


Biblioteca para execução remota de comandos FTP

Crie um script para o Expect. Lembrando de alterar a variável ${BANNER}:

vi /backup/bin/ftp-cmd
#!/usr/bin/expect

set timeout 20
set hostName [lindex $argv 0]
set userName [lindex $argv 1]
set password [lindex $argv 2]
set command1 [lindex $argv 3]
set command2 [lindex $argv 4]

spawn ftp $hostName

expect "Name (${BANNER}:root):"
send "$userName\r"
expect "Password:"
send "$password\r";
expect "ftp>"
send "$command1 $command2\r"
send  "quit\r"
expect eof


Envio remoto com checagem de integridade

Crie um script para envio dos arquivos:

#!/bin/bash

source /backup/conf/backup.conf

# Criando LOCK do script....
LOCK="/backup/backup.lock"
{
if ! flock -n 200; then
        echo -e "$(data_hora) Script rodando.... saindo imediatamente.\n"
        exit 1
else

cd ${DIR}

# Envia o arquivo de dump
${ROOTDIR}/bin/ftp-cmd ${HOST} ${USER} ${PASSWD} put ${FILE}

# Checa se o arquivo remoto possui o mesmo tamanho do arquivo local após upload via FTP visto que o comando FTP sempre retorna status 0 após execução
CHECK_REMOTE_SIZE=$(expect ${ROOTDIR}/bin/ftp-cmd ${HOST} ${USER} ${PASSWD} size ${FILE}|egrep -v '230-|221|ftp\>'|grep 213|awk '{print $2}'|grep -o '[0-9]*')
CHECK_LOCAL_SIZE=$(stat --printf="%s" ${FILE})

if [ "${CHECK_REMOTE_SIZE}" = "${CHECK_LOCAL_SIZE}" ]; then
         echo "SUCESSO AO ENVIAR ARQUIVO ${FILE} VIA FTP" >> ${BKPLOG}
else
        echo "ERRO AO ENVIAR ARQUIVO ${FILE} VIA FTP"  >> ${BKPLOG}
        if [ "${EMAIL_ERRO}" = "1" ]; then echo "Arquivo não enviado com sucesso"|python $MAILSCRIPT "$FALHA ao sincronizar backup com o servidor remoto  "; fi
fi

fi
} 200>${LOCK}

# Removendo arquivo de LOCK...
rm $LOCK


Limpeza remota

Crie um script para limpeza remota dos arquivos:

#!/bin/bash

source /backup/conf/backup-ftp.conf

cd /backup/bin
DAYS_BACKUP_SAVED="2"
EXTENSION_FILES=".tar.gz"

#################################
cmd_ls_ftp(){
        expect ftp-cmd ${HOST} ${USER} ${PASSWD} ls|grep ${EXTENSION_FILES}|awk '{print $9}'
}

cmd_list_clear_ftp(){
        expect ftp-cmd ${HOST} ${USER} ${PASSWD} ls $i|grep ${EXTENSION_FILES}|awk '{print $9}'|head -$(echo ${DAYS_BKP}-${DAYS_BACKUP_SAVED}|bc)
}
cmd_clear_ftp(){
        for i in $(cmd_list_clear_ftp); do
                expect ftp-cmd ${HOST} ${USER} ${PASSWD} del $i|grep ${EXTENSION_FILES}|awk '{print $9}'|head -$(echo ${DAYS_BKP}-${DAYS_BACKUP_SAVED}|bc)
        done
}
#################################

DAYS_BKP=$(cmd_ls_ftp |wc -l)
if [ "${DAYS_BKP}" -gt "${DAYS_BACKUP_SAVED}" ]; then
        cmd_clear_ftp
else
        echo -e "\nnenhum arquivo removido\n"
fi