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