checkin.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package functions
  2. import (
  3. "fmt"
  4. "context"
  5. "strings"
  6. "log"
  7. "net"
  8. "os/exec"
  9. "github.com/gravitl/netmaker/netclient/config"
  10. "github.com/gravitl/netmaker/netclient/wireguard"
  11. "github.com/gravitl/netmaker/netclient/server"
  12. "github.com/gravitl/netmaker/netclient/auth"
  13. nodepb "github.com/gravitl/netmaker/grpc"
  14. "google.golang.org/grpc"
  15. "google.golang.org/grpc/metadata"
  16. //homedir "github.com/mitchellh/go-homedir"
  17. )
  18. func CheckIn(network string) error {
  19. node := server.GetNode(network)
  20. cfg, err := config.ReadConfig(network)
  21. if err != nil {
  22. return err
  23. }
  24. nodecfg := cfg.Node
  25. servercfg := cfg.Server
  26. fmt.Println("Checking into server at " + servercfg.GRPCAddress)
  27. setupcheck := true
  28. ipchange := false
  29. if !(nodecfg.IPForwarding == "off") {
  30. out, err := exec.Command("sysctl", "net.ipv4.ip_forward").Output()
  31. if err != nil {
  32. fmt.Println(err)
  33. fmt.Println("WARNING: Error encountered setting ip forwarding. This can break functionality.")
  34. } else {
  35. s := strings.Fields(string(out))
  36. if s[2] != "1" {
  37. _, err = exec.Command("sysctl", "-w", "net.ipv4.ip_forward=1").Output()
  38. if err != nil {
  39. fmt.Println(err)
  40. fmt.Println("WARNING: Error encountered setting ip forwarding. You may want to investigate this.")
  41. }
  42. }
  43. }
  44. }
  45. if nodecfg.Roaming != "off" {
  46. if nodecfg.IsLocal != "yes" {
  47. fmt.Println("Checking to see if public addresses have changed")
  48. extIP, err := getPublicIP()
  49. if err != nil {
  50. fmt.Printf("Error encountered checking ip addresses: %v", err)
  51. }
  52. if nodecfg.Endpoint != extIP && extIP != "" {
  53. fmt.Println("Endpoint has changed from " +
  54. nodecfg.Endpoint + " to " + extIP)
  55. fmt.Println("Updating address")
  56. nodecfg.Endpoint = extIP
  57. nodecfg.PostChanges = "true"
  58. node.Endpoint = extIP
  59. node.Postchanges = "true"
  60. ipchange = true
  61. }
  62. intIP, err := getPrivateAddr()
  63. if err != nil {
  64. fmt.Printf("Error encountered checking ip addresses: %v", err)
  65. }
  66. if nodecfg.LocalAddress != intIP && intIP != "" {
  67. fmt.Println("Local Address has changed from " +
  68. nodecfg.LocalAddress + " to " + intIP)
  69. fmt.Println("Updating address")
  70. nodecfg.LocalAddress = intIP
  71. nodecfg.PostChanges = "true"
  72. node.Localaddress = intIP
  73. node.Postchanges = "true"
  74. ipchange = true
  75. }
  76. } else {
  77. fmt.Println("Checking to see if local addresses have changed")
  78. localIP, err := getLocalIP(nodecfg.LocalRange)
  79. if err != nil {
  80. fmt.Printf("Error encountered checking ip addresses: %v", err)
  81. }
  82. if nodecfg.Endpoint != localIP && localIP != "" {
  83. fmt.Println("Endpoint has changed from " +
  84. nodecfg.Endpoint + " to " + localIP)
  85. fmt.Println("Updating address")
  86. nodecfg.Endpoint = localIP
  87. nodecfg.LocalAddress = localIP
  88. nodecfg.PostChanges = "true"
  89. node.Endpoint = localIP
  90. node.Localaddress = localIP
  91. node.Postchanges = "true"
  92. ipchange = true
  93. }
  94. }
  95. if node.Postchanges != "true" {
  96. fmt.Println("Addresses have not changed.")
  97. }
  98. }
  99. if ipchange {
  100. err := config.ModConfig(&node)
  101. if err != nil {
  102. return err
  103. log.Fatalf("Error: %v", err)
  104. }
  105. err = wireguard.SetWGConfig(network)
  106. if err != nil {
  107. return err
  108. log.Fatalf("Error: %v", err)
  109. }
  110. node = server.GetNode(network)
  111. cfg, err := config.ReadConfig(network)
  112. if err != nil {
  113. return err
  114. }
  115. nodecfg = cfg.Node
  116. }
  117. var wcclient nodepb.NodeServiceClient
  118. var requestOpts grpc.DialOption
  119. requestOpts = grpc.WithInsecure()
  120. conn, err := grpc.Dial(servercfg.GRPCAddress, requestOpts)
  121. if err != nil {
  122. fmt.Printf("Cant dial GRPC server: %v", err)
  123. return err
  124. }
  125. wcclient = nodepb.NewNodeServiceClient(conn)
  126. ctx := context.Background()
  127. fmt.Println("Authenticating with GRPC Server")
  128. ctx, err = auth.SetJWT(wcclient, network)
  129. if err != nil {
  130. fmt.Printf("Failed to authenticate: %v", err)
  131. return err
  132. }
  133. fmt.Println("Authenticated")
  134. fmt.Println("Checking In.")
  135. var header metadata.MD
  136. node.Nodenetwork = network
  137. checkinres, err := wcclient.CheckIn(
  138. ctx,
  139. &nodepb.CheckInReq{
  140. Node: &node,
  141. },
  142. grpc.Header(&header),
  143. )
  144. if err != nil {
  145. if checkinres != nil && checkinres.Checkinresponse.Ispending {
  146. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
  147. return nil
  148. }
  149. fmt.Printf("Unable to process Check In request: %v", err)
  150. return err
  151. }
  152. fmt.Println("Checked in.")
  153. if checkinres.Checkinresponse.Ispending {
  154. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
  155. return err
  156. }
  157. newinterface := server.GetNode(network).Interface
  158. readreq := &nodepb.ReadNodeReq{
  159. Macaddress: node.Macaddress,
  160. Network: node.Nodenetwork,
  161. }
  162. readres, err := wcclient.ReadNode(ctx, readreq, grpc.Header(&header))
  163. if err != nil {
  164. fmt.Printf("Error: %v", err)
  165. } else {
  166. currentiface := readres.Node.Interface
  167. ifaceupdate := newinterface != currentiface
  168. if err != nil {
  169. log.Printf("Error retrieving interface: %v", err)
  170. }
  171. if ifaceupdate {
  172. fmt.Println("Interface update: " + currentiface +
  173. " >>>> " + newinterface)
  174. err := DeleteInterface(currentiface, nodecfg.PostDown)
  175. if err != nil {
  176. fmt.Println("ERROR DELETING INTERFACE: " + currentiface)
  177. }
  178. err = wireguard.SetWGConfig(network)
  179. if err != nil {
  180. log.Printf("Error updating interface: %v", err)
  181. }
  182. }
  183. }
  184. if checkinres.Checkinresponse.Needconfigupdate {
  185. fmt.Println("Server has requested that node update config.")
  186. fmt.Println("Updating config from remote server.")
  187. req := &nodepb.ReadNodeReq{
  188. Macaddress: node.Macaddress,
  189. Network: node.Nodenetwork,
  190. }
  191. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  192. if err != nil {
  193. return err
  194. log.Fatalf("Error: %v", err)
  195. }
  196. err = config.ModConfig(readres.Node)
  197. if err != nil {
  198. return err
  199. log.Fatalf("Error: %v", err)
  200. }
  201. err = wireguard.SetWGConfig(network)
  202. if err != nil {
  203. return err
  204. log.Fatalf("Error: %v", err)
  205. }
  206. setupcheck = false
  207. } else if nodecfg.PostChanges == "true" {
  208. fmt.Println("Node has requested to update remote config.")
  209. fmt.Println("Posting local config to remote server.")
  210. postnode := server.GetNode(network)
  211. req := &nodepb.UpdateNodeReq{
  212. Node: &postnode,
  213. }
  214. res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  215. if err != nil {
  216. return err
  217. log.Fatalf("Error: %v", err)
  218. }
  219. res.Node.Postchanges = "false"
  220. err = config.ModConfig(res.Node)
  221. if err != nil {
  222. return err
  223. log.Fatalf("Error: %v", err)
  224. }
  225. err = wireguard.SetWGConfig(network)
  226. if err != nil {
  227. return err
  228. log.Fatalf("Error: %v", err)
  229. }
  230. setupcheck = false
  231. }
  232. if checkinres.Checkinresponse.Needkeyupdate {
  233. fmt.Println("Server has requested that node update key pairs.")
  234. fmt.Println("Proceeding to re-generate key pairs for Wiregard.")
  235. err = wireguard.SetWGKeyConfig(network, servercfg.GRPCAddress)
  236. if err != nil {
  237. return err
  238. log.Fatalf("Unable to process reset keys request: %v", err)
  239. }
  240. setupcheck = false
  241. }
  242. if checkinres.Checkinresponse.Needpeerupdate {
  243. fmt.Println("Server has requested that node update peer list.")
  244. fmt.Println("Updating peer list from remote server.")
  245. err = wireguard.SetWGConfig(network)
  246. if err != nil {
  247. return err
  248. log.Fatalf("Unable to process Set Peers request: %v", err)
  249. }
  250. setupcheck = false
  251. }
  252. if checkinres.Checkinresponse.Needdelete {
  253. fmt.Println("This machine got the delete signal. Deleting.")
  254. err := LeaveNetwork(network)
  255. if err != nil {
  256. return err
  257. log.Fatalf("Error: %v", err)
  258. }
  259. }
  260. if setupcheck {
  261. iface := nodecfg.Interface
  262. _, err := net.InterfaceByName(iface)
  263. if err != nil {
  264. fmt.Println("interface " + iface + " does not currently exist. Setting up WireGuard.")
  265. err = wireguard.SetWGKeyConfig(network, servercfg.GRPCAddress)
  266. if err != nil {
  267. return err
  268. log.Fatalf("Error: %v", err)
  269. }
  270. }
  271. }
  272. return nil
  273. }