commands.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package command
  2. import (
  3. "errors"
  4. "fmt"
  5. "strings"
  6. "github.com/gravitl/netmaker/logger"
  7. "github.com/gravitl/netmaker/netclient/config"
  8. "github.com/gravitl/netmaker/netclient/daemon"
  9. "github.com/gravitl/netmaker/netclient/functions"
  10. "github.com/gravitl/netmaker/netclient/ncutils"
  11. )
  12. // Join - join command to run from cli
  13. func Join(cfg *config.ClientConfig, privateKey string) error {
  14. var err error
  15. //join network
  16. if cfg.SsoServer != "" {
  17. // User wants to get access key from the OIDC server
  18. // Do that before the Joining Network flow by performing the end point auth flow
  19. // if performed successfully an access key is obtained from the server and then we
  20. // proceed with the usual flow 'pretending' that user is feeded us with an access token
  21. if len(cfg.Network) == 0 || cfg.Network == "all" {
  22. return fmt.Errorf("no network provided. Specify network with \"-n <net name>\"")
  23. }
  24. logger.Log(1, "Logging into %s via:", cfg.Network, cfg.SsoServer)
  25. err = functions.JoinViaSSo(cfg, privateKey)
  26. if err != nil {
  27. logger.Log(0, "Join failed: ", err.Error())
  28. return err
  29. }
  30. if cfg.AccessKey == "" {
  31. return errors.New("login failed")
  32. }
  33. }
  34. logger.Log(1, "Joining network: ", cfg.Network)
  35. err = functions.JoinNetwork(cfg, privateKey)
  36. if err != nil {
  37. if !strings.Contains(err.Error(), "ALREADY_INSTALLED") {
  38. logger.Log(0, "error installing: ", err.Error())
  39. err = functions.WipeLocal(cfg)
  40. if err != nil {
  41. logger.Log(1, "error removing artifacts: ", err.Error())
  42. }
  43. if cfg.Daemon != "off" {
  44. if ncutils.IsLinux() {
  45. err = daemon.RemoveSystemDServices()
  46. }
  47. if err != nil {
  48. logger.Log(1, "error removing services: ", err.Error())
  49. }
  50. if ncutils.IsFreeBSD() {
  51. daemon.RemoveFreebsdDaemon()
  52. }
  53. }
  54. }
  55. if err != nil && strings.Contains(err.Error(), "ALREADY_INSTALLED") {
  56. logger.Log(0, err.Error())
  57. err = nil
  58. }
  59. return err
  60. }
  61. logger.Log(1, "joined", cfg.Network)
  62. return err
  63. }
  64. // Leave - runs the leave command from cli
  65. func Leave(cfg *config.ClientConfig) error {
  66. err := functions.LeaveNetwork(cfg.Network)
  67. if err != nil {
  68. logger.Log(1, "error attempting to leave network "+cfg.Network)
  69. } else {
  70. logger.Log(0, "success")
  71. }
  72. return err
  73. }
  74. // Pull - runs pull command from cli
  75. func Pull(cfg *config.ClientConfig) error {
  76. var err error
  77. var networks = []string{}
  78. if cfg.Network == "all" {
  79. logger.Log(0, "No network selected. Running Pull for all networks.")
  80. networks, err = ncutils.GetSystemNetworks()
  81. if err != nil {
  82. logger.Log(1, "Error retrieving networks. Exiting.")
  83. return err
  84. }
  85. } else {
  86. networks = append(networks, cfg.Network)
  87. }
  88. var currentServers = make(map[string]config.ClientConfig)
  89. for _, network := range networks {
  90. currCfg, err := config.ReadConfig(network)
  91. if err != nil {
  92. logger.Log(1, "could not read config when pulling for network", network)
  93. continue
  94. }
  95. _, err = functions.Pull(network, true)
  96. if err != nil {
  97. logger.Log(1, "error pulling network config for network: ", network, "\n", err.Error())
  98. } else {
  99. logger.Log(1, "pulled network config for "+network)
  100. }
  101. currentServers[currCfg.Server.Server] = *currCfg
  102. }
  103. daemon.Restart()
  104. logger.Log(1, "reset network", cfg.Network, "and peer configs")
  105. return err
  106. }
  107. // List - runs list command from cli
  108. func List(cfg config.ClientConfig) error {
  109. _, err := functions.List(cfg.Network)
  110. return err
  111. }
  112. // Uninstall - runs uninstall command from cli
  113. func Uninstall() error {
  114. logger.Log(0, "uninstalling netclient...")
  115. err := functions.Uninstall()
  116. logger.Log(0, "uninstalled netclient")
  117. return err
  118. }
  119. // Daemon - runs the daemon
  120. func Daemon() error {
  121. err := functions.Daemon()
  122. return err
  123. }
  124. // Install - installs binary and daemon
  125. func Install() error {
  126. return functions.Install()
  127. }
  128. // Connect - re-instates a connection of a node
  129. func Connect(cfg config.ClientConfig) error {
  130. networkName := cfg.Network
  131. if networkName == "" {
  132. networkName = cfg.Node.Network
  133. }
  134. if networkName == "all" {
  135. return fmt.Errorf("no network specified")
  136. }
  137. return functions.Connect(networkName)
  138. }
  139. // Disconnect - disconnects a connection of a node
  140. func Disconnect(cfg config.ClientConfig) error {
  141. networkName := cfg.Network
  142. if networkName == "" {
  143. networkName = cfg.Node.Network
  144. }
  145. if networkName == "all" {
  146. return fmt.Errorf("no network specified")
  147. }
  148. return functions.Disconnect(networkName)
  149. }