common.go 30 KB

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