common.go 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042
  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. if !nodecfg.RoamingOff {
  554. fmt.Println("Checking to see if addresses have changed")
  555. extIP, err := getPublicAddr()
  556. if err != nil {
  557. fmt.Printf("Error encountered checking ip addresses: %v", err)
  558. }
  559. if nodecfg.Endpoint != extIP && extIP != "" {
  560. fmt.Println("Endpoint has changed from " +
  561. nodecfg.Endpoint + " to " + extIP)
  562. fmt.Println("Updating address")
  563. nodecfg.Endpoint = extIP
  564. nodecfg.PostChanges = "true"
  565. node.Endpoint = extIP
  566. node.Postchanges = "true"
  567. }
  568. intIP, err := getPrivateAddr()
  569. if err != nil {
  570. fmt.Printf("Error encountered checking ip addresses: %v", err)
  571. }
  572. if nodecfg.LocalAddress != intIP && intIP != "" {
  573. fmt.Println("Local Address has changed from " +
  574. nodecfg.LocalAddress + " to " + intIP)
  575. fmt.Println("Updating address")
  576. nodecfg.LocalAddress = intIP
  577. nodecfg.PostChanges = "true"
  578. node.Localaddress = intIP
  579. node.Postchanges = "true"
  580. }
  581. if node.Postchanges != "true" {
  582. fmt.Println("Addresses have not changed.")
  583. }
  584. }
  585. var wcclient nodepb.NodeServiceClient
  586. var requestOpts grpc.DialOption
  587. requestOpts = grpc.WithInsecure()
  588. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  589. if err != nil {
  590. fmt.Printf("Cant dial GRPC server: %v", err)
  591. return err
  592. }
  593. wcclient = nodepb.NewNodeServiceClient(conn)
  594. ctx := context.Background()
  595. fmt.Println("Authenticating with GRPC Server")
  596. ctx, err = SetJWT(wcclient)
  597. if err != nil {
  598. fmt.Printf("Failed to authenticate: %v", err)
  599. return err
  600. }
  601. fmt.Println("Authenticated")
  602. fmt.Println("Checking In.")
  603. var header metadata.MD
  604. checkinres, err := wcclient.CheckIn(
  605. ctx,
  606. &nodepb.CheckInReq{
  607. Node: &node,
  608. },
  609. grpc.Header(&header),
  610. )
  611. if err != nil {
  612. if checkinres != nil && checkinres.Checkinresponse.Ispending {
  613. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.")
  614. return nil
  615. }
  616. fmt.Printf("Unable to process Check In request: %v", err)
  617. return err
  618. }
  619. fmt.Println("Checked in.")
  620. if checkinres.Checkinresponse.Ispending {
  621. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.")
  622. return err
  623. }
  624. newinterface := getNode().Interface
  625. readreq := &nodepb.ReadNodeReq{
  626. Macaddress: node.Macaddress,
  627. Group: node.Nodegroup,
  628. }
  629. readres, err := wcclient.ReadNode(ctx, readreq, grpc.Header(&header))
  630. if err != nil {
  631. fmt.Printf("Error: %v", err)
  632. } else {
  633. currentiface := readres.Node.Interface
  634. ifaceupdate := newinterface != currentiface
  635. fmt.Println("Is it time to update the interface? ")
  636. fmt.Println(ifaceupdate)
  637. if err != nil {
  638. log.Printf("Error retrieving interface: %v", err)
  639. }
  640. if ifaceupdate {
  641. err := DeleteInterface(currentiface)
  642. if err != nil {
  643. fmt.Println("ERROR DELETING INTERFACE: " + currentiface)
  644. }
  645. }
  646. err = setWGConfig()
  647. }
  648. if checkinres.Checkinresponse.Needconfigupdate {
  649. fmt.Println("Server has requested that node update config.")
  650. fmt.Println("Updating config from remote server.")
  651. req := &nodepb.ReadNodeReq{
  652. Macaddress: node.Macaddress,
  653. Group: node.Nodegroup,
  654. }
  655. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  656. if err != nil {
  657. return err
  658. log.Fatalf("Error: %v", err)
  659. }
  660. err = modConfig(readres.Node)
  661. if err != nil {
  662. return err
  663. log.Fatalf("Error: %v", err)
  664. }
  665. err = setWGConfig()
  666. if err != nil {
  667. return err
  668. log.Fatalf("Error: %v", err)
  669. }
  670. setupcheck = false
  671. } else if nodecfg.PostChanges == "true" {
  672. fmt.Println("Node has requested to update remote config.")
  673. fmt.Println("Posting local config to remote server.")
  674. postnode := getNode()
  675. req := &nodepb.UpdateNodeReq{
  676. Node: &postnode,
  677. }
  678. res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  679. if err != nil {
  680. return err
  681. log.Fatalf("Error: %v", err)
  682. }
  683. res.Node.Postchanges = "false"
  684. err = modConfig(res.Node)
  685. if err != nil {
  686. return err
  687. log.Fatalf("Error: %v", err)
  688. }
  689. err = setWGConfig()
  690. if err != nil {
  691. return err
  692. log.Fatalf("Error: %v", err)
  693. }
  694. setupcheck = false
  695. }
  696. if checkinres.Checkinresponse.Needpeerupdate {
  697. fmt.Println("Server has requested that node update peer list.")
  698. fmt.Println("Updating peer list from remote server.")
  699. err = setWGConfig()
  700. if err != nil {
  701. return err
  702. log.Fatalf("Unable to process Set Peers request: %v", err)
  703. }
  704. setupcheck = false
  705. }
  706. if setupcheck {
  707. iface := nodecfg.Interface
  708. _, err := net.InterfaceByName(iface)
  709. if err != nil {
  710. fmt.Println("interface " + iface + " does not currently exist. Setting up WireGuard.")
  711. err = setWGConfig()
  712. if err != nil {
  713. return err
  714. log.Fatalf("Error: %v", err)
  715. }
  716. }
  717. }
  718. return nil
  719. }
  720. func needInterfaceUpdate(ctx context.Context, mac string, group string, iface string) (bool, string, error) {
  721. var header metadata.MD
  722. req := &nodepb.ReadNodeReq{
  723. Macaddress: mac,
  724. Group: group,
  725. }
  726. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  727. if err != nil {
  728. return false, "", err
  729. log.Fatalf("Error: %v", err)
  730. }
  731. oldiface := readres.Node.Interface
  732. return iface != oldiface, oldiface, err
  733. }
  734. func getNode() nodepb.Node {
  735. modcfg := config.Config
  736. modcfg.ReadConfig()
  737. nodecfg := modcfg.Node
  738. var node nodepb.Node
  739. node.Name = nodecfg.Name
  740. node.Interface = nodecfg.Interface
  741. node.Nodegroup = nodecfg.Group
  742. node.Localaddress = nodecfg.LocalAddress
  743. node.Address = nodecfg.WGAddress
  744. node.Listenport = nodecfg.Port
  745. node.Keepalive = nodecfg.KeepAlive
  746. node.Postup = nodecfg.PostUp
  747. node.Preup = nodecfg.PreUp
  748. node.Publickey = nodecfg.PublicKey
  749. node.Macaddress = nodecfg.MacAddress
  750. node.Endpoint = nodecfg.Endpoint
  751. node.Password = nodecfg.Password
  752. //spew.Dump(node)
  753. return node
  754. }
  755. func Remove() error {
  756. //need to implement checkin on server side
  757. servercfg := config.Config.Server
  758. node := config.Config.Node
  759. fmt.Println("Deleting remote node with MAC: " + node.MacAddress)
  760. var wcclient nodepb.NodeServiceClient
  761. var requestOpts grpc.DialOption
  762. requestOpts = grpc.WithInsecure()
  763. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  764. if err != nil {
  765. log.Printf("Unable to establish client connection to " + servercfg.Address + ": %v", err)
  766. return err
  767. }
  768. wcclient = nodepb.NewNodeServiceClient(conn)
  769. ctx := context.Background()
  770. fmt.Println("Authenticating with GRPC Server")
  771. ctx, err = SetJWT(wcclient)
  772. if err != nil {
  773. return err
  774. log.Fatalf("Failed to authenticate: %v", err)
  775. }
  776. fmt.Println("Authenticated")
  777. var header metadata.MD
  778. _, err = wcclient.DeleteNode(
  779. ctx,
  780. &nodepb.DeleteNodeReq{
  781. Macaddress: node.MacAddress,
  782. GroupName: node.Group,
  783. },
  784. grpc.Header(&header),
  785. )
  786. if err != nil {
  787. fmt.Println("Encountered error deleting node.")
  788. fmt.Println(err)
  789. //return err
  790. //log.Fatalf("Unable to process Delete request: %v", err)
  791. }
  792. fmt.Println("Deleted node " + node.MacAddress)
  793. err = WipeLocal()
  794. if err != nil {
  795. //return err
  796. log.Printf("Unable to wipe local config: %v", err)
  797. }
  798. err = RemoveSystemDServices()
  799. if err != nil {
  800. return err
  801. log.Fatalf("Unable to remove systemd services: %v", err)
  802. }
  803. return nil
  804. }
  805. func WipeLocal() error{
  806. nodecfg := config.Config.Node
  807. ifacename := nodecfg.Interface
  808. //home, err := homedir.Dir()
  809. home := "/etc/netclient"
  810. err := os.Remove(home + "/.netconfig")
  811. if err != nil {
  812. fmt.Println(err)
  813. }
  814. err = os.Remove(home + "/.nettoken")
  815. if err != nil {
  816. fmt.Println(err)
  817. }
  818. ipExec, err := exec.LookPath("ip")
  819. if ifacename != "" {
  820. cmdIPLinkDel := &exec.Cmd {
  821. Path: ipExec,
  822. Args: []string{ ipExec, "link", "del", ifacename },
  823. Stdout: os.Stdout,
  824. Stderr: os.Stdout,
  825. }
  826. err = cmdIPLinkDel.Run()
  827. if err != nil {
  828. fmt.Println(err)
  829. }
  830. }
  831. return err
  832. }
  833. func DeleteInterface(ifacename string) error{
  834. ipExec, err := exec.LookPath("ip")
  835. cmdIPLinkDel := &exec.Cmd {
  836. Path: ipExec,
  837. Args: []string{ ipExec, "link", "del", ifacename },
  838. Stdout: os.Stdout,
  839. Stderr: os.Stdout,
  840. }
  841. err = cmdIPLinkDel.Run()
  842. if err != nil {
  843. fmt.Println(err)
  844. }
  845. return err
  846. }
  847. func getPeers(macaddress string, group string, server string) ([]wgtypes.PeerConfig, error) {
  848. //need to implement checkin on server side
  849. var peers []wgtypes.PeerConfig
  850. var wcclient nodepb.NodeServiceClient
  851. modcfg := config.Config
  852. modcfg.ReadConfig()
  853. nodecfg := modcfg.Node
  854. keepalive := nodecfg.KeepAlive
  855. keepalivedur, err := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s")
  856. if err != nil {
  857. log.Fatalf("Issue with format of keepalive value. Please update netconfig: %v", err)
  858. }
  859. fmt.Println("Registering with GRPC Server")
  860. requestOpts := grpc.WithInsecure()
  861. conn, err := grpc.Dial(server, requestOpts)
  862. if err != nil {
  863. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  864. }
  865. // Instantiate the BlogServiceClient with our client connection to the server
  866. wcclient = nodepb.NewNodeServiceClient(conn)
  867. req := &nodepb.GetPeersReq{
  868. Macaddress: macaddress,
  869. Group: group,
  870. }
  871. ctx := context.Background()
  872. fmt.Println("Authenticating with GRPC Server")
  873. ctx, err = SetJWT(wcclient)
  874. if err != nil {
  875. fmt.Println("Failed to authenticate.")
  876. return peers, err
  877. }
  878. var header metadata.MD
  879. stream, err := wcclient.GetPeers(ctx, req, grpc.Header(&header))
  880. if err != nil {
  881. return nil, err
  882. }
  883. fmt.Println("Parsing peers response")
  884. for {
  885. // stream.Recv returns a pointer to a ListBlogRes at the current iteration
  886. res, err := stream.Recv()
  887. // If end of stream, break the loop
  888. if err == io.EOF {
  889. break
  890. }
  891. // if err, return an error
  892. if err != nil {
  893. if strings.Contains(err.Error(), "mongo: no documents in result") {
  894. break
  895. } else {
  896. fmt.Println("ERROR ENCOUNTERED WITH RESPONSE")
  897. fmt.Println(res)
  898. return peers, err
  899. }
  900. }
  901. pubkey, err := wgtypes.ParseKey(res.Peers.Publickey)
  902. if err != nil {
  903. fmt.Println("error parsing key")
  904. return peers, err
  905. }
  906. var peer wgtypes.PeerConfig
  907. if keepalive != 0 {
  908. peer = wgtypes.PeerConfig{
  909. PublicKey: pubkey,
  910. PersistentKeepaliveInterval: &keepalivedur,
  911. Endpoint: &net.UDPAddr{
  912. IP: net.ParseIP(res.Peers.Endpoint),
  913. Port: int(res.Peers.Listenport),
  914. },
  915. ReplaceAllowedIPs: true,
  916. AllowedIPs: []net.IPNet{{
  917. IP: net.ParseIP(res.Peers.Address),
  918. Mask: net.CIDRMask(32, 32),
  919. }},
  920. }
  921. } else {
  922. peer = wgtypes.PeerConfig{
  923. PublicKey: pubkey,
  924. Endpoint: &net.UDPAddr{
  925. IP: net.ParseIP(res.Peers.Endpoint),
  926. Port: int(res.Peers.Listenport),
  927. },
  928. ReplaceAllowedIPs: true,
  929. AllowedIPs: []net.IPNet{{
  930. IP: net.ParseIP(res.Peers.Address),
  931. Mask: net.CIDRMask(32, 32),
  932. }},
  933. }
  934. }
  935. peers = append(peers, peer)
  936. }
  937. fmt.Println("Finished parsing peers response")
  938. return peers, err
  939. }