Browse Source

Complete Network Manager refactoring

Changes:
- Removed old WiFi client management from main.go
- Deleted applyScannerConfig() and applyWiFiClientState()
- Network Manager now handles all network priorities automatically
- BLE scanner management kept in main.go (not network-related)
- Config updates now just call netmgr.UpdateConfig()

Network Manager now fully controls:
1. eth0 (carrier detect, DHCP/Static)
2. wlan0 client (WiFi connection)
3. wlan0 AP fallback (120s timeout)
4. WiFi scanner coordination

Ready for hardware testing
root 1 month ago
parent
commit
cfc98db1ca
1 changed files with 21 additions and 114 deletions
  1. 21 114
      cmd/beacon-daemon/main.go

+ 21 - 114
cmd/beacon-daemon/main.go

@@ -193,94 +193,6 @@ func main() {
 	log.Println("Daemon stopped")
 	log.Println("Daemon stopped")
 }
 }
 
 
-// applyScannerConfig starts/stops scanners based on current config
-func (d *Daemon) applyScannerConfig() {
-	d.mu.Lock()
-	bleEnabled := d.cfg.BLE.Enabled
-	wifiMonitorEnabled := d.cfg.WiFi.MonitorEnabled
-	wifiClientEnabled := d.cfg.WiFi.ClientEnabled
-	zmqBLE := d.cfg.ZMQAddrBLE
-	zmqWiFi := d.cfg.ZMQAddrWiFi
-	wifiIface := d.cfg.WiFiIface
-	d.mu.Unlock()
-
-	// BLE scanner
-	if bleEnabled {
-		if !d.scanners.IsBLERunning() {
-			log.Println("Starting BLE scanner...")
-			if err := d.scanners.StartBLE(zmqBLE); err != nil {
-				log.Printf("Failed to start BLE scanner: %v", err)
-			}
-		}
-	} else {
-		if d.scanners.IsBLERunning() {
-			log.Println("Stopping BLE scanner...")
-			d.scanners.StopBLE()
-		}
-	}
-
-	// WiFi scanner - NEVER run if WiFi client is enabled (they share wlan0)
-	// Client mode takes priority over monitor mode
-	if wifiClientEnabled {
-		if d.scanners.IsWiFiRunning() {
-			log.Println("Stopping WiFi scanner (client mode enabled in config)...")
-			d.scanners.StopWiFi()
-		}
-		return
-	}
-
-	// WiFi scanner - only if monitor enabled AND client disabled
-	// Client has HIGHER priority - if both enabled, client works, scanner doesn't
-	if wifiMonitorEnabled {
-		if !d.scanners.IsWiFiRunning() {
-			log.Println("Starting WiFi scanner...")
-			if err := d.scanners.StartWiFi(zmqWiFi, wifiIface); err != nil {
-				log.Printf("Failed to start WiFi scanner: %v", err)
-			}
-		}
-	} else {
-		if d.scanners.IsWiFiRunning() {
-			log.Println("Stopping WiFi scanner (monitor disabled)...")
-			d.scanners.StopWiFi()
-		}
-	}
-}
-
-// applyWiFiClientState checks if WiFi client state matches config and applies changes
-func (d *Daemon) applyWiFiClientState() {
-	d.mu.Lock()
-	clientEnabled := d.cfg.WiFi.ClientEnabled
-	ssid := d.cfg.WiFi.SSID
-	psk := d.cfg.WiFi.PSK
-	d.mu.Unlock()
-
-	// Check if wlan0 has an IP (meaning it's connected)
-	wlan0IP := getInterfaceIP("wlan0")
-	isConnected := wlan0IP != ""
-
-	if clientEnabled && ssid != "" {
-		// Should be connected
-		if !isConnected {
-			// Stop WiFi scanner before connecting client (they can't coexist)
-			if d.scanners.IsWiFiRunning() {
-				log.Println("Stopping WiFi scanner before connecting client...")
-				d.scanners.StopWiFi()
-			}
-
-			log.Printf("WiFi client should be connected (SSID=%s), connecting...", ssid)
-			if err := applyWiFiSettings(ssid, psk); err != nil {
-				log.Printf("Failed to connect WiFi client: %v", err)
-			}
-		}
-	} else {
-		// Should be disconnected
-		if isConnected {
-			log.Println("WiFi client should be disconnected, disconnecting...")
-			disconnectWiFiClient()
-		}
-	}
-}
-
 func (d *Daemon) registrationLoop() {
 func (d *Daemon) registrationLoop() {
 	for {
 	for {
 		select {
 		select {
@@ -376,7 +288,6 @@ func (d *Daemon) fetchAndApplyConfig() {
 	bleChanged := false
 	bleChanged := false
 	wifiMonitorChanged := false
 	wifiMonitorChanged := false
 	wifiClientChanged := false
 	wifiClientChanged := false
-	oldClientEnabled := d.cfg.WiFi.ClientEnabled
 
 
 	if effectiveMode == "cloud" {
 	if effectiveMode == "cloud" {
 		// Cloud mode: server settings have priority
 		// Cloud mode: server settings have priority
@@ -418,35 +329,29 @@ func (d *Daemon) fetchAndApplyConfig() {
 
 
 	d.mu.Unlock()
 	d.mu.Unlock()
 
 
-	// Apply scanner config changes
-	if bleChanged || wifiMonitorChanged {
-		log.Printf("Config changed (mode=%s): ble=%v wifi_monitor=%v", effectiveMode, d.cfg.BLE.Enabled, d.cfg.WiFi.MonitorEnabled)
-		d.applyScannerConfig()
-	}
-
-	// Apply WiFi client changes
-	if wifiClientChanged {
-		if d.cfg.WiFi.ClientEnabled && d.cfg.WiFi.SSID != "" {
-			// Stop WiFi scanner before connecting client
-			if d.scanners.IsWiFiRunning() {
-				log.Println("Stopping WiFi scanner before connecting client...")
-				d.scanners.StopWiFi()
+	// Apply BLE scanner changes (not managed by Network Manager)
+	if bleChanged {
+		log.Printf("BLE config changed (mode=%s): enabled=%v", effectiveMode, d.cfg.BLE.Enabled)
+		if d.cfg.BLE.Enabled {
+			if !d.scanners.IsBLERunning() {
+				log.Println("Starting BLE scanner...")
+				d.scanners.StartBLE(d.cfg.ZMQAddrBLE)
 			}
 			}
-
-			log.Printf("WiFi client enabled by server: SSID=%s", d.cfg.WiFi.SSID)
-			if err := applyWiFiSettings(d.cfg.WiFi.SSID, d.cfg.WiFi.PSK); err != nil {
-				log.Printf("Failed to apply WiFi client settings: %v", err)
+		} else {
+			if d.scanners.IsBLERunning() {
+				log.Println("Stopping BLE scanner...")
+				d.scanners.StopBLE()
 			}
 			}
-			// After client connects, update scanner config (will skip WiFi scanner)
-			d.applyScannerConfig()
-		} else if oldClientEnabled && !d.cfg.WiFi.ClientEnabled {
-			log.Println("WiFi client disabled by server")
-			disconnectWiFiClient()
-			// After client disconnects, WiFi scanner may start (if monitor enabled)
-			d.applyScannerConfig()
 		}
 		}
 	}
 	}
 
 
+	// Log WiFi config changes (Network Manager will handle automatically)
+	if wifiMonitorChanged || wifiClientChanged {
+		log.Printf("WiFi config changed (mode=%s): monitor=%v client=%v ssid=%s",
+			effectiveMode, d.cfg.WiFi.MonitorEnabled, d.cfg.WiFi.ClientEnabled, d.cfg.WiFi.SSID)
+		log.Println("Network Manager will apply changes automatically")
+	}
+
 	// Update tunnel config
 	// Update tunnel config
 	d.tunnel.UpdateConfig(d.cfg)
 	d.tunnel.UpdateConfig(d.cfg)
 	if sshChanged {
 	if sshChanged {
@@ -459,7 +364,9 @@ func (d *Daemon) fetchAndApplyConfig() {
 		}
 		}
 	}
 	}
 
 
-	// Update network manager config (eth0 settings are local-only, never from server)
+	// Update network manager config - it will handle all network changes automatically
+	// (eth0 settings are local-only, never from server)
+	// (WiFi client and scanner coordination handled by Network Manager)
 	d.netmgr.UpdateConfig(d.cfg)
 	d.netmgr.UpdateConfig(d.cfg)
 
 
 	// Save updated config
 	// Save updated config