Newer
Older
package templateCreate
import (
"flag"
"os"
Clemens Barth
committed
"strings"
"github.com/sirupsen/logrus"
"gopkg.in/yaml.v3"
)
var configPath_default = "templateCreate/templateCreate.clab_vars.yaml" // config path if no other path is given via -config flag
var tcConf *TemplateCreateConfig // pointer to parsed config
var peerGenMode string
// ipPrefix: ipBase without number after last ".".
// e.g. ipBase = "172.100.20.0" -> ipPrefix = "172.100.20.".
var ipPrefix string
Clemens Barth
committed
var curSubnetNr int
func ParseTemplateCreateConfig() {
// TODO: flag validation
configPath := flag.String("config", "", "path to the config file")
logLevel := flag.String("log", "", "logrus log level (debug, info, warn, error, fatal, panic)")
ekmsNum := flag.Int("ekms", 0, "number of EKMS to generate")
mode := flag.String("mode", "", "peer generation mode")
flag.IntVar(ekmsNum, "kms", 0, "number of KMS to generate") // -kms: alias for -ekms
flag.StringVar(configPath, "conf", "", "path to the config file") // -conf: alias for -config
setLogLevel(logLevel)
setConfigPath(configPath)
// unmarshal config
config := &TemplateCreateConfig{}
file, err := os.ReadFile(*configPath)
if err != nil {
logrus.Fatal(err)
}
if err := yaml.Unmarshal(file, config); err != nil {
logrus.Fatal(err)
}
// set TemplateCreateConfig variable
tcConf = config
//logrus.Info(*tcConf) // print entire parsed config
setEkmsNumber(ekmsNum)
setPeerGenMode(mode)
Clemens Barth
committed
setConfVals()
}
func setConfVals() {
// IP without part after last dot, but including last dot
// to add the subnet numbers to for individual IPs
// e.g. ipBase: 172.100.20.4 -> ipPrefix: 172.100.20.
ipPrefix = tcConf.General.IpBase[:strings.LastIndex(tcConf.General.IpBase, ".")+1]
// the next free subnet number in the network
// control nodes start from .1
// e.g. 5 control nodes, xxx.xxx.xx.1 - xxx.xxx.xx.6 -> curSubnetNr = 6
curSubnetNr = tcConf.General.ControlNodeCount + 1
func setLogLevel(logLevel *string) {
//logLevel := flag.String("log", "", "logrus log level (debug, info, warn, error, fatal, panic)")
logrus.SetFormatter(&logrus.TextFormatter{FullTimestamp: true})
// parse string, this is built-in feature of logrus
ll, err := logrus.ParseLevel(*logLevel)
if err != nil {
ll = logrus.InfoLevel
logrus.Info("-log flag not provided, using default: ", ll)
}
// set global log level
logrus.SetLevel(ll)
//logrus.Info("Setting log level to ", ll)
}
func setConfigPath(configPath *string) {
// if no --config argument given
if *configPath == "" {
err := flag.Set("config", configPath_default)
if err != nil {
logrus.Fatal(err)
}
logrus.Info("-config, -conf flag not provided, using default: ", *configPath)
}
}
// needs the config file to be parsed to check the EKMS value.
func setEkmsNumber(ekmsNum *int) {
if *ekmsNum < 1 {
logrus.Info("-ekms, -kms flag not provided or invalid value, using value in config file: ", tcConf.EKMS.Num)
} else {
tcConf.EKMS.Num = *ekmsNum
logrus.Info("EKMS number set to ", tcConf.EKMS.Num)
}
}
func setPeerGenMode(mode *string) {
if *mode == "" {
err := flag.Set("mode", tcConf.PeerGen.Mode)
if err != nil {
logrus.Fatal(err)
}
peerGenMode = tcConf.PeerGen.Mode
logrus.Info("-mode flag not provided, using value in config file: ", *mode)
} else {
tcConf.PeerGen.Mode = *mode
peerGenMode = *mode
logrus.Info("Peer generation mode set to ", peerGenMode)
}
}