common.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913
  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 netconfig 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 Netmaker 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. fmt.Println("Checking into server: " + servercfg.Address)
  491. setupcheck := true
  492. var wcclient nodepb.NodeServiceClient
  493. var requestOpts grpc.DialOption
  494. requestOpts = grpc.WithInsecure()
  495. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  496. if err != nil {
  497. fmt.Printf("Cant dial GRPC server: %v", err)
  498. return err
  499. }
  500. wcclient = nodepb.NewNodeServiceClient(conn)
  501. ctx := context.Background()
  502. fmt.Println("Authenticating with GRPC Server")
  503. ctx, err = SetJWT(wcclient)
  504. if err != nil {
  505. fmt.Printf("Failed to authenticate: %v", err)
  506. return err
  507. }
  508. fmt.Println("Authenticated")
  509. fmt.Println("Checking In.")
  510. var header metadata.MD
  511. checkinres, err := wcclient.CheckIn(
  512. ctx,
  513. &nodepb.CheckInReq{
  514. Node: &node,
  515. },
  516. grpc.Header(&header),
  517. )
  518. if err != nil {
  519. if checkinres != nil && checkinres.Checkinresponse.Ispending {
  520. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.")
  521. return nil
  522. }
  523. fmt.Printf("Unable to process Check In request: %v", err)
  524. return err
  525. }
  526. fmt.Println("Checked in.")
  527. if checkinres.Checkinresponse.Ispending {
  528. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.")
  529. return err
  530. }
  531. if checkinres.Checkinresponse.Needconfigupdate {
  532. fmt.Println("Server has requested that node update config.")
  533. fmt.Println("Updating config from remote server.")
  534. req := &nodepb.ReadNodeReq{
  535. Macaddress: node.Macaddress,
  536. Group: node.Nodegroup,
  537. }
  538. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  539. if err != nil {
  540. return err
  541. log.Fatalf("Error: %v", err)
  542. }
  543. err = modConfig(readres.Node)
  544. if err != nil {
  545. return err
  546. log.Fatalf("Error: %v", err)
  547. }
  548. err = setWGConfig()
  549. if err != nil {
  550. return err
  551. log.Fatalf("Error: %v", err)
  552. }
  553. setupcheck = false
  554. } else if nodecfg.PostChanges == "true" {
  555. fmt.Println("Node has requested to update remote config.")
  556. fmt.Println("Posting local config to remote server.")
  557. postnode := getNode()
  558. currentinterface := postnode.Interface
  559. req := &nodepb.UpdateNodeReq{
  560. Node: &postnode,
  561. }
  562. res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  563. if err != nil {
  564. return err
  565. log.Fatalf("Error: %v", err)
  566. }
  567. res.Node.Postchanges = "false"
  568. newinterface := res.Node.Interface
  569. err = modConfig(res.Node)
  570. if err != nil {
  571. return err
  572. log.Fatalf("Error: %v", err)
  573. }
  574. if currentinterface != newinterface {
  575. err := DeleteInterface(currentinterface)
  576. if err != nil {
  577. fmt.Println("ERROR DELETING INTERFACE: " + currentinterface)
  578. }
  579. }
  580. err = setWGConfig()
  581. if err != nil {
  582. return err
  583. log.Fatalf("Error: %v", err)
  584. }
  585. setupcheck = false
  586. }
  587. if checkinres.Checkinresponse.Needpeerupdate {
  588. fmt.Println("Server has requested that node update peer list.")
  589. fmt.Println("Updating peer list from remote server.")
  590. err = setWGConfig()
  591. if err != nil {
  592. return err
  593. log.Fatalf("Unable to process Set Peers request: %v", err)
  594. }
  595. setupcheck = false
  596. }
  597. if setupcheck {
  598. iface := nodecfg.Interface
  599. _, err := net.InterfaceByName(iface)
  600. if err != nil {
  601. fmt.Println("interface " + iface + " does not currently exist. Setting up WireGuard.")
  602. err = setWGConfig()
  603. if err != nil {
  604. return err
  605. log.Fatalf("Error: %v", err)
  606. }
  607. }
  608. }
  609. return nil
  610. }
  611. func getNode() nodepb.Node {
  612. modcfg := config.Config
  613. modcfg.ReadConfig()
  614. nodecfg := modcfg.Node
  615. var node nodepb.Node
  616. node.Name = nodecfg.Name
  617. node.Interface = nodecfg.Interface
  618. node.Nodegroup = nodecfg.Group
  619. node.Localaddress = nodecfg.LocalAddress
  620. node.Address = nodecfg.WGAddress
  621. node.Listenport = nodecfg.Port
  622. node.Keepalive = nodecfg.KeepAlive
  623. node.Postup = nodecfg.PostUp
  624. node.Preup = nodecfg.PreUp
  625. node.Publickey = nodecfg.PublicKey
  626. node.Macaddress = nodecfg.MacAddress
  627. node.Endpoint = nodecfg.Endpoint
  628. node.Password = nodecfg.Password
  629. //spew.Dump(node)
  630. return node
  631. }
  632. func Remove() error {
  633. //need to implement checkin on server side
  634. servercfg := config.Config.Server
  635. node := config.Config.Node
  636. fmt.Println("Deleting remote node with MAC: " + node.MacAddress)
  637. var wcclient nodepb.NodeServiceClient
  638. var requestOpts grpc.DialOption
  639. requestOpts = grpc.WithInsecure()
  640. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  641. if err != nil {
  642. log.Printf("Unable to establish client connection to " + servercfg.Address + ": %v", err)
  643. return err
  644. }
  645. wcclient = nodepb.NewNodeServiceClient(conn)
  646. ctx := context.Background()
  647. fmt.Println("Authenticating with GRPC Server")
  648. ctx, err = SetJWT(wcclient)
  649. if err != nil {
  650. return err
  651. log.Fatalf("Failed to authenticate: %v", err)
  652. }
  653. fmt.Println("Authenticated")
  654. var header metadata.MD
  655. _, err = wcclient.DeleteNode(
  656. ctx,
  657. &nodepb.DeleteNodeReq{
  658. Macaddress: node.MacAddress,
  659. GroupName: node.Group,
  660. },
  661. grpc.Header(&header),
  662. )
  663. if err != nil {
  664. fmt.Println("Encountered error deleting node.")
  665. fmt.Println(err)
  666. //return err
  667. //log.Fatalf("Unable to process Delete request: %v", err)
  668. }
  669. fmt.Println("Deleted node " + node.MacAddress)
  670. err = WipeLocal()
  671. if err != nil {
  672. return err
  673. log.Fatalf("Unable to wipe local config: %v", err)
  674. }
  675. err = RemoveSystemDServices()
  676. if err != nil {
  677. return err
  678. log.Fatalf("Unable to remove systemd services: %v", err)
  679. }
  680. return nil
  681. }
  682. func WipeLocal() error{
  683. nodecfg := config.Config.Node
  684. ifacename := nodecfg.Interface
  685. //home, err := homedir.Dir()
  686. home := "/etc/netclient"
  687. err := os.Remove(home + "/.netconfig")
  688. if err != nil {
  689. fmt.Println(err)
  690. }
  691. err = os.Remove(home + "/.nettoken")
  692. if err != nil {
  693. fmt.Println(err)
  694. }
  695. ipExec, err := exec.LookPath("ip")
  696. cmdIPLinkDel := &exec.Cmd {
  697. Path: ipExec,
  698. Args: []string{ ipExec, "link", "del", ifacename },
  699. Stdout: os.Stdout,
  700. Stderr: os.Stdout,
  701. }
  702. err = cmdIPLinkDel.Run()
  703. if err != nil {
  704. fmt.Println(err)
  705. }
  706. return err
  707. }
  708. func DeleteInterface(ifacename string) error{
  709. ipExec, err := exec.LookPath("ip")
  710. cmdIPLinkDel := &exec.Cmd {
  711. Path: ipExec,
  712. Args: []string{ ipExec, "link", "del", ifacename },
  713. Stdout: os.Stdout,
  714. Stderr: os.Stdout,
  715. }
  716. err = cmdIPLinkDel.Run()
  717. if err != nil {
  718. fmt.Println(err)
  719. }
  720. return err
  721. }
  722. func getPeers(macaddress string, group string, server string) ([]wgtypes.PeerConfig, error) {
  723. //need to implement checkin on server side
  724. var peers []wgtypes.PeerConfig
  725. var wcclient nodepb.NodeServiceClient
  726. modcfg := config.Config
  727. modcfg.ReadConfig()
  728. nodecfg := modcfg.Node
  729. keepalive := nodecfg.KeepAlive
  730. keepalivedur, err := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s")
  731. if err != nil {
  732. log.Fatalf("Issue with format of keepalive value. Please update netconfig: %v", err)
  733. }
  734. fmt.Println("Registering with GRPC Server")
  735. requestOpts := grpc.WithInsecure()
  736. conn, err := grpc.Dial(server, requestOpts)
  737. if err != nil {
  738. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  739. }
  740. // Instantiate the BlogServiceClient with our client connection to the server
  741. wcclient = nodepb.NewNodeServiceClient(conn)
  742. req := &nodepb.GetPeersReq{
  743. Macaddress: macaddress,
  744. Group: group,
  745. }
  746. ctx := context.Background()
  747. fmt.Println("Authenticating with GRPC Server")
  748. ctx, err = SetJWT(wcclient)
  749. if err != nil {
  750. fmt.Println("Failed to authenticate.")
  751. return peers, err
  752. }
  753. var header metadata.MD
  754. stream, err := wcclient.GetPeers(ctx, req, grpc.Header(&header))
  755. if err != nil {
  756. return nil, err
  757. }
  758. fmt.Println("Parsing peers response")
  759. for {
  760. // stream.Recv returns a pointer to a ListBlogRes at the current iteration
  761. res, err := stream.Recv()
  762. // If end of stream, break the loop
  763. if err == io.EOF {
  764. break
  765. }
  766. // if err, return an error
  767. if err != nil {
  768. if strings.Contains(err.Error(), "mongo: no documents in result") {
  769. break
  770. } else {
  771. fmt.Println("ERROR ENCOUNTERED WITH RESPONSE")
  772. fmt.Println(res)
  773. return peers, err
  774. }
  775. }
  776. pubkey, err := wgtypes.ParseKey(res.Peers.Publickey)
  777. if err != nil {
  778. fmt.Println("error parsing key")
  779. return peers, err
  780. }
  781. var peer wgtypes.PeerConfig
  782. if keepalive != 0 {
  783. peer = wgtypes.PeerConfig{
  784. PublicKey: pubkey,
  785. PersistentKeepaliveInterval: &keepalivedur,
  786. Endpoint: &net.UDPAddr{
  787. IP: net.ParseIP(res.Peers.Endpoint),
  788. Port: int(res.Peers.Listenport),
  789. },
  790. ReplaceAllowedIPs: true,
  791. AllowedIPs: []net.IPNet{{
  792. IP: net.ParseIP(res.Peers.Address),
  793. Mask: net.CIDRMask(32, 32),
  794. }},
  795. }
  796. } else {
  797. peer = wgtypes.PeerConfig{
  798. PublicKey: pubkey,
  799. Endpoint: &net.UDPAddr{
  800. IP: net.ParseIP(res.Peers.Endpoint),
  801. Port: int(res.Peers.Listenport),
  802. },
  803. ReplaceAllowedIPs: true,
  804. AllowedIPs: []net.IPNet{{
  805. IP: net.ParseIP(res.Peers.Address),
  806. Mask: net.CIDRMask(32, 32),
  807. }},
  808. }
  809. }
  810. peers = append(peers, peer)
  811. }
  812. fmt.Println("Finished parsing peers response")
  813. return peers, err
  814. }