common.go 23 KB

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