#!/bin/bash
if dpkg -l | grep -q "network-manager"; then
  # Verificar si es un VPS o máquina virtual
  if systemd-detect-virt --quiet; then
    echo "El sistema está ejecutándose en una máquina virtual."
    #exit 0
  else
    # menú-ip "server"
    sudo cat > /bin/menu-ip <<- "EOF"
#!/bin/bash

# Función para convertir una máscara de subred en notación CIDR
mask_to_cidr() {
  local IFS
  IFS=.
  read -r i1 i2 i3 i4 <<< "$1"
  local cidr=0
  local octets=("$i1" "$i2" "$i3" "$i4")
  
  for octet in "${octets[@]}"; do
    while [ "$octet" -ne 0 ]; do
      cidr=$((cidr + octet % 2))
      octet=$((octet / 2))
    done
  done

  echo "$cidr"
}

while :
do
    choix=$(whiptail --title "IP Tools" --menu "Selecciona una opción:" 15 60 6 \
    1 "Ver IP Local" \
    2 "Ver IP Pública" \
    3 "Set IP Static /DHCP" \
    4 "Salir" 3>&1 1>&2 2>&3)

    exitstatus=$?

    if [ $exitstatus = 0 ]; then
        echo "Opción seleccionada:" $choix
    else
        echo "Has elegido cancelar. Saliendo..."
        break
    fi

    case $choix in
    1)
        # Ver IP Local (muestra la IP local de los dispositivos)
        device_list=$(ip -o link show | awk -F: '$2 !~ /lo/{print $2}')
        ip_list=""
        for device in $device_list; do
            local_ip=$(ip -4 -o addr show $device | awk '{print $4}')
            ip_list="$ip_list$device = $local_ip\n"
        done
        whiptail --title "IP Local" --msgbox "Tu IP local es:\n\n$ip_list" 15 60
        ;;
    2)
        # Ver IP Pública (muestra la IP pública)
        public_ip=$(curl -s https://ifconfig.me)
        whiptail --title "IP Pública" --msgbox "Tu IP pública es:\n\n$public_ip" 10 40
        ;;
    3)
        # Configurar Static / DHCP (muestra la lista de dispositivos y permite seleccionar uno)
        device_list=$(ip -o link show | awk -F: '$2 !~ /lo/{print $2}')
        selected_device=""

        while [ -z "$selected_device" ]; do
            options=()
            for device in $device_list; do
                options+=("$device" "")
            done

            selected_device=$(whiptail --title "Static / DHCP" --menu "Selecciona un dispositivo de red:" 15 60 4 "${options[@]}" 3>&1 1>&2 2>&3)

            if [ $? -ne 0 ]; then
                echo "Has elegido cancelar. Saliendo..."
                break
            fi

            # Detectar el nombre del dispositivo basado en la interfaz seleccionada
            if [[ "$selected_device" == wlp* ]]; then
                device_name=$(nmcli -t -f active,ssid dev wifi | egrep '^yes' | cut -d: -f2)
              else
                device_name=$(nmcli -t -f name,device con show --active | grep -i "$selected_device" | cut -d: -f1)
            fi

            choice=$(whiptail --title "Static / DHCP" --menu "Selecciona una opción para $selected_device:" 15 60 4 \
            1 "Configurar DHCP" \
            2 "Configurar Static" \
            3 "Volver" 3>&1 1>&2 2>&3)
            
            case $choice in
            1)
                # Configurar DHCP para el dispositivo seleccionado
                sudo nmcli con mod "$device_name" ipv4.method auto
                sudo nmcli con mod "$device_name" ipv4.addresses ""
                sudo nmcli con up "$device_name"
                sudo systemctl stop NetworkManager &&
                sudo systemctl start NetworkManager 
                whiptail --title "Static / DHCP" --msgbox "Se ha configurado DHCP para $device_name." 10 40
                ;;
            2)
                # Configurar IP estática para el dispositivo seleccionado
                ip=""
                mask=""
                gateway=""
                dns1=""
                dns2=""

                # Solicitar IP estática
                ip=$(whiptail --title "Static / DHCP" --inputbox "Ingresa la IP estática para $device_name:" 10 60 3>&1 1>&2 2>&3)
                if [ $? -ne 0 ]; then
                    echo "Has elegido cancelar. Saliendo..."
                    break
                fi

                # Solicitar máscara de subred
                mask=$(whiptail --title "Static / DHCP" --inputbox "Ingresa la máscara de subred en formato de octetos para $device_name (ejemplo: 255.255.255.0):" 10 60 3>&1 1>&2 2>&3)
                if [ $? -ne 0 ]; then
                    echo "Has elegido cancelar. Saliendo..."
                    break
                fi

                # Solicitar puerta de enlace (gateway)
                gateway=$(whiptail --title "Static / DHCP" --inputbox "Ingresa la puerta de enlace (gateway) para $device_name:" 10 60 3>&1 1>&2 2>&3)
                if [ $? -ne 0 ]; then
                    echo "Has elegido cancelar. Saliendo..."
                    break
                fi

                # Solicitar DNS primario
                dns1=$(whiptail --title "Static / DHCP" --inputbox "Ingresa la dirección DNS primaria (dns1) para $device_name:" 10 60 3>&1 1>&2 2>&3)
                if [ $? -ne 0 ]; then
                    echo "Has elegido cancelar. Saliendo..."
                    break
                fi

                # Solicitar DNS secundario
                dns2=$(whiptail --title "Static / DHCP" --inputbox "Ingresa la dirección DNS secundaria (dns2) para $device_name:" 10 60 3>&1 1>&2 2>&3)
                if [ $? -ne 0 ]; then
                    echo "Has elegido cancelar. Saliendo..."
                    break
                fi

                # Convertir la máscara a CIDR
                cidr=$(mask_to_cidr "$mask")

                # Configurar la IP estática utilizando nmcli
                sudo nmcli con mod "$device_name" ipv4.method manual ipv4.addresses "$ip/$cidr" ipv4.gateway "$gateway" ipv4.dns "$dns1 $dns2"
                sudo nmcli con up "$device_name"
                sudo systemctl stop NetworkManager
                sudo systemctl start NetworkManager
                whiptail --title "Static / DHCP" --msgbox "Se ha configurado una IP estática para $device_name." 10 40
                ;;
            3)
                # Volver al menú anterior
                selected_device=""
                ;;
            *)
                ;;
            esac
        done
        ;;
    4)
        break
        ;;
    esac
done

exit 0
EOF
  fi
fi

if [ -f "/bin/menu-ip" ]; then
  sudo chmod +x /bin/menu-ip
  ln -sf /bin/menu-ip /bin/MENU-IP
  sudo chmod +x /bin/MENU*
fi
