package config import "fmt" type MaclistAction string const ( MaclistAccept MaclistAction = "accept" MaclistDrop MaclistAction = "drop" MaclistReject MaclistAction = "reject" ) type MaclistEntry struct { Action MaclistAction `yaml:"action"` Interface string `yaml:"interface"` MAC string `yaml:"mac,omitempty"` Addresses []string `yaml:"addresses,omitempty"` Log string `yaml:"log,omitempty"` Comment string `yaml:"comment,omitempty"` } var validMaclistActions = map[MaclistAction]bool{ MaclistAccept: true, MaclistDrop: true, MaclistReject: true, } func (c *Config) validateMaclist() error { // Build a set of configured interface names for lookup. ifaceSet := make(map[string]bool, len(c.Interfaces)) for _, iface := range c.Interfaces { ifaceSet[iface.Interface] = true } for i, m := range c.Maclist { if !validMaclistActions[m.Action] { return fmt.Errorf("maclist[%d]: unknown action %q", i, m.Action) } if m.Interface == "" { return fmt.Errorf("maclist[%d]: interface required", i) } if m.MAC == "" && len(m.Addresses) == 0 { return fmt.Errorf("maclist[%d]: mac or addresses required", i) } if !ifaceSet[m.Interface] { return fmt.Errorf("maclist[%d]: interface %q not defined in config", i, m.Interface) } } return nil }