package functions import ( "strconv" "strings" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/netclient/config" "github.com/gravitl/netmaker/netclient/functions/upgrades" "github.com/gravitl/netmaker/netclient/ncutils" ) // UpdateClientConfig - function is called on daemon start to update clientConfig if required // Usage : set update required to true and and update logic to function func UpdateClientConfig() { defer upgrades.ReleaseUpgrades() networks, _ := ncutils.GetSystemNetworks() if len(networks) == 0 { return } logger.Log(0, "checking for netclient updates...") for _, network := range networks { cfg := config.ClientConfig{} cfg.Network = network cfg.ReadConfig() major, minor, _ := Version(cfg.Node.Version) if major == 0 && minor < 14 { logger.Log(0, "schema of network", cfg.Network, "is out of date and cannot be updated\n Correct behaviour of netclient cannot be guaranteed") continue } configChanged := false for _, u := range upgrades.Upgrades { configChanged = false if logic.StringSliceContains(u.RequiredVersions, cfg.Node.Version) { logger.Log(0, "updating ", cfg.Network) u.OP(&cfg) cfg.Node.Version = u.NewVersion configChanged = true } } if configChanged { //save and publish if err := PublishNodeUpdate(&cfg); err != nil { logger.Log(0, "error publishing node update during schema change", err.Error()) } } } logger.Log(0, "finished updates") } // Version - parse version string into component parts // version string must be semantic version of form 1.2.3 or v1.2.3 // otherwise 0, 0, 0 will be returned. func Version(version string) (int, int, int) { var major, minor, patch int var errMajor, errMinor, errPatch error parts := strings.Split(version, ".") //ensure semantic version if len(parts) < 3 { return major, minor, patch } if strings.Contains(parts[0], "v") { majors := strings.Split(parts[0], "v") major, errMajor = strconv.Atoi(majors[1]) } else { major, errMajor = strconv.Atoi(parts[0]) } minor, errMinor = strconv.Atoi(parts[1]) patch, errPatch = strconv.Atoi(parts[2]) if errMajor != nil || errMinor != nil || errPatch != nil { return 0, 0, 0 } return major, minor, patch }