1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2025-12-10 07:25:37 -05:00
Files
DankMaterialShell/backend/internal/server/network/backend_networkd_signals.go
2025-11-12 17:18:45 -05:00

69 lines
1.4 KiB
Go

package network
import (
"fmt"
"github.com/AvengeMedia/DankMaterialShell/backend/internal/log"
"github.com/godbus/dbus/v5"
)
func (b *SystemdNetworkdBackend) StartMonitoring(onStateChange func()) error {
b.onStateChange = onStateChange
b.signals = make(chan *dbus.Signal, 64)
b.conn.Signal(b.signals)
matchRules := []string{
"type='signal',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',path_namespace='/org/freedesktop/network1'",
"type='signal',interface='org.freedesktop.network1.Manager'",
}
for _, rule := range matchRules {
if err := b.conn.BusObject().Call("org.freedesktop.DBus.AddMatch", 0, rule).Err; err != nil {
return fmt.Errorf("add match %q: %w", rule, err)
}
}
b.sigWG.Add(1)
go b.signalLoop()
return nil
}
func (b *SystemdNetworkdBackend) StopMonitoring() {
b.sigWG.Wait()
}
func (b *SystemdNetworkdBackend) signalLoop() {
defer b.sigWG.Done()
for {
select {
case <-b.stopChan:
return
case sig := <-b.signals:
if sig == nil {
continue
}
if sig.Name == "org.freedesktop.DBus.Properties.PropertiesChanged" {
if len(sig.Body) < 2 {
continue
}
iface, ok := sig.Body[0].(string)
if !ok || iface != networkdLinkIface {
continue
}
b.enumerateLinks()
if err := b.updateState(); err != nil {
log.Warnf("networkd state update failed: %v", err)
}
if b.onStateChange != nil {
b.onStateChange()
}
}
}
}
}