mirror of
https://github.com/speatzle/nfsense.git
synced 2025-05-11 19:08:20 +00:00
Add dbus Test
This commit is contained in:
parent
a737ac4d9d
commit
f01ea3fdb7
7 changed files with 106 additions and 56 deletions
|
@ -1,68 +1,40 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { apiCall } from "../api";
|
import { apiCall } from "../api";
|
||||||
import { Form as ValidationForm, Field, ErrorMessage } from 'vee-validate';
|
|
||||||
|
|
||||||
async function doShit(){
|
let links = $ref([]);
|
||||||
apiCall("Firewall.GetForwardRules", {});
|
let loading = $ref(false);
|
||||||
|
|
||||||
|
async function load(){
|
||||||
|
loading = true
|
||||||
|
let res = await apiCall("Network.GetLinks", {});
|
||||||
|
if (res.Error === null) {
|
||||||
|
console.debug("links", res.Data.Links);
|
||||||
|
links = res.Data.Links;
|
||||||
|
} else {
|
||||||
|
console.debug("error", res);
|
||||||
|
}
|
||||||
|
loading = false
|
||||||
}
|
}
|
||||||
|
|
||||||
let fields = $ref([
|
onMounted(async() => {
|
||||||
{key: "name", label: "Name", as: "TextBox", rules: validateEmail},
|
load();
|
||||||
{key: "verdict", label: "Verdict", as: "PillBar", props: {options: [{name: 'Accept'}, {name: 'Drop'}, {name: 'Continue'}]}},
|
});
|
||||||
{key: "counter", label: "Counter", as: "CheckBox" },
|
|
||||||
{key: "comment", label: "Comment", as: "MultilineTextBox", enabled: (values: Record<string, any>) => (values["verdict"] == 2) as Boolean },
|
|
||||||
]);
|
|
||||||
|
|
||||||
|
|
||||||
function validateEmail(value: any) {
|
|
||||||
// if the field is empty
|
|
||||||
if (!value) {
|
|
||||||
return 'This field is required';
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the field is not a valid email
|
|
||||||
const regex = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
|
|
||||||
if (!regex.test(value)) {
|
|
||||||
return 'This field must be a valid email';
|
|
||||||
}
|
|
||||||
|
|
||||||
// All is good
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<PageHeader title="Dashboard">
|
<PageHeader title="Dashboard">
|
||||||
<button @click="doShit">Example Buttons</button>
|
|
||||||
</PageHeader>
|
</PageHeader>
|
||||||
<ValidationForm class="form" v-slot="{ values }">
|
<div v-if="!loading" v-for="(link, index) in links" :key="index">
|
||||||
<template v-for="(field, index) in fields" :key="index">
|
<p>{{ link.name }} {{ link.carrier_state }} {{ link.operational_state }}</p>
|
||||||
<template v-if="field.enabled ? field.enabled(values) : true">
|
</div>
|
||||||
<label :for="field.key" v-text="field.label"/>
|
<div v-else>
|
||||||
<Field :name="field.key" :as="field.as" :rules="field.rules" v-bind="field.props"/>
|
Loading...
|
||||||
<ErrorMessage :name="field.key" />
|
</div>
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
{{ values }}
|
|
||||||
</ValidationForm>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
ValidationForm {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: auto 1fr;
|
|
||||||
padding: 0.5rem;
|
|
||||||
gap: 0.5rem;
|
|
||||||
}
|
|
||||||
ValidationForm > :is(button, .button, h2) {
|
|
||||||
grid-column: 1 / 3;
|
|
||||||
}
|
|
||||||
ValidationForm > :is(label) {
|
|
||||||
grid-column: 1;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
1
go.mod
1
go.mod
|
@ -13,6 +13,7 @@ require (
|
||||||
github.com/go-playground/locales v0.14.1 // indirect
|
github.com/go-playground/locales v0.14.1 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.11.2 // 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/klauspost/compress v1.10.3 // indirect
|
||||||
github.com/leodido/go-urn v1.2.1 // indirect
|
github.com/leodido/go-urn v1.2.1 // indirect
|
||||||
github.com/r3labs/diff/v3 v3.0.1 // indirect
|
github.com/r3labs/diff/v3 v3.0.1 // indirect
|
||||||
|
|
2
go.sum
2
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/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 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=
|
||||||
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
|
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.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 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls=
|
||||||
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||||
|
|
|
@ -5,8 +5,23 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"nfsense.net/nfsense/internal/definitions"
|
"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 {
|
type GetInterfacesResult struct {
|
||||||
Interfaces map[string]definitions.Interface
|
Interfaces map[string]definitions.Interface
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
package network
|
package network
|
||||||
|
|
||||||
import "nfsense.net/nfsense/internal/config"
|
import (
|
||||||
|
"github.com/godbus/dbus/v5"
|
||||||
|
"nfsense.net/nfsense/internal/config"
|
||||||
|
)
|
||||||
|
|
||||||
type Network struct {
|
type Network struct {
|
||||||
ConfigManager *config.ConfigManager
|
ConfigManager *config.ConfigManager
|
||||||
|
DbusConn *dbus.Conn
|
||||||
}
|
}
|
||||||
|
|
48
internal/networkd/dbus/link.go
Normal file
48
internal/networkd/dbus/link.go
Normal file
|
@ -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
|
||||||
|
}
|
16
main.go
16
main.go
|
@ -9,6 +9,7 @@ import (
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/godbus/dbus/v5"
|
||||||
"golang.org/x/exp/slog"
|
"golang.org/x/exp/slog"
|
||||||
configAPI "nfsense.net/nfsense/internal/api/config"
|
configAPI "nfsense.net/nfsense/internal/api/config"
|
||||||
"nfsense.net/nfsense/internal/api/firewall"
|
"nfsense.net/nfsense/internal/api/firewall"
|
||||||
|
@ -26,10 +27,17 @@ func main() {
|
||||||
|
|
||||||
slog.Info("Starting...")
|
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 := config.CreateConfigManager()
|
||||||
configManager.RegisterApplyFunction(networkd.ApplyNetworkdConfiguration)
|
configManager.RegisterApplyFunction(networkd.ApplyNetworkdConfiguration)
|
||||||
|
|
||||||
err := configManager.LoadCurrentConfigFromDisk()
|
err = configManager.LoadCurrentConfigFromDisk()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("Loading Current Config", err)
|
slog.Error("Loading Current Config", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
@ -62,7 +70,7 @@ func main() {
|
||||||
|
|
||||||
slog.Info("Setup API...")
|
slog.Info("Setup API...")
|
||||||
apiHandler := jsonrpc.NewHandler(100 << 20)
|
apiHandler := jsonrpc.NewHandler(100 << 20)
|
||||||
RegisterAPIMethods(apiHandler, configManager)
|
RegisterAPIMethods(apiHandler, configManager, dbusConn)
|
||||||
|
|
||||||
slog.Info("Starting Webserver...")
|
slog.Info("Starting Webserver...")
|
||||||
server.StartWebserver(configManager, apiHandler)
|
server.StartWebserver(configManager, apiHandler)
|
||||||
|
@ -83,9 +91,9 @@ func main() {
|
||||||
slog.Info("Done")
|
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("Config", &configAPI.Config{ConfigManager: configManager})
|
||||||
apiHandler.Register("Firewall", &firewall.Firewall{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})
|
apiHandler.Register("Object", &object.Object{ConfigManager: configManager})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue