pull.go 3.3 KB

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