#!/bin/bash
# Por C0nt05
versaoLocal="1.4.1"
revproxyInstalado=false
versaoRemota_url="https://raw.githubusercontent.com/talesam/revproxy/main/versao.txt"
# Verifica se o script está sendo executado como root
if [[ $EUID -ne 0 ]]; then
dialog --title "Erro" --msgbox "Este script deve ser executado como root ou com sudo." 5 60
exit 1
fi
# Verifica se o dialog está instalado
if ! command -v dialog &> /dev/null; then
echo "O pacote 'dialog' não está instalado. Tentando instalar..."
# Verifica se o script está sendo executado como root
if [[ $EUID -ne 0 ]]; then
echo "Você precisa ser root para instalar o 'dialog'. Por favor, execute o script como root ou use sudo."
exit 1
fi
# Tenta instalar o dialog
apt-get update && apt-get install dialog -y
# Verifica se a instalação foi bem-sucedida
if ! command -v dialog &> /dev/null; then
echo "Falha ao instalar o 'dialog'. Por favor, instale manualmente e tente novamente."
exit 1
fi
fi
# Verifica se o arquivo /usr/local/bin/revproxy já existe
if [ -f /usr/local/bin/revproxy ]; then
revproxyInstalado=true
fi
install_revproxy() {
clear
if [ ! -f /usr/local/bin/revproxy ]; then
dialog --title "Instalação" --infobox "Instalando revproxy..." 5 50
sleep 1
wget -q -O /usr/local/bin/revproxy https://raw.githubusercontent.com/talesam/revproxy/main/revproxy
chmod +x /usr/local/bin/revproxy
# Chama a função para instalar o proxy
install_proxy
revproxyInstalado=true
dialog --title "Instalação" --msgbox "revproxy instalado com sucesso! Para executar use o comando 'revproxy'" 6 50
else
dialog --title "Informação" --msgbox "RevProxy já está instalado." 5 50
fi
}
# Função para verificar e atualizar a versão do script
check_update() {
clear
versaoRemota=$(wget -qO- "$versaoRemota_url")
if [ "$versaoRemota" != "$versaoLocal" ]; then
dialog --title "Atualização Disponível" --yesno "Versão Atual: $versaoLocal\nNova Versão: $versaoRemota\nDeseja atualizar o script?" 7 50
response=$?
if [ $response -eq 0 ]; then
wget -q -O /usr/local/bin/revproxy https://raw.githubusercontent.com/talesam/revproxy/main/revproxy
chmod +x /usr/local/bin/revproxy
dialog --title "Atualização" --msgbox "Script atualizado para a versão $versaoRemota. Por favor, execute-o novamente." 6 50
exit 0
fi
else
dialog --title "Atualização" --msgbox "Você já está na versão mais recente ($versaoLocal)." 5 50
fi
}
# Função para solicitar e validar a porta
get_port() {
local port
port=$(dialog --title "Insira a Porta" --inputbox "Digite a porta (padrão 80):" 8 40 80 3>&1 1>&2 2>&3)
if ! [[ $port =~ ^[0-9]+$ ]] || [ $port -le 0 ] || [ $port -gt 65535 ]; then
dialog --title "Erro" --msgbox "Porta inválida. Por favor, insira um número entre 1 e 65535." 5 50
return 1
fi
echo $port
}
# Função para solicitar o nome da VPN
get_vpn_name() {
local nomeVpn
nomeVpn=$(dialog --title "Nome da VPN" --inputbox "Digite o nome da VPN:" 8 40 3>&1 1>&2 2>&3)
if [ -z "$nomeVpn" ]; then
dialog --title "Erro" --msgbox "Nome da VPN não pode ser vazio." 5 50
return 1
fi
echo $nomeVpn
}
# Função para instalar o proxy
install_proxy() {
clear
if [ -f /usr/bin/proxy.bak ]; then
dialog --title "Instalação Cancelada" --msgbox "Um backup do proxy já existe. Instalação cancelada para evitar sobrescrever o backup." 6 50
return
fi
if [ -f /usr/bin/proxy ]; then
mv /usr/bin/proxy /usr/bin/proxy.bak
dialog --title "Backup" --msgbox "Backup do proxy atual salvo como proxy.bak" 5 50
fi
curl -s -L -o /tmp/proxy https://github.com/talesam/revproxy/raw/main/proxy
chmod +x /usr/bin/proxy
dialog --title "Instalação" --msgbox "Proxy instalado com sucesso!" 5 50
}
# Função para restaurar o proxy original
restore_proxy() {
clear
echo ""
if [ -f /usr/bin/proxy.bak ]; then
mv /usr/bin/proxy.bak /usr/bin/proxy
dialog --title "Restauração" --msgbox "Proxy original restaurado com sucesso." 5 50
revproxyInstalado=false
else
dialog --title "Erro" --msgbox "Backup do proxy não encontrado." 5 50
fi
}
list_ports() {
local ports=$(netstat -tuln | grep LISTEN)
echo "$ports" > /tmp/port_list.txt
dialog --title "Portas em Execução" --textbox /tmp/port_list.txt 20 70
rm /tmp/port_list.txt
}
# Função para matar processo em uma porta específica
kill_port() {
local port
port=$(dialog --title "Encerrar Processo" --inputbox "Digite a porta para encerrar o processo:" 8 40 3>&1 1>&2 2>&3)
pid=$(lsof -t -i:$port)
if [ -n "$pid" ]; then
kill $pid
dialog --title "Sucesso" --msgbox "Processo na porta $port encerrado." 5 50
else
dialog --title "Erro" --msgbox "Nenhum processo encontrado na porta $port." 5 50
fi
}
run_proxy() {
dialog --title "Configuração do Proxy" --infobox "Iniciando configuração do proxy..." 5 50
sleep 1
local port=$(get_port)
if [ $? -ne 0 ]; then
dialog --title "Erro" --msgbox "Erro ao obter a porta." 5 50
return
fi
local nomeVpn=$(get_vpn_name)
if [ $? -ne 0 ]; then
dialog --title "Erro" --msgbox "Erro ao obter o nome da VPN." 5 50
return
fi
local mode=$1
local command="/usr/bin/proxy --port $port --http --response $nomeVpn"
case $mode in
"ssh") command="$command --ssh-only" ;;
"openvpn") command="$command --openvpn-port" ;;
esac
dialog --title "Executando Proxy" --msgbox "Proxy executando na porta $port com configuração: $mode e VPN: $nomeVpn" 6 50
screen -dmS proxy $command
}
# Menu principal
while true; do
exec 3>&1
selection=$(dialog \
--backtitle "RevProxy - $versaoLocal" \
--title "Menu Principal" \
--clear \
--cancel-label "Sair" \
--menu "Escolha uma opção:" 20 70 10 \
"1" "Instalar Proxy" \
"2" "Restaurar Proxy Original" \
"3" "Proxy com HTTP e SSH (APENAS)" \
"4" "Proxy com HTTP e OpenVPN (TUDO)" \
"5" "Listar portas em execução" \
"6" "Encerrar processo em uma porta" \
"7" "Verificar atualizações do script" \
2>&1 1>&3)
exit_status=$?
exec 3>&-
if [ $exit_status = 1 ]; then
break
fi
case $selection in
1) install_revproxy ;;
2) restore_proxy ;;
3) [ "$revproxyInstalado" = true ] && run_proxy "ssh" ;;
4) [ "$revproxyInstalado" = true ] && run_proxy "openvpn" ;;
5) list_ports ;;
6) kill_port ;;
7) check_update ;;
esac
done
# Limpa a tela ao sair
clear