#!/bin/bash

set -e

# ============================================================
# Configuração inicial de VM Debian 13
#
# - Configura hostname
# - Configura domínio
# - Recria /etc/hosts
# - Detecta interfaces de rede
# - Recria /etc/network/interfaces do zero
# - DHCP / Estático / Não configurar por interface
# - Limpa históricos
# - Desliga a máquina ao final
#
# Compatível com:
# curl -fsSL URL | bash
# ============================================================


# ============================================================
# FUNÇÕES
# ============================================================

read_tty() {
    local prompt="$1"
    local varname="$2"

    read -rp "$prompt" "$varname" < /dev/tty
}


valid_ipv4() {
    local ip="$1"
    local IFS=.
    local -a octets

    read -ra octets <<< "$ip"

    [ "${#octets[@]}" -eq 4 ] || return 1

    for octet in "${octets[@]}"; do

        [[ "$octet" =~ ^[0-9]+$ ]] || return 1

        [ "$octet" -ge 0 ] 2>/dev/null || return 1
        [ "$octet" -le 255 ] 2>/dev/null || return 1

    done

    return 0
}


valid_hostname() {
    local value="$1"

    [[ "$value" =~ ^[a-zA-Z0-9]([a-zA-Z0-9.-]*[a-zA-Z0-9])?$ ]]
}


# ============================================================
# VERIFICA ROOT
# ============================================================

if [ "$EUID" -ne 0 ]; then

    echo
    echo "ERRO: execute este script como root."
    echo

    exit 1

fi


# ============================================================
# CABEÇALHO
# ============================================================

clear 2>/dev/null || true

echo
echo "============================================================"
echo " CONFIGURAÇÃO INICIAL - DEBIAN 13"
echo "============================================================"
echo


# ============================================================
# HOSTNAME
# ============================================================

while true; do

    read_tty "Novo nome da máquina: " NEW_HOSTNAME

    if [ -z "$NEW_HOSTNAME" ]; then

        echo "O nome da máquina não pode ficar vazio."

        continue

    fi


    if ! valid_hostname "$NEW_HOSTNAME"; then

        echo "Hostname inválido."

        continue

    fi

    break

done


# ============================================================
# DOMÍNIO
# ============================================================

while true; do

    read_tty "Domínio (ex.: fatec.local): " NEW_DOMAIN

    if [ -z "$NEW_DOMAIN" ]; then

        echo "O domínio não pode ficar vazio."

        continue

    fi


    if ! valid_hostname "$NEW_DOMAIN"; then

        echo "Domínio inválido."

        continue

    fi

    break

done


FQDN="${NEW_HOSTNAME}.${NEW_DOMAIN}"


# ============================================================
# CONFIRMAÇÃO
# ============================================================

echo
echo "------------------------------------------------------------"
echo "Hostname : $NEW_HOSTNAME"
echo "Domínio  : $NEW_DOMAIN"
echo "FQDN     : $FQDN"
echo "------------------------------------------------------------"
echo

read_tty "Continuar? [S/n]: " CONFIRM


case "$CONFIRM" in

    n|N|nao|não|NAO|NÃO)

        echo
        echo "Operação cancelada."
        echo

        exit 0
        ;;

esac


# ============================================================
# CONFIGURA HOSTNAME
# ============================================================

echo
echo "Configurando hostname..."

echo "$NEW_HOSTNAME" > /etc/hostname

hostnamectl set-hostname "$NEW_HOSTNAME"


# ============================================================
# RECRIA /etc/hosts
# ============================================================

echo "Configurando /etc/hosts..."

cat > /etc/hosts <<EOF
127.0.0.1       localhost
127.0.1.1       $FQDN $NEW_HOSTNAME

::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
EOF


# ============================================================
# DETECTA INTERFACES
# ============================================================

echo
echo "============================================================"
echo " INTERFACES DE REDE ENCONTRADAS"
echo "============================================================"
echo


mapfile -t INTERFACES < <(
    find /sys/class/net \
        -mindepth 1 \
        -maxdepth 1 \
        -printf '%f\n' |
        grep -v '^lo$' |
        sort
)


if [ "${#INTERFACES[@]}" -eq 0 ]; then

    echo "ERRO: nenhuma interface de rede encontrada."

    exit 1

fi


for IFACE in "${INTERFACES[@]}"; do

    MAC="desconhecido"
    STATE="desconhecido"


    if [ -f "/sys/class/net/$IFACE/address" ]; then

        MAC=$(cat "/sys/class/net/$IFACE/address")

    fi


    if [ -f "/sys/class/net/$IFACE/operstate" ]; then

        STATE=$(cat "/sys/class/net/$IFACE/operstate")

    fi


    echo "Interface : $IFACE"
    echo "MAC       : $MAC"
    echo "Estado    : $STATE"
    echo

done


# ============================================================
# RECRIA /etc/network/interfaces DO ZERO
# ============================================================

echo "Recriando /etc/network/interfaces..."

cat > /etc/network/interfaces <<'EOF'
# ============================================================
# Configuração de rede
# Gerada automaticamente pelo script de configuração inicial
# ============================================================

auto lo
iface lo inet loopback

EOF


# ============================================================
# CONFIGURA CADA INTERFACE
# ============================================================

for IFACE in "${INTERFACES[@]}"; do

    MAC="desconhecido"


    if [ -f "/sys/class/net/$IFACE/address" ]; then

        MAC=$(cat "/sys/class/net/$IFACE/address")

    fi


    echo
    echo "============================================================"
    echo " INTERFACE: $IFACE"
    echo " MAC:       $MAC"
    echo "============================================================"
    echo
    echo "1) DHCP"
    echo "2) IP estático"
    echo "3) Não configurar"
    echo


    while true; do

        read_tty "Escolha [1/2/3]: " OPTION


        case "$OPTION" in


            # ====================================================
            # DHCP
            # ====================================================

            1)

                cat >> /etc/network/interfaces <<EOF

# ------------------------------------------------------------
# Interface $IFACE - DHCP
# ------------------------------------------------------------

auto $IFACE
allow-hotplug $IFACE
iface $IFACE inet dhcp

EOF

                echo
                echo "$IFACE configurada como DHCP."

                break
                ;;


            # ====================================================
            # IP ESTÁTICO
            # ====================================================

            2)

                echo
                echo "Configuração estática de $IFACE"
                echo


                # ------------------------------------------------
                # IP
                # ------------------------------------------------

                while true; do

                    read_tty "Endereço IPv4: " IPADDR


                    if valid_ipv4 "$IPADDR"; then

                        break

                    fi


                    echo "Endereço IPv4 inválido."

                done


                # ------------------------------------------------
                # PREFIXO
                # ------------------------------------------------

                while true; do

                    read_tty "Prefixo da rede [ex.: 24]: " PREFIX


                    if [[ "$PREFIX" =~ ^[0-9]+$ ]] &&
                       [ "$PREFIX" -ge 0 ] &&
                       [ "$PREFIX" -le 32 ]; then

                        break

                    fi


                    echo "Prefixo inválido. Informe um valor entre 0 e 32."

                done


                # ------------------------------------------------
                # GATEWAY
                # ------------------------------------------------

                while true; do

                    read_tty "Gateway [ENTER para nenhum]: " GATEWAY


                    if [ -z "$GATEWAY" ]; then

                        break

                    fi


                    if valid_ipv4 "$GATEWAY"; then

                        break

                    fi


                    echo "Gateway inválido."

                done


                # ------------------------------------------------
                # DNS
                # ------------------------------------------------

                while true; do

                    read_tty "DNS [ex.: 172.16.0.2 8.8.8.8] [ENTER para nenhum]: " DNS


                    if [ -z "$DNS" ]; then

                        break

                    fi


                    DNS_VALID=1


                    for DNS_IP in $DNS; do

                        if ! valid_ipv4 "$DNS_IP"; then

                            DNS_VALID=0

                            break

                        fi

                    done


                    if [ "$DNS_VALID" -eq 1 ]; then

                        break

                    fi


                    echo "Um ou mais servidores DNS são inválidos."

                done


                # ------------------------------------------------
                # DNS SEARCH
                # ------------------------------------------------

                read_tty "Domínio de pesquisa DNS [$NEW_DOMAIN]: " DNS_SEARCH


                if [ -z "$DNS_SEARCH" ]; then

                    DNS_SEARCH="$NEW_DOMAIN"

                fi


                # ------------------------------------------------
                # GRAVA CONFIGURAÇÃO
                # ------------------------------------------------

                cat >> /etc/network/interfaces <<EOF

# ------------------------------------------------------------
# Interface $IFACE - ESTÁTICA
# ------------------------------------------------------------

auto $IFACE
allow-hotplug $IFACE
iface $IFACE inet static
    address $IPADDR/$PREFIX
EOF


                if [ -n "$GATEWAY" ]; then

                    echo "    gateway $GATEWAY" >> /etc/network/interfaces

                fi


                if [ -n "$DNS" ]; then

                    echo "    dns-nameservers $DNS" >> /etc/network/interfaces

                fi


                if [ -n "$DNS_SEARCH" ]; then

                    echo "    dns-search $DNS_SEARCH" >> /etc/network/interfaces

                fi


                echo
                echo "$IFACE configurada com IP estático."

                break
                ;;


            # ====================================================
            # NÃO CONFIGURAR
            # ====================================================

            3)

                echo
                echo "$IFACE não será configurada."

                break
                ;;


            # ====================================================
            # INVÁLIDO
            # ====================================================

            *)

                echo
                echo "Opção inválida. Escolha 1, 2 ou 3."
                ;;

        esac

    done

done


# ============================================================
# PERMISSÃO DO ARQUIVO
# ============================================================

chmod 644 /etc/network/interfaces


# ============================================================
# MOSTRA RESULTADO
# ============================================================

echo
echo "============================================================"
echo " CONFIGURAÇÃO FINAL"
echo "============================================================"
echo

echo "Hostname : $NEW_HOSTNAME"
echo "Domínio  : $NEW_DOMAIN"
echo "FQDN     : $FQDN"

echo
echo "------------------------------------------------------------"
echo "/etc/network/interfaces"
echo "------------------------------------------------------------"
echo

cat /etc/network/interfaces

echo
echo "------------------------------------------------------------"
echo


# ============================================================
# CONFIRMA FINALIZAÇÃO
# ============================================================

echo
echo "A configuração foi concluída."
echo
echo "A máquina será desligada ao final da limpeza."
echo

read_tty "Pressione ENTER para finalizar e desligar..." FINAL_CONFIRM


# ============================================================
# LIMPEZA DE HISTÓRICO
# ============================================================

echo
echo "Limpando históricos..."


# ============================================================
# ROOT
# ============================================================

history -c 2>/dev/null || true

rm -f /root/.bash_history
rm -f /root/.zsh_history
rm -f /root/.python_history
rm -f /root/.lesshst
rm -f /root/.wget-hsts


# ============================================================
# USUÁRIOS NORMAIS
# ============================================================

while IFS=: read -r \
    USERNAME \
    PASSWORD_FIELD \
    USER_ID \
    GROUP_ID \
    GECOS \
    HOME_DIR \
    USER_SHELL

do

    if [ "$USER_ID" -ge 1000 ] 2>/dev/null &&
       [ "$USER_ID" -lt 65534 ] 2>/dev/null &&
       [ -d "$HOME_DIR" ]; then

        rm -f "$HOME_DIR/.bash_history"
        rm -f "$HOME_DIR/.zsh_history"
        rm -f "$HOME_DIR/.python_history"
        rm -f "$HOME_DIR/.lesshst"
        rm -f "$HOME_DIR/.wget-hsts"

    fi

done < /etc/passwd


# ============================================================
# LIMPA HISTÓRICO DA SESSÃO ATUAL
# ============================================================

history -c 2>/dev/null || true

unset HISTFILE

export HISTFILE=/dev/null


# ============================================================
# SINCRONIZA DISCO
# ============================================================

sync


# ============================================================
# FINALIZAÇÃO
# ============================================================

echo
echo "============================================================"
echo " CONFIGURAÇÃO CONCLUÍDA"
echo "============================================================"
echo
echo "Hostname : $NEW_HOSTNAME"
echo "Domínio  : $NEW_DOMAIN"
echo "FQDN     : $FQDN"
echo
echo "Rede configurada em:"
echo "/etc/network/interfaces"
echo
echo "Históricos removidos."
echo
echo "Desligando a máquina..."
echo


sleep 3


# ============================================================
# DESLIGA A VM
# ============================================================

systemctl poweroff