Skip to content
Snippets Groups Projects
parseTemplateCreateConf.go 3.38 KiB
Newer Older
  • Learn to ignore specific revisions
  • package templateCreate
    
    import (
    	"flag"
    	"os"
    
    
    	"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
    
    // ipPrefix: ipBase without number after last ".".
    // e.g. ipBase = "172.100.20.0" -> ipPrefix = "172.100.20.".
    var ipPrefix string
    
    
    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)
    
    	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)
    	}
    }
    
    
    Clemens Barth's avatar
    Clemens Barth committed
    // 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)
    	}
    }