#!/bin/bash
# ┌──────────────────────────────────────────────────────────┐
# │ Author: Bruno.Tosta                                      │
# │ Desc: Instalar SigERP / SigPDV                           │
# └──────────────────────────────────────────────────────────┘
VERSAO="3.9"
SISTEMA=$(lsb_release -cs) USUARIO=$(id -un) ROOT=$(id -u)
REPOSITORIO='download.sigsolucoes.net.br/public/Tosta/ERP'
Configurar(){
[ ! $SISTEMA = 'jammy' ] && MenuStatus 'NÃO HÁ' && exit
case "$1" in
	1) source <(wget -qO- "$REPOSITORIO/instaladores/controle/config_teste");;
	2) source <(wget -qO- "$REPOSITORIO/instaladores/controle/config_teste");;
esac
}
# ┌──────────────────────────────────────────────────────────┐
# └─────────────────────────────────────────────────{ MENUS }┘
MenuExecutar(){
	clear; read -p "
	┌─ $SISTEMA ──────────────────────────────────────┐
	│                                              │
	│   1 │ Instalar SigERP                        │
	│   2 │ Instalar SigPDV                        │
	│   3 │ Instalar SigERP e SigPDV               │
	│   4 │ Outros                                 │
	│   0 │ Sair                                   │
	│                                              │
	└──────────────────────────────────────── $VERSAO ─┘
	Escolha uma opção: " EXECUTAR && Executar
}
MenuSelecionar(){
	clear; read -p "
	┌─ $SISTEMA ──────────────────────────────────────┐
	│                                              │
	│   1 │ Comandos SigERP                        │
	│   2 │ Comandos SigPDV                        │
	│   0 │ Sair                                   │
	│                                              │
	└──────────────────────────────────────── $VERSAO ─┘
	Escolha uma opção: " EXECUTAR
	case "$EXECUTAR" in
	1|2) Configurar "$EXECUTAR";;
	3) exit			;;
	*) MenuExecutar	;;
esac
}
MenuPostgres(){
	clear; echo "	┌─ PostgreSQL ─ $ATUALIZANDO ─────────────────────────┐
	│                                            $V │"
	for i in "${!COMANDOS[@]}"; do
	printf "	│  $((i + 1)) │ "${COMANDOS[$i]}"    			       │\n"
	done
	read -p "	│                                              │
	└──────────────────────────────────────── $VERSAO ─┘
	Escolha uma opção: " TESTAR && Testavel
}
MenuAtualizacao(){
	clear; read -p "
	┌───────────────── ATUALIZAR ──────────────────┐
	│                                              │
	│ Existe uma versão do instalador mais recente │
	│ Deseja atualizar para a versão mais recente? │
	│                     S/N                      │
	└──────────────────────────────────────── $VERSAO ─┘
	Escolha uma opção: " RESPOSTA
}
MenuStatus(){
	clear; echo "
	┌──────────────────────────────────────────────┐
	│                                              │
	│                  $1	               │
	│                                              │
	└──────────────────────────────────────────────┘
	"; sleep 1
}
# ┌──────────────────────────────────────────────────────────┐
# └─────────────────────────────────────────────────{ OPCAO }┘
Executar(){
case "$EXECUTAR" in
	1|2) Configurar "$EXECUTAR"; MenuStatus "$ATUALIZANDO"; Instalar;;
	3) for N in 1 2; do
		Configurar "$N"; MenuStatus "$ATUALIZANDO"; Instalar
		done												;;
	4) MenuSelecionar; MenuPostgres							;;
	0) MenuStatus 'SAINDO'; exit							;;
	*) MenuStatus 'INVALIDO'; MenuExecutar
esac
}
Testavel(){
for i in "${!COMANDOS[@]}"; do
	CASE+="
	$i) clear; Controle \"${COMANDOS[$i]}\"	;;"
done
eval "
case \"$(($TESTAR-1))\" in
	$CASE
	0) exit									;;
	*) MenuStatus 'INVALIDO'; MenuExecutar	;;
esac"
}
Instalar(){
	(mkdir -m 777 '/tmp/INSTALL'
		sudo apt update && sudo apt upgrade -y && \
			InstalarPyEnv && Ambiente && \
				InstalarPostgres && InstalarPGAdmin4 && \
					Pacotes && BuscaArquivo && Finalizando) && \
	#rm -rf '/tmp/INSTALL/' &&
	exit
}
# ┌──────────────────────────────────────────────────────────┐
# └──────────────────────────────────────────────{ AMBIENTE }┘
InstalarPyEnv(){
	[ ! -x "/home/$USUARIO/.pyenv" ] && {
	(sudo apt update && sudo apt install -y git make build-essential libssl-dev \
	zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
	libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev) && \
	(curl https://pyenv.run | bash) && {
		echo "$CONFIG" >> ~/.bashrc
		eval "$(cat ~/.bashrc | tail -n +10)"
		pyenv install 2.7.18
		pyenv virtualenv 2.7.18 sigsolucoes
		}
	} || eval "$(cat ~/.bashrc | tail -n +10)" && echo 'Já baixado'
}
Ambiente(){
	(sudo apt install -y ssh net-tools terminator vim gcc locate aptitude lbzip2 python3-pip libevent-dev \
	mousepad libxslt1-dev libldap2-dev libsasl2-dev libtiff5-dev libjpeg8-dev libopenjp2-7-dev \
	system-config-printer libfreetype6-dev liblcms2-dev libwebp-dev libharfbuzz-dev libfribidi-dev \
	libxcb1-dev libpq-dev swig libcups2-dev sqlite3 ncurses-dev libmysqlclient-dev \
	default-libmysqlclient-dev htop atop iotop pyqt5-dev libxkbcommon-x11-0 \
	libxcb-xinerama0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 \
	libxcb-render-util0 libxcb-shape0 libxcb-sync1 libxcb-xfixes0 libxrender1 qt5dxcb-plugin)
		export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt5/plugins
}
Pacotes(){
	(pyenv shell sigsolucoes && \
		easy_install egenix-mx-base && \
		sudo wget 'https://raw.githubusercontent.com/paulfitz/mysql-connector-c/master/include/my_config.h' -P '/usr/include/mysql/' && \
		wget -qO '/tmp/INSTALL/requirements' --show-progress "$REPOSITORIO/instaladores/controle/requirements_teste" && \
		pip install -r '/tmp/INSTALL/requirements')
}
# ┌──────────────────────────────────────────────────────────┐
# └──────────────────────────────────────────────{ INSTALAR }┘
BuscaArquivo(){
for APLICATIVO in "${PACOTES[@]}"; do
	(pyenv shell sigsolucoes && BaixaArquivo)
done
}
BaixaArquivo(){
	BAIXAR=$(wget -qO- "$REPOSITORIO/instaladores/controle/update_teste" | grep -wi "$APLICATIVO" | cut -d"=" -f2)
	wget -qO "/tmp/INSTALL/$APLICATIVO-$BAIXAR.tar.gz" --show-progress "$REPOSITORIO/$APLICATIVO/$APLICATIVO-$BAIXAR.tar.gz"
	ExtraiArquivo
}
ExtraiArquivo(){
case "$APLICATIVO" in
'sigerp') sudo mkdir -p "$LOCAL" && wget -qO '/tmp/INSTALL/resources.tar.gz' --show-progress "$REPOSITORIO/pacotes/resources.tar.gz" && \
			(sudo tar xfvz '/tmp/INSTALL/resources.tar.gz' -C '/sig' && sudo tar xfvz "/tmp/INSTALL/$APLICATIVO-$BAIXAR.tar.gz" -C "$LOCAL" && \
			sudo mv "$LOCAL/$APLICATIVO" "$LOCAL/7.0") && (Permissao) && \
				echo "O $APLICATIVO-$BAIXAR instalado com sucesso!"
			;;
'sigpdv') sudo mkdir -p "$LOCAL" && wget -qO '/tmp/INSTALL/iniciadores.tar.gz' --show-progress "$REPOSITORIO/pacotes/iniciadores.tar.gz" && \
			(sudo tar xfvz "/tmp/INSTALL/$APLICATIVO-$BAIXAR.tar.gz" -C "$LOCAL" && sudo tar xfvz '/tmp/INSTALL/iniciadores.tar.gz' -C '/usr/bin/') && \
			sudo ln -s "/$LOCAL/sigpdv" "/home/$USUARIO/.pyenv/versions/sigsolucoes/lib/python2.7/site-packages/" && sudo ln -s "/$LOCAL/sigpdv" '/usr/local/' && \
			(VerificaSigEXT && Permissao) && \
				echo "O $APLICATIVO-$BAIXAR instalado com sucesso!"
			;;
'kiwi'|'stoqdrivers') sudo tar xfvz "/tmp/INSTALL/$APLICATIVO-$BAIXAR.tar.gz" -C '/tmp/INSTALL/' && \
			sudo cp -a "/tmp/INSTALL/$APLICATIVO/$APLICATIVO" "/$LOCAL"
			sudo ln -s "/$LOCAL/$APLICATIVO" "/home/$USUARIO/.pyenv/versions/sigsolucoes/lib/python2.7/site-packages/" && \
				echo "O $APLICATIVO-$BAIXAR linkado com sucesso!"
			;;
*) sudo tar xfvz "/tmp/INSTALL/$APLICATIVO-$BAIXAR.tar.gz" -C '/tmp/INSTALL/' && (cd "/tmp/INSTALL/$APLICATIVO-$BAIXAR" && python setup.py install) && \
				echo "O $APLICATIVO-$BAIXAR extraido com sucesso!"
			;;
esac
}
VerificaSigEXT(){
	sudo mkdir -p '/sig/sigext'
	sudo wget -qO '/sig/sigext/pdvconfig.cfg' --show-progress "$REPOSITORIO/pacotes/pdvconfig.cfg"
	sudo wget -qO '/sig/sigext/CliSiTef.ini' --show-progress "$REPOSITORIO/pacotes/CliSiTef.ini"
	ln -s '/sig/sigext/pdvconfig.cfg' '/sig/sigpdv'
	for LINK in producao homologacao lib_ssl_antiga; do
		ln -s '/sig/sigext/CliSiTef.ini' "/sig/sigpdv/sigtef/lib_x86_64/$LINK"
	done
}
Permissao(){
	sudo chown -R $USUARIO:$USUARIO '/sig'
for PERMISSAO in "${PERMISSOES[@]}"; do
		sudo chmod -R 755 "$PERMISSAO"
done && echo 'Permissões ajustadas!'
}
Finalizando(){
	# Alterando o Network-Time do Sistema
	sudo timedatectl set-local-rtc 0
	sudo timedatectl set-timezone America/Sao_Paulo
	sudo timedatectl set-ntp true

    # Adicionando um usuário ao grupo dialout
	sudo adduser "$USUARIO" dialout
	sudo usermod -aG dialout "$USUARIO"

	# Baixar icones
    wget -qO '/tmp/INSTALL/imagens.tar.gz' --show-progress "$REPOSITORIO/pacotes/imagens.tar.gz" && \
        sudo tar xfvz '/tmp/INSTALL/imagens.tar.gz' -C '/usr/share/pixmaps'

	case "$EXECUTAR" in
	2) sudo wget -qO '/usr/share/xfce4/backdrops/sigpdv.jpg' --show-progress "$REPOSITORIO/pacotes/sigpdv.jpg" && F
		;;
	1|3) sudo wget -qO '/usr/share/xfce4/backdrops/sigerp.jpeg' --show-progress "$REPOSITORIO/pacotes/sigerp.jpg" && \
		sudo wget -qO '/lib/systemd/system/openerp.service' --show-progress "$REPOSITORIO/pacotes/openerp.service" && \
		sudo sed -i "s/USUARIO/$USUARIO/" /lib/systemd/system/openerp.service && \
		sudo systemctl enable --now openerp.service && [ "$EXECUTAR" = '3' ] && F
		;;
	esac

	for PARAMETRO in dpms-enabled dpms-on-ac-sleep dpms-on-ac-off blank-on-battery blank-on-ac brightness-on-battery brightness-on-ac \
			inactivity-sleep-mode-on-battery inactivity-sleep-mode-on-ac sleep-mode-on-battery sleep-mode-on-ac \
			power-off-on-battery power-off-on-ac; do
		xfconf-query -c xfce4-power-manager -p "/xfce4-power-manager/$PARAMETRO" -s 0 -n -t int
	done

	# Desativa configurações de descanso de tela
	for PARAMETRO in activate lock-screen lock-delay timeout suspend-when-locked blank-after use-blanking saver/mode \
			saver/idle-activation/enabled saver/enabled lock/enabled lock/user-switching/enabled lock/status-messages/enabled \
			lock/saver-activation/enabled; do
		xfconf-query -c xfce4-screensaver -p "/$PARAMETRO" -s false -n -t bool
	done

	# Desativa integração entre xfce4-power-manager e xfce4-screensaver
	for PARAMETRO in activate lock-screen lock-delay timeout suspend-when-locked blank-after use-blanking; do
		xfconf-query -c xfce4-screensaver -p "/xfce4-power-manager/$PARAMETRO" -s 0 -n -t int
	done

	# Altera o icone do sig no botão iniciar
	#xfconf-query -c xfce4-appfinder -p /general/Icon -s /usr/share/pixmaps/icon-sig.png --create -t string
	#xfconf-query -c xfce4-desktop -p /icons/icon -s /usr/share/pixmaps/icon-sig.png --create -t string
	#sed -i 's|^button-icon=.*|button-icon=/usr/share/pixmaps/icon-sig.png|' ~/.config/xfce4/panel/whiskermenu-*.rc

	# Altera a imagem de papel de parede
	for PARAMETRO in $(xfconf-query -c xfce4-desktop -l | grep "last-image" | sed 's/\/last-image//'); do
		xfconf-query -c xfce4-desktop -p "$PARAMETRO/last-image" --create -t string -s "/usr/share/xfce4/backdrops/$ATUALIZANDO.jpg"
	done

	sudo mkdir -m 777 '/recebe/'

	for INSTALADOR in openvpn.sh rclone.sh; do
		sudo wget -qO "/recebe/$INSTALADOR" --show-progress "$REPOSITORIO/instaladores/$INSTALADOR"
	done
		sudo wget -qO '/usr/local/bin/hub' --show-progress "$REPOSITORIO/controle/hub" && chmod 777 '/usr/local/bin/hub'

	# Faz com que todas as opções alteradas sejam carregadas e salvas
	xfdesktop --reloa
	xset s off
	xset -dpms
	xset s noblank
	xfdesktop --reload
	xfce4-panel --save
	xfce4-panel --restart
}
F(){

	# Baixando e criando atalhos
	wget -qO '/tmp/INSTALL/atalhos.tar.gz' --show-progress "$REPOSITORIO/pacotes/atalhos.tar.gz" && \
		sudo tar xfvz '/tmp/INSTALL/atalhos.tar.gz' -C '/usr/share/applications' && (
			for NOME in sigpdv.desktop pdvconfig.desktop terminator.desktop pgadmin4.desktop; do
				sudo cp /usr/share/applications/$NOME /home/$USUARIO/Área\ de\ Trabalho/ && \
				sudo chown $USUARIO:$USUARIO /home/$USqUARIO/Área\ de\ Trabalho/$NOME && sudo chmod +x /home/$USUARIO/Área\ de\ Trabalho/$NOME
			done
	)

	# Criando pastas
	sudo mkdir -m 777 '/var/cache/ChavesCliSiTef'

	# Ditar para não usar DNS
	echo "/sig/sigtef/lib_x86_64/" | sudo tee -a '/etc/ld.so.conf'
	echo "UseDNS no" | sudo tee -a '/etc/ssh/sshd_config'
	sudo ldconfig

	# Criando Arquivo de Configuração para '/tmp/'
	(cd '/etc/tmpfiles.d/'
	sudo touch 'clisitef.conf'
	sudo echo "L /tmp/ChavesCliSiTef 1777 - - - /var/cache/ChavesCliSiTef" | sudo tee -a 'clisitef.conf')
}
# ┌──────────────────────────────────────────────────────────┐
# └──────────────────────────────────────────────{ POSTGRES }┘
InstalarPostgres(){
	[ -d '/etc/postgresql' ] && echo 'PostgreSQL já baixado' || {
		sudo apt install -fy postgresql-14 && \
		cd '/etc/postgresql/14/main/'

		# Configurações do PostgreSQL
		sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" postgresql.conf
		sudo sed -i "s/port = 5433/port = 5432/" postgresql.conf

		# Permissões de acesso e autenticação
		sudo sed -i "s/127.0.0.1\/32/0.0.0.0\/0/" pg_hba.conf
		sudo sed -i "s/scram-sha-256/trust/" pg_hba.conf
		sudo sed -i "s/md5/trust/" pg_hba.conf
		sudo sed -i "s/peer/trust/" pg_hba.conf

		# Comentando configurações de replicação
		sudo sed -i "s/host    replication     all             0.0.0.0\/0/#host    replication     all             0.0.0.0\/0/" pg_hba.conf
		sudo sed -i "s/host    replication     all             ::1\/128/#host    replication     all             ::1\/128/" pg_hba.conf

		sudo /etc/init.d/postgresql reload
		sudo /etc/init.d/postgresql stop
		sudo /etc/init.d/postgresql start
	}

case "$ATUALIZANDO" in
	'sigpdv') sudo createdb -h 'localhost' -U 'postgres' -E 'utf8' 'sigpdv'	;;
	'sigerp') sudo /etc/init.d/postgresql stop
			  sudo /etc/init.d/postgresql start
			  sudo createuser -U 'postgres' --createdb -P 'openerp'			;;
esac
SENHA=''
	[ "$SENHA" = '' ] && echo 'não terá senha' || {
		PASS=$(openssl rand -base64 12 | sed 's/^/=E/') # Inicio para SigERP sempre será =E
		PASS=$(openssl rand -base64 12 | sed 's/^/=E/') # Inicio para SigPDV sempre será =P
		echo "$PASS" > '/tmp/senha.txt'
		sudo psql -U postgres -c "ALTER USER postgres WITH PASSWORD '$PASS'" -d template1
	}
}
InstalarPGAdmin4(){
	[ -d '/usr/pgadmin4' ] && echo 'PGAdmin4 já baixado' || {
		sudo apt update
		curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo gpg --dearmor -o /usr/share/keyrings/pgadmin-keyring.gpg
		echo "deb [signed-by=/usr/share/keyrings/pgadmin-keyring.gpg] https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/jammy pgadmin4 main" | sudo tee /etc/apt/sources.list.d/pgadmin4.list
		sudo apt update
		sudo apt install -y pgadmin4-desktop
	}
}
# ┌──────────────────────────────────────────────────────────┐
# └────────────────────────────────────────{ BANCO DE DADOS }┘
Controle(){
case "$1" in
	backup		) VerificaPasta; Identifica 'DUMP'								;;
	criar		) Operador 'CRIAR'												;;
	deletar		) Operador 'DELETAR'											;;
	restaurar	) Operador 'RESTAURAR'											;;
	levantar	) Identifica 'LEVANTAR'; ReiniciaSistema						;;
	completo	) Operador 'CRIAR'; Operador 'RESTAURAR'; Identifica 'LEVANTAR'	;;
esac
}
Identifica(){
[[ "$BASE" = 'all' || "$BASE" == 'tudo' || "$BASE" == 'todas' || "$BASE" == 'todos' ]] && {
    QUANTIDADE=$(PGPASSWORD="$SENHA" psql -U "$USER" -l | awk '{ if ($3 == "'$USER'" && $1 != "template0" && $1 != "template1" && $1 != "'$USER'") print $1 }' | wc -l)
for ((N=1; N <= "$QUANTIDADE"; N++)) do
	BASE=$(PGPASSWORD="$SENHA" psql -U "$USER" -l | awk '{ if ($3 == "'$USER'" && $1 != "template0" && $1 != "template1" && $1 != "'$USER'") print $1 }' | head -$(($N+B)) | tail -1)
		printf "\nQuantidade: $N/$QUANTIDADE \nBase: $BASE \n"
		Operador "$1"
		printf "Completo: $BASE \n"
done
} || {
		Operador "$1"
		printf "Completo: $BASE \n"
	}
}
Operador(){
case "$1" in
	DUMP		) PGPASSWORD="$SENHA" pg_dump -h "$HOST" -p "$PORTA" -U "$USER" --role "$USER" -F 'c' -b -v -T 'logs_logs' -T 'ir_attachment' -T 'logs_detalhe' -T 'ecf_exportar_osv_id_seq' -f "/tmp/$BASE.$DATA.dump" -d "$BASE"
;;
	CRIAR		) PGPASSWORD="$SENHA" createdb -h "$HOST" -p "$PORTA" -U "$USER" -O "$USER" "$BASE"
;;
	DELETAR		) PGPASSWORD="$SENHA" dropdb -h "$HOST" -p "$PORTA" -U "$USER" -f --if-exists "$BASE"
;;
	RESTAURAR	) PGPASSWORD="$SENHA" pg_restore -h "$HOST" -p "$PORTA" -U "$USER" -F 'c' --role "$USER" -O -v -d "$BASE" "/tmp/$BASE.dump"
;;
	LEVANTAR	) pyenv shell sigsolucoes && (/sig/scripts/openerp.sh uall -d "$BASE" --stop-after-init)
;;
esac
}
# ┌──────────────────────────────────────────────────────────┐
# └───────────────────────────────────────────{ ATUALIZADOR }┘
PerguntarAtualizar(){
	SCRIPT=$(realpath $0)
	SERVER=$(wget -qO- "$REPOSITORIO/instaladores/instalador_t.sh" | grep -oP 'VERSAO="\K[^"]+' | head -1)
	CLIENT=$(grep -oP 'VERSAO="\K[^"]+' "$SCRIPT" | head -1)
[[ "$SERVER" = "$CLIENT" ]] && MenuExecutar || { MenuAtualizacao
while true; do
	case "$RESPOSTA" in
		  S|Sim|s|sim) wget -qO "$SCRIPT" --show-progress "$REPOSITORIO/instaladores/instalador_t.sh" &&
		  chmod 777 "$SCRIPT"; MenuStatus 'ATUALIZADO'; exit ;;
		  N|Nao|n|nao) MenuStatus 'SAINDO'; exit			 ;;
					*) MenuStatus 'INVALIDO'; MenuAtualizacao;;
	esac
done
}
}
# ┌──────────────────────────────────────────────────────────┐
# └─────────────────────────────────────────────{ PRINCIPAL }┘
LOGFILE="/tmp/${0##*/}".log
exec 1> >(tee -a "$LOGFILE"); exec 2>&1
[ "$ROOT" = '0' ] && MenuStatus 'SEM ROOT' && exit 1 || {
[ -z "$1" ] && {
	PerguntarAtualizar
} || {
while [ -n "$1" ]; do
case "$1" in
	sigerp) Configurar '1'; Instalar		;;
	sigpdv) Configurar '2'; Instalar		;;
	"$1") $1 && exit;;
	*)  MenuStatus 'INVALIDO'; MenuExecutar	;;
esac
done
}
}
