diff --git a/scripts/repair_networkl.sh b/scripts/repair_networkl.sh new file mode 100644 index 0000000..a7e70b1 --- /dev/null +++ b/scripts/repair_networkl.sh @@ -0,0 +1,244 @@ +#!/bin/bash + +# Configuración +SCRIPT_VERSION="1.5" +LOG_FILE="/var/log/repair_network.log" + +# Colores para salida +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +NC='\033[0m' # No Color + +# Cargar el archivo de idioma +if [ -f "/usr/local/bin/ProxMenux/lang/es.lang" ]; then + source "/usr/local/bin/ProxMenux/lang/es.lang" +else + echo "Error: No se pudo cargar el archivo de idioma." + exit 1 +fi + +# Funciones de utilidad +log() { + echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" + echo -e "$1" +} + +error() { + log "${RED}${NETWORK_ERROR}: $1${NC}" +} + +success() { + log "${GREEN}${NETWORK_SUCCESS}: $1${NC}" +} + +warning() { + log "${YELLOW}${NETWORK_WARNING}: $1${NC}" +} + +# Función para detectar todas las interfaces de red +detect_all_interfaces() { + all_interfaces=$(ip -o link show | awk -F': ' '{print $2}' | grep -v lo) + physical_interfaces=$(echo "$all_interfaces" | grep -v @) + vlan_interfaces=$(echo "$all_interfaces" | grep @) + log "$NETWORK_ALL_INTERFACES: $all_interfaces" + log "$NETWORK_PHYSICAL_INTERFACES: $physical_interfaces" + log "$NETWORK_VLAN_INTERFACES: $vlan_interfaces" +} + +# Función para obtener interfaces configuradas +get_configured_interfaces() { + configured_interfaces=$(grep -E "^auto|^allow-hotplug" /etc/network/interfaces | awk '{print $2}' | sort | uniq) + log "$NETWORK_CONFIGURED_INTERFACES: $configured_interfaces" +} + +# Función para verificar y corregir la configuración de VLANs +check_and_fix_vlans() { + for vlan in $vlan_interfaces; do + local parent_interface=$(echo $vlan | cut -d@ -f2) + local vlan_id=$(echo $vlan | cut -d. -f2) + + if ! grep -q "^auto $vlan" /etc/network/interfaces; then + log "$NETWORK_VLAN_NOT_CONFIGURED: $vlan" + configure_vlan $vlan + else + local configured_parent=$(grep -A2 "iface $vlan" /etc/network/interfaces | grep "vlan-raw-device" | awk '{print $2}') + local configured_id=$(grep -A2 "iface $vlan" /etc/network/interfaces | grep "vlan_id" | awk '{print $2}') + + if [ "$configured_parent" != "$parent_interface" ] || [ "$configured_id" != "$vlan_id" ]; then + log "$NETWORK_VLAN_MISMATCH: $vlan" + fix_vlan_config $vlan $parent_interface $vlan_id + fi + fi + done +} + +# Función para configurar una VLAN +configure_vlan() { + local vlan=$1 + local parent_interface=$(echo $vlan | cut -d@ -f2) + local vlan_id=$(echo $vlan | cut -d. -f2) + + echo -e "\nauto $vlan\niface $vlan inet manual\n vlan-raw-device $parent_interface\n vlan_id $vlan_id" >> /etc/network/interfaces + log "$NETWORK_VLAN_CONFIGURED: $vlan" +} + +# Función para corregir la configuración de una VLAN +fix_vlan_config() { + local vlan=$1 + local parent_interface=$2 + local vlan_id=$3 + + sed -i "/iface $vlan/,/^$/ s/vlan-raw-device.*/vlan-raw-device $parent_interface/" /etc/network/interfaces + sed -i "/iface $vlan/,/^$/ s/vlan_id.*/vlan_id $vlan_id/" /etc/network/interfaces + log "$NETWORK_VLAN_FIXED: $vlan" +} + +# Función para verificar y corregir la configuración de puentes +check_and_fix_bridge_ports() { + local bridge=$1 + local old_port=$(grep "bridge-ports" /etc/network/interfaces | grep $bridge | awk '{print $2}') + + if ! ip link show $old_port &>/dev/null; then + log "$NETWORK_BRIDGE_PORT_MISSING: $bridge - $old_port" + + local candidates=$(ip -o link show | awk -F': ' '$2 !~ /^(lo|vmbr|bond|dummy)/ {print $2}') + + echo "$NETWORK_SELECT_NEW_BRIDGE_PORT: $bridge" + echo "$NETWORK_AVAILABLE_INTERFACES:" + + local i=1 + for iface in $candidates; do + local state=$(cat /sys/class/net/$iface/operstate) + local ip_addr=$(ip -o -4 addr show dev $iface | awk '{print $4}') + local config_type=$(grep -A1 "iface $iface" /etc/network/interfaces | grep -q "dhcp" && echo "dhcp" || echo "static") + local vlan="" + if [[ $iface == *@* ]]; then + vlan=" (VLAN)" + fi + + if [ -z "$ip_addr" ]; then + ip_addr="No IP" + fi + + echo "$i) $iface$vlan - Estado: $state, IP: $ip_addr, Configuración: $config_type" + ((i++)) + done + + read -p "$NETWORK_SELECT_INTERFACE: " selection + + if [[ $selection =~ ^[0-9]+$ ]] && [ $selection -le $i ]; then + local new_port=$(echo "$candidates" | sed -n "${selection}p") + sed -i "s/bridge-ports $old_port/bridge-ports $new_port/" /etc/network/interfaces + log "$NETWORK_BRIDGE_PORT_UPDATED: $bridge - $old_port -> $new_port" + else + log "$NETWORK_BRIDGE_PORT_UPDATE_FAILED: $bridge" + fi + fi +} + +# Función para reiniciar el servicio de red +restart_networking() { + log "$NETWORK_RESTARTING" + systemctl restart networking + if [ $? -eq 0 ]; then + success "$NETWORK_RESTART_SUCCESS" + else + error "$NETWORK_RESTART_FAILED" + fi +} + +# Función para verificar la conectividad de red +check_network_connectivity() { + if ping -c 4 8.8.8.8 &> /dev/null; then + success "$NETWORK_CONNECTIVITY_OK" + return 0 + else + warning "$NETWORK_CONNECTIVITY_FAILED" + return 1 + fi +} + +# Función para configurar manualmente una interfaz +configure_interface_manually() { + local interface=$1 + local current_ip=$(grep -A2 "iface $interface" /etc/network/interfaces | grep "address" | awk '{print $2}') + local current_gateway=$(grep -A4 "iface $interface" /etc/network/interfaces | grep "gateway" | awk '{print $2}') + + echo "Configurando $interface:" + echo "Dirección IP actual: $current_ip" + read -p "¿Desea cambiar la dirección IP? (s/n): " change_ip + if [[ $change_ip =~ ^[Ss]$ ]]; then + read -p "Nueva dirección IP: " new_ip + sed -i "/iface $interface/,/^$/ s/address.*/address $new_ip/" /etc/network/interfaces + fi + + echo "Puerta de enlace actual: $current_gateway" + read -p "¿Desea cambiar la puerta de enlace? (s/n): " change_gateway + if [[ $change_gateway =~ ^[Ss]$ ]]; then + read -p "Nueva puerta de enlace: " new_gateway + sed -i "/iface $interface/,/^$/ s/gateway.*/gateway $new_gateway/" /etc/network/interfaces + fi + + if [[ $interface == *@* ]]; then + local parent_interface=$(echo $interface | cut -d@ -f2) + local vlan_id=$(echo $interface | cut -d. -f2) + echo "Configuración de VLAN:" + echo "Interfaz padre actual: $parent_interface" + echo "ID de VLAN actual: $vlan_id" + read -p "¿Desea cambiar la configuración de VLAN? (s/n): " change_vlan + if [[ $change_vlan =~ ^[Ss]$ ]]; then + read -p "Nueva interfaz padre: " new_parent + read -p "Nuevo ID de VLAN: " new_vlan_id + sed -i "/iface $interface/,/^$/ s/vlan-raw-device.*/vlan-raw-device $new_parent/" /etc/network/interfaces + sed -i "/iface $interface/,/^$/ s/vlan_id.*/vlan_id $new_vlan_id/" /etc/network/interfaces + fi + fi + + log "$NETWORK_INTERFACE_MANUALLY_CONFIGURED: $interface" +} + +# Función para actualizar la IP de Proxmox +update_proxmox_ip() { + local main_interface=$(ip route | grep default | awk '{print $5}') + local main_ip=$(ip addr show $main_interface | grep "inet " | awk '{print $2}' | cut -d/ -f1) + if [ -n "$main_ip" ]; then + sed -i "s/^IP_ADDRESS=.*/IP_ADDRESS=\"$main_ip\"/" /etc/pve/storage.cfg + log "$PROXMOX_IP_UPDATED: $main_ip" + else + warning "$PROXMOX_IP_UPDATE_FAILED" + fi +} + +# Función principal +main() { + log "$NETWORK_REPAIR_STARTED" + + detect_all_interfaces + get_configured_interfaces + + check_and_fix_vlans + + for bridge in $(grep "iface.*inet static" /etc/network/interfaces | awk '{print $2}'); do + check_and_fix_bridge_ports $bridge + done + + update_proxmox_ip + restart_networking + + if ! check_network_connectivity; then + read -p "$NETWORK_MANUAL_CONFIG_PROMPT (s/n): " manual_config + if [[ $manual_config =~ ^[Ss]$ ]]; then + for interface in $(grep "iface.*inet" /etc/network/interfaces | awk '{print $2}'); do + configure_interface_manually $interface + done + restart_networking + check_network_connectivity + fi + fi + + log "$NETWORK_REPAIR_COMPLETED" +} + +# Ejecutar la función principal +main