common.go 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060
  1. package functions
  2. import (
  3. //"github.com/davecgh/go-spew/spew"
  4. "fmt"
  5. "time"
  6. "errors"
  7. "context"
  8. "net/http"
  9. "io/ioutil"
  10. "io"
  11. "strings"
  12. "log"
  13. "net"
  14. "os"
  15. "strconv"
  16. "os/exec"
  17. "github.com/gravitl/netmaker/netclient/config"
  18. nodepb "github.com/gravitl/netmaker/grpc"
  19. "golang.zx2c4.com/wireguard/wgctrl"
  20. "google.golang.org/grpc"
  21. "google.golang.org/grpc/metadata"
  22. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  23. //homedir "github.com/mitchellh/go-homedir"
  24. )
  25. var (
  26. wcclient nodepb.NodeServiceClient
  27. )
  28. func Install(accesskey string, password string, server string, group string, noauto bool) error {
  29. wgclient, err := wgctrl.New()
  30. if err != nil {
  31. log.Fatalf("failed to open client: %v", err)
  32. }
  33. defer wgclient.Close()
  34. nodecfg := config.Config.Node
  35. servercfg := config.Config.Server
  36. fmt.Println("SERVER SETTINGS:")
  37. if server == "" {
  38. if servercfg.Address == "" {
  39. log.Fatal("no server provided")
  40. } else {
  41. server = servercfg.Address
  42. }
  43. }
  44. fmt.Println(" Server: " + server)
  45. if accesskey == "" {
  46. if servercfg.AccessKey == "" {
  47. fmt.Println("no access key provided.Proceeding anyway.")
  48. } else {
  49. accesskey = servercfg.AccessKey
  50. }
  51. }
  52. fmt.Println(" AccessKey: " + accesskey)
  53. err = config.WriteServer(server, accesskey)
  54. if err != nil {
  55. fmt.Println("Error encountered while writing Server Config.")
  56. return err
  57. }
  58. fmt.Println("NODE REQUESTING SETTINGS:")
  59. if password == "" {
  60. if nodecfg.Password == "" {
  61. //create error here
  62. log.Fatal("no password provided")
  63. } else {
  64. password = nodecfg.Password
  65. }
  66. }
  67. fmt.Println(" Password: " + password)
  68. if group == "badgroup" {
  69. if nodecfg.Group == "" {
  70. //create error here
  71. log.Fatal("no group provided")
  72. } else {
  73. group = nodecfg.Group
  74. }
  75. }
  76. fmt.Println(" Group: " + group)
  77. var macaddress string
  78. var localaddress string
  79. var listenport int32
  80. var keepalive int32
  81. var publickey wgtypes.Key
  82. var privatekey wgtypes.Key
  83. var privkeystring string
  84. var endpoint string
  85. var name string
  86. var wginterface string
  87. if nodecfg.Endpoint == "" {
  88. resp, err := http.Get("https://ifconfig.me")
  89. if err != nil {
  90. return err
  91. }
  92. defer resp.Body.Close()
  93. if resp.StatusCode == http.StatusOK {
  94. bodyBytes, err := ioutil.ReadAll(resp.Body)
  95. if err != nil {
  96. return err
  97. }
  98. endpoint = string(bodyBytes)
  99. }
  100. } else {
  101. endpoint = nodecfg.Endpoint
  102. }
  103. fmt.Println(" Public Endpoint: " + endpoint)
  104. if nodecfg.LocalAddress == "" {
  105. ifaces, err := net.Interfaces()
  106. if err != nil {
  107. return err
  108. }
  109. var local string
  110. found := false
  111. for _, i := range ifaces {
  112. if i.Flags&net.FlagUp == 0 {
  113. continue // interface down
  114. }
  115. if i.Flags&net.FlagLoopback != 0 {
  116. continue // loopback interface
  117. }
  118. addrs, err := i.Addrs()
  119. if err != nil {
  120. return err
  121. }
  122. for _, addr := range addrs {
  123. var ip net.IP
  124. switch v := addr.(type) {
  125. case *net.IPNet:
  126. if !found {
  127. ip = v.IP
  128. local = ip.String()
  129. found = true
  130. }
  131. case *net.IPAddr:
  132. if !found {
  133. ip = v.IP
  134. local = ip.String()
  135. found = true
  136. }
  137. }
  138. }
  139. }
  140. localaddress = local
  141. } else {
  142. localaddress = nodecfg.LocalAddress
  143. }
  144. fmt.Println(" Local Address: " + localaddress)
  145. if nodecfg.Name != "" {
  146. name = nodecfg.Name
  147. }
  148. fmt.Println(" Name: " + name)
  149. if nodecfg.Interface != "" {
  150. wginterface = nodecfg.Interface
  151. }
  152. fmt.Println(" Interface: " + wginterface)
  153. if nodecfg.KeepAlive != 0 {
  154. keepalive = nodecfg.KeepAlive
  155. }
  156. fmt.Println(" KeepAlive: " + wginterface)
  157. if nodecfg.Port != 0 {
  158. listenport = nodecfg.Port
  159. }
  160. fmt.Println(" Port: " + string(listenport))
  161. if nodecfg.PrivateKey != "" {
  162. privkeystring = nodecfg.PrivateKey
  163. privatekey, err := wgtypes.ParseKey(nodecfg.PrivateKey)
  164. if err != nil {
  165. log.Fatal(err)
  166. }
  167. if nodecfg.PublicKey != "" {
  168. publickey, err = wgtypes.ParseKey(nodecfg.PublicKey)
  169. if err != nil {
  170. log.Fatal(err)
  171. }
  172. } else {
  173. publickey = privatekey.PublicKey()
  174. }
  175. } else {
  176. privatekey, err := wgtypes.GeneratePrivateKey()
  177. if err != nil {
  178. log.Fatal(err)
  179. }
  180. privkeystring = privatekey.String()
  181. publickey = privatekey.PublicKey()
  182. }
  183. if nodecfg.MacAddress != "" {
  184. macaddress = nodecfg.MacAddress
  185. } else {
  186. macs, err := getMacAddr()
  187. if err != nil {
  188. return err
  189. } else if len(macs) == 0 {
  190. log.Fatal()
  191. } else {
  192. macaddress = macs[0]
  193. }
  194. }
  195. fmt.Println(" Mac Address: " + macaddress)
  196. fmt.Println(" Private Key: " + privatekey.String())
  197. fmt.Println(" Public Key: " + publickey.String())
  198. var wcclient nodepb.NodeServiceClient
  199. var requestOpts grpc.DialOption
  200. requestOpts = grpc.WithInsecure()
  201. conn, err := grpc.Dial(server, requestOpts)
  202. if err != nil {
  203. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  204. }
  205. wcclient = nodepb.NewNodeServiceClient(conn)
  206. postnode := &nodepb.Node{
  207. Password: password,
  208. Macaddress: macaddress,
  209. Accesskey: accesskey,
  210. Nodegroup: group,
  211. Listenport: listenport,
  212. Keepalive: keepalive,
  213. Localaddress: localaddress,
  214. Interface: wginterface,
  215. Publickey: publickey.String(),
  216. Name: name,
  217. Endpoint: endpoint,
  218. }
  219. fmt.Println("Writing node settings to netconfig file.")
  220. err = modConfig(postnode)
  221. if err != nil {
  222. return err
  223. }
  224. res, err := wcclient.CreateNode(
  225. context.TODO(),
  226. &nodepb.CreateNodeReq{
  227. Node: postnode,
  228. },
  229. )
  230. if err != nil {
  231. return err
  232. }
  233. node := res.Node
  234. fmt.Println("Setting local config from server response")
  235. if err != nil {
  236. return err
  237. }
  238. fmt.Println("NODE RECIEVED SETTINGS: ")
  239. fmt.Println(" Password: " + node.Password)
  240. fmt.Println(" WG Address: " + node.Address)
  241. fmt.Println(" Group: " + node.Nodegroup)
  242. fmt.Println(" Public Endpoint: " + node.Endpoint)
  243. fmt.Println(" Local Address: " + node.Localaddress)
  244. fmt.Println(" Name: " + node.Name)
  245. fmt.Println(" Interface: " + node.Interface)
  246. fmt.Println(" Port: " + strconv.FormatInt(int64(node.Listenport), 10))
  247. fmt.Println(" KeepAlive: " + strconv.FormatInt(int64(node.Keepalive), 10))
  248. fmt.Println(" Public Key: " + node.Publickey)
  249. fmt.Println(" Mac Address: " + node.Macaddress)
  250. err = modConfig(node)
  251. if err != nil {
  252. return err
  253. }
  254. if node.Ispending {
  255. fmt.Println("Node is marked as PENDING.")
  256. fmt.Println("Awaiting approval from Admin before configuring WireGuard.")
  257. if !noauto {
  258. fmt.Println("Configuring Netmaker Service.")
  259. err = ConfigureSystemD()
  260. return err
  261. }
  262. }
  263. peers, err := getPeers(node.Macaddress, node.Nodegroup, server)
  264. if err != nil {
  265. return err
  266. }
  267. fmt.Println("retrived peers, setting wireguard config.")
  268. err = storePrivKey(privkeystring)
  269. if err != nil {
  270. return err
  271. }
  272. err = initWireguard(node, privkeystring, peers)
  273. if err != nil {
  274. return err
  275. }
  276. if !noauto {
  277. err = ConfigureSystemD()
  278. }
  279. if err != nil {
  280. return err
  281. }
  282. return err
  283. }
  284. func modConfig(node *nodepb.Node) error{
  285. modconfig := config.Config
  286. modconfig.ReadConfig()
  287. nodecfg := modconfig.Node
  288. if node.Name != ""{
  289. nodecfg.Name = node.Name
  290. }
  291. if node.Interface != ""{
  292. nodecfg.Interface = node.Interface
  293. }
  294. if node.Nodegroup != ""{
  295. nodecfg.Group = node.Nodegroup
  296. }
  297. if node.Macaddress != ""{
  298. nodecfg.MacAddress = node.Macaddress
  299. }
  300. if node.Localaddress != ""{
  301. nodecfg.LocalAddress = node.Localaddress
  302. }
  303. if node.Listenport != 0{
  304. nodecfg.Port = node.Listenport
  305. }
  306. if node.Keepalive != 0{
  307. nodecfg.KeepAlive = node.Keepalive
  308. }
  309. if node.Publickey != ""{
  310. nodecfg.PublicKey = node.Publickey
  311. }
  312. if node.Endpoint != ""{
  313. nodecfg.Endpoint = node.Endpoint
  314. }
  315. if node.Password != ""{
  316. nodecfg.Password = node.Password
  317. }
  318. if node.Address != ""{
  319. nodecfg.WGAddress = node.Address
  320. }
  321. if node.Postchanges != "" {
  322. nodecfg.PostChanges = node.Postchanges
  323. }
  324. modconfig.Node = nodecfg
  325. err := config.Write(modconfig)
  326. return err
  327. }
  328. func getMacAddr() ([]string, error) {
  329. ifas, err := net.Interfaces()
  330. if err != nil {
  331. return nil, err
  332. }
  333. var as []string
  334. for _, ifa := range ifas {
  335. a := ifa.HardwareAddr.String()
  336. if a != "" {
  337. as = append(as, a)
  338. }
  339. }
  340. return as, nil
  341. }
  342. /*
  343. func read(macaddress string, group string) error {
  344. //this would be used for retrieving state as set by the server.
  345. }
  346. func checkLocalConfigChange() error {
  347. }
  348. */
  349. func initWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig) error {
  350. ipExec, err := exec.LookPath("ip")
  351. if err != nil {
  352. return err
  353. }
  354. key, err := wgtypes.ParseKey(privkey)
  355. if err != nil {
  356. return err
  357. }
  358. wgclient, err := wgctrl.New()
  359. modcfg := config.Config
  360. modcfg.ReadConfig()
  361. nodecfg := modcfg.Node
  362. fmt.Println("beginning local WG config")
  363. if err != nil {
  364. log.Fatalf("failed to open client: %v", err)
  365. }
  366. defer wgclient.Close()
  367. fmt.Println("setting local settings")
  368. ifacename := node.Interface
  369. if nodecfg.Interface != "" {
  370. ifacename = nodecfg.Interface
  371. } else if node.Interface != "" {
  372. ifacename = node.Interface
  373. } else {
  374. log.Fatal("no interface to configure")
  375. }
  376. if node.Address == "" {
  377. log.Fatal("no address to configure")
  378. }
  379. cmdIPDevLinkAdd := &exec.Cmd {
  380. Path: ipExec,
  381. Args: []string{ ipExec, "link", "add", "dev", ifacename, "type", "wireguard" },
  382. Stdout: os.Stdout,
  383. Stderr: os.Stdout,
  384. }
  385. cmdIPAddrAdd := &exec.Cmd {
  386. Path: ipExec,
  387. Args: []string{ ipExec, "address", "add", "dev", ifacename, node.Address+"/24"},
  388. Stdout: os.Stdout,
  389. Stderr: os.Stdout,
  390. }
  391. currentiface, err := net.InterfaceByName(ifacename)
  392. if err != nil {
  393. err = cmdIPDevLinkAdd.Run()
  394. if err != nil && !strings.Contains(err.Error(), "exists") {
  395. fmt.Println("Error creating interface")
  396. //fmt.Println(err.Error())
  397. //return err
  398. }
  399. }
  400. match := false
  401. addrs, _ := currentiface.Addrs()
  402. for _, a := range addrs {
  403. if strings.Contains(a.String(), node.Address){
  404. match = true
  405. }
  406. }
  407. if !match {
  408. err = cmdIPAddrAdd.Run()
  409. if err != nil {
  410. fmt.Println("Error adding address")
  411. //return err
  412. }
  413. }
  414. var nodeport int
  415. nodeport = int(node.Listenport)
  416. fmt.Println("setting WG config from node and peers")
  417. //pubkey := privkey.PublicKey()
  418. conf := wgtypes.Config{
  419. PrivateKey: &key,
  420. ListenPort: &nodeport,
  421. ReplacePeers: true,
  422. Peers: peers,
  423. }
  424. _, err = wgclient.Device(ifacename)
  425. if err != nil {
  426. if os.IsNotExist(err) {
  427. fmt.Println("Device does not exist: ")
  428. fmt.Println(err)
  429. } else {
  430. log.Fatalf("Unknown config error: %v", err)
  431. }
  432. }
  433. fmt.Println("configuring WG device")
  434. err = wgclient.ConfigureDevice(ifacename, conf)
  435. if err != nil {
  436. if os.IsNotExist(err) {
  437. fmt.Println("Device does not exist: ")
  438. fmt.Println(err)
  439. } else {
  440. fmt.Printf("This is inconvenient: %v", err)
  441. }
  442. }
  443. cmdIPLinkUp := &exec.Cmd {
  444. Path: ipExec,
  445. Args: []string{ ipExec, "link", "set", "up", "dev", ifacename},
  446. Stdout: os.Stdout,
  447. Stderr: os.Stdout,
  448. }
  449. cmdIPLinkDown := &exec.Cmd {
  450. Path: ipExec,
  451. Args: []string{ ipExec, "link", "set", "down", "dev", ifacename},
  452. Stdout: os.Stdout,
  453. Stderr: os.Stdout,
  454. }
  455. err = cmdIPLinkDown.Run()
  456. err = cmdIPLinkUp.Run()
  457. if err != nil {
  458. return err
  459. }
  460. return err
  461. }
  462. func setWGConfig() error {
  463. servercfg := config.Config.Server
  464. nodecfg := config.Config.Node
  465. node := getNode()
  466. peers, err := getPeers(node.Macaddress, nodecfg.Group, servercfg.Address)
  467. if err != nil {
  468. return err
  469. }
  470. privkey, err := retrievePrivKey()
  471. if err != nil {
  472. return err
  473. }
  474. err = initWireguard(&node, privkey, peers)
  475. if err != nil {
  476. return err
  477. }
  478. return err
  479. }
  480. func storePrivKey(key string) error{
  481. d1 := []byte(key)
  482. err := ioutil.WriteFile("/root/.wckey", d1, 0644)
  483. return err
  484. }
  485. func retrievePrivKey() (string, error) {
  486. dat, err := ioutil.ReadFile("/root/.wckey")
  487. return string(dat), err
  488. }
  489. func getPublicAddr() (string, error) {
  490. resp, err := http.Get("https://ifconfig.me")
  491. if err != nil {
  492. return "", err
  493. }
  494. defer resp.Body.Close()
  495. endpoint := ""
  496. if resp.StatusCode == http.StatusOK {
  497. bodyBytes, err := ioutil.ReadAll(resp.Body)
  498. if err != nil {
  499. return "", err
  500. }
  501. endpoint = string(bodyBytes)
  502. }
  503. return endpoint, err
  504. }
  505. func getPrivateAddr() (string, error) {
  506. ifaces, err := net.Interfaces()
  507. if err != nil {
  508. return "", err
  509. }
  510. var local string
  511. found := false
  512. for _, i := range ifaces {
  513. if i.Flags&net.FlagUp == 0 {
  514. continue // interface down
  515. }
  516. if i.Flags&net.FlagLoopback != 0 {
  517. continue // loopback interface
  518. }
  519. addrs, err := i.Addrs()
  520. if err != nil {
  521. return "", err
  522. }
  523. for _, addr := range addrs {
  524. var ip net.IP
  525. switch v := addr.(type) {
  526. case *net.IPNet:
  527. if !found {
  528. ip = v.IP
  529. local = ip.String()
  530. found = true
  531. }
  532. case *net.IPAddr:
  533. if !found {
  534. ip = v.IP
  535. local = ip.String()
  536. found = true
  537. }
  538. }
  539. }
  540. }
  541. if !found {
  542. err := errors.New("Local Address Not Found.")
  543. return "", err
  544. }
  545. return local, err
  546. }
  547. func CheckIn() error {
  548. node := getNode()
  549. nodecfg := config.Config.Node
  550. servercfg := config.Config.Server
  551. fmt.Println("Checking into server: " + servercfg.Address)
  552. setupcheck := true
  553. ipchange := false
  554. if !nodecfg.RoamingOff {
  555. fmt.Println("Checking to see if addresses have changed")
  556. extIP, err := getPublicAddr()
  557. if err != nil {
  558. fmt.Printf("Error encountered checking ip addresses: %v", err)
  559. }
  560. if nodecfg.Endpoint != extIP && extIP != "" {
  561. fmt.Println("Endpoint has changed from " +
  562. nodecfg.Endpoint + " to " + extIP)
  563. fmt.Println("Updating address")
  564. nodecfg.Endpoint = extIP
  565. nodecfg.PostChanges = "true"
  566. node.Endpoint = extIP
  567. node.Postchanges = "true"
  568. ipchange = true
  569. }
  570. intIP, err := getPrivateAddr()
  571. if err != nil {
  572. fmt.Printf("Error encountered checking ip addresses: %v", err)
  573. }
  574. if nodecfg.LocalAddress != intIP && intIP != "" {
  575. fmt.Println("Local Address has changed from " +
  576. nodecfg.LocalAddress + " to " + intIP)
  577. fmt.Println("Updating address")
  578. nodecfg.LocalAddress = intIP
  579. nodecfg.PostChanges = "true"
  580. node.Localaddress = intIP
  581. node.Postchanges = "true"
  582. ipchange = true
  583. }
  584. if node.Postchanges != "true" {
  585. fmt.Println("Addresses have not changed.")
  586. }
  587. }
  588. if ipchange {
  589. err := modConfig(&node)
  590. if err != nil {
  591. return err
  592. log.Fatalf("Error: %v", err)
  593. }
  594. err = setWGConfig()
  595. if err != nil {
  596. return err
  597. log.Fatalf("Error: %v", err)
  598. }
  599. node = getNode()
  600. nodecfg = config.Config.Node
  601. }
  602. var wcclient nodepb.NodeServiceClient
  603. var requestOpts grpc.DialOption
  604. requestOpts = grpc.WithInsecure()
  605. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  606. if err != nil {
  607. fmt.Printf("Cant dial GRPC server: %v", err)
  608. return err
  609. }
  610. wcclient = nodepb.NewNodeServiceClient(conn)
  611. ctx := context.Background()
  612. fmt.Println("Authenticating with GRPC Server")
  613. ctx, err = SetJWT(wcclient)
  614. if err != nil {
  615. fmt.Printf("Failed to authenticate: %v", err)
  616. return err
  617. }
  618. fmt.Println("Authenticated")
  619. fmt.Println("Checking In.")
  620. var header metadata.MD
  621. checkinres, err := wcclient.CheckIn(
  622. ctx,
  623. &nodepb.CheckInReq{
  624. Node: &node,
  625. },
  626. grpc.Header(&header),
  627. )
  628. if err != nil {
  629. if checkinres != nil && checkinres.Checkinresponse.Ispending {
  630. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.")
  631. return nil
  632. }
  633. fmt.Printf("Unable to process Check In request: %v", err)
  634. return err
  635. }
  636. fmt.Println("Checked in.")
  637. if checkinres.Checkinresponse.Ispending {
  638. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.")
  639. return err
  640. }
  641. newinterface := getNode().Interface
  642. readreq := &nodepb.ReadNodeReq{
  643. Macaddress: node.Macaddress,
  644. Group: node.Nodegroup,
  645. }
  646. readres, err := wcclient.ReadNode(ctx, readreq, grpc.Header(&header))
  647. if err != nil {
  648. fmt.Printf("Error: %v", err)
  649. } else {
  650. currentiface := readres.Node.Interface
  651. ifaceupdate := newinterface != currentiface
  652. if err != nil {
  653. log.Printf("Error retrieving interface: %v", err)
  654. }
  655. if ifaceupdate {
  656. fmt.Println("Interface update: " + currentiface +
  657. " >>>> " + newinterface)
  658. err := DeleteInterface(currentiface)
  659. if err != nil {
  660. fmt.Println("ERROR DELETING INTERFACE: " + currentiface)
  661. }
  662. }
  663. err = setWGConfig()
  664. }
  665. if checkinres.Checkinresponse.Needconfigupdate {
  666. fmt.Println("Server has requested that node update config.")
  667. fmt.Println("Updating config from remote server.")
  668. req := &nodepb.ReadNodeReq{
  669. Macaddress: node.Macaddress,
  670. Group: node.Nodegroup,
  671. }
  672. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  673. if err != nil {
  674. return err
  675. log.Fatalf("Error: %v", err)
  676. }
  677. err = modConfig(readres.Node)
  678. if err != nil {
  679. return err
  680. log.Fatalf("Error: %v", err)
  681. }
  682. err = setWGConfig()
  683. if err != nil {
  684. return err
  685. log.Fatalf("Error: %v", err)
  686. }
  687. setupcheck = false
  688. } else if nodecfg.PostChanges == "true" {
  689. fmt.Println("Node has requested to update remote config.")
  690. fmt.Println("Posting local config to remote server.")
  691. postnode := getNode()
  692. req := &nodepb.UpdateNodeReq{
  693. Node: &postnode,
  694. }
  695. res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  696. if err != nil {
  697. return err
  698. log.Fatalf("Error: %v", err)
  699. }
  700. res.Node.Postchanges = "false"
  701. err = modConfig(res.Node)
  702. if err != nil {
  703. return err
  704. log.Fatalf("Error: %v", err)
  705. }
  706. err = setWGConfig()
  707. if err != nil {
  708. return err
  709. log.Fatalf("Error: %v", err)
  710. }
  711. setupcheck = false
  712. }
  713. if checkinres.Checkinresponse.Needpeerupdate {
  714. fmt.Println("Server has requested that node update peer list.")
  715. fmt.Println("Updating peer list from remote server.")
  716. err = setWGConfig()
  717. if err != nil {
  718. return err
  719. log.Fatalf("Unable to process Set Peers request: %v", err)
  720. }
  721. setupcheck = false
  722. }
  723. if setupcheck {
  724. iface := nodecfg.Interface
  725. _, err := net.InterfaceByName(iface)
  726. if err != nil {
  727. fmt.Println("interface " + iface + " does not currently exist. Setting up WireGuard.")
  728. err = setWGConfig()
  729. if err != nil {
  730. return err
  731. log.Fatalf("Error: %v", err)
  732. }
  733. }
  734. }
  735. return nil
  736. }
  737. func needInterfaceUpdate(ctx context.Context, mac string, group string, iface string) (bool, string, error) {
  738. var header metadata.MD
  739. req := &nodepb.ReadNodeReq{
  740. Macaddress: mac,
  741. Group: group,
  742. }
  743. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  744. if err != nil {
  745. return false, "", err
  746. log.Fatalf("Error: %v", err)
  747. }
  748. oldiface := readres.Node.Interface
  749. return iface != oldiface, oldiface, err
  750. }
  751. func getNode() nodepb.Node {
  752. modcfg := config.Config
  753. modcfg.ReadConfig()
  754. nodecfg := modcfg.Node
  755. var node nodepb.Node
  756. node.Name = nodecfg.Name
  757. node.Interface = nodecfg.Interface
  758. node.Nodegroup = nodecfg.Group
  759. node.Localaddress = nodecfg.LocalAddress
  760. node.Address = nodecfg.WGAddress
  761. node.Listenport = nodecfg.Port
  762. node.Keepalive = nodecfg.KeepAlive
  763. node.Postup = nodecfg.PostUp
  764. node.Preup = nodecfg.PreUp
  765. node.Publickey = nodecfg.PublicKey
  766. node.Macaddress = nodecfg.MacAddress
  767. node.Endpoint = nodecfg.Endpoint
  768. node.Password = nodecfg.Password
  769. //spew.Dump(node)
  770. return node
  771. }
  772. func Remove() error {
  773. //need to implement checkin on server side
  774. servercfg := config.Config.Server
  775. node := config.Config.Node
  776. fmt.Println("Deleting remote node with MAC: " + node.MacAddress)
  777. var wcclient nodepb.NodeServiceClient
  778. var requestOpts grpc.DialOption
  779. requestOpts = grpc.WithInsecure()
  780. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  781. if err != nil {
  782. log.Printf("Unable to establish client connection to " + servercfg.Address + ": %v", err)
  783. return err
  784. }
  785. wcclient = nodepb.NewNodeServiceClient(conn)
  786. ctx := context.Background()
  787. fmt.Println("Authenticating with GRPC Server")
  788. ctx, err = SetJWT(wcclient)
  789. if err != nil {
  790. return err
  791. log.Fatalf("Failed to authenticate: %v", err)
  792. }
  793. fmt.Println("Authenticated")
  794. var header metadata.MD
  795. _, err = wcclient.DeleteNode(
  796. ctx,
  797. &nodepb.DeleteNodeReq{
  798. Macaddress: node.MacAddress,
  799. GroupName: node.Group,
  800. },
  801. grpc.Header(&header),
  802. )
  803. if err != nil {
  804. fmt.Println("Encountered error deleting node.")
  805. fmt.Println(err)
  806. //return err
  807. //log.Fatalf("Unable to process Delete request: %v", err)
  808. }
  809. fmt.Println("Deleted node " + node.MacAddress)
  810. err = WipeLocal()
  811. if err != nil {
  812. //return err
  813. log.Printf("Unable to wipe local config: %v", err)
  814. }
  815. err = RemoveSystemDServices()
  816. if err != nil {
  817. return err
  818. log.Fatalf("Unable to remove systemd services: %v", err)
  819. }
  820. return nil
  821. }
  822. func WipeLocal() error{
  823. nodecfg := config.Config.Node
  824. ifacename := nodecfg.Interface
  825. //home, err := homedir.Dir()
  826. home := "/etc/netclient"
  827. err := os.Remove(home + "/.netconfig")
  828. if err != nil {
  829. fmt.Println(err)
  830. }
  831. err = os.Remove(home + "/.nettoken")
  832. if err != nil {
  833. fmt.Println(err)
  834. }
  835. ipExec, err := exec.LookPath("ip")
  836. if ifacename != "" {
  837. cmdIPLinkDel := &exec.Cmd {
  838. Path: ipExec,
  839. Args: []string{ ipExec, "link", "del", ifacename },
  840. Stdout: os.Stdout,
  841. Stderr: os.Stdout,
  842. }
  843. err = cmdIPLinkDel.Run()
  844. if err != nil {
  845. fmt.Println(err)
  846. }
  847. }
  848. return err
  849. }
  850. func DeleteInterface(ifacename string) error{
  851. ipExec, err := exec.LookPath("ip")
  852. cmdIPLinkDel := &exec.Cmd {
  853. Path: ipExec,
  854. Args: []string{ ipExec, "link", "del", ifacename },
  855. Stdout: os.Stdout,
  856. Stderr: os.Stdout,
  857. }
  858. err = cmdIPLinkDel.Run()
  859. if err != nil {
  860. fmt.Println(err)
  861. }
  862. return err
  863. }
  864. func getPeers(macaddress string, group string, server string) ([]wgtypes.PeerConfig, error) {
  865. //need to implement checkin on server side
  866. var peers []wgtypes.PeerConfig
  867. var wcclient nodepb.NodeServiceClient
  868. modcfg := config.Config
  869. modcfg.ReadConfig()
  870. nodecfg := modcfg.Node
  871. keepalive := nodecfg.KeepAlive
  872. keepalivedur, err := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s")
  873. if err != nil {
  874. log.Fatalf("Issue with format of keepalive value. Please update netconfig: %v", err)
  875. }
  876. fmt.Println("Registering with GRPC Server")
  877. requestOpts := grpc.WithInsecure()
  878. conn, err := grpc.Dial(server, requestOpts)
  879. if err != nil {
  880. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  881. }
  882. // Instantiate the BlogServiceClient with our client connection to the server
  883. wcclient = nodepb.NewNodeServiceClient(conn)
  884. req := &nodepb.GetPeersReq{
  885. Macaddress: macaddress,
  886. Group: group,
  887. }
  888. ctx := context.Background()
  889. fmt.Println("Authenticating with GRPC Server")
  890. ctx, err = SetJWT(wcclient)
  891. if err != nil {
  892. fmt.Println("Failed to authenticate.")
  893. return peers, err
  894. }
  895. var header metadata.MD
  896. stream, err := wcclient.GetPeers(ctx, req, grpc.Header(&header))
  897. if err != nil {
  898. return nil, err
  899. }
  900. fmt.Println("Parsing peers response")
  901. for {
  902. // stream.Recv returns a pointer to a ListBlogRes at the current iteration
  903. res, err := stream.Recv()
  904. // If end of stream, break the loop
  905. if err == io.EOF {
  906. break
  907. }
  908. // if err, return an error
  909. if err != nil {
  910. if strings.Contains(err.Error(), "mongo: no documents in result") {
  911. break
  912. } else {
  913. fmt.Println("ERROR ENCOUNTERED WITH RESPONSE")
  914. fmt.Println(res)
  915. return peers, err
  916. }
  917. }
  918. pubkey, err := wgtypes.ParseKey(res.Peers.Publickey)
  919. if err != nil {
  920. fmt.Println("error parsing key")
  921. return peers, err
  922. }
  923. var peer wgtypes.PeerConfig
  924. if keepalive != 0 {
  925. peer = wgtypes.PeerConfig{
  926. PublicKey: pubkey,
  927. PersistentKeepaliveInterval: &keepalivedur,
  928. Endpoint: &net.UDPAddr{
  929. IP: net.ParseIP(res.Peers.Endpoint),
  930. Port: int(res.Peers.Listenport),
  931. },
  932. ReplaceAllowedIPs: true,
  933. AllowedIPs: []net.IPNet{{
  934. IP: net.ParseIP(res.Peers.Address),
  935. Mask: net.CIDRMask(32, 32),
  936. }},
  937. }
  938. } else {
  939. peer = wgtypes.PeerConfig{
  940. PublicKey: pubkey,
  941. Endpoint: &net.UDPAddr{
  942. IP: net.ParseIP(res.Peers.Endpoint),
  943. Port: int(res.Peers.Listenport),
  944. },
  945. ReplaceAllowedIPs: true,
  946. AllowedIPs: []net.IPNet{{
  947. IP: net.ParseIP(res.Peers.Address),
  948. Mask: net.CIDRMask(32, 32),
  949. }},
  950. }
  951. }
  952. peers = append(peers, peer)
  953. }
  954. fmt.Println("Finished parsing peers response")
  955. return peers, err
  956. }