//check validation of config func validateConfig(conf *Config, md *toml.MetaData) error { //for protection when debugging on non production environment var errStrings []string format := "[%s]" inValid := false for _, keys := range checkTomlKeys { if !md.IsDefined(keys...) { switch len(keys) { case 1: format = "[%s]" case 2: format = "[%s] %s" case 3: format = "[%s.%s] %s" default: //invalid check string inValid = true break } keysIfc := u.SliceStrToInterface(keys) errStrings = append(errStrings, fmt.Sprintf(format, keysIfc...)) } } // Error if inValid { return errors.New("Error: Check Text has wrong number of parameter") } if len(errStrings) != 0 { return fmt.Errorf("Error: There are lacks of keys : %#v \n", errStrings) } return nil }
func printTypes(md toml.MetaData) { tabw := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) for _, key := range md.Keys() { fmt.Fprintf(tabw, "%s%s\t%s\n", strings.Repeat(" ", len(key)-1), key, md.Type(key...)) } tabw.Flush() }
func analyzeFmdConf(config map[string]toml.Primitive, md *toml.MetaData) error { if section, ok := config["ngxfmd"]; ok { err := md.PrimitiveDecode(section, fmConf) if err != nil { fmt.Println(err.Error()) return err } fmt.Printf("(%+v)\n", *fmConf) return nil } else { fmt.Println("analyze nginx files manager configuration failed") return errors.New("does not specify fmd section configuration") } }
func analyzeCmddConf(config map[string]toml.Primitive, md *toml.MetaData) error { if section, ok := config["cmdd"]; ok { err := md.PrimitiveDecode(section, cmddConfig) if err != nil { fmt.Println(err.Error()) return err } fmt.Printf("(%+v)\n", *cmddConfig) return nil } else { fmt.Println("analyze cmddConfig failed") return errors.New("does not specify cmmd section configuration") } }
func validateScriptsConf(scripts *ScriptsConf, meta toml.MetaData) error { if scripts == nil { return nil } if !meta.IsDefined("scripts", "path") { return errors.New("scripts section provided without path.") } if !meta.IsDefined("scripts", "run_interval_ms") { return errors.New("scripts section provided without run_interval_ms.") } if scripts.RunIntervalMS <= 0 { return errors.New("scripts.run_interval_ms must be positive") } return nil }
func loadSystemConfig(conf string, isFileName bool) (*SystemConf, error) { sc := newSystemConf() var decodeMeta toml.MetaData var err error if isFileName { decodeMeta, err = toml.DecodeFile(conf, &sc) } else { decodeMeta, err = toml.Decode(conf, &sc) } if err != nil { return sc, err } if len(decodeMeta.Undecoded()) > 0 { return sc, fmt.Errorf("undecoded fields in system configuration: %v", decodeMeta.Undecoded()) } sc.md = decodeMeta return sc, nil }
func main() { var cfg config var md toml.MetaData md, err := toml.DecodeFile(configFile, &cfg) if err != nil { log.Fatal(err) } for _, o := range cfg.Outs { out_plugin := plugin.GetOut(o.Plugin) out_cfg_prim := o.Config var plugin_conf = out_plugin.GetConfig() md.PrimitiveDecode(out_cfg_prim, plugin_conf) } out := plugin.GetOut("outfile") result := out.Write("somestring") fmt.Println(result) }
func InitHandlerConf(confs map[string]toml.Primitive, md *toml.MetaData) error { var err error for k, handler := range CmdHandlers { if conf, ok := confs[k]; ok { handlerConf := handler.ConfigStruct() err = md.PrimitiveDecode(conf, handlerConf) if err != nil { cmdlog.EPrintln(err.Error()) return err } err = handler.Init(handlerConf) if err != nil { cmdlog.EPrintln(err.Error()) return err } } } return err }
func parseConfig(configFile string) map[string]*Service { var config Services var md toml.MetaData var err error if md, err = toml.DecodeFile(configFile, &config); err != nil { log.Fatal(err) } services := make(map[string]*Service) for name, serv := range config { s := NewService() s.Name = name services[name] = s for _, k := range md.Keys() { ks := strings.Split(k.String(), ".") if len(ks) > 1 && ks[0] == name { switch ks[1] { case "srcport": s.Srcport = serv.Srcport case "srcflags": s.Srcflags = serv.Srcflags case "srcproto": s.Srcproto = serv.Srcproto case "dsthost": s.Dsthost = serv.Dsthost case "dstproto": s.Dstproto = serv.Dstproto case "dstport": s.Dstport = serv.Dstport case "enabled": s.Enabled = serv.Enabled } } } } log.Println("Found", len(services), "services") return services }
func validateOSStatsConf(osStats *OSStatsConf, meta toml.MetaData) error { if osStats == nil { return nil } if meta.IsDefined("os_stats", "check_interval_ms") { if osStats.CheckIntervalMS <= 0 { return errors.New("check_interval_ms must be positive") } } if err := validateMemConf(osStats.Mem); err != nil { return err } if err := validateCPUConf(osStats.CPU); err != nil { return err } // For now, any parseable NetConf is valid. for _, diskConf := range osStats.Disk { if err := validateDiskConf(diskConf); err != nil { return err } } return nil }
//Loads a container configuration object, overriding a base //This function prevents empty TOML keys (anything you didn't specify) from overriding a preset value. func LoadContainerSettings(base *Container, inc *Container, meta *toml.MetaData, key ...string) { if meta.IsDefined(append(key, "command")...) { base.Command = inc.Command } if meta.IsDefined(append(key, "folder")...) { base.Folder = inc.Folder } if meta.IsDefined(append(key, "privileged")...) { base.Privileged = inc.Privileged } if meta.IsDefined(append(key, "mounts")...) { base.Mounts = append(base.Mounts, inc.Mounts...) } if meta.IsDefined(append(key, "ports")...) { base.Ports = append(base.Ports, inc.Ports...) } if meta.IsDefined(append(key, "dns")...) { base.DNS = append(base.DNS, inc.DNS...) } if meta.IsDefined(append(key, "attach")...) { base.Attach = inc.Attach } if meta.IsDefined(append(key, "purge")...) { base.Purge = inc.Purge } if meta.IsDefined(append(key, "environment")...) { base.Environment = append(base.Environment, inc.Environment...) } }
func SetDefaultConfigValues(md toml.MetaData, bt *Bgp) error { neighbors := []neighbor{} global := make(map[string]bool) for _, key := range md.Keys() { if !strings.HasPrefix(key.String(), "Global") { continue } if key.String() != "Global" { global[key.String()] = true } } if _, ok := global["Global.AfiSafis.AfiSafiList"]; !ok { bt.Global.AfiSafis.AfiSafiList = []AfiSafi{ AfiSafi{AfiSafiName: "ipv4-unicast"}, AfiSafi{AfiSafiName: "ipv6-unicast"}, AfiSafi{AfiSafiName: "l3vpn-ipv4-unicast"}, AfiSafi{AfiSafiName: "l3vpn-ipv6-unicast"}, AfiSafi{AfiSafiName: "l2vpn-evpn"}, AfiSafi{AfiSafiName: "encap"}, AfiSafi{AfiSafiName: "rtc"}, AfiSafi{AfiSafiName: "ipv4-flowspec"}, AfiSafi{AfiSafiName: "l3vpn-ipnv4-flowspec"}, } } nidx := 0 for _, key := range md.Keys() { if !strings.HasPrefix(key.String(), "Neighbors.NeighborList") { continue } if key.String() == "Neighbors.NeighborList" { neighbors = append(neighbors, neighbor{attributes: make(map[string]bool)}) nidx++ } else { neighbors[nidx-1].attributes[key.String()] = true } } for i, n := range neighbors { neighbor := &bt.Neighbors.NeighborList[i] timerConfig := &neighbor.Timers.TimersConfig if _, ok := n.attributes["Neighbors.NeighborList.Timers.TimersConfig.ConnectRetry"]; !ok { timerConfig.HoldTime = float64(DEFAULT_CONNECT_RETRY) } if _, ok := n.attributes["Neighbors.NeighborList.Timers.TimersConfig.HoldTime"]; !ok { timerConfig.HoldTime = float64(DEFAULT_HOLDTIME) } if _, ok := n.attributes["Neighbors.NeighborList.Timers.TimersConfig.KeepaliveInterval"]; !ok { timerConfig.KeepaliveInterval = timerConfig.HoldTime / 3 } if _, ok := n.attributes["Neighbors.NeighborList.Timers.TimersConfig.IdleHoldTimeAfterReset"]; !ok { timerConfig.IdleHoldTimeAfterReset = float64(DEFAULT_IDLE_HOLDTIME_AFTER_RESET) } if _, ok := n.attributes["Neighbors.NeighborList.AfiSafis.AfiSafiList"]; !ok { if neighbor.NeighborConfig.NeighborAddress.To4() != nil { neighbor.AfiSafis.AfiSafiList = []AfiSafi{ AfiSafi{AfiSafiName: "ipv4-unicast"}} } else { neighbor.AfiSafis.AfiSafiList = []AfiSafi{ AfiSafi{AfiSafiName: "ipv6-unicast"}} } } else { for _, rf := range neighbor.AfiSafis.AfiSafiList { _, err := bgp.GetRouteFamily(rf.AfiSafiName) if err != nil { return err } } } if _, ok := n.attributes["Neighbors.NeighborList.NeighborConfig.PeerType"]; !ok { if neighbor.NeighborConfig.PeerAs != bt.Global.GlobalConfig.As { neighbor.NeighborConfig.PeerType = PEER_TYPE_EXTERNAL } else { neighbor.NeighborConfig.PeerType = PEER_TYPE_INTERNAL } } } for _, r := range bt.RpkiServers.RpkiServerList { if r.RpkiServerConfig.Port == 0 { r.RpkiServerConfig.Port = bgp.RPKI_DEFAULT_PORT } } return nil }