Files
proxmox/smom-dbis-138-proxmox/scripts/fix-container-ips.sh

165 lines
5.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# Fix container IP addresses - configure static IPs in 192.168.11.X/24 range
# This script updates existing containers to use static IP addresses from inventory.example
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# PROJECT_ROOT should be one level up from scripts directory
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
# Source common functions
if [[ -f "$PROJECT_ROOT/lib/common.sh" ]]; then
source "$PROJECT_ROOT/lib/common.sh"
else
log_info() { echo "[INFO] $1"; }
log_success() { echo "[✓] $1"; }
log_warn() { echo "[WARNING] $1"; }
log_error() { echo "[ERROR] $1"; exit 1; }
error_exit() { echo "[ERROR] $1"; exit 1; }
fi
# Load configuration files
load_config 2>/dev/null || true
if [[ -f "$PROJECT_ROOT/config/network.conf" ]]; then
source "$PROJECT_ROOT/config/network.conf"
fi
# IP address mapping from inventory.example
declare -A VMID_IPS
VMID_IPS[1000]="192.168.11.100" # validator-1
VMID_IPS[1001]="192.168.11.101" # validator-2
VMID_IPS[1002]="192.168.11.102" # validator-3
VMID_IPS[1003]="192.168.11.103" # validator-4
VMID_IPS[1004]="192.168.11.104" # validator-5
VMID_IPS[1500]="192.168.11.150" # sentry-1
VMID_IPS[1501]="192.168.11.151" # sentry-2
VMID_IPS[1502]="192.168.11.152" # sentry-3
VMID_IPS[1503]="192.168.11.153" # sentry-4
VMID_IPS[2500]="192.168.11.250" # rpc-1
VMID_IPS[2501]="192.168.11.251" # rpc-2
VMID_IPS[2502]="192.168.11.252" # rpc-3
GATEWAY="${GATEWAY:-192.168.11.1}"
NETMASK="${NETMASK:-24}"
BRIDGE="${PROXMOX_BRIDGE:-vmbr0}"
# Force correct gateway if network.conf has wrong value
if [[ "$GATEWAY" == "10.3.1.1" ]]; then
GATEWAY="192.168.11.1"
fi
log_info "Fixing container IP addresses to use static 192.168.11.X/24 range"
log_info "Gateway: $GATEWAY, Bridge: $BRIDGE"
# Check if running on Proxmox host
if ! command_exists pct; then
error_exit "This script must be run on Proxmox host (pct command not found)"
fi
check_root
# Function to configure static IP for a container
configure_static_ip() {
local vmid="$1"
local ip_address="$2"
if ! pct list | grep -q "^\s*$vmid\s"; then
log_warn "Container $vmid does not exist, skipping"
return 1
fi
log_info "Configuring static IP $ip_address/$NETMASK for container $vmid"
# Stop container if running (required for network config changes)
local was_running=false
if pct status "$vmid" 2>/dev/null | grep -q "status: running"; then
was_running=true
log_info "Stopping container $vmid to apply network changes..."
pct stop "$vmid" || log_warn "Failed to stop container $vmid"
sleep 2
fi
# Configure static IP using pct set
# Format: bridge=vmbr0,name=eth0,ip=192.168.11.100/24,gw=192.168.11.1,type=veth
# Note: NETMASK should be in CIDR format (24, not 255.255.255.0)
local cidr_mask="$NETMASK"
if [[ "$NETMASK" == "255.255.255.0" ]]; then
cidr_mask="24"
fi
local net_config="bridge=$BRIDGE,name=eth0,ip=$ip_address/$cidr_mask,gw=$GATEWAY,type=veth"
log_info "Setting network configuration: $net_config"
if pct set "$vmid" --net0 "$net_config"; then
log_success "Network configuration updated for container $vmid"
else
log_error "Failed to update network configuration for container $vmid"
return 1
fi
# Also configure DNS servers
pct set "$vmid" --nameserver "8.8.8.8 8.8.4.4" 2>/dev/null || log_warn "Failed to set DNS servers for $vmid"
# Start container if it was running before
if [[ "$was_running" == "true" ]]; then
log_info "Starting container $vmid..."
pct start "$vmid" || log_warn "Failed to start container $vmid"
# Wait for container to be running
local max_wait=30
local waited=0
while ! pct status "$vmid" 2>/dev/null | grep -q "status: running" && [[ $waited -lt $max_wait ]]; do
sleep 1
waited=$((waited + 1))
done
if pct status "$vmid" 2>/dev/null | grep -q "status: running"; then
log_success "Container $vmid is running"
# Wait a bit more for network to come up
sleep 3
# Verify IP address
local actual_ip=$(pct exec "$vmid" -- ip -4 addr show dev eth0 2>/dev/null | awk '/inet / {print $2}' | cut -d'/' -f1)
if [[ "$actual_ip" == "$ip_address" ]]; then
log_success "Verified IP address $ip_address on container $vmid"
else
log_warn "IP address mismatch: expected $ip_address, got $actual_ip (may need container restart)"
fi
else
log_warn "Container $vmid did not start successfully"
fi
fi
return 0
}
# Process all containers
processed=0
failed=0
for vmid in "${!VMID_IPS[@]}"; do
ip_address="${VMID_IPS[$vmid]}"
if configure_static_ip "$vmid" "$ip_address"; then
processed=$((processed + 1))
else
failed=$((failed + 1))
fi
echo "" # Blank line between containers
done
log_success "IP address configuration completed!"
log_info "Summary:"
log_info " Processed: $processed containers"
if [[ $failed -gt 0 ]]; then
log_warn " Failed: $failed containers"
fi
log_info ""
log_info "Next steps:"
log_info "1. Verify IP addresses: pct exec <vmid> -- ip addr show eth0"
log_info "2. Test connectivity: pct exec <vmid> -- ping -c 3 $GATEWAY"
log_info "3. Update static-nodes.json with new IP addresses if changed"