From 83a8e8601612a1612ef42883a1f8fd46ba723e1f Mon Sep 17 00:00:00 2001 From: Tiago Date: Sat, 14 Feb 2026 23:29:10 +0000 Subject: [PATCH] Update debian/set_mac_wifi.sh --- debian/set_mac_wifi.sh | 68 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/debian/set_mac_wifi.sh b/debian/set_mac_wifi.sh index 65ff3ae..3a5e0d7 100644 --- a/debian/set_mac_wifi.sh +++ b/debian/set_mac_wifi.sh @@ -1,9 +1,10 @@ #!/bin/bash # Script to set fixed MAC address and disable Wi-Fi if eth0 configuration succeeds # Must be run with sudo! +# Update: Agora gera um MAC único automaticamente se nenhum for especificado (resolver problema do DM9601). # --- Configuration --- -ETH0_MAC="00:00:00:00:00:00" # Default MAC - will be changed by setup script +ETH0_MAC="00:00:00:00:00:00" # Default MAC - será alterado automaticamente se mantiver este valor # WLAN0_MAC="XX:XX:XX:XX:XX:XX" # Uncomment and set if needed # Verify root privileges @@ -113,9 +114,68 @@ disable_wifi() { fi } -# --- Execution --- -# Set MAC for eth0 and disable Wi-Fi if successful +# --- Novas Funções Complementares (Dinâmicas) --- + +# Função para gerar um MAC único baseado no Serial do Raspberry Pi +# Garante que cada dispositivo fica com um MAC diferente mas consistente +generate_unique_mac() { + local serial + serial=$(awk '/Serial/ {print $3}' /proc/cpuinfo | tr -d ' ') + + if [ -z "$serial" ]; then + # Fallback aleatório caso não encontre serial + printf '%02X:%02X:%02X:%02X:%02X:%02X' $((0x02 | (RANDOM % 256) & 0xFE)) $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)) + else + # Gera hash do serial para criar os octetos + local hash + hash=$(echo -n "$serial-dm9601" | md5sum | cut -c1-10) + # 02 define como Local Admin Address + echo "02:${hash:0:2}:${hash:2:2}:${hash:4:2}:${hash:6:2}:${hash:8:2}" + fi +} + +# Função para criar regra Udev persistente (Best Practice) +# Isto faz com que o MAC seja aplicado no boot, evitando erros de "Device Busy" +setup_udev_persistence() { + local interface="$1" + local target_mac="$2" + local log_file="/var/log/set_mac.log" + + # Obtém o MAC original (físico) do adaptador + local original_mac + original_mac=$(ip link show "$interface" | awk '/ether/ {print $2}' | tr '[:upper:]' '[:lower:]') + target_mac=$(echo "$target_mac" | tr '[:upper:]' '[:lower:]') + + if [ -z "$original_mac" ]; then return 1; fi + + local rules_file="/etc/udev/rules.d/81-mac-spoof.rules" + + # Se a regra já existe para este MAC original, não faz nada + if grep -q "$original_mac" "$rules_file" 2>/dev/null; then + return 0 + fi + + echo "$(date): Criando regra udev persistente para $interface" | tee -a "$log_file" + echo "ACTION==\"add\", SUBSYSTEM==\"net\", ATTR{address}==\"$original_mac\", RUN+=\"/usr/bin/ip link set dev \$name address $target_mac\"" >> "$rules_file" + udevadm control --reload-rules +} + +# --- Execução Principal --- + +# LÓGICA COMPLEMENTAR: +# Se ETH0_MAC for o valor padrão (00:00...) ou vazio, gera um novo automaticamente. +if [ -z "$ETH0_MAC" ] || [ "$ETH0_MAC" == "00:00:00:00:00:00" ]; then + echo "$(date): Nenhum MAC específico definido. Gerando MAC único automático..." | tee -a /var/log/set_mac.log + ETH0_MAC=$(generate_unique_mac) + echo "$(date): Novo MAC gerado: $ETH0_MAC" | tee -a /var/log/set_mac.log +fi + +# Executa a lógica original com o MAC definido (seja o do config ou o gerado) if set_mac "eth0" "$ETH0_MAC"; then + # Se definiu o MAC com sucesso, tenta criar persistência via Udev + # Isto resolve o problema do adapter mantendo o MAC em futuros boots + setup_udev_persistence "eth0" "$ETH0_MAC" + # Check if disable_wifi is already running if ! pgrep -f "disable_wifi" > /dev/null; then #configure_static_ip @@ -130,4 +190,4 @@ fi # Uncomment if you want to set MAC for wlan0 (optional) # if [[ -n "$WLAN0_MAC" ]]; then # set_mac "wlan0" "$WLAN0_MAC" -# fi +# fi \ No newline at end of file