#!/bin/bash
########################################################
# backup-do v1.0
# SCRIPT DE BACKUP PARA SERVIDORES NA DIGITAL OCEAN
# Por Rafael Carreiro
# 13 de Maio de 2016
# Link do projeto: https://netuno.arcasolutions.com/rafael.oliveira/backup-dedicados-do
# rafael.oliveira@arcasolutions.com
########################################################

# Declaração de variáveis
DATA=`date +%Y-%m-%d`
DATA_ANTIGA=`date +%Y-%m-%d --date='7 day ago'`
BKP_DIR=/var/backup
LOG=$BKP_DIR/$DATA/backup.log
ADMIN="rafael.oliveira@arcasolutions.com"
EDIR_ROOT=`find /home -type f -name config.inc.php | cut -d'/' -f1,2,3,4`
NOME_EDIR_ROOT=`find /home -type f -name config.inc.php | cut -d'/' -f4`
EDIR_USER=`find /home -type f -name config.inc.php | cut -d'/' -f3`
OPTION_RESTORE=

#Separei as versões em 3 grupos:
#Grupo 1 =	<= 9.0								version_g1
#Grupo 2 = 	> 9.0 && <=10.4				version_g2
#Grupo 3 = 	> 10.4								version_g3

version_g1(){
	EDIR_V=`grep -E "VERSION" $EDIR_ROOT/conf/constants.inc.php | awk '{ print $2}' | tr -d '[) " ; v a-zA-Z]' | sed 's/^[. $]//' | sed '/^$/d' | head -1`
	echo -e "Versão encontrada: $EDIR_V" | tee $LOG
	DB_USER=`grep -E "define\(_DIRECTORYDB_USER\," $EDIR_ROOT/conf/config.inc.php | cut -f2 -d '"'`
	DB_PASS=`grep -E "define\(_DIRECTORYDB_PASS\," $EDIR_ROOT/conf/config.inc.php | cut -f2 -d '"'`
	echo -e "Credenciais do MySQL encontradas."
	PROJDOMAIN1=`grep -E "domainInfo\[" $EDIR_ROOT/custom/domain/domain.inc.php | sed s/\"/\'/g | head -1  | cut -f2 -d "'" `
	echo -e "Dominio principal encontrado: $PROJDOMAIN1"
	echo -e "\neDirectory versão:\t$EDIR_V\nProjeto:\t\t$PROJDOMAIN1\n"
}

version_g2(){
	EDIR_V=`grep -E "VERSION" $EDIR_ROOT/conf/constants.inc.php | awk '{ print $2}' | tr -d '[) " ; v a-zA-Z]' | sed 's/^[. $]//' | sed '/^$/d' | head -1`
	echo -e "Versão encontrada: $EDIR_V" | tee $LOG
	DB_USER=`grep -E "define\(\"_DIRECTORYDB_USER\"\," $EDIR_ROOT/conf/config.inc.php | cut -f4 -d '"'`
	DB_PASS=`grep -E "define\(\"_DIRECTORYDB_PASS\"\," $EDIR_ROOT/conf/config.inc.php  | cut -f4 -d '"'`
	echo -e "Credenciais do MySQL encontradas."
	PROJDOMAIN1=`grep -E "domainInfo\[" $EDIR_ROOT/custom/domain/domain.inc.php | sed s/\"/\'/g | head -1  | cut -f2 -d "'" `
	echo -e "Dominio principal encontrado: $PROJDOMAIN1"
	echo -e "\neDirectory versão:\t$EDIR_V\nProjeto:\t\t$PROJDOMAIN1\n"
}

version_g3(){
	EDIR_V=`cat $EDIR_ROOT/src/ArcaSolutions/CoreBundle/Kernel/Kernel.php  | grep VERSION | head -1 | awk '{ print $4 }' | tr -d "[ ' ; ]"`
	echo -e "Versão encontrada: $EDIR_V" | tee $LOG
	DB_USER=`grep -E "define\(\"_DIRECTORYDB_USER\"\," $EDIR_ROOT/web/conf/config.inc.php | cut -f4 -d '"'`
	DB_PASS=`grep -E "define\(\"_DIRECTORYDB_PASS\"\," $EDIR_ROOT/web/conf/config.inc.php  | cut -f4 -d '"'`
	echo -e "Credenciais do MySQL encontradas."
	PROJDOMAIN1=`grep -E "domainInfo\[" $EDIR_ROOT/web/custom/domain/domain.inc.php | sed s/\"/\'/g | head -1  | cut -f2 -d "'" `
	echo -e "Dominio principal encontrado: $PROJDOMAIN1"
	echo -e "\neDirectory versão:\t$EDIR_V\nProjeto:\t\t$PROJDOMAIN1\n"
}

version_g1_ou_g2(){
	grep -E "define\(\"_DIRECTORYDB_USER\"\," $EDIR_ROOT/conf/config.inc.php > /dev/null
	if [ "$?" = 0 ]; then
		version_g2
	else
		version_g1
	fi
}

#email(){ 
#sendmail $ADMIN << FIM
#Subject: Backup $PROJDOMAIN1 $DATA
#Projeto: $PROJDOMAIN1
#
#$(cat $LOG)
#FIM
#[[ ! "$?" = 0 ]] && echo "Erro" | tee $LOG 
#}  

atualizar_s3() {
	#Apaga uma semana de backups a partir de 7 dias atrás caso exista no bucket bkp-all-files-all-servers do S3
	#for i in $(seq 7 40) ; do echo -e "Deletando : $(date +%Y-%m-%d --date="$i day ago")" ; /usr/local/bin/aws s3 rm s3://bkp-all-files-all-servers/$EDIR_USER/$(date +%Y-%m-%d --date="$i day ago") --recursive ; done
	/usr/local/bin/aws s3 rm s3://bkp-all-files-all-servers/$EDIR_USER/$DATA_ANTIGA --recursive
	}

atualizar_bkp_dir() {
	echo -e "\nLimpando diretorio de backups..." | tee $LOG
	#Lista arquivos na pasta raiz de backups e deixa somente o último
	cd $BKP_DIR
	for i in `ls` ; do	if [ "$i" != "$DATA" ] ; then /bin/rm -rf $i 2> $LOG ; fi ; done
	if [ $? = 0 ]; then echo -e "ok" | tee $LOG ; else echo "Erro." ; fi 
	}

iniciar_backup(){
	atualizar_bkp_dir
	atualizar_s3

	# ----- CHECAR/CRIAR DIRETORIO DE BACKUP -----
	if [[ ! -d $BKP_DIR/$DATA  ]] ; then mkdir $BKP_DIR/$DATA ; fi ;
	if [[ ! -f $LOG ]] ; then touch $LOG ; fi ; cat /dev/null > $LOG
	if [[ ! -d $BKP_DIR/$DATA/databases  ]] ; then mkdir $BKP_DIR/$DATA/databases ; fi ;
	if [[ ! -d $BKP_DIR/$DATA/project-files  ]] ; then mkdir $BKP_DIR/$DATA/project-files ; fi ;
	if [[ ! -d $BKP_DIR/$DATA/config  ]] ; then mkdir $BKP_DIR/$DATA/config ; fi ;

	# ----- EXPORTAR DATABASES PARA O DIRETORIO DE BACKUP -----
	cd $BKP_DIR/$DATA/databases
	echo -e "\nExportando databases ..." | tee $LOG 
	for banco in $(mysql -u$DB_USER -p$DB_PASS -e "show databases;" | grep main)
	do
		mysqldump -C -u$DB_USER -p$DB_PASS $banco > $banco.sql
	done
	
	# ----- COMPACTAR DATABASES E ENVIAR PARA O DIRETORIO DE BACKUP -----
	cd $BKP_DIR/$DATA/databases ; tar zcf databases-$DATA.tar.gz *.sql; [[ ! "$?" = 0 ]] && echo "Erro." | tee $LOG 
	rm -rf $BKP_DIR/$DATA/databases/*.sql; [[ ! "$?" = 0 ]] && echo "Erro." | tee $LOG 
	echo -e "Databases compactadas com sucesso" | tee $LOG 
	echo -e "ok" | tee $LOG

	# ----- COMPACTAR PUBLIC_HTML E ENVIAR PARA O DIRETORIO DE BACKUP -----
	echo -e "\nCompactando diretorio raiz..." | tee $LOG 
	cd /home/$EDIR_USER ; tar zcf "$NOME_EDIR_ROOT-$DATA.tar.gz" "$NOME_EDIR_ROOT"; [[ ! "$?" = 0 ]] && echo "Erro." | tee $LOG 
	mv $NOME_EDIR_ROOT-*.tar.gz $BKP_DIR/$DATA/project-files ; [[ ! "$?" = 0 ]] && echo "Erro." | tee $LOG 
	echo -e "Arquivos do projeto compactados com sucesso" | tee $LOG 
	echo -e "ok" | tee $LOG 
	
	# ----- COMPACTAR /ETC/HTTPD E ENVIAR PARA O DIRETORIO DE BACKUP -----
	echo -e "\nCompactando arquivos de configuracao do Apache..." | tee $LOG 
	cd /etc ; tar zcf config-httpd.tar.gz httpd ; mv config-httpd.tar.gz $BKP_DIR/$DATA/config/
	echo -e "ok" | tee $LOG 

	# ----- ENVIAR PACOTE PARA O S3 -----
	echo -e "\nEnviando para o S3..." | tee $LOG 
	/usr/local/bin/aws s3 cp $BKP_DIR/$DATA/databases s3://bkp-all-files-all-servers/$EDIR_USER/$DATA/databases/ --recursive  | tee $LOG  ; [[ ! "$?" = 0 ]] && echo "Erro" | tee $LOG 
	/usr/local/bin/aws s3 cp $BKP_DIR/$DATA/project-files s3://bkp-all-files-all-servers/$EDIR_USER/$DATA/project-files/  --recursive  | tee $LOG ; [[ ! "$?" = 0 ]] && echo "Erro" | tee $LOG 
	/usr/local/bin/aws s3 cp $BKP_DIR/$DATA/config s3://bkp-all-files-all-servers/$EDIR_USER/$DATA/config/  --recursive  | tee $LOG ; [[ ! "$?" = 0 ]] && echo "Erro" | tee $LOG 
	echo -e "Enviado para o S3 em \"bkp-all-files-all-servers/$EDIR_USER\"" | tee $LOG 

	# ----- LISTANDO DIRETORIO DE BACKUP NO S3 -----
	echo -e "\nListagem atual em \"bkp-all-files-all-servers/$EDIR_USER\":" | tee $LOG 
	/usr/local/bin/aws s3 ls s3://bkp-all-files-all-servers/$EDIR_USER/ --recursive  | tee $LOG ; [[ ! "$?" = 0 ]] && echo "Erro" | tee $LOG 
	echo -e "ok" | tee $LOG 
	echo -e "\nBackup realizado com sucesso\nEmail de notificacao enviado para $ADMIN\nPara mais informacoes veja o log em $LOG\n"
}

verifica_versao() {
	if [ `find /home -type f -name config.inc.php | wc -l` = 1 ]; then : ; else echo -e "Problema!\nMais de um arquivo config.inc.php encontrado.\n\033[05;31m"; find /home -type f -name config.inc.php; echo -e "\033[0m"; exit ; fi
	EDIR_VERSION=`find /home -type f -name config.inc.php | cut -d'/' -f5`
	if [[ $EDIR_VERSION == "conf" ]]; then 
		version_g1_ou_g2
	else 
		version_g3
	fi
}

main(){
	verifica_versao
	iniciar_backup
	#email
}

install() {
	DIR_INSTALL=/usr/local/backup-do
	if [ ! -d $DIR_INSTALL ]; then
		echo -e "\nIniciando instalacao..."
		
		# Verifica se aws-cli está instalado
		if [[ ! -e /usr/local/bin/aws ]]; then echo -e "\n[!] Problema !\nInstale e configure o aws-cli para acesso ao S3.\n"; exit 0 ; fi
		
		# Verifica se o diretorio /var/backup existe, se nao existir irá cria-lo
		if [[ ! -d $BKP_DIR  ]] ; then mkdir $BKP_DIR ; echo -e "\nDiretorio de backup criado \"$BKP_DIR\"" | tee $LOG ; else echo -e "\nDiretorio de backup encontrado." | tee $LOG ; fi
		mkdir $DIR_INSTALL
		
		# Baixa o script principal para o diretorio /usr/local/backup-do, da permissao e cria link para o PATH
		wget -O /usr/local/backup-do/backup-do.sh https://s3-sa-east-1.amazonaws.com/upgradev11/scripts/backup-do.sh --no-check-certificate 2> /dev/null
		chmod +x /usr/local/backup-do/backup-do.sh
		if [ -f /usr/local/bin/backup-do ]; then rm -rf /usr/local/bin/backup-do ; fi
		ln -s /usr/local/backup-do/backup-do.sh /usr/local/bin/backup-do
		
		# Adicionando entrada no cron para execução diaria
		grep "backup-do" /var/spool/cron/root	
		if [ ! "$?" = 0 ] ;then 
			touch /var/backup/cron-backup-do.log
			echo  '0 0 * * * /bin/bash /usr/local/bin/backup-do -b 2>&1 > /var/backup/cron-backup-do.log' >> /var/spool/cron/root
		else :
		fi
		echo -e "\nInstalacao concluida com sucesso."
	else
		echo -e "\nO programa ja esta instalado.\nDeseja atualizar? (s/n)"
		read -p ": " pergunta_atualizar
		if [ "$pergunta_atualizar" == "s" ]; then
			update
		elif  [ "$pergunta_atualizar" == "n" ]; then
			exit
		fi
	fi
	}
	
update(){
	echo -e "Atualizando..."
	wget -O /usr/local/backup-do/backup-do.sh https://s3-sa-east-1.amazonaws.com/upgradev11/scripts/backup-do.sh --no-check-certificate 2> /dev/null
	echo -e "Programa atualizado com sucesso."
}

restaurar(){
	verifica_versao
	echo -e "Listando ultimos backups realizados...\n"
	/usr/local/bin/aws s3 ls s3://bkp-all-files-all-servers/$NOME_EDIR_ROOT/
	echo -e "\nEscolha a data que deseja restaurar no formato AAAA-MM-DD"
	echo -e "Exemplo: `date +%Y-%m-%d`\n"
	read -p ": " DATA_INPUT
	echo -e "\nVoce escolheu o dia $DATA_INPUT"
	
	if [ ! -d restore ]; then 
		echo "Criando diretorio \"restore\"";  mkdir restore
	else
		:
	fi
	
	echo -e "\nO que deseja restaurar?"
	echo -e "
[1] Banco de Dados
[2] Config do Apache
[3] Arquivos do projeto
[4] Tudo
	"
	read -p ": " OPTION_RESTORE
	if [[ "$OPTION_RESTORE" -eq 1 ]]; then
		echo -e "Ok, voce escolheu banco de dados,"
		echo -e "Deseja: "
		echo -e "
[1] Baixar os arquivos .sql
[2] Restaurar automaticamente"
		read -p ": " OPTION_RESTORE_MYSQL
		
		if [[ "$OPTION_RESTORE_MYSQL" -eq 1 ]]; then 
			echo -e "Os arquivos serao salvos em \"`pwd`/restore/\""
			/usr/local/bin/aws s3 cp s3://bkp-all-files-all-servers/$NOME_EDIR_ROOT/$DATA_INPUT/databases restore/ --recursive
		
		elif [[ "$OPTION_RESTORE_MYSQL" -eq 2 ]]; then
			/usr/local/bin/aws s3 cp s3://bkp-all-files-all-servers/$NOME_EDIR_ROOT/$DATA_INPUT/databases restore/ --recursive
			cd restore ; tar zxf  databases-$DATA_INPUT.tar.gz ; echo -e ""
			
			for banco in $(mysql -u$DB_USER -p$DB_PASS -e "show databases;" | grep main)
				do
				mysql -u$DB_USER -p$DB_PASS -e "use $banco; source $(echo -e "$(ls $banco.sql)");"
				echo -e "Database $banco restaurado com sucesso."
			done
		
		else :
		fi
	
	elif [[ "$OPTION_RESTORE" -eq  2 ]]; then
		/usr/local/bin/aws s3 cp s3://bkp-all-files-all-servers/$NOME_EDIR_ROOT/$DATA_INPUT/config restore/ --recursive
	
	elif [[ "$OPTION_RESTORE" -eq 3 ]]; then
		/usr/local/bin/aws s3 cp s3://bkp-all-files-all-servers/$NOME_EDIR_ROOT/$DATA_INPUT/project-files restore/ --recursive
		
	elif [[ "$OPTION_RESTORE" -eq  4 ]]; then
		/usr/local/bin/aws s3 cp s3://bkp-all-files-all-servers/$NOME_EDIR_ROOT/$DATA_INPUT/ restore/ --recursive
		
	else 
		echo -e "Opcao invalida."
	fi
	echo -e "\n"
}

menu_help(){
	echo -e '
backup-do - Backup Digital Ocean v 1.0
Desenvolvido por Rafael Carreiro <rafael.oliveira@arcasolutions.com>

-b ou --backup \t\t: Iniciar o backup
-r ou --restore \t: Restaurar um backup

-u ou --update \t\t: Atualizar o programa
-i ou --install \t: Instalar o programa

-h ou --help \t\t: Este menu de ajuda
'
	}

clear

if [ $# -eq 0 ]; then menu_help; fi
case $1 in
"--install" | "-i" )
		install
	;;
"--backup" | "-b" )
		echo -e "\nIniciando backup...\nAguarde..." | tee $LOG 2> /dev/null
		main
	;;
"--update" | "-u" )
		update
		exit
	;;
"--restore" | "-r")
		restaurar
	;;
"--help" | "-h")
		menu_help
	;;
esac
