diff --git a/internal/definitions/config/config.go b/internal/definitions/config/config.go index 2d96726..232aa32 100644 --- a/internal/definitions/config/config.go +++ b/internal/definitions/config/config.go @@ -9,6 +9,7 @@ import ( "nfsense.net/nfsense/internal/definitions/firewall" "nfsense.net/nfsense/internal/definitions/network" "nfsense.net/nfsense/internal/definitions/object" + "nfsense.net/nfsense/internal/definitions/service" ) type Config struct { @@ -16,6 +17,7 @@ type Config struct { Firewall firewall.Firewall `json:"firewall" validate:"required,dive"` Object object.Object `json:"object" validate:"required,dive"` Network network.Network `json:"network" validate:"required,dive"` + Service service.Service `json:"service" validate:"required,dive"` } // Clone TODO find a better way to deep copy diff --git a/internal/definitions/service/dhcp_v4.go b/internal/definitions/service/dhcp_v4.go new file mode 100644 index 0000000..93da47c --- /dev/null +++ b/internal/definitions/service/dhcp_v4.go @@ -0,0 +1,21 @@ +package service + +import ( + "time" +) + +type DHCPv4 struct { + Interface string + Pool []string + DefaultLeaseTime time.Duration + MaxLeaseTime time.Duration + + GatewayMode Mode + Gateway *string + DNSServerMode Mode + DNSServer *[]string + NTPServerMode Mode + NTPServer *[]string + + Reservations []Reservation +} diff --git a/internal/definitions/service/dhcp_v6.go b/internal/definitions/service/dhcp_v6.go new file mode 100644 index 0000000..267152e --- /dev/null +++ b/internal/definitions/service/dhcp_v6.go @@ -0,0 +1,19 @@ +package service + +import "time" + +type DHCPv6 struct { + Interface string + Pool []string + DefaultLeaseTime time.Duration + MaxLeaseTime time.Duration + + GatewayMode Mode + Gateway *string + DNSServerMode Mode + DNSServer *[]string + NTPServerMode Mode + NTPServer *[]string + + Reservations []Reservation +} diff --git a/internal/definitions/service/mode.go b/internal/definitions/service/mode.go new file mode 100644 index 0000000..c5168c4 --- /dev/null +++ b/internal/definitions/service/mode.go @@ -0,0 +1,37 @@ +package service + +import "encoding/json" + +type Mode int + +const ( + None Mode = iota + Interface + Specify +) + +func (t Mode) String() string { + return [...]string{"none", "interface", "specify"}[t] +} + +func (t *Mode) FromString(input string) Mode { + return map[string]Mode{ + "none": None, + "interface": Interface, + "specify": Specify, + }[input] +} + +func (t Mode) MarshalJSON() ([]byte, error) { + return json.Marshal(t.String()) +} + +func (t *Mode) UnmarshalJSON(b []byte) error { + var s string + err := json.Unmarshal(b, &s) + if err != nil { + return err + } + *t = t.FromString(s) + return nil +} diff --git a/internal/definitions/service/reservation.go b/internal/definitions/service/reservation.go new file mode 100644 index 0000000..8c5665f --- /dev/null +++ b/internal/definitions/service/reservation.go @@ -0,0 +1,12 @@ +package service + +import ( + "net/netip" + + "nfsense.net/nfsense/internal/definitions/common" +) + +type Reservation struct { + HardwareAddress common.HardwareAddress + IPAddress netip.Addr +} diff --git a/internal/definitions/service/service.go b/internal/definitions/service/service.go new file mode 100644 index 0000000..9baaabf --- /dev/null +++ b/internal/definitions/service/service.go @@ -0,0 +1,6 @@ +package service + +type Service struct { + DHCPv4 []DHCPv4 `json:"dhcp_v4" validate:"required,dive"` + DHCPv6 []DHCPv6 `json:"dhcp_v6" validate:"required,dive"` +}