#!/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 "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