2
0

checkin.go 13 KB

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