64883d4f02
Enable interpretation of backslash escapes in log messages across all debian scripts for consistent formatting and proper escape sequence handling
295 lines
8.3 KiB
Bash
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
|