commands.go 5.1 KB

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