﻿#!/bin/bash

#
#
# Nome:  Script para execução do backup Xcontact.
# Versao: 2                                             Revisão: 16                                      Nome:  backup_v2r16.sh
# Autor: Daniel Lauck
# Script que reune os dados do Xcontact e os prepara para enviar para o servidor de backup. O script pode realizar uma série de funções como executar backup local,
# enviar para o cloud da X5, enviar para um servidor do cliente, etc.
# O controle de qual tarefa executar é feito através do uso de argumentos fornecidos quando da chamada do script;
#
#
# Script baseado no uso de funções e argumentos de ação - utilizando case statement. Dependendo do argumento escolhido pelo usuário será executadas diversas funções
# que realizam as tarefas.
#
#
#######################################################################################################################################
# Changelog:
#
# v2 r16:
# - Correção da função que copia os arquivos de áudios da URA.
# - Removida função que copia a pasta www.
# - Reajuste para manter somente as últimas duas cópias.
#
# v2 r15:
# - Reajustado forma como que o diretório de backup é determinado. Usado variável declarada no início do arquivo.  dir_bkp_tmp
#
#
# v2 r14:
# - Adicionado comando "core show settings" para extrair informações gerais do asterisk.
#
#
# v2 r13:
# - Melhorada a sessão de comentários do cabeçalho.
# - Atualizada a mensagem de erro quando se executa o script sem fornecer argumentos.
# - Tarefa de copiar os áudios da URA agora é realizada pela função "exporta_audios_xcontact", analisando se os áudios estão em /opt/xcontact/audios
# ou ainda na pasta /gravacoes.
#
#
# v2 r12:
# Alterado o diretório de backup dos áudios
#
# v2 r10:
# Adequação para funcionar com Xcontact v 3.4.0 e superiores (Centos7)
# O Script faz uso de blocos de  funcoes (function) e "cases", sendo cada tarefa atribuida a uma funcao e depois chamada conforme a
# escolha feita através da chamada do script. O comportamento do script é determiando pelo parametro $1, chamado junto ao script.
#
# v2 rev9:
# Adicionado processo para cópia de chaves para login sem senha no processo de envio de backup.
# Reajustado processo envio de backup cliente home office
#
# rev8:
# Adicionada a cópia do arquivo config.json
#
# rev7:
# Correçao da verificação de dependencias
# Adição da função para backup de clientes home office
#
# rev6:
# Script copia o conteúdo do diretório /gravacoes/Xcontact/, contendo todos os audios de URA.
#
#
#
#
#
########################################################################################################################################
#
# Forma de uso:
#
# ./backup_v2rX {parametro}
#
# exporta             : somente cria o arquivo tar com o conteudo do backup. Nao envia para os diretórios remotos. Grava dentro de /bkp
# so_envia            : apenas envia os arquivos já gerados
# envia_cliente       : realiza o backup do sistema e envia para o diretorio do Cliente"
# envia_x5            : realiza o backup do sistema e envia para a X5"
# so_envia_x5         : apenas envia os arquivos para o servidor de backup"
# limpa               : limpa o diretório /bkp deixando somente os 3 ultimos backups"
# sync-gravacoes      : sincroniza o diretório de gravacoes para servidor remoto"
# prepara_envio_x5    : prepara as chaves SSH para envio para a X5"
# backup_home         : realiza o backup do sistema e envia para a X5 - pasta home"
#
#
#
#########################################################################################################################################
# Dependências:  pacote RSYNC, PV, WGET
#
# Script tenta instalar as dependências de forma automática.
#
# Instalação deve ser feita com:
# yum install -y pv
# yum install -y rsync
# yum install -y wget
#
# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# rpm -ivh epel-release-latest-7.noarch.rpm
#
#
############################################ FIM DO CABEÇALHO ###########################################################################
#
#
#
#
#
#
#
# Define as variáveis

CLIENTE=$('hostname')                                    #    <<<<------------------- EDITAR - Nome do cliente. Utilizar apenas 1 nome sem caract. especial.
DATA=`date +%d-%m-%Y`
HORA=`date +%H:%M`
SRV_CLIENTE=172.30.25.142                       #    <<<<------------------- EDITAR - End. IP do servidor de backup do cliente.
LOG=/var/log/log_bkp.txt
RSYNC_SRV=172.30.25.15                          #    <<<<------------------- End. IP do servidor de backup da X5     - NÃO ALTERAR
RSYNC_SRV_HOME=172.30.25.15                     #    <<<<------------------- End. IP do servidor de backup da X5     - NÃO ALTERAR
DIR_BKP_TMP=/tmp                                #    <<<<------------------- EDITAR - Diretório onde será gerado o arquivo temporário de backup. 

 
shopt -s extglob



# Testes preliminares de sanidade
# Verifica a existencia de diretorios e arquivos importantes.



function testes_preliminares (){

    RESULTADO1=`rpm -qa wget`
    RESULTADO2=`rpm -qa pv`
    RESULTADO3=`rpm -qa rsync`


    if [ ! $RESULTADO1 ]; then
      echo "Pacote wget não instalado.....instalando"
      yum install wget -y
    else
      echo "Pacote wget instalado."
    fi


    if [ ! $RESULTADO2 ]; then
      echo "Pacote PV não instalado.....instalando"
      wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
      rpm -ivh epel-release-latest-7.noarch.rpm
      yum install pv -y
    else
      echo "Pacote PV instalado. Prosseguindo"
    fi

    if [ ! $RESULTADO3 ]; then
      echo "Pacote rsync não instalado.....instalando"
      yum install rsync -y
    else
      echo "Pacote rsync instalado."
    fi


}




# Cria os diretórios temporários necessários para salvar os arquivos.

function cria_dir(){

/bin/mkdir $DIR_BKP_TMP/xcontact-export/ >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/linux_data/ >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/sounds >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/audios >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/utils/ >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/agi >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/moh >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/Xcontact >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/linux_data/ >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/khomp/ >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/banco_dados/ >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/www/ >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/vpn/ >/dev/null 2>&1
/bin/mkdir $DIR_BKP_TMP/xcontact-export/opt/ >/dev/null 2>&1
/bin/mkdir /bkp/ >/dev/null 2>&1
}




# Funcao que realiza o backup do banco de dados do Xcontact.

function export_banco(){


# Bkp da base
echo "Realizando processo de export do banco de dados:"
/usr/bin/pg_dumpall -U xcontact -l xcontact -f $DIR_BKP_TMP/xcontact-export/banco_dados/xc_export-${CLIENTE}-${DATA}.sql | pv -p -t -s 100000000 -r -b


}


function export_dados_ast(){


# Backup da configuração geral do asterisk e do Linux. Obtem dados que não estão em banco.

echo "Iniciando a cópia dos arquivos:"
cp -r /etc/asterisk/sip_trunk.conf $DIR_BKP_TMP/xcontact-export/
cp -r /etc/asterisk/sip.conf $DIR_BKP_TMP/xcontact-export/sip.conf_original
cp -r /etc/asterisk/extensions_custom.conf $DIR_BKP_TMP/xcontact-export/
cp -r /etc/asterisk/extensions.conf $DIR_BKP_TMP/xcontact-export/extensions.conf_original
cp -r /etc/asterisk/cdr.conf $DIR_BKP_TMP/xcontact-export/
cp -r /etc/asterisk/confbridge.conf $DIR_BKP_TMP/xcontact-export/
cp -r /etc/asterisk/features.conf $DIR_BKP_TMP/xcontact-export/
cp -r /etc/asterisk/rtp.conf $DIR_BKP_TMP/xcontact-export/
cp -r /etc/asterisk/musiconhold.conf $DIR_BKP_TMP/xcontact-export/
cp -r /etc/asterisk/voicemail.conf $DIR_BKP_TMP/xcontact-export/
cp -r /etc/asterisk/func_odbc.conf $DIR_BKP_TMP/xcontact-export/func_odbc.conf_original
cp -r /var/lib/asterisk/sounds/* $DIR_BKP_TMP/xcontact-export/sounds/
cp -r /var/lib/asterisk/agi-bin/cust* $DIR_BKP_TMP/xcontact-export/agi/ 2>/dev/null     # Estes arquivos podem não existir então não apresenta o erro na tela.
cp -r /etc/sysconfig/network-scripts/ifcfg* $DIR_BKP_TMP/xcontact-export/ 2>/dev/null   # Estes arquivos podem não existir então não apresenta o erro na tela.
cp -r /etc/sysconfig/network-scripts/route* $DIR_BKP_TMP/xcontact-export/ 2>/dev/null   # Estes arquivos podem não existir então não apresenta o erro na tela.
cp -r /etc/motd $DIR_BKP_TMP/xcontact-export/
cp -r /opt/xcontact/xcontact-server/*.json $DIR_BKP_TMP/xcontact-export/
cp -r /opt/xcontact/xcontact-callback-abandono/config.json $DIR_BKP_TMP/xcontact-export/config.json.callback


# Copia, se existir, os arquivos da VPN.

if [ -d /etc/openvpn/ ]; then
        cp -r /etc/openvpn/* $DIR_BKP_TMP/xcontact-export/vpn/
else
    echo "Não foi detectado ambiente de VPN."
fi


# Backup do ambiente Khomp

if [ -d /etc/khomp ]; then
    cp -r /etc/khomp/* $DIR_BKP_TMP/xcontact-export/khomp/
    cp -r /etc/asterisk/khomp.conf $DIR_BKP_TMP/xcontact-export/
else
    echo "Não foi detectado ambiente da Khomp instalado."
fi
echo "Cópia de arquivos Linux finalizada:"

}



function exp_utils () {

#Copia os scripst de backup e demais utilizários da X5.

echo "Iniciando copia dos scripts utils:"

 cp -r /opt/xcontact/ $DIR_BKP_TMP/xcontact-export/utils/


 echo "Copia dos scripts utils finalizada:"
}




function exporta_linux {

echo "Iniciando prints Linux:"

# Tira alguns prints com informações relevantes do sistema.
 echo ..........Versão do Xcontact ...................................> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 rpm -qa | grep xcontact  >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo ................................................................>> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 ip addr sh >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 ip route  >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 ss -tuan >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 iptables -nvL >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 iptables -t nat -nvL >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 crontab -l >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 uname -r >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 df -h -t ext4 >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 df -h -t xfs >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 mount >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 lscpu >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo . >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo . >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo . >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo ...................MOSTRA OS DADOS ASTERISK...................... >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo . >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo . >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo . >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo ....................sip show peers..........................>> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 asterisk -rx "sip show peers" >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo ....................sip show users..........................>> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 asterisk -rx "sip show users" >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo ....................sip show settings.......................>> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 asterisk -rx "sip show settings" >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo ....................core show settings......................>> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 asterisk -rx "core show settings" >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo ....................sip show registry.......................>> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 asterisk -rx "sip show registry" >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 echo ....................core show translation...................>> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 asterisk -rx "core show translation" >> $DIR_BKP_TMP/xcontact-export/linux_data/prints.txt
 cat /etc/asterisk/sip.conf | grep register > $DIR_BKP_TMP/xcontact-export/linux_data/registros.txt
 cat /etc/asterisk/extensions.conf | grep Realtime -b1 > $DIR_BKP_TMP/xcontact-export/realtime.txt
}


function exporta_audios_xcontact (){

    if [ -d /opt/xcontact/audios/ ]; then
        echo "Audios localizados dentro de /opt/xcontact/audios/"
        cp -r /opt/xcontact/audios/* $DIR_BKP_TMP/xcontact-export/audios/

    else
        echo "Audios localizados dentro de /gravacoes/xcontact/audios/"
        cp -r /gravacoes/Xcontact/audios/* $DIR_BKP_TMP/xcontact-export/audios/

    fi

}


function export_reune_dados () {

# Reune e comprime tudo


   echo "Iniciando processo para criar o tar : `date +%d-%m-%y_%H:%M:%S`"
#   /bin/tar -cjf /bkp/xcontact_export-${CLIENTE}-${DATA}.tar.bz2 $DIR_BKP_TMP/xcontact-export
   /bin/tar cf - $DIR_BKP_TMP/xcontact-export/ -P | pv -s $(du -sb $DIR_BKP_TMP/xcontact-export | awk '{print $1}') | gzip > /bkp/xcontact_export-${CLIENTE}-${DATA}.tar.gz
   #Verifica se o tar foi criado com sucesso, caso contrário sai e registra no log.
   if test $? = 1; then
   echo "Falha ao criar o arquivo tar: `date +%d-%m-%y_%H:%M:%S`" >> $LOG
   echo "Falha ao criar o arquivo tar:"
   fi

}



#TODO      Função obsoleta. Remover em futurar versões.

function export_www () {
  cp -r /var/www/html/  $DIR_BKP_TMP/xcontact-export/www/
}



function export_opt () {
  cp -r /opt/xcontact/  $DIR_BKP_TMP/xcontact-export/opt/
}


function export_audios (){
    cp -r /gravacoes/Xcontact/audios/ $DIR_BKP_TMP/xcontact-export/audios/

}


# Faz o ajuste para funcionamento do login sem senha no servidor de backup da X5.
function ajustaLoginSSH(){

  sed -i '/172.30.25.15/,$d' /root/.ssh/known_hosts      #Limpa referencia ao host remoto.

  if [ -f /root/.ssh/id_rsa ]; then
    
    echo "Identificado ajuste de PKI. Reutilizando a mesma chave."
    ssh-copy-id bkp_rsync@${RSYNC_SRV_HOME}

  else
    echo "Não foi identificado ajuste de PKI."
    ssh-keygen -t rsa -f /root/.ssh/id_rsa -q -N ""
    ssh-copy-id bkp_rsync@${RSYNC_SRV_HOME}
  fi

}


function envia_rsync () {


# Envia o backup para o servidor na X5.
echo "Enviando via Rsync"
echo ${RSYNC_SRV}
echo ${CLIENTE}
rsync -Cravz /bkp/ bkp_rsync@${RSYNC_SRV}:/backup/premisses
}




function envia_cliente () {

 echo "Enviando para a pasta do cliente"
# Envia para o cliente


 rsync -Cravzp /bkp/ root@${SRV_CLIENTE}:/bkp/

}


# Envia para o cliente
function envia_bkpHome () {

 echo "Enviando para a centralizados backup home office"


 rsync -Cravp /bkp/ bkp_rsync@${RSYNC_SRV_HOME}:/backup/homeoffice

}



#   Faz o sincronismo do diretório de gravaçoes entre com o servidor de backup.
function envia_cliente_grav () {

   rsync -Cravp /gravacoes/* root@${SRV_CLIENTE}:/gravacoes/

}




# Realiza o processo de limpeza dos diretórios temporários após a finalização do script. Deixa somente os 3 últimos backups dentro do diretório /bkp.

function limpa () {

        echo "Limpando o diretorio de backups /bkp: `date +%d-%m-%y_%H:%M:%S`" >> $LOG

        if [ -d /bkp ]; then
                cd /bkp

                file1=`ls -1t  | head -1`
                file2=`ls -1t  | head -2 | tail -1`
                echo ">"
                echo ">"
                echo "Cópias de segurança armazenadas no disco local:"
                echo ">"
                echo ">"
                echo Backup mais recente é      : $file1
                echo Segundo mais recente é     : $file2
                echo ">"
                echo ">"
                echo ">"
                echo ">"
                echo ">"

                rm -v !("$file1"|"$file2") >/dev/null 2>&1

                echo ">"
                echo ">"
                echo "Limpando o diretorio $DIR_BKP_TMP/xcontact-export:"
                echo ">"
                echo ">"

                 if [ -d  $DIR_BKP_TMP/xcontact-export/ ]; then
                 rm -fr $DIR_BKP_TMP/xcontact-export/* -R
                 echo "Conteudo do diretorio é $DIR_BKP_TMP/xcontact-export:"
                 fi

        else
                  echo "Falha ao limpar os diretórios."
          exit 1
       fi
}





# Mostra os arquivos dentro do backup.
function export_mostra_dados () {

         echo "Os arquivos dentro do TAR sao:"
         /bin/tar -jtvf /bkp/xcontact-${CLIENTE}*
}


function forma_de_uso(){

  echo `$0`
  echo "Uso:          ./backup_vXrX.sh ARGUMENTO"
  echo "."
  echo "."
  echo "exporta             : realiza o backup do sistema para restore e atualização. Criado arquivo .gz dentro do diretório /bkp"
  echo "envia_cliente       : realiza o backup do sistema e envia para o diretorio do Cliente"
  echo "envia_x5            : realiza o backup do sistema e envia para a X5"
  echo "so_envia_x5         : apenas envia os arquivos para o servidor de backup"
  echo "limpa               : limpa o diretório /bkp deixando somente os 3 ultimos backups"
  echo "sync-gravacoes      : sincroniza o diretório de gravacoes para servidor remoto"
  echo "prepara_envio_x5    : prepara as chaves SSH para envio para a X5"
  echo "backup_home         : realiza o backup do sistema e envia para a X5 - pasta home"
  echo "."
  echo " ##########################    IMPORTANTE   #############################################"
  echo "."
  echo "Fazer o ajuste da variável CLIENTE dentro do script, com o nome do cliente. Utilizado para formar o nome do arquivo gz"
  echo "."
  echo "."
  echo "."

}

#
#
#
########################### INICO DO BLOCO QUE TRATA A AÇÃO ESCOLHIDA  PELO USUÁRIO  #################################################
#
#
#

case $1 in



exporta)
        testes_preliminares
        cria_dir
        export_banco
        export_dados_ast
        exporta_linux
        exp_utils
        exporta_audios_xcontact
        export_reune_dados
        limpa

;;

exportaHome)

         # Gera os arquivos de backup e envia para o dispositivo do cliente.

         echo "Backup Xcontact CRIACAO E ENVIO RSYNC PARA HOME iniciado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG
         testes_preliminares
         cria_dir
         export_banco
         export_dados_ast
         exporta_linux
         exp_utils
         export_audios
         export_reune_dados
         envia_bkpHome
         limpa
         echo "Backup Xcontact CRIACAO E ENVIA RSYNC PARA HOME finalizado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG

;;


sync-gravacoes)
        testes_preliminares
        envia_cliente_grav


;;




envia_x5)
         echo "Backup Xcontact CRIACAO E ENVIO RSYNC iniciado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG
         testes_preliminares
         cria_dir
         export_banco
         export_dados_ast
         exporta_linux
         exp_utils
         exporta_audios_xcontact
         export_reune_dados
         envia_rsync
         limpa
         echo "Backup Xcontact CRIACAO E ENVIA RSYNC finalizado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG


;;

envia_cliente)
 # Gera os arquivos de backup e envia para o dispositivo do cliente.
         echo "Backup Xcontact CRIACAO E ENVIO RSYNC iniciado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG
         testes_preliminares
         cria_dir
         export_banco
         export_dados_ast
         exporta_linux
         exporta_audios_xcontact
         exp_utils
         export_www
         export_reune_dados
         envia_cliente
         envia_cliente_grav
         limpa
         echo "Backup Xcontact CRIACAO E ENVIA RSYNC finalizado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG
;;


so_envia_cliente)
         # Envia todo o conteúdo da pasta /bkp para o servidor de backup do Cliente
        testes_preliminares
        envia_cliente
        envia_cliente_grav
;;

limpa)
        echo "Backup Xcontact APENAS ENVIO iniciado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG
        limpa
        echo "Backup Xcontact CRIACAO E ENVIA finalizado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG
;;



so_envia_x5)
        echo "Backup Xcontact APENAS ENVIO iniciado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG
        testes_preliminares
        envia_rsync
        echo "Backup Xcontact CRIACAO E ENVIA finalizado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG


;;


prepara_envio_x5)
  ajustaLoginSSH

;;


backup_home)
        echo "Backup Xcontact CRIACAO E ENVIO RSYNC HOME iniciado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG
         testes_preliminares
         cria_dir
         export_banco
         export_dados_ast
         exporta_audios_xcontact
         exporta_linux
         exp_utils
         export_www
         export_reune_dados
         envia_bkpHome
         limpa
         echo "Backup Xcontact CRIACAO E ENVIA RSYNC HOME finalizado em: `date +%d-%m-%y_%H:%M:%S`" >> $LOG

;;


-h | --help)

  forma_de_uso

;;


-V | --version)

  echo "Script para backup do ambiente do Xcontact. Versão 2 revisão 13"

;;


*)

echo "Utilize  (-V | --version) para exibir a versão"
echo "Utilize  (-h | --help) para exibir a ajuda de como utilizar."


esac




exit 0





# FIM
