From 23dcf816904858cb32ae9ffc4cdd2f565e5bd12d Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Thu, 13 Apr 2023 18:23:12 +0200 Subject: [PATCH] Add DHCP API --- internal/api/service/dhcp_v4_server.go | 81 ++++++++++++++++++++++++++ internal/api/service/dhcp_v6_server.go | 81 ++++++++++++++++++++++++++ internal/api/service/service.go | 11 ++++ main.go | 2 + 4 files changed, 175 insertions(+) create mode 100644 internal/api/service/dhcp_v4_server.go create mode 100644 internal/api/service/dhcp_v6_server.go create mode 100644 internal/api/service/service.go diff --git a/internal/api/service/dhcp_v4_server.go b/internal/api/service/dhcp_v4_server.go new file mode 100644 index 0000000..8548e13 --- /dev/null +++ b/internal/api/service/dhcp_v4_server.go @@ -0,0 +1,81 @@ +package service + +import ( + "context" + "fmt" + + "nfsense.net/nfsense/internal/definitions/service" +) + +type GetDHCPv4ServerParameters struct { + Index uint +} + +type GetDHCPv4ServerResult struct { + service.DHCPv4Server +} + +func (f *Service) GetDHCPv4Server(ctx context.Context, params GetDHCPv4ServerParameters) (GetDHCPv4ServerResult, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv4Servers) { + return GetDHCPv4ServerResult{}, fmt.Errorf("DHCPv4Server does not Exist") + } + + return GetDHCPv4ServerResult{ + DHCPv4Server: f.ConfigManager.GetPendingConfig().Service.DHCPv4Servers[params.Index], + }, nil +} + +type GetDHCPv4ServersResult struct { + DHCPv4Servers []service.DHCPv4Server `json:"dhcp_v4_servers"` +} + +func (f *Service) GetDHCPv4Servers(ctx context.Context, params struct{}) (GetDHCPv4ServersResult, error) { + return GetDHCPv4ServersResult{ + DHCPv4Servers: f.ConfigManager.GetPendingConfig().Service.DHCPv4Servers, + }, nil +} + +type CreateDHCPv4ServerParameters struct { + DHCPv4Server service.DHCPv4Server `json:"dhcp_v4_server"` +} + +func (f *Service) CreateDHCPv4Server(ctx context.Context, params CreateDHCPv4ServerParameters) (struct{}, error) { + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Service.DHCPv4Servers = append(conf.Service.DHCPv4Servers, params.DHCPv4Server) + return struct{}{}, t.Commit() +} + +type UpdateDHCPv4ServerParameters struct { + Index uint64 `json:"index"` + DHCPv4Server service.DHCPv4Server `json:"dhcp_v4_server"` +} + +func (f *Service) UpdateDHCPv4Server(ctx context.Context, params UpdateDHCPv4ServerParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv4Servers) { + return struct{}{}, fmt.Errorf("DHCPv4Server does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Service.DHCPv4Servers[params.Index] = params.DHCPv4Server + return struct{}{}, t.Commit() +} + +type DeleteDHCPv4ServerParameters struct { + Index uint64 `json:"index"` +} + +func (f *Service) DeleteDHCPv4Server(ctx context.Context, params DeleteDHCPv4ServerParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv4Servers) { + return struct{}{}, fmt.Errorf("DHCPv4Server does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Service.DHCPv4Servers = append(conf.Service.DHCPv4Servers[:params.Index], conf.Service.DHCPv4Servers[params.Index+1:]...) + return struct{}{}, t.Commit() +} diff --git a/internal/api/service/dhcp_v6_server.go b/internal/api/service/dhcp_v6_server.go new file mode 100644 index 0000000..ebbb050 --- /dev/null +++ b/internal/api/service/dhcp_v6_server.go @@ -0,0 +1,81 @@ +package service + +import ( + "context" + "fmt" + + "nfsense.net/nfsense/internal/definitions/service" +) + +type GetDHCPv6ServerParameters struct { + Index uint +} + +type GetDHCPv6ServerResult struct { + service.DHCPv6Server +} + +func (f *Service) GetDHCPv6Server(ctx context.Context, params GetDHCPv6ServerParameters) (GetDHCPv6ServerResult, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv6Servers) { + return GetDHCPv6ServerResult{}, fmt.Errorf("DHCPv6Server does not Exist") + } + + return GetDHCPv6ServerResult{ + DHCPv6Server: f.ConfigManager.GetPendingConfig().Service.DHCPv6Servers[params.Index], + }, nil +} + +type GetDHCPv6ServersResult struct { + DHCPv6Servers []service.DHCPv6Server `json:"dhcp_v6_servers"` +} + +func (f *Service) GetDHCPv6Servers(ctx context.Context, params struct{}) (GetDHCPv6ServersResult, error) { + return GetDHCPv6ServersResult{ + DHCPv6Servers: f.ConfigManager.GetPendingConfig().Service.DHCPv6Servers, + }, nil +} + +type CreateDHCPv6ServerParameters struct { + DHCPv6Server service.DHCPv6Server `json:"dhcp_v6_server"` +} + +func (f *Service) CreateDHCPv6Server(ctx context.Context, params CreateDHCPv6ServerParameters) (struct{}, error) { + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Service.DHCPv6Servers = append(conf.Service.DHCPv6Servers, params.DHCPv6Server) + return struct{}{}, t.Commit() +} + +type UpdateDHCPv6ServerParameters struct { + Index uint64 `json:"index"` + DHCPv6Server service.DHCPv6Server `json:"dhcp_v6_server"` +} + +func (f *Service) UpdateDHCPv6Server(ctx context.Context, params UpdateDHCPv6ServerParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv6Servers) { + return struct{}{}, fmt.Errorf("DHCPv6Server does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Service.DHCPv6Servers[params.Index] = params.DHCPv6Server + return struct{}{}, t.Commit() +} + +type DeleteDHCPv6ServerParameters struct { + Index uint64 `json:"index"` +} + +func (f *Service) DeleteDHCPv6Server(ctx context.Context, params DeleteDHCPv6ServerParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv6Servers) { + return struct{}{}, fmt.Errorf("DHCPv6Server does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Service.DHCPv6Servers = append(conf.Service.DHCPv6Servers[:params.Index], conf.Service.DHCPv6Servers[params.Index+1:]...) + return struct{}{}, t.Commit() +} diff --git a/internal/api/service/service.go b/internal/api/service/service.go new file mode 100644 index 0000000..2dd9f4d --- /dev/null +++ b/internal/api/service/service.go @@ -0,0 +1,11 @@ +package service + +import ( + "github.com/godbus/dbus/v5" + "nfsense.net/nfsense/internal/config" +) + +type Service struct { + ConfigManager *config.ConfigManager + DbusConn *dbus.Conn +} diff --git a/main.go b/main.go index eda5146..0f84f76 100644 --- a/main.go +++ b/main.go @@ -15,6 +15,7 @@ import ( "nfsense.net/nfsense/internal/api/firewall" "nfsense.net/nfsense/internal/api/network" "nfsense.net/nfsense/internal/api/object" + "nfsense.net/nfsense/internal/api/service" "nfsense.net/nfsense/internal/config" "nfsense.net/nfsense/internal/jsonrpc" "nfsense.net/nfsense/internal/networkd" @@ -96,4 +97,5 @@ func RegisterAPIMethods(apiHandler *jsonrpc.Handler, configManager *config.Confi apiHandler.Register("Firewall", &firewall.Firewall{ConfigManager: configManager}) apiHandler.Register("Network", &network.Network{ConfigManager: configManager, DbusConn: dbusConn}) apiHandler.Register("Object", &object.Object{ConfigManager: configManager}) + apiHandler.Register("Service", &service.Service{ConfigManager: configManager, DbusConn: dbusConn}) }