ProxMenux/scripts/repair_networkl.sh
2025-01-10 20:53:15 +01:00

245 lines
8.3 KiB
Bash

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