common.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966
  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. currentiface, err := net.InterfaceByName(ifacename)
  391. if err != nil {
  392. err = cmdIPDevLinkAdd.Run()
  393. if err != nil && !strings.Contains(err.Error(), "exists") {
  394. fmt.Println("Error creating interface")
  395. //fmt.Println(err.Error())
  396. //return err
  397. }
  398. }
  399. match := false
  400. addrs, _ := currentiface.Addrs()
  401. for _, a := range addrs {
  402. fmt.Println("Current address: " + a.String())
  403. fmt.Println("node.Address: " + node.Address)
  404. if strings.Contains(a.String(), node.Address){
  405. match = true
  406. }
  407. }
  408. if !match {
  409. err = cmdIPAddrAdd.Run()
  410. if err != nil {
  411. fmt.Println("Error adding address")
  412. //return err
  413. }
  414. }
  415. var nodeport int
  416. nodeport = int(node.Listenport)
  417. fmt.Println("setting WG config from node and peers")
  418. //pubkey := privkey.PublicKey()
  419. conf := wgtypes.Config{
  420. PrivateKey: &key,
  421. ListenPort: &nodeport,
  422. ReplacePeers: true,
  423. Peers: peers,
  424. }
  425. _, err = wgclient.Device(ifacename)
  426. if err != nil {
  427. if os.IsNotExist(err) {
  428. fmt.Println("Device does not exist: ")
  429. fmt.Println(err)
  430. } else {
  431. log.Fatalf("Unknown config error: %v", err)
  432. }
  433. }
  434. fmt.Println("configuring WG device")
  435. err = wgclient.ConfigureDevice(ifacename, conf)
  436. if err != nil {
  437. if os.IsNotExist(err) {
  438. fmt.Println("Device does not exist: ")
  439. fmt.Println(err)
  440. } else {
  441. fmt.Printf("This is inconvenient: %v", err)
  442. }
  443. }
  444. cmdIPLinkUp := &exec.Cmd {
  445. Path: ipExec,
  446. Args: []string{ ipExec, "link", "set", "up", "dev", ifacename},
  447. Stdout: os.Stdout,
  448. Stderr: os.Stdout,
  449. }
  450. cmdIPLinkDown := &exec.Cmd {
  451. Path: ipExec,
  452. Args: []string{ ipExec, "link", "set", "down", "dev", ifacename},
  453. Stdout: os.Stdout,
  454. Stderr: os.Stdout,
  455. }
  456. err = cmdIPLinkDown.Run()
  457. err = cmdIPLinkUp.Run()
  458. if err != nil {
  459. return err
  460. }
  461. return err
  462. }
  463. /*
  464. func reconfigureWireguardSelf(node nodepb.Node) error {
  465. }
  466. func reconfigureWireguardPeers(peers []nodepb.PeersResponse) error {
  467. }
  468. func update(node nodepb.Node) error {
  469. }
  470. func updateLocal() error {
  471. }
  472. */
  473. func setWGConfig() error {
  474. servercfg := config.Config.Server
  475. nodecfg := config.Config.Node
  476. node := getNode()
  477. peers, err := getPeers(node.Macaddress, nodecfg.Group, servercfg.Address)
  478. if err != nil {
  479. return err
  480. }
  481. privkey, err := retrievePrivKey()
  482. if err != nil {
  483. return err
  484. }
  485. err = initWireguard(&node, privkey, peers)
  486. if err != nil {
  487. return err
  488. }
  489. return err
  490. }
  491. func storePrivKey(key string) error{
  492. d1 := []byte(key)
  493. err := ioutil.WriteFile("/root/.wckey", d1, 0644)
  494. return err
  495. }
  496. func retrievePrivKey() (string, error) {
  497. dat, err := ioutil.ReadFile("/root/.wckey")
  498. return string(dat), err
  499. }
  500. func CheckIn() error {
  501. node := getNode()
  502. nodecfg := config.Config.Node
  503. servercfg := config.Config.Server
  504. fmt.Println("Checking into server: " + servercfg.Address)
  505. setupcheck := true
  506. var wcclient nodepb.NodeServiceClient
  507. var requestOpts grpc.DialOption
  508. requestOpts = grpc.WithInsecure()
  509. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  510. if err != nil {
  511. fmt.Printf("Cant dial GRPC server: %v", err)
  512. return err
  513. }
  514. wcclient = nodepb.NewNodeServiceClient(conn)
  515. ctx := context.Background()
  516. fmt.Println("Authenticating with GRPC Server")
  517. ctx, err = SetJWT(wcclient)
  518. if err != nil {
  519. fmt.Printf("Failed to authenticate: %v", err)
  520. return err
  521. }
  522. fmt.Println("Authenticated")
  523. fmt.Println("Checking In.")
  524. var header metadata.MD
  525. checkinres, err := wcclient.CheckIn(
  526. ctx,
  527. &nodepb.CheckInReq{
  528. Node: &node,
  529. },
  530. grpc.Header(&header),
  531. )
  532. if err != nil {
  533. if checkinres != nil && checkinres.Checkinresponse.Ispending {
  534. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.")
  535. return nil
  536. }
  537. fmt.Printf("Unable to process Check In request: %v", err)
  538. return err
  539. }
  540. fmt.Println("Checked in.")
  541. if checkinres.Checkinresponse.Ispending {
  542. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.")
  543. return err
  544. }
  545. newinterface := getNode().Interface
  546. readreq := &nodepb.ReadNodeReq{
  547. Macaddress: node.Macaddress,
  548. Group: node.Nodegroup,
  549. }
  550. readres, err := wcclient.ReadNode(ctx, readreq, grpc.Header(&header))
  551. if err != nil {
  552. fmt.Printf("Error: %v", err)
  553. } else {
  554. currentiface := readres.Node.Interface
  555. ifaceupdate := newinterface != currentiface
  556. fmt.Println("Is it time to update the interface? ")
  557. fmt.Println(ifaceupdate)
  558. if err != nil {
  559. log.Printf("Error retrieving interface: %v", err)
  560. }
  561. if ifaceupdate {
  562. err := DeleteInterface(currentiface)
  563. if err != nil {
  564. fmt.Println("ERROR DELETING INTERFACE: " + currentiface)
  565. }
  566. }
  567. err = setWGConfig()
  568. }
  569. if checkinres.Checkinresponse.Needconfigupdate {
  570. fmt.Println("Server has requested that node update config.")
  571. fmt.Println("Updating config from remote server.")
  572. req := &nodepb.ReadNodeReq{
  573. Macaddress: node.Macaddress,
  574. Group: node.Nodegroup,
  575. }
  576. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  577. if err != nil {
  578. return err
  579. log.Fatalf("Error: %v", err)
  580. }
  581. err = modConfig(readres.Node)
  582. if err != nil {
  583. return err
  584. log.Fatalf("Error: %v", err)
  585. }
  586. err = setWGConfig()
  587. if err != nil {
  588. return err
  589. log.Fatalf("Error: %v", err)
  590. }
  591. setupcheck = false
  592. } else if nodecfg.PostChanges == "true" {
  593. fmt.Println("Node has requested to update remote config.")
  594. fmt.Println("Posting local config to remote server.")
  595. postnode := getNode()
  596. req := &nodepb.UpdateNodeReq{
  597. Node: &postnode,
  598. }
  599. res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  600. if err != nil {
  601. return err
  602. log.Fatalf("Error: %v", err)
  603. }
  604. res.Node.Postchanges = "false"
  605. err = modConfig(res.Node)
  606. if err != nil {
  607. return err
  608. log.Fatalf("Error: %v", err)
  609. }
  610. err = setWGConfig()
  611. if err != nil {
  612. return err
  613. log.Fatalf("Error: %v", err)
  614. }
  615. setupcheck = false
  616. }
  617. if checkinres.Checkinresponse.Needpeerupdate {
  618. fmt.Println("Server has requested that node update peer list.")
  619. fmt.Println("Updating peer list from remote server.")
  620. err = setWGConfig()
  621. if err != nil {
  622. return err
  623. log.Fatalf("Unable to process Set Peers request: %v", err)
  624. }
  625. setupcheck = false
  626. }
  627. if setupcheck {
  628. iface := nodecfg.Interface
  629. _, err := net.InterfaceByName(iface)
  630. if err != nil {
  631. fmt.Println("interface " + iface + " does not currently exist. Setting up WireGuard.")
  632. err = setWGConfig()
  633. if err != nil {
  634. return err
  635. log.Fatalf("Error: %v", err)
  636. }
  637. }
  638. }
  639. return nil
  640. }
  641. func needInterfaceUpdate(ctx context.Context, mac string, group string, iface string) (bool, string, error) {
  642. var header metadata.MD
  643. req := &nodepb.ReadNodeReq{
  644. Macaddress: mac,
  645. Group: group,
  646. }
  647. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  648. if err != nil {
  649. return false, "", err
  650. log.Fatalf("Error: %v", err)
  651. }
  652. oldiface := readres.Node.Interface
  653. return iface != oldiface, oldiface, err
  654. }
  655. func getNode() nodepb.Node {
  656. modcfg := config.Config
  657. modcfg.ReadConfig()
  658. nodecfg := modcfg.Node
  659. var node nodepb.Node
  660. node.Name = nodecfg.Name
  661. node.Interface = nodecfg.Interface
  662. node.Nodegroup = nodecfg.Group
  663. node.Localaddress = nodecfg.LocalAddress
  664. node.Address = nodecfg.WGAddress
  665. node.Listenport = nodecfg.Port
  666. node.Keepalive = nodecfg.KeepAlive
  667. node.Postup = nodecfg.PostUp
  668. node.Preup = nodecfg.PreUp
  669. node.Publickey = nodecfg.PublicKey
  670. node.Macaddress = nodecfg.MacAddress
  671. node.Endpoint = nodecfg.Endpoint
  672. node.Password = nodecfg.Password
  673. //spew.Dump(node)
  674. return node
  675. }
  676. func Remove() error {
  677. //need to implement checkin on server side
  678. servercfg := config.Config.Server
  679. node := config.Config.Node
  680. fmt.Println("Deleting remote node with MAC: " + node.MacAddress)
  681. var wcclient nodepb.NodeServiceClient
  682. var requestOpts grpc.DialOption
  683. requestOpts = grpc.WithInsecure()
  684. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  685. if err != nil {
  686. log.Printf("Unable to establish client connection to " + servercfg.Address + ": %v", err)
  687. return err
  688. }
  689. wcclient = nodepb.NewNodeServiceClient(conn)
  690. ctx := context.Background()
  691. fmt.Println("Authenticating with GRPC Server")
  692. ctx, err = SetJWT(wcclient)
  693. if err != nil {
  694. return err
  695. log.Fatalf("Failed to authenticate: %v", err)
  696. }
  697. fmt.Println("Authenticated")
  698. var header metadata.MD
  699. _, err = wcclient.DeleteNode(
  700. ctx,
  701. &nodepb.DeleteNodeReq{
  702. Macaddress: node.MacAddress,
  703. GroupName: node.Group,
  704. },
  705. grpc.Header(&header),
  706. )
  707. if err != nil {
  708. fmt.Println("Encountered error deleting node.")
  709. fmt.Println(err)
  710. //return err
  711. //log.Fatalf("Unable to process Delete request: %v", err)
  712. }
  713. fmt.Println("Deleted node " + node.MacAddress)
  714. err = WipeLocal()
  715. if err != nil {
  716. return err
  717. log.Fatalf("Unable to wipe local config: %v", err)
  718. }
  719. err = RemoveSystemDServices()
  720. if err != nil {
  721. return err
  722. log.Fatalf("Unable to remove systemd services: %v", err)
  723. }
  724. return nil
  725. }
  726. func WipeLocal() error{
  727. nodecfg := config.Config.Node
  728. ifacename := nodecfg.Interface
  729. //home, err := homedir.Dir()
  730. home := "/etc/netclient"
  731. err := os.Remove(home + "/.netconfig")
  732. if err != nil {
  733. fmt.Println(err)
  734. }
  735. err = os.Remove(home + "/.nettoken")
  736. if err != nil {
  737. fmt.Println(err)
  738. }
  739. ipExec, err := exec.LookPath("ip")
  740. cmdIPLinkDel := &exec.Cmd {
  741. Path: ipExec,
  742. Args: []string{ ipExec, "link", "del", ifacename },
  743. Stdout: os.Stdout,
  744. Stderr: os.Stdout,
  745. }
  746. err = cmdIPLinkDel.Run()
  747. if err != nil {
  748. fmt.Println(err)
  749. }
  750. return err
  751. }
  752. func DeleteInterface(ifacename string) error{
  753. ipExec, err := exec.LookPath("ip")
  754. cmdIPLinkDel := &exec.Cmd {
  755. Path: ipExec,
  756. Args: []string{ ipExec, "link", "del", ifacename },
  757. Stdout: os.Stdout,
  758. Stderr: os.Stdout,
  759. }
  760. err = cmdIPLinkDel.Run()
  761. if err != nil {
  762. fmt.Println(err)
  763. }
  764. return err
  765. }
  766. func getPeers(macaddress string, group string, server string) ([]wgtypes.PeerConfig, error) {
  767. //need to implement checkin on server side
  768. var peers []wgtypes.PeerConfig
  769. var wcclient nodepb.NodeServiceClient
  770. modcfg := config.Config
  771. modcfg.ReadConfig()
  772. nodecfg := modcfg.Node
  773. keepalive := nodecfg.KeepAlive
  774. keepalivedur, err := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s")
  775. if err != nil {
  776. log.Fatalf("Issue with format of keepalive value. Please update netconfig: %v", err)
  777. }
  778. fmt.Println("Registering with GRPC Server")
  779. requestOpts := grpc.WithInsecure()
  780. conn, err := grpc.Dial(server, requestOpts)
  781. if err != nil {
  782. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  783. }
  784. // Instantiate the BlogServiceClient with our client connection to the server
  785. wcclient = nodepb.NewNodeServiceClient(conn)
  786. req := &nodepb.GetPeersReq{
  787. Macaddress: macaddress,
  788. Group: group,
  789. }
  790. ctx := context.Background()
  791. fmt.Println("Authenticating with GRPC Server")
  792. ctx, err = SetJWT(wcclient)
  793. if err != nil {
  794. fmt.Println("Failed to authenticate.")
  795. return peers, err
  796. }
  797. var header metadata.MD
  798. stream, err := wcclient.GetPeers(ctx, req, grpc.Header(&header))
  799. if err != nil {
  800. return nil, err
  801. }
  802. fmt.Println("Parsing peers response")
  803. for {
  804. // stream.Recv returns a pointer to a ListBlogRes at the current iteration
  805. res, err := stream.Recv()
  806. // If end of stream, break the loop
  807. if err == io.EOF {
  808. break
  809. }
  810. // if err, return an error
  811. if err != nil {
  812. if strings.Contains(err.Error(), "mongo: no documents in result") {
  813. break
  814. } else {
  815. fmt.Println("ERROR ENCOUNTERED WITH RESPONSE")
  816. fmt.Println(res)
  817. return peers, err
  818. }
  819. }
  820. pubkey, err := wgtypes.ParseKey(res.Peers.Publickey)
  821. if err != nil {
  822. fmt.Println("error parsing key")
  823. return peers, err
  824. }
  825. var peer wgtypes.PeerConfig
  826. if keepalive != 0 {
  827. peer = wgtypes.PeerConfig{
  828. PublicKey: pubkey,
  829. PersistentKeepaliveInterval: &keepalivedur,
  830. Endpoint: &net.UDPAddr{
  831. IP: net.ParseIP(res.Peers.Endpoint),
  832. Port: int(res.Peers.Listenport),
  833. },
  834. ReplaceAllowedIPs: true,
  835. AllowedIPs: []net.IPNet{{
  836. IP: net.ParseIP(res.Peers.Address),
  837. Mask: net.CIDRMask(32, 32),
  838. }},
  839. }
  840. } else {
  841. peer = wgtypes.PeerConfig{
  842. PublicKey: pubkey,
  843. Endpoint: &net.UDPAddr{
  844. IP: net.ParseIP(res.Peers.Endpoint),
  845. Port: int(res.Peers.Listenport),
  846. },
  847. ReplaceAllowedIPs: true,
  848. AllowedIPs: []net.IPNet{{
  849. IP: net.ParseIP(res.Peers.Address),
  850. Mask: net.CIDRMask(32, 32),
  851. }},
  852. }
  853. }
  854. peers = append(peers, peer)
  855. }
  856. fmt.Println("Finished parsing peers response")
  857. return peers, err
  858. }