add stringer to generate constant strings
- doing work on validation for each possible field
This commit is contained in:
parent
a78f001a41
commit
4d6d785924
@ -62,6 +62,11 @@ func runMain(cmd *cobra.Command, args []string) {
|
||||
v["hostname"].(string),
|
||||
v["subnetid"].(int),
|
||||
)
|
||||
if !r.Validate() {
|
||||
slog.Error("reservation", slog.Any("validate", r))
|
||||
continue
|
||||
}
|
||||
|
||||
reslist = append(
|
||||
reslist,
|
||||
r,
|
||||
|
8
go.mod
8
go.mod
@ -2,7 +2,11 @@ module git.staur.ca/stobbsm/kea-manage
|
||||
|
||||
go 1.22.4
|
||||
|
||||
require github.com/jackc/pgx/v5 v5.7.1
|
||||
require (
|
||||
github.com/jackc/pgx/v5 v5.7.1
|
||||
github.com/spf13/cobra v1.8.1
|
||||
github.com/spf13/viper v1.19.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||
@ -18,9 +22,7 @@ require (
|
||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
||||
github.com/spf13/afero v1.11.0 // indirect
|
||||
github.com/spf13/cast v1.6.0 // indirect
|
||||
github.com/spf13/cobra v1.8.1 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/spf13/viper v1.19.0 // indirect
|
||||
github.com/subosito/gotenv v1.6.0 // indirect
|
||||
go.uber.org/atomic v1.9.0 // indirect
|
||||
go.uber.org/multierr v1.9.0 // indirect
|
||||
|
19
go.sum
19
go.sum
@ -1,10 +1,14 @@
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
@ -17,15 +21,21 @@ github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs=
|
||||
github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA=
|
||||
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
|
||||
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
|
||||
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
|
||||
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
|
||||
@ -51,9 +61,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
||||
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
|
||||
@ -72,6 +81,8 @@ golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
|
||||
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
@ -1,25 +1,52 @@
|
||||
package reservation
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
"net"
|
||||
|
||||
"git.staur.ca/stobbsm/kea-manage/lib/types"
|
||||
"git.staur.ca/stobbsm/kea-manage/lib/validators/macaddr"
|
||||
)
|
||||
|
||||
type ReservationV4 struct {
|
||||
Type int
|
||||
IdentifierType types.Identifier
|
||||
SubnetID int
|
||||
MacAddr string
|
||||
Identifier string
|
||||
Ipv4 string
|
||||
Hostname string
|
||||
}
|
||||
|
||||
func ReserveV4MacAddr(rtype string, mac string, addr string, hostname string, subnet int) *ReservationV4 {
|
||||
func ReserveV4MacAddr(identifierType string, identifier string, addr string, hostname string, subnet int) *ReservationV4 {
|
||||
r := &ReservationV4{
|
||||
MacAddr: mac,
|
||||
Type: types.Lookup(rtype),
|
||||
IdentifierType: types.Lookup(identifierType),
|
||||
SubnetID: subnet,
|
||||
Identifier: identifier,
|
||||
Ipv4: addr,
|
||||
Hostname: hostname,
|
||||
}
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
// Validate implements the Validator interface. Returns true when valid, false when not.
|
||||
// Will print message to the slog Error channel when an error is found to provide more information
|
||||
// This does not validate against the database, just validates that the written configuration
|
||||
// is correct
|
||||
func (r *ReservationV4) Validate() bool {
|
||||
if r.IdentifierType == 255 {
|
||||
slog.Error("validate", slog.Any("reservationV4.type", "invalid"))
|
||||
return false
|
||||
}
|
||||
|
||||
if net.ParseIP(r.Ipv4) == nil {
|
||||
slog.Error("validate", slog.Any("reservationV4.ipv4", r.Ipv4))
|
||||
return false
|
||||
}
|
||||
|
||||
if !macaddr.IsValid(r.Identifier) {
|
||||
slog.Error("validate", slog.Any("reservationV4.identifier", r.Identifier))
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ func (p *Postgres) InsertResV4(r *reservation.ReservationV4) error {
|
||||
}
|
||||
defer tx.Rollback(context.Background())
|
||||
|
||||
ct, err := tx.Exec(context.Background(), insertIfNotExists, r.MacAddr, r.Type, r.SubnetID, r.Ipv4, r.Hostname)
|
||||
ct, err := tx.Exec(context.Background(), insertIfNotExists, r.Identifier, r.IdentifierType, r.SubnetID, r.Ipv4, r.Hostname)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
37
lib/types/identifier_string.go
Normal file
37
lib/types/identifier_string.go
Normal file
@ -0,0 +1,37 @@
|
||||
// Code generated by "stringer -type=Identifier"; DO NOT EDIT.
|
||||
|
||||
package types
|
||||
|
||||
import "strconv"
|
||||
|
||||
func _() {
|
||||
// An "invalid array index" compiler error signifies that the constant values have changed.
|
||||
// Re-run the stringer command to generate them again.
|
||||
var x [1]struct{}
|
||||
_ = x[HwAddress-0]
|
||||
_ = x[DuID-1]
|
||||
_ = x[CircuitId-2]
|
||||
_ = x[ClientId-3]
|
||||
_ = x[FlexId-4]
|
||||
_ = x[Invalid-255]
|
||||
}
|
||||
|
||||
const (
|
||||
_Identifier_name_0 = "HwAddressDuIDCircuitIdClientIdFlexId"
|
||||
_Identifier_name_1 = "Invalid"
|
||||
)
|
||||
|
||||
var (
|
||||
_Identifier_index_0 = [...]uint8{0, 9, 13, 22, 30, 36}
|
||||
)
|
||||
|
||||
func (i Identifier) String() string {
|
||||
switch {
|
||||
case 0 <= i && i <= 4:
|
||||
return _Identifier_name_0[_Identifier_index_0[i]:_Identifier_index_0[i+1]]
|
||||
case i == 255:
|
||||
return _Identifier_name_1
|
||||
default:
|
||||
return "Identifier(" + strconv.FormatInt(int64(i), 10) + ")"
|
||||
}
|
||||
}
|
@ -2,16 +2,36 @@ package types
|
||||
|
||||
import "strings"
|
||||
|
||||
var types = map[string]int{
|
||||
"macaddr": 0,
|
||||
"hwaddr": 0,
|
||||
"invalid": 255,
|
||||
type Identifier int
|
||||
|
||||
func (i Identifier) Int() int {
|
||||
return int(i)
|
||||
}
|
||||
|
||||
func Lookup(rtype string) int {
|
||||
//go:generate stringer -type=Identifier
|
||||
const (
|
||||
HwAddress Identifier = 0
|
||||
DuID Identifier = 1
|
||||
CircuitId Identifier = 2
|
||||
ClientId Identifier = 3
|
||||
FlexId Identifier = 4
|
||||
Invalid Identifier = 255
|
||||
)
|
||||
|
||||
var types = map[string]Identifier{
|
||||
"macaddr": HwAddress,
|
||||
"hwaddr": HwAddress,
|
||||
"duid": DuID,
|
||||
"circuit-id": CircuitId,
|
||||
"client-id": ClientId,
|
||||
"flex-id": FlexId,
|
||||
"invalid": Invalid,
|
||||
}
|
||||
|
||||
func Lookup(rtype string) Identifier {
|
||||
rtype = strings.ToLower(rtype)
|
||||
if t, ok := types[rtype]; ok == true {
|
||||
return t
|
||||
}
|
||||
return types["invalid"]
|
||||
return Invalid
|
||||
}
|
||||
|
9
lib/validators/macaddr/macaddr.go
Normal file
9
lib/validators/macaddr/macaddr.go
Normal file
@ -0,0 +1,9 @@
|
||||
package macaddr
|
||||
|
||||
import "regexp"
|
||||
|
||||
const rxValidMac = `^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$`
|
||||
|
||||
func IsValid(mac string) bool {
|
||||
return regexp.MustCompile(rxValidMac).MatchString(mac)
|
||||
}
|
Loading…
Reference in New Issue
Block a user