#!/bin/bash
#author:Cristiano Siqueira
#descricao:Baixa e instala o OpenVPN local ou comodato.
#Revisao:

user=`whoami`
ovpn='/etc/openvpn/client'
dlpadrao='download.sigsolucoes.net.br/produtos/crss/ovpn'

setkey(){
	echo $nome > $ovpn/sigerp.passwd
	echo $senha >> $ovpn/sigerp.passwd
}
toread(){
	read -p "Digite o usuário da VPN do Comodato: " nome
	read -p "Digite a senha da VPN do Comodato: " senha
}
enableovpn(){
	chown daemon:daemon $ovpn/sigerp.*
	systemctl enable openvpn
	systemctl enable openvpn-client@sigerp
	systemctl start openvpn-client@sigerp
}
erroinstall(){
	echo "╔═════════════════════════════════════╗"
	echo "║ A pasta necessária para instalação  ║"
	echo "║ não foi identificada. Favor revisar ║"
	echo "║      a instalação do OpenVPN.       ║"
	echo "╚═════════════════════════════════════╝"
	sleep 3	
	opcoesiniciais
}
imprimepasswd(){
	echo " "
	echo "╔═══════════════════════════════════════╗"
	echo "║ Dados salvos no arquivo sigerp.passwd ║"
	echo "╚═══════════════════════════════════════╝"
	echo " "
	echo "╔═══════════════════════════════════╗"
	while IFS= read -r line; do
		printf "║ %-33s ║\n" "$line"
	done < $ovpn/sigerp.passwd
	echo "╚═══════════════════════════════════╝"
}
localoucomodato(){
	echo " "
	echo " A VPN será Comodato ou Local?"
	echo "╔═════════════════════════════╗"
	echo "║ (1) Comodato                ║"
	echo "║ (2) Local                   ║"
	echo "╚═════════════════════════════╝"
	read -p "R: " installtype
}

alterasenha(){
	toread
	if [ -e $/ ];then
		setkey
		imprimepasswd
		sleep 3
	else
		setkey
		imprimepasswd
		sleep 3
	fi
	enableovpn
	verificaconexao
}

secomodato(){
	toread
	if [ -e $ovpn ];then
		setkey
		imprimepasswd
		sleep 3
	else
		erroinstall
	fi
	echo "╔════════════════════════════════════════════════════╗"
	echo "║ Baixando arquivo OpenVPN para instalação na nuvem: ║"
	echo "╚════════════════════════════════════════════════════╝"
	cd $ovpn/
	if [ -e sigerp.conf ];then
		rm -rf sigerp.conf
	fi
	wget $dlpadrao/comodato/sigerp.conf
	chown daemon:daemon $ovpn/sigerp.*
	enableovpn
	verificaconexao
}

selocal(){
	read -p "Digite o usuário da VPN Local: " nome
	read -p "Digite a senha da VPN Local: " senha
	if [ -e $ovpn ];then
		setkey
		imprimepasswd
		sleep 3
	else
		erroinstall
	fi
	echo "╔════════════════════════════════════════════════════╗"
	echo "║ Baixando arquivo OpenVPN para instalação na nuvem: ║"
	echo "╚════════════════════════════════════════════════════╝"
	cd $ovpn
	if [ -e sigerp.conf ];then
		rm -rf sigerp.conf
	fi
	wget $dlpadrao/local/sigerp.conf
	chown daemon:daemon $ovpn/sigerp.*
	enableovpn
	verificaconexao
}

erro(){
    clear
    echo "╔══════════════════════════════════════════════════════════╗"
    echo "║              Você digitou uma opção erra!                ║"
    echo "║  Por favor, reinicie o processo e responda corretamente. ║"
    echo "╚══════════════════════════════════════════════════════════╝"
    exit
}

verificaconexao(){
	echo "╔════════════════════════════╗"
	echo "║ Mostrando se VPN conectou! ║"
	echo "╚════════════════════════════╝"
	echo " "
	sleep 3
	clear
	echo -e "\033[5m\033[32m"
	echo -e "╔══════════════════╗"
	echo -e "║ Analizando. . .  ║"
	echo -e "╚══════════════════╝\033[0m"
	sleep 6
	clear

	if ip addr show tun0 &> /dev/null; then
		echo "ENDEREÇO IP DA VPN: "
		ip addr show tun0 | grep -o 'inet [0-9.]\+'
		echo " "
		echo " "
		opcoesiniciais
	elif ip addr show tun1 &> /dev/null; then
		echo "ENDEREÇO IP DA VPN: "
		ip addr show tun1 | grep -o 'inet [0-9.]\+'
		echo " "
		echo " "
		opcoesiniciais
	else
		echo "╔═══════════════════════════════════╗"
		echo "║ Nenhuma interface VPN encontrada. ║"
		echo "║ Possivelmente a VPN não conectou. ║"
		echo "╚═══════════════════════════════════╝"
		sleep 4
		journalctl -xe
		opcoesiniciais
	fi
}

fim(){
	echo "      ╔═══════╗"
	echo "      ║  FIM  ║"
	echo "      ╚═══════╝"
	exit
}

opcoesiniciais(){
echo " "
echo " "
echo "     Selecione uma das opções!"
echo "╔══════════════════════════════════╗"
echo "║ (1) Instalar OpenVPN.            ║"
echo "║ (2) Configurar/Reconfigurar VPN. ║"
echo "║ (3) Alterar usuário e senha.     ║"
echo "║ (4) Verificar Conexão da VPN.    ║"
echo "║ (5) Sair.                        ║"
echo "╚══════════════════════════════════╝"
read -p "R: " ovpn
	if [[ $ovpn == 1 ]]; then
	echo "╔═══════════════════════════════════╗"
	echo "║ Executando instalação do OpenVPN. ║"
	echo "╚═══════════════════════════════════╝"
		apt update

		mkdir -p /etc/apt/keyrings # directory does not exist on older releases
		curl -fsSL https://swupdate.openvpn.net/repos/repo-public.gpg | gpg --dearmor > /etc/apt/keyrings/openvpn-repo-public.gpg
		#echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/openvpn-repo-public.gpg] https://build.openvpn.net/debian/openvpn/release/2.6 bionic main" > /etc/apt/sources.list.d/openvpn-aptrepo.list
		echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/openvpn-repo-public.gpg] https://build.openvpn.net/debian/openvpn/release/2.6 jammy main" > /etc/apt/sources.list.d/openvpn-aptrepo.list
		apt -y install openvpn

		localoucomodato
		sleep 2
	    if   [[ $installtype == 1 ]]; then
			secomodato
	    elif [[ $installtype == 2 ]]; then
			selocal
	    else
			erro
	    fi
		opcoesiniciais
	elif [[ $ovpn == 2 ]]; then
		localoucomodato
		sleep 2
	    if   [[ $installtype == 1 ]]; then
			secomodato
	    elif [[ $installtype == 2 ]]; then
			selocal
	    else
			erro
	    fi
	    opcoesiniciais
	elif [[ $ovpn == 3 ]]; then
		alterasenha
		opcoesiniciais
	elif [[ $ovpn == 4 ]]; then
		verificaconexao
		opcoesiniciais
	elif [[ $ovpn == 5 ]]; then
		fim
	else
		erro
		opcoesiniciais
	fi
}

if [[ $user == "root" ]]; then
	opcoesiniciais
else
    clear
    echo " "
    echo " "
    echo "╔══════════════════════════════════════════════════╗"
    echo "║Execute este aplicatvo em usuário Root, por favor.║"
    echo "╚══════════════════════════════════════════════════╝"
    exit
fi
