pull.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package functions
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "os"
  7. "runtime"
  8. nodepb "github.com/gravitl/netmaker/grpc"
  9. "github.com/gravitl/netmaker/models"
  10. "github.com/gravitl/netmaker/netclient/auth"
  11. "github.com/gravitl/netmaker/netclient/config"
  12. "github.com/gravitl/netmaker/netclient/local"
  13. "github.com/gravitl/netmaker/netclient/ncutils"
  14. "github.com/gravitl/netmaker/netclient/wireguard"
  15. "google.golang.org/grpc"
  16. "google.golang.org/grpc/metadata"
  17. //homedir "github.com/mitchellh/go-homedir"
  18. )
  19. // Pull - pulls the latest config from the server, if manual it will overwrite
  20. func Pull(network string, manual bool) (*models.Node, error) {
  21. cfg, err := config.ReadConfig(network)
  22. if err != nil {
  23. return nil, err
  24. }
  25. node := cfg.Node
  26. //servercfg := cfg.Server
  27. if cfg.Node.IPForwarding == "yes" && !ncutils.IsWindows() {
  28. if err = local.SetIPForwarding(); err != nil {
  29. return nil, err
  30. }
  31. }
  32. var resNode models.Node // just need to fill this with either server calls or client calls
  33. var header metadata.MD
  34. var wcclient nodepb.NodeServiceClient
  35. var ctx context.Context
  36. if cfg.Node.IsServer != "yes" {
  37. conn, err := grpc.Dial(cfg.Server.GRPCAddress,
  38. ncutils.GRPCRequestOpts(cfg.Server.GRPCSSL))
  39. if err != nil {
  40. ncutils.PrintLog("Cant dial GRPC server: "+err.Error(), 1)
  41. return nil, err
  42. }
  43. defer conn.Close()
  44. wcclient = nodepb.NewNodeServiceClient(conn)
  45. ctx, err = auth.SetJWT(wcclient, network)
  46. if err != nil {
  47. ncutils.PrintLog("Failed to authenticate: "+err.Error(), 1)
  48. return nil, err
  49. }
  50. data, err := json.Marshal(&node)
  51. if err != nil {
  52. ncutils.PrintLog("Failed to parse node config: "+err.Error(), 1)
  53. return nil, err
  54. }
  55. req := &nodepb.Object{
  56. Data: string(data),
  57. Type: nodepb.NODE_TYPE,
  58. }
  59. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  60. if err != nil {
  61. return nil, err
  62. }
  63. if err = json.Unmarshal([]byte(readres.Data), &resNode); err != nil {
  64. return nil, err
  65. }
  66. }
  67. // ensure that the OS never changes
  68. resNode.OS = runtime.GOOS
  69. if manual {
  70. // check for interface change
  71. if cfg.Node.Interface != resNode.Interface {
  72. if err = DeleteInterface(cfg.Node.Interface, cfg.Node.PostDown); err != nil {
  73. ncutils.PrintLog("could not delete old interface "+cfg.Node.Interface, 1)
  74. }
  75. }
  76. if err = config.ModConfig(&resNode); err != nil {
  77. return nil, err
  78. }
  79. if err = wireguard.SetWGConfig(network, false); err != nil {
  80. return nil, err
  81. }
  82. nodeData, err := json.Marshal(&resNode)
  83. if err != nil {
  84. return &resNode, err
  85. }
  86. if resNode.IsServer != "yes" {
  87. if wcclient == nil || ctx == nil {
  88. return &cfg.Node, errors.New("issue initializing gRPC client")
  89. }
  90. req := &nodepb.Object{
  91. Data: string(nodeData),
  92. Type: nodepb.NODE_TYPE,
  93. Metadata: "",
  94. }
  95. _, err = wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  96. if err != nil {
  97. return &resNode, err
  98. }
  99. }
  100. } else {
  101. if err = wireguard.SetWGConfig(network, true); err != nil {
  102. if errors.Is(err, os.ErrNotExist) && !ncutils.IsFreeBSD() {
  103. return Pull(network, true)
  104. } else {
  105. return nil, err
  106. }
  107. }
  108. }
  109. var bkupErr = config.SaveBackup(network)
  110. if bkupErr != nil {
  111. ncutils.Log("unable to update backup file")
  112. }
  113. return &resNode, err
  114. }