clientconfig.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package functions
  2. import (
  3. "strconv"
  4. "strings"
  5. "github.com/gravitl/netmaker/logger"
  6. "github.com/gravitl/netmaker/netclient/config"
  7. "github.com/gravitl/netmaker/netclient/functions/upgrades"
  8. "github.com/gravitl/netmaker/netclient/ncutils"
  9. )
  10. // UpdateClientConfig - function is called on daemon start to update clientConfig if required
  11. // Usage : set update required to true and and update logic to function
  12. func UpdateClientConfig() {
  13. defer upgrades.ReleaseUpgrades()
  14. upgrades.InitializeUpgrades()
  15. networks, _ := ncutils.GetSystemNetworks()
  16. if len(networks) == 0 {
  17. return
  18. }
  19. logger.Log(0, "checking for netclient updates...")
  20. for _, network := range networks {
  21. cfg := config.ClientConfig{}
  22. cfg.Network = network
  23. cfg.ReadConfig()
  24. major, minor, _ := Version(cfg.Node.Version)
  25. if major == 0 && minor < 14 {
  26. logger.Log(0, "schema of network", cfg.Network, "is out of date and cannot be updated\n Correct behaviour of netclient cannot be guaranteed")
  27. continue
  28. }
  29. configChanged := false
  30. for _, u := range upgrades.Upgrades {
  31. if ncutils.StringSliceContains(u.RequiredVersions, cfg.Node.Version) {
  32. logger.Log(0, "upgrading node", cfg.Node.Name, "on network", cfg.Node.Network, "from", cfg.Node.Version, "to", u.NewVersion)
  33. upgrades.UpgradeFunction(u.OP)(&cfg)
  34. cfg.Node.Version = u.NewVersion
  35. configChanged = true
  36. }
  37. }
  38. if configChanged {
  39. //save and publish
  40. if err := PublishNodeUpdate(&cfg); err != nil {
  41. logger.Log(0, "error publishing node update during schema change", err.Error())
  42. }
  43. if err := config.ModNodeConfig(&cfg.Node); err != nil {
  44. logger.Log(0, "error saving local config for node,", cfg.Node.Name, ", on network,", cfg.Node.Network)
  45. }
  46. }
  47. }
  48. logger.Log(0, "finished updates")
  49. }
  50. // Version - parse version string into component parts
  51. // version string must be semantic version of form 1.2.3 or v1.2.3
  52. // otherwise 0, 0, 0 will be returned.
  53. func Version(version string) (int, int, int) {
  54. var major, minor, patch int
  55. var errMajor, errMinor, errPatch error
  56. parts := strings.Split(version, ".")
  57. //ensure semantic version
  58. if len(parts) < 3 {
  59. return major, minor, patch
  60. }
  61. if strings.Contains(parts[0], "v") {
  62. majors := strings.Split(parts[0], "v")
  63. major, errMajor = strconv.Atoi(majors[1])
  64. } else {
  65. major, errMajor = strconv.Atoi(parts[0])
  66. }
  67. minor, errMinor = strconv.Atoi(parts[1])
  68. patch, errPatch = strconv.Atoi(parts[2])
  69. if errMajor != nil || errMinor != nil || errPatch != nil {
  70. return 0, 0, 0
  71. }
  72. return major, minor, patch
  73. }