diff --git a/internal/definitions/common/time.go b/internal/definitions/common/time.go new file mode 100644 index 0000000..0a365e6 --- /dev/null +++ b/internal/definitions/common/time.go @@ -0,0 +1,34 @@ +package common + +import ( + "encoding/json" + "errors" + "time" +) + +type Duration struct { + time.Duration +} + +// MarshalJSON for IPNet +func (i Duration) MarshalJSON() ([]byte, error) { + return json.Marshal(int(i.Seconds())) +} + +// UnmarshalJSON for IPNet +func (i *Duration) UnmarshalJSON(b []byte) error { + var v interface{} + if err := json.Unmarshal(b, &v); err != nil { + return err + } + switch value := v.(type) { + case float64: + i.Duration = time.Second * time.Duration(value) + return nil + case int: + i.Duration = time.Second * time.Duration(value) + return nil + default: + return errors.New("invalid duration") + } +} diff --git a/internal/definitions/service/dhcp_v4_server.go b/internal/definitions/service/dhcp_v4_server.go index 987fb77..35ccd52 100644 --- a/internal/definitions/service/dhcp_v4_server.go +++ b/internal/definitions/service/dhcp_v4_server.go @@ -1,14 +1,12 @@ package service -import ( - "time" -) +import "nfsense.net/nfsense/internal/definitions/common" type DHCPv4Server struct { - Interface string `json:"interface"` - Pool []string `json:"pool"` - DefaultLeaseTime time.Duration `json:"default_lease_time"` - MaxLeaseTime time.Duration `json:"max_lease_time"` + Interface string `json:"interface"` + Pool []string `json:"pool"` + DefaultLeaseTime common.Duration `json:"default_lease_time"` + MaxLeaseTime common.Duration `json:"max_lease_time"` GatewayMode Mode `json:"gateway_mode"` Gateway *string `json:"gateway,omitempty"` diff --git a/internal/dhcp_server/template.go b/internal/dhcp_server/template.go index efaa6f3..ac0b671 100644 --- a/internal/dhcp_server/template.go +++ b/internal/dhcp_server/template.go @@ -8,8 +8,8 @@ import ( "strconv" "strings" "text/template" - "time" + "nfsense.net/nfsense/internal/definitions/common" "nfsense.net/nfsense/internal/definitions/config" "nfsense.net/nfsense/internal/util" ) @@ -66,7 +66,7 @@ func getAddressObjectAsPoolRange(conf config.Config, name string) string { return strings.ReplaceAll(conf.Object.Addresses[name].Range.String(), "-", " ") } -func getTimeInSecond(dur time.Duration) string { +func getTimeInSecond(dur common.Duration) string { return fmt.Sprintf("%d", int(dur.Seconds())) }