You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

348 lines
11 KiB

#!/bin/bash
trap "" 2 20
#Para rodar o script via crontab sem passar pelo menu, adicione os parametros config,bd,audios,copia(realiza uma copia do arquivo para a Simples IP) apos o nome do script
#Ex: /hdaux/utilitarios/scripts/backup.sh config
#Ex: /hdaux/utilitarios/scripts/backup.sh config,bd
#Ex: /hdaux/utilitarios/scripts/backup.sh config,bd,audios
#Configuracao no crontab
#Backup - Shell
#0 1 * * * root /hdaux/utilitarios/scripts/backup.sh config,bd,copia
#Variaveis
#Diretorio raiz do backup sem / no final
DIR_BACKUP=/hdaux/backup
[ -d /hd2 ] && mkdir -p /hd2/backup && DIR_BACKUP=/hd2/backup
CLIENTE=$([ -e /hdaux/cliente ] && cat /hdaux/cliente)
IP_CENTRAL_SIP=$(ifconfig | grep "inet " | grep -v "127.0.0.1" | awk {'print $2'} | sed -e 's/addr://g'| sed -e 's/^/IP-CENTRAL-SIP:/g')
EMAIL="suporte@simplesip.com.br"
SERVER="192.168.115.13"
USER_REMOTO="backup"
SENHA_REMOTO="SimpleS"
PARAMETROS=$1
if [ -z $PARAMETROS ] ; then
# Loop que mostra o menu principal
drives=$( dialog --stdout \
--title 'Escolha dos Componentes' \
--separate-output \
--checklist 'Quais itens voce deseja copiar?' \
0 0 0 \
config '' ON \
bd '' ON \
audios '' OFF \
copia_remota_Simples_IP '' OFF )
# Apertou CANCELAR ou ESC, então sair...
[ $? -ne 0 ] && exit
else
drives=$(echo $PARAMETROS | sed "s/,/\\n/g")
fi
[ -z "$drives" ] && exit
#Armazenando a data e hora em uma variavel
declare -x data=$(date +%F-%H-%M-%S)
#Criando a pasta para armazenar o backup:
mkdir -p $DIR_BACKUP/$data
echo "$drives" | while read LINHA
do
case $LINHA in
config)
clear
echo "Copiando arquivos de configuracao"
mkdir -p $DIR_BACKUP/$data/var_spool_asterisk
cp -Rap /etc/asterisk $DIR_BACKUP/$data/etc_asterisk
cp -Rap /var/lib/asterisk $DIR_BACKUP/$data/var_lib_asterisk
cp -Rap /var/spool/asterisk/{dictate,meetme,outgoing,system,tmp,voicemail} $DIR_BACKUP/$data/var_spool_asterisk/
cp -Rap /etc/dahdi $DIR_BACKUP/$data/etc_dahdi
cp -Rap /etc/ppp $DIR_BACKUP/$data/etc_ppp
cp -Rap /etc/snmp $DIR_BACKUP/$data/etc_snmp
cp -Rap /hdaux/utilitarios/scripts $DIR_BACKUP/$data/hdaux_utilitarios_scripts
wget -qO- 'http://127.0.0.1' | grep -i "<title>Sistema" > $DIR_BACKUP/$data/versao.txt
;;
bd)
clear
echo "Copiando banco de dados"
pg_dump -i -Fp pbx > $DIR_BACKUP/$data/pbx.sql
RESULT=$?
if [ "$RESULT" != "0" ] ; then
clear
echo -e "Subject: BACKUP - CLIENTE:$CLIENTE\nERRO DURANTE O BACKUP DO BANCO DE DADOS EM: $(date +%F-%H-%M-%S). \n$IP_CENTRAL_SIP" | msmtp -t $EMAIL
fi
;;
audios)
clear
echo "Copiando arquivos de audio (gravacoes)"
mkdir -p $DIR_BACKUP/$data/gravacoes
CONT=1
ARQUIVOS=$(ls -ltr --time-style=+%F-%T /var/spool/asterisk/monitor/ | grep -v "\-rwxr-x---" | grep -i wav)
TOTAL=$(echo "$ARQUIVOS" | wc -l)
echo "$ARQUIVOS" | while read LINHA; do
echo "Copiando arquivo $CONT de $TOTAL"
echo ""
ANO=$(echo "$LINHA" | awk {'print $6'} | cut -f 1 -d "-")
MES=$(echo "$LINHA" | awk {'print $6'} | cut -f 2 -d "-")
AUDIO=$(echo "$LINHA" | awk {'print $7'})
if ! [ -d $DIR_BACKUP/$data/gravacoes/$ANO ] ; then
mkdir -p $DIR_BACKUP/$data/gravacoes/$ANO
fi
if ! [ -d $DIR_BACKUP/$data/gravacoes/$ANO/$MES ] ; then
mkdir -p $DIR_BACKUP/$data/gravacoes/$ANO/$MES
fi
cp -Rap /var/spool/asterisk/monitor/$AUDIO $DIR_BACKUP/$data/gravacoes/$ANO/$MES/
[ -f $DIR_BACKUP/$data/gravacoes/$ANO/$MES/$AUDIO ] && chmod 0750 /var/spool/asterisk/monitor/$AUDIO
CONT=$(($CONT + 1))
done
;;
copia_remota_Simples_IP)
echo "OK" > /tmp/copia_bkp.txt
;;
copia)
echo "OK" > /tmp/copia_bkp.txt
;;
esac
done
#Criando arquivo de restauracao
cd $DIR_BACKUP
[ -e $DIR_BACKUP/$data/restaura.sh ] && /bin/rm -rf $DIR_BACKUP/$data/restaura.sh
cat << EOF > $DIR_BACKUP/$data/restaura.sh
#!/bin/bash
trap "" 2 20
#Variaveis
#Descobrindo o caminho do script
DIR=\$(dirname \$0)
PATH_ARQUIVO=\$(cd \$DIR;pwd)
# Loop que mostra o menu principal
drives=\$( dialog --stdout \
--title 'Escolha dos Componentes' \
--separate-output \
--checklist 'Quais itens voce deseja restaurar?' \
0 0 0 \
config '' ON \
bd '' ON \
audios '' OFF \
configs_vpn '' OFF )
# Apertou CANCELAR ou ESC, entao sair...
[ \$? -ne 0 ] && exit
[ -z "\$drives" ] && exit
#Armazenando a data e hora em uma variavel
declare -x data=\$(date +%F-%H-%M-%S)
#Muda para a raiz da pasta backup
cd \$PATH_ARQUIVO/
echo "\$drives" | while read LINHA
do
case \$LINHA in
config)
cd \$PATH_ARQUIVO/
clear
! [ -d etc_asterisk ] && echo "Arquivos de configuracao nao encontrado" && touch /tmp/erro_config.txt && exit
echo "Restaurando arquivos de configuracao"
/etc/init.d/rc.pbx stop
sleep 5
[ -d /etc/asterisk ] && /bin/rm -rf /etc/asterisk
[ -d /var/lib/asterisk ] && /bin/rm -rf /var/lib/asterisk
! [ -d /var/spool/asterisk ] && mkdir -p /var/spool/asterisk
[ -d /etc/dahdi ] && /bin/rm -rf /etc/dahdi
[ -d /hdaux/utilitarios/scripts ] && /bin/rm -rf /hdaux/utilitarios/scripts
/bin/cp -Rapf etc_asterisk /etc/asterisk
/bin/cp -Rapf var_lib_asterisk /var/lib/asterisk
/bin/cp -Rapf var_spool_asterisk/* /var/spool/asterisk/
/bin/cp -Rapf etc_dahdi /etc/dahdi
/bin/cp -Rapf hdaux_utilitarios_scripts /hdaux/utilitarios/scripts
/hdaux/utilitarios/scripts/permissoes_atualizacao.sh
/etc/init.d/rc.pbx start
/etc/init.d/supervisor start
;;
bd)
clear
! [ -e pbx.sql ] && echo "Arquivo pbx.sql nao encontrado" && touch /tmp/erro_bd.txt && exit
echo "Restaurando banco de dados"
cd /tmp
[ -e /etc/init.d/supervisor ] && /etc/init.d/supervisor stop
! [ -e /var/lib/pgsql/data/postmaster.pid ] && service postgresql start && sleep 15
if ! [ -e /var/lib/pgsql/data/postmaster.pid ] ; then
clear
echo "O banco de dados nao esta acessivel"
echo "Restauracao cancelada"
touch /tmp/erro_bd.txt
exit
fi
#Criando Banco de Dados
if ! [ -z "\$(su postgres -c 'psql -l' | grep 'pbx ')" ] ; then
service postgresql stop
sleep 5
service postgresql start
sleep 15
if ! [ -e /var/lib/pgsql/data/postmaster.pid ] ; then
clear
echo "Aguardando resposta do Banco de Dados"
for i in {30..1};do sleep 1 && echo -n "\$i ";done
if ! [ -e /var/lib/pgsql/data/postmaster.pid ] ; then
echo "O banco de dados nao esta acessivel"
echo "Restauracao cancelada"
touch /tmp/erro_bd.txt
exit
fi
fi
su postgres -c "dropdb pbx"
fi
sleep 5
su postgres -c "createdb pbx"
sleep 5
/bin/cp -Rap \$PATH_ARQUIVO/pbx*.sql /tmp/pbx.sql
su postgres -c "psql -d pbx -f /tmp/pbx.sql"
sleep 1
/bin/rm -rf /tmp/pbx.sql
;;
audios)
cd \$PATH_ARQUIVO/
clear
! [ -d gravacoes ] && echo "Diretorio de audios (gravacoes) nao encontrado" && touch /tmp/erro_audios.txt && exit
echo "Restaurando arquivos de audio (gravacoes)"
! [ -d /var/spool/asterisk/monitor ] && mkdir -p /var/spool/asterisk/monitor
CONT=1
ARQUIVOS=\$(find gravacoes/ -iname *.WAV)
TOTAL=\$(echo "\$ARQUIVOS" | wc -l)
echo "\$ARQUIVOS" | while read LINHA; do
echo "Copiando arquivo \$CONT de \$TOTAL"
/bin/cp -Rap \$LINHA /var/spool/asterisk/monitor/
CONT=\$((\$CONT + 1))
done
/hdaux/utilitarios/scripts/permissoes_atualizacao.sh
;;
configs_vpn)
cd \$PATH_ARQUIVO/
clear
! [ -d etc_ppp ] && echo "Arquivos de configuracao da VPN nao encontrado" && touch /tmp/erro_vpn.txt && exit
echo "Restaurando arquivos de configuracao da VPN"
exit
[ -d /etc/ppp ] && /bin/rm -rf /etc/ppp
[ -d /etc/snmp ] && /bin/rm -rf /etc/snmp
/bin/cp -Rap etc_ppp /etc/ppp
/bin/cp -Rap etc_snmp /etc/snmp
;;
esac
done
[ -e /tmp/erro_config.txt ] && /bin/rm -rf /tmp/erro_config.txt && exit
[ -e /tmp/erro_bd.txt ] && /bin/rm -rf /tmp/erro_bd.txt && exit
[ -e /tmp/erro_audios.txt ] && /bin/rm -rf /tmp/erro_audios.txt && exit
[ -e /tmp/erro_vpn.txt ] && /bin/rm -rf /tmp/erro_vpn.txt && exit
clear
service snmpd restart
/bin/rm -rf \$PATH_ARQUIVO
echo "Arquivos restaurados"
echo ""
echo ""
exit 0
EOF
chmod 777 $DIR_BACKUP/$data/restaura.sh
#Compactando o backup
cd $DIR_BACKUP
diasemana=$(date +%A)
case $diasemana in
Monday)
diasemana=segunda-feira
;;
Tuesday)
diasemana=terca-feira
;;
Wednesday)
diasemana=quarta-feira
;;
Thursday)
diasemana=quinta-feira
;;
Friday)
diasemana=sexta-feira
;;
Saturday)
diasemana=sabado
;;
Sunday)
diasemana=domingo
;;
esac
[ -e $diasemana.tar.gz ] && rm -rf $diasemana.tar.gz
clear
echo "Compactando Arquivo"
tar czf $diasemana.tar.gz $data
rm -rf $data
#Copiando para Simples IP
if [ -e /tmp/copia_bkp.txt ] ; then
clear
echo "Copiando arquivo para Simples IP"
cd $DIR_BACKUP
mount.cifs //$SERVER/backup /mnt -o fstype=cifs,user=$USER_REMOTO,password=$SENHA_REMOTO,file_mode=0644,dir_mode=0777,vers=2.1
VAR_ERRO=$?
CONT=1
while [ "$VAR_ERRO" != "0" ] ; do
sleep 600
mount.cifs //$SERVER/backup /mnt -o fstype=cifs,user=$USER_REMOTO,password=$SENHA_REMOTO,file_mode=0644,dir_mode=0777,vers=2.1
VAR_ERRO=$?
CONT=$(($CONT + 1))
if [ "$CONT" == "100" ] ; then
rm -rf /tmp/copia_bkp.txt
echo -e "Subject: Backup Cliente:$CLIENTE\nErro ao montar o compartilhamento em $(date +%F-%H-%M-%S)." | msmtp -t $EMAIL
exit;
fi
done
! [ -d /mnt/backup/$CLIENTE ] && mkdir /mnt/backup/$CLIENTE
[ -e /mnt/backup/$CLIENTE/$diasemana.tar.gz ] && rm -rf /mnt/backup/$CLIENTE/$diasemana.tar.gz
cp -Rap $diasemana.tar.gz /mnt/backup/$CLIENTE/
ORIGINAL=$(md5sum $diasemana.tar.gz | awk {'print $1'})
COPIA=$(md5sum /mnt/backup/$CLIENTE/$diasemana.tar.gz | awk {'print $1'})
[ "$ORIGINAL" != "$COPIA" ] && echo -e "Subject: Backup Cliente:$CLIENTE\nErro ao realizar copia do arquivo em $(date +%F-%H-%M-%S)." | msmtp -t $EMAIL
umount /mnt
rm -rf /tmp/copia_bkp.txt
fi
if [ "$ORIGINAL" != "$COPIA" ] ; then
echo "Backup realizado com sucesso - Falha na copia para Simples IP"
else
echo "Backup realizado com sucesso"
fi
exit 0