diff --git a/client/src/pages/index.vue b/client/src/pages/index.vue index 5c483b6..429f8f4 100644 --- a/client/src/pages/index.vue +++ b/client/src/pages/index.vue @@ -1,68 +1,40 @@ - Example Buttons - - - - - - - - - {{ values }} - + + {{ link.name }} {{ link.carrier_state }} {{ link.operational_state }} + + + Loading... + + \ No newline at end of file diff --git a/go.mod b/go.mod index db6294c..e483b15 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.11.2 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/klauspost/compress v1.10.3 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/r3labs/diff/v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 0260a45..e817307 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,8 @@ github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= diff --git a/internal/api/network/interfaces.go b/internal/api/network/interfaces.go index 77c0556..0b5656a 100644 --- a/internal/api/network/interfaces.go +++ b/internal/api/network/interfaces.go @@ -5,8 +5,23 @@ import ( "fmt" "nfsense.net/nfsense/internal/definitions" + "nfsense.net/nfsense/internal/networkd/dbus" ) +type GetLinksResult struct { + Links []dbus.Link +} + +func (f *Network) GetLinks(ctx context.Context, params struct{}) (GetLinksResult, error) { + links, err := dbus.GetLinks(*f.DbusConn) + if err != nil { + return GetLinksResult{}, fmt.Errorf("Getting Links: %w", err) + } + return GetLinksResult{ + Links: links, + }, nil +} + type GetInterfacesResult struct { Interfaces map[string]definitions.Interface } diff --git a/internal/api/network/network.go b/internal/api/network/network.go index e27aaed..4811b49 100644 --- a/internal/api/network/network.go +++ b/internal/api/network/network.go @@ -1,7 +1,11 @@ package network -import "nfsense.net/nfsense/internal/config" +import ( + "github.com/godbus/dbus/v5" + "nfsense.net/nfsense/internal/config" +) type Network struct { ConfigManager *config.ConfigManager + DbusConn *dbus.Conn } diff --git a/internal/networkd/dbus/link.go b/internal/networkd/dbus/link.go new file mode 100644 index 0000000..92c6470 --- /dev/null +++ b/internal/networkd/dbus/link.go @@ -0,0 +1,48 @@ +package dbus + +import ( + "fmt" + + "github.com/godbus/dbus/v5" + "golang.org/x/exp/slog" +) + +type Link struct { + Name string `json:"name"` + CarrierState string `json:"carrier_state"` + OperationalState string `json:"operational_state"` +} + +func GetLinks(dbusConn dbus.Conn) ([]Link, error) { + managerObj := dbusConn.Object("org.freedesktop.network1", dbus.ObjectPath("/org/freedesktop/network1")) + + var links [][]any + err := managerObj.Call("org.freedesktop.network1.Manager.ListLinks", 0).Store(&links) + if err != nil { + return nil, fmt.Errorf("Calling ListLinks %w", err) + } + slog.Info("Dbus Result", "links", links) + + result := []Link{} + + for _, link := range links { + name := link[1].(string) + path := link[2].(string) + linkObj := dbusConn.Object("org.freedesktop.network1", dbus.ObjectPath(path)) + carrierState, err := linkObj.GetProperty("CarrierState") + if err != nil { + return nil, fmt.Errorf("GetProperty CarrierState %w", err) + } + operationalState, err := linkObj.GetProperty("OperationalState") + if err != nil { + return nil, fmt.Errorf("GetProperty OperationalState %w", err) + } + result = append(result, Link{ + Name: name, + CarrierState: carrierState.String(), + OperationalState: operationalState.String(), + }) + } + + return result, nil +} diff --git a/main.go b/main.go index 81f21b1..eda5146 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "syscall" "time" + "github.com/godbus/dbus/v5" "golang.org/x/exp/slog" configAPI "nfsense.net/nfsense/internal/api/config" "nfsense.net/nfsense/internal/api/firewall" @@ -26,10 +27,17 @@ func main() { slog.Info("Starting...") + dbusConn, err := dbus.ConnectSystemBus() + if err != nil { + slog.Error("Connecting to DBus", err) + // os.Exit(1) + } + defer dbusConn.Close() + configManager := config.CreateConfigManager() configManager.RegisterApplyFunction(networkd.ApplyNetworkdConfiguration) - err := configManager.LoadCurrentConfigFromDisk() + err = configManager.LoadCurrentConfigFromDisk() if err != nil { slog.Error("Loading Current Config", err) os.Exit(1) @@ -62,7 +70,7 @@ func main() { slog.Info("Setup API...") apiHandler := jsonrpc.NewHandler(100 << 20) - RegisterAPIMethods(apiHandler, configManager) + RegisterAPIMethods(apiHandler, configManager, dbusConn) slog.Info("Starting Webserver...") server.StartWebserver(configManager, apiHandler) @@ -83,9 +91,9 @@ func main() { slog.Info("Done") } -func RegisterAPIMethods(apiHandler *jsonrpc.Handler, configManager *config.ConfigManager) { +func RegisterAPIMethods(apiHandler *jsonrpc.Handler, configManager *config.ConfigManager, dbusConn *dbus.Conn) { apiHandler.Register("Config", &configAPI.Config{ConfigManager: configManager}) apiHandler.Register("Firewall", &firewall.Firewall{ConfigManager: configManager}) - apiHandler.Register("Network", &network.Network{ConfigManager: configManager}) + apiHandler.Register("Network", &network.Network{ConfigManager: configManager, DbusConn: dbusConn}) apiHandler.Register("Object", &object.Object{ConfigManager: configManager}) }
{{ link.name }} {{ link.carrier_state }} {{ link.operational_state }}