Files
scripts/debian/set_static_ip.sh
tiago.aica 64883d4f02 style(debian): add -e flag to echo commands in log functions
Enable interpretation of backslash escapes in log messages across all debian scripts for consistent formatting and proper escape sequence handling
2026-02-15 17:52:34 +00:00

295 lines
8.3 KiB
Bash

#!/bin/bash
# =============================================
# Static IP Configuration Script
# Configures static IP for active interface (eth0 or wlan0)
# Must be run with sudo!
#
# Usage:
# IP_ADDRESS=192.168.1.100 GATEWAY=192.168.1.1 ./set_static_ip.sh
# =============================================
# --- Configuration ---
DEFAULT_GATEWAY="${GATEWAY_ENV:-10.10.0.1}" # Use GATEWAY_ENV if provided, otherwise default
DNS_SERVERS="8.8.8.8 8.8.4.4"
LOG_FILE="/var/log/set_static_ip.log"
NETPLAN_DIR="/etc/netplan"
MAX_LOG_SIZE_KB=1024 # 1MB
# --- Funções Auxiliares ---
# Função de Log (modificada para usar logger)
log() {
local message="$1"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# Escreve no ficheiro de log
echo -e "$timestamp: $message" | tee -a "$LOG_FILE"
# Envia para o syslog (opcional)
logger -t "set_static_ip" "$message"
}
# Função para limitar o tamanho do log
limit_log_size() {
local log_file="$1"
local max_size_kb="$2"
local max_size_bytes=$((max_size_kb * 1024))
if [ -f "$log_file" ]; then
local current_size=$(stat -c %s "$log_file" 2>/dev/null || wc -c < "$log_file" 2>/dev/null)
if [ "$current_size" -gt "$max_size_bytes" ]; then
log "Aviso: Ficheiro de log $log_file excedeu $max_size_kb KB. A truncar..."
tail -n 500 "$log_file" > "${log_file}.tmp" && mv "${log_file}.tmp" "$log_file"
log "Ficheiro de log truncado. As últimas 500 linhas foram mantidas."
fi
fi
}
# Function to fix netplan permissions
fix_netplan_permissions() {
log "Fixing netplan permissions..."
# Fix permissions for all netplan files
find "$NETPLAN_DIR" -type f -name "*.yaml" -exec chmod 600 {} \;
find /lib/netplan -type f -name "*.yaml" -exec chmod 600 {} \;
find /run/netplan -type f -name "*.yaml" -exec chmod 600 {} \;
# Fix ownership
chown root:root "$NETPLAN_DIR"/*.yaml 2>/dev/null
chown root:root /lib/netplan/*.yaml 2>/dev/null
chown root:root /run/netplan/*.yaml 2>/dev/null
log "Netplan permissions fixed"
}
# Function to check if interface is up
is_interface_up() {
local interface="$1"
if ip link show "$interface" | grep -q "state UP"; then
return 0
else
return 1
fi
}
# Function to get active interface
get_active_interface() {
# Check eth0 first
if is_interface_up "eth0"; then
echo "eth0"
return 0
fi
# Then check wlan0
if is_interface_up "wlan0"; then
echo "wlan0"
return 0
fi
# No active interface found
return 1
}
# Function to check if system uses dhcpcd
uses_dhcpcd() {
if [ -f /etc/dhcpcd.conf ] && systemctl list-unit-files | grep -q dhcpcd; then
return 0
else
return 1
fi
}
# Function to check if system uses netplan
uses_netplan() {
if [ -d "$NETPLAN_DIR" ] && command -v netplan >/dev/null; then
return 0
else
return 1
fi
}
# Function to check if system uses NetworkManager
uses_network_manager() {
if systemctl list-unit-files | grep -q NetworkManager && command -v nmcli >/dev/null; then
return 0
else
return 1
fi
}
# Function to configure static IP using dhcpcd
configure_static_ip_dhcpcd() {
local interface="$1"
local ip_address="$2"
local gateway="$3"
local dns="$4"
log "Configuring static IP for $interface using dhcpcd..."
# Backup original dhcpcd.conf
if [ ! -f /etc/dhcpcd.conf.bak ]; then
cp /etc/dhcpcd.conf /etc/dhcpcd.conf.bak
log "Created backup of /etc/dhcpcd.conf"
fi
# Remove any existing configuration for this interface
sed -i "/^interface $interface$/,/^$/d" /etc/dhcpcd.conf
# Add new configuration
{
echo ""
echo "# Static IP configuration for $interface"
echo "interface $interface"
echo "static ip_address=$ip_address"
echo "static routers=$gateway"
echo "static domain_name_servers=$dns"
} >> /etc/dhcpcd.conf
log "Static IP configuration added to /etc/dhcpcd.conf"
log "Restarting networking..."
# Try different methods to restart networking
if systemctl restart dhcpcd 2>/dev/null; then
log "dhcpcd service restarted successfully"
return 0
elif systemctl restart networking 2>/dev/null; then
log "networking service restarted successfully"
return 0
elif systemctl restart systemd-networkd 2>/dev/null; then
log "systemd-networkd service restarted successfully"
return 0
else
log "Could not restart networking service automatically"
log "Please reboot the system for changes to take effect"
return 0
fi
}
# Function to configure static IP using netplan
configure_static_ip_netplan() {
local interface="$1"
local ip_address="$2"
local gateway="$3"
local dns="$4"
log "Configuring static IP for $interface using netplan..."
# Fix netplan permissions first
fix_netplan_permissions
# Find netplan config file
local netplan_file=$(ls "$NETPLAN_DIR"/*.yaml 2>/dev/null | head -n 1)
if [ -z "$netplan_file" ]; then
# Create default netplan file if none exists
netplan_file="$NETPLAN_DIR/01-static-ip.yaml"
log "Creating new netplan configuration file: $netplan_file"
else
# Backup original netplan config
if [ ! -f "$netplan_file.bak" ]; then
cp "$netplan_file" "$netplan_file.bak"
log "Created backup of $netplan_file"
fi
fi
# Create new netplan configuration
cat > "$netplan_file" <<EOF
network:
version: 2
renderer: networkd
ethernets:
$interface:
addresses: [$ip_address]
routes:
- to: default
via: $gateway
nameservers:
addresses: [$(echo $dns | sed 's/ /, /g')]
EOF
# Set correct permissions
chmod 600 "$netplan_file"
chown root:root "$netplan_file"
log "Static IP configuration added to $netplan_file"
log "Applying netplan configuration..."
# Apply netplan configuration
if netplan apply; then
log "Netplan configuration applied successfully"
return 0
else
log "Failed to apply netplan configuration"
return 1
fi
}
# Function to configure static IP using NetworkManager
configure_static_ip_network_manager() {
local interface="$1"
local ip_address="$2"
local gateway="$3"
local dns="$4"
log "Configuring static IP for $interface using NetworkManager..."
# Set static IP
if nmcli con show "$interface" >/dev/null 2>&1; then
nmcli con mod "$interface" ipv4.method manual ipv4.addresses "$ip_address" ipv4.gateway "$gateway" ipv4.dns "$dns"
else
nmcli con add type ethernet ifname "$interface" con-name "$interface" ipv4.method manual ipv4.addresses "$ip_address" ipv4.gateway "$gateway" ipv4.dns "$dns"
fi
# Restart connection
nmcli con down "$interface" && nmcli con up "$interface"
log "NetworkManager configuration applied successfully"
return 0
}
# Function to configure static IP
configure_static_ip() {
local ip_address="${IP_ADDRESS_ENV:-$1}"
local gateway="${GATEWAY_ENV:-$DEFAULT_GATEWAY}"
local interface
local dns="$DNS_SERVERS"
mkdir -p "$(dirname "$LOG_FILE")"
limit_log_size "$LOG_FILE" "$MAX_LOG_SIZE_KB" # Verifica o tamanho do log no início
# Get active interface
if ! interface=$(get_active_interface); then
log "No active network interface found (eth0 or wlan0)"
return 1
fi
log "Active interface: $interface"
log "Configuring static IP: $ip_address"
log "Gateway: $gateway"
log "DNS Servers: $dns"
# Check which network management system is in use
if uses_dhcpcd; then
configure_static_ip_dhcpcd "$interface" "$ip_address" "$gateway" "$dns"
elif uses_netplan; then
configure_static_ip_netplan "$interface" "$ip_address" "$gateway" "$dns"
elif uses_network_manager; then
configure_static_ip_network_manager "$interface" "$ip_address" "$gateway" "$dns"
else
log "Could not determine network configuration method"
log "Please configure your network manually:"
log "Interface: $interface"
log "IP Address: $ip_address"
log "Gateway: $gateway"
log "DNS Servers: $dns"
return 1
fi
}
# --- Main Execution ---
# Configure static IP
configure_static_ip