common.go 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109
  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. cfg, err := config.ReadConfig(group)
  35. if err != nil {
  36. log.Printf("No Config Yet. Will Write: %v", err)
  37. }
  38. nodecfg := cfg.Node
  39. servercfg := cfg.Server
  40. fmt.Println("SERVER SETTINGS:")
  41. if server == "" {
  42. if servercfg.Address == "" {
  43. log.Fatal("no server provided")
  44. } else {
  45. server = servercfg.Address
  46. }
  47. }
  48. fmt.Println(" Server: " + server)
  49. if accesskey == "" {
  50. if servercfg.AccessKey == "" {
  51. fmt.Println("no access key provided.Proceeding anyway.")
  52. } else {
  53. accesskey = servercfg.AccessKey
  54. }
  55. }
  56. fmt.Println(" AccessKey: " + accesskey)
  57. err = config.WriteServer(server, accesskey, group)
  58. if err != nil {
  59. fmt.Println("Error encountered while writing Server Config.")
  60. return err
  61. }
  62. fmt.Println("NODE REQUESTING SETTINGS:")
  63. if password == "" {
  64. if nodecfg.Password == "" {
  65. //create error here
  66. log.Fatal("no password provided")
  67. } else {
  68. password = nodecfg.Password
  69. }
  70. }
  71. fmt.Println(" Password: " + password)
  72. if group == "badgroup" {
  73. if nodecfg.Group == "" {
  74. //create error here
  75. log.Fatal("no group provided")
  76. } else {
  77. group = nodecfg.Group
  78. }
  79. }
  80. fmt.Println(" Group: " + group)
  81. var macaddress string
  82. var localaddress string
  83. var listenport int32
  84. var keepalive int32
  85. var publickey wgtypes.Key
  86. var privatekey wgtypes.Key
  87. var privkeystring string
  88. var endpoint string
  89. var name string
  90. var wginterface string
  91. if nodecfg.Endpoint == "" {
  92. endpoint, err = getPublicIP()
  93. if err != nil {
  94. return err
  95. }
  96. } else {
  97. endpoint = nodecfg.Endpoint
  98. }
  99. fmt.Println(" Public Endpoint: " + endpoint)
  100. if nodecfg.LocalAddress == "" {
  101. ifaces, err := net.Interfaces()
  102. if err != nil {
  103. return err
  104. }
  105. var local string
  106. found := false
  107. for _, i := range ifaces {
  108. if i.Flags&net.FlagUp == 0 {
  109. continue // interface down
  110. }
  111. if i.Flags&net.FlagLoopback != 0 {
  112. continue // loopback interface
  113. }
  114. addrs, err := i.Addrs()
  115. if err != nil {
  116. return err
  117. }
  118. for _, addr := range addrs {
  119. var ip net.IP
  120. switch v := addr.(type) {
  121. case *net.IPNet:
  122. if !found {
  123. ip = v.IP
  124. local = ip.String()
  125. found = true
  126. }
  127. case *net.IPAddr:
  128. if !found {
  129. ip = v.IP
  130. local = ip.String()
  131. found = true
  132. }
  133. }
  134. }
  135. }
  136. localaddress = local
  137. } else {
  138. localaddress = nodecfg.LocalAddress
  139. }
  140. fmt.Println(" Local Address: " + localaddress)
  141. if nodecfg.Name != "" {
  142. name = nodecfg.Name
  143. }
  144. fmt.Println(" Name: " + name)
  145. if nodecfg.Interface != "" {
  146. wginterface = nodecfg.Interface
  147. }
  148. fmt.Println(" Interface: " + wginterface)
  149. if nodecfg.KeepAlive != 0 {
  150. keepalive = nodecfg.KeepAlive
  151. }
  152. fmt.Println(" KeepAlive: " + wginterface)
  153. if nodecfg.Port != 0 {
  154. listenport = nodecfg.Port
  155. }
  156. fmt.Println(" Port: " + string(listenport))
  157. if nodecfg.PrivateKey != "" {
  158. privkeystring = nodecfg.PrivateKey
  159. privatekey, err := wgtypes.ParseKey(nodecfg.PrivateKey)
  160. if err != nil {
  161. log.Fatal(err)
  162. }
  163. if nodecfg.PublicKey != "" {
  164. publickey, err = wgtypes.ParseKey(nodecfg.PublicKey)
  165. if err != nil {
  166. log.Fatal(err)
  167. }
  168. } else {
  169. publickey = privatekey.PublicKey()
  170. }
  171. } else {
  172. privatekey, err := wgtypes.GeneratePrivateKey()
  173. if err != nil {
  174. log.Fatal(err)
  175. }
  176. privkeystring = privatekey.String()
  177. publickey = privatekey.PublicKey()
  178. }
  179. if nodecfg.MacAddress != "" {
  180. macaddress = nodecfg.MacAddress
  181. } else {
  182. macs, err := getMacAddr()
  183. if err != nil {
  184. return err
  185. } else if len(macs) == 0 {
  186. log.Fatal()
  187. } else {
  188. macaddress = macs[0]
  189. }
  190. }
  191. fmt.Println(" Mac Address: " + macaddress)
  192. fmt.Println(" Private Key: " + privatekey.String())
  193. fmt.Println(" Public Key: " + publickey.String())
  194. var wcclient nodepb.NodeServiceClient
  195. var requestOpts grpc.DialOption
  196. requestOpts = grpc.WithInsecure()
  197. conn, err := grpc.Dial(server, requestOpts)
  198. if err != nil {
  199. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  200. }
  201. wcclient = nodepb.NewNodeServiceClient(conn)
  202. postnode := &nodepb.Node{
  203. Password: password,
  204. Macaddress: macaddress,
  205. Accesskey: accesskey,
  206. Nodegroup: group,
  207. Listenport: listenport,
  208. Keepalive: keepalive,
  209. Localaddress: localaddress,
  210. Interface: wginterface,
  211. Publickey: publickey.String(),
  212. Name: name,
  213. Endpoint: endpoint,
  214. }
  215. fmt.Println("Writing node settings to netconfig file.")
  216. err = modConfig(postnode)
  217. if err != nil {
  218. return err
  219. }
  220. res, err := wcclient.CreateNode(
  221. context.TODO(),
  222. &nodepb.CreateNodeReq{
  223. Node: postnode,
  224. },
  225. )
  226. if err != nil {
  227. return err
  228. }
  229. node := res.Node
  230. fmt.Println("Setting local config from server response")
  231. if err != nil {
  232. return err
  233. }
  234. fmt.Println("NODE RECIEVED SETTINGS: ")
  235. fmt.Println(" Password: " + node.Password)
  236. fmt.Println(" WG Address: " + node.Address)
  237. fmt.Println(" Group: " + node.Nodegroup)
  238. fmt.Println(" Public Endpoint: " + node.Endpoint)
  239. fmt.Println(" Local Address: " + node.Localaddress)
  240. fmt.Println(" Name: " + node.Name)
  241. fmt.Println(" Interface: " + node.Interface)
  242. fmt.Println(" Port: " + strconv.FormatInt(int64(node.Listenport), 10))
  243. fmt.Println(" KeepAlive: " + strconv.FormatInt(int64(node.Keepalive), 10))
  244. fmt.Println(" Public Key: " + node.Publickey)
  245. fmt.Println(" Mac Address: " + node.Macaddress)
  246. err = modConfig(node)
  247. if err != nil {
  248. return err
  249. }
  250. if node.Ispending {
  251. fmt.Println("Node is marked as PENDING.")
  252. fmt.Println("Awaiting approval from Admin before configuring WireGuard.")
  253. if !noauto {
  254. fmt.Println("Configuring Netmaker Service.")
  255. err = ConfigureSystemD(group)
  256. return err
  257. }
  258. }
  259. peers, err := getPeers(node.Macaddress, group, server)
  260. if err != nil {
  261. return err
  262. }
  263. fmt.Println("retrived peers, setting wireguard config.")
  264. err = storePrivKey(privkeystring)
  265. if err != nil {
  266. return err
  267. }
  268. err = initWireguard(node, privkeystring, peers)
  269. if err != nil {
  270. return err
  271. }
  272. if !noauto {
  273. err = ConfigureSystemD(group)
  274. }
  275. if err != nil {
  276. return err
  277. }
  278. return err
  279. }
  280. func getPublicIP() (string, error) {
  281. iplist := []string{"https://ifconfig.me", "http://api.ipify.org", "http://ipinfo.io/ip"}
  282. endpoint := ""
  283. var err error
  284. for _, ipserver := range iplist {
  285. resp, err := http.Get(ipserver)
  286. if err != nil {
  287. continue
  288. }
  289. defer resp.Body.Close()
  290. if resp.StatusCode == http.StatusOK {
  291. bodyBytes, err := ioutil.ReadAll(resp.Body)
  292. if err != nil {
  293. continue
  294. }
  295. endpoint = string(bodyBytes)
  296. break
  297. }
  298. }
  299. if err == nil && endpoint == "" {
  300. err = errors.New("Public Address Not Found.")
  301. }
  302. return endpoint, err
  303. }
  304. func modConfig(node *nodepb.Node) error{
  305. group := node.Nodegroup
  306. if group == "" {
  307. return errors.New("No Group Provided")
  308. }
  309. //modconfig := config.Config
  310. modconfig, err := config.ReadConfig(group)
  311. //modconfig.ReadConfig()
  312. if err != nil {
  313. return err
  314. }
  315. nodecfg := modconfig.Node
  316. if node.Name != ""{
  317. nodecfg.Name = node.Name
  318. }
  319. if node.Interface != ""{
  320. nodecfg.Interface = node.Interface
  321. }
  322. if node.Nodegroup != ""{
  323. nodecfg.Group = node.Nodegroup
  324. }
  325. if node.Macaddress != ""{
  326. nodecfg.MacAddress = node.Macaddress
  327. }
  328. if node.Localaddress != ""{
  329. nodecfg.LocalAddress = node.Localaddress
  330. }
  331. if node.Listenport != 0{
  332. nodecfg.Port = node.Listenport
  333. }
  334. if node.Keepalive != 0{
  335. nodecfg.KeepAlive = node.Keepalive
  336. }
  337. if node.Publickey != ""{
  338. nodecfg.PublicKey = node.Publickey
  339. }
  340. if node.Endpoint != ""{
  341. nodecfg.Endpoint = node.Endpoint
  342. }
  343. if node.Password != ""{
  344. nodecfg.Password = node.Password
  345. }
  346. if node.Address != ""{
  347. nodecfg.WGAddress = node.Address
  348. }
  349. if node.Postchanges != "" {
  350. nodecfg.PostChanges = node.Postchanges
  351. }
  352. modconfig.Node = nodecfg
  353. err = config.Write(modconfig, group)
  354. return err
  355. }
  356. func getMacAddr() ([]string, error) {
  357. ifas, err := net.Interfaces()
  358. if err != nil {
  359. return nil, err
  360. }
  361. var as []string
  362. for _, ifa := range ifas {
  363. a := ifa.HardwareAddr.String()
  364. if a != "" {
  365. as = append(as, a)
  366. }
  367. }
  368. return as, nil
  369. }
  370. /*
  371. func read(macaddress string, group string) error {
  372. //this would be used for retrieving state as set by the server.
  373. }
  374. func checkLocalConfigChange() error {
  375. }
  376. */
  377. func initWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig) error {
  378. ipExec, err := exec.LookPath("ip")
  379. if err != nil {
  380. return err
  381. }
  382. key, err := wgtypes.ParseKey(privkey)
  383. if err != nil {
  384. return err
  385. }
  386. wgclient, err := wgctrl.New()
  387. //modcfg := config.Config
  388. //modcfg.ReadConfig()
  389. modcfg, err := config.ReadConfig(node.Nodegroup)
  390. if err != nil {
  391. return err
  392. }
  393. nodecfg := modcfg.Node
  394. fmt.Println("beginning local WG config")
  395. if err != nil {
  396. log.Fatalf("failed to open client: %v", err)
  397. }
  398. defer wgclient.Close()
  399. fmt.Println("setting local settings")
  400. ifacename := node.Interface
  401. if nodecfg.Interface != "" {
  402. ifacename = nodecfg.Interface
  403. } else if node.Interface != "" {
  404. ifacename = node.Interface
  405. } else {
  406. log.Fatal("no interface to configure")
  407. }
  408. if node.Address == "" {
  409. log.Fatal("no address to configure")
  410. }
  411. cmdIPDevLinkAdd := &exec.Cmd {
  412. Path: ipExec,
  413. Args: []string{ ipExec, "link", "add", "dev", ifacename, "type", "wireguard" },
  414. Stdout: os.Stdout,
  415. Stderr: os.Stdout,
  416. }
  417. cmdIPAddrAdd := &exec.Cmd {
  418. Path: ipExec,
  419. Args: []string{ ipExec, "address", "add", "dev", ifacename, node.Address+"/24"},
  420. Stdout: os.Stdout,
  421. Stderr: os.Stdout,
  422. }
  423. currentiface, err := net.InterfaceByName(ifacename)
  424. if err != nil {
  425. err = cmdIPDevLinkAdd.Run()
  426. if err != nil && !strings.Contains(err.Error(), "exists") {
  427. fmt.Println("Error creating interface")
  428. //fmt.Println(err.Error())
  429. //return err
  430. }
  431. }
  432. match := false
  433. addrs, _ := currentiface.Addrs()
  434. for _, a := range addrs {
  435. if strings.Contains(a.String(), node.Address){
  436. match = true
  437. }
  438. }
  439. if !match {
  440. err = cmdIPAddrAdd.Run()
  441. if err != nil {
  442. fmt.Println("Error adding address")
  443. //return err
  444. }
  445. }
  446. var nodeport int
  447. nodeport = int(node.Listenport)
  448. fmt.Println("setting WG config from node and peers")
  449. //pubkey := privkey.PublicKey()
  450. conf := wgtypes.Config{
  451. PrivateKey: &key,
  452. ListenPort: &nodeport,
  453. ReplacePeers: true,
  454. Peers: peers,
  455. }
  456. _, err = wgclient.Device(ifacename)
  457. if err != nil {
  458. if os.IsNotExist(err) {
  459. fmt.Println("Device does not exist: ")
  460. fmt.Println(err)
  461. } else {
  462. log.Fatalf("Unknown config error: %v", err)
  463. }
  464. }
  465. fmt.Println("configuring WG device")
  466. err = wgclient.ConfigureDevice(ifacename, conf)
  467. if err != nil {
  468. if os.IsNotExist(err) {
  469. fmt.Println("Device does not exist: ")
  470. fmt.Println(err)
  471. } else {
  472. fmt.Printf("This is inconvenient: %v", err)
  473. }
  474. }
  475. cmdIPLinkUp := &exec.Cmd {
  476. Path: ipExec,
  477. Args: []string{ ipExec, "link", "set", "up", "dev", ifacename},
  478. Stdout: os.Stdout,
  479. Stderr: os.Stdout,
  480. }
  481. cmdIPLinkDown := &exec.Cmd {
  482. Path: ipExec,
  483. Args: []string{ ipExec, "link", "set", "down", "dev", ifacename},
  484. Stdout: os.Stdout,
  485. Stderr: os.Stdout,
  486. }
  487. err = cmdIPLinkDown.Run()
  488. err = cmdIPLinkUp.Run()
  489. if err != nil {
  490. return err
  491. }
  492. return err
  493. }
  494. func setWGConfig(network string) error {
  495. cfg, err := config.ReadConfig(network)
  496. if err != nil {
  497. return err
  498. }
  499. servercfg := cfg.Server
  500. nodecfg := cfg.Node
  501. node := getNode(network)
  502. peers, err := getPeers(node.Macaddress, nodecfg.Group, servercfg.Address)
  503. if err != nil {
  504. return err
  505. }
  506. privkey, err := retrievePrivKey()
  507. if err != nil {
  508. return err
  509. }
  510. err = initWireguard(&node, privkey, peers)
  511. if err != nil {
  512. return err
  513. }
  514. return err
  515. }
  516. func storePrivKey(key string) error{
  517. d1 := []byte(key)
  518. err := ioutil.WriteFile("/root/.wckey", d1, 0644)
  519. return err
  520. }
  521. func retrievePrivKey() (string, error) {
  522. dat, err := ioutil.ReadFile("/root/.wckey")
  523. return string(dat), err
  524. }
  525. func getPrivateAddr() (string, error) {
  526. ifaces, err := net.Interfaces()
  527. if err != nil {
  528. return "", err
  529. }
  530. var local string
  531. found := false
  532. for _, i := range ifaces {
  533. if i.Flags&net.FlagUp == 0 {
  534. continue // interface down
  535. }
  536. if i.Flags&net.FlagLoopback != 0 {
  537. continue // loopback interface
  538. }
  539. addrs, err := i.Addrs()
  540. if err != nil {
  541. return "", err
  542. }
  543. for _, addr := range addrs {
  544. var ip net.IP
  545. switch v := addr.(type) {
  546. case *net.IPNet:
  547. if !found {
  548. ip = v.IP
  549. local = ip.String()
  550. found = true
  551. }
  552. case *net.IPAddr:
  553. if !found {
  554. ip = v.IP
  555. local = ip.String()
  556. found = true
  557. }
  558. }
  559. }
  560. }
  561. if !found {
  562. err := errors.New("Local Address Not Found.")
  563. return "", err
  564. }
  565. return local, err
  566. }
  567. func CheckIn(network string) error {
  568. node := getNode(network)
  569. cfg, err := config.ReadConfig(network)
  570. if err != nil {
  571. return err
  572. }
  573. nodecfg := cfg.Node
  574. servercfg := cfg.Server
  575. fmt.Println("Checking into server: " + servercfg.Address)
  576. setupcheck := true
  577. ipchange := false
  578. if !nodecfg.RoamingOff {
  579. fmt.Println("Checking to see if addresses have changed")
  580. extIP, err := getPublicIP()
  581. if err != nil {
  582. fmt.Printf("Error encountered checking ip addresses: %v", err)
  583. }
  584. if nodecfg.Endpoint != extIP && extIP != "" {
  585. fmt.Println("Endpoint has changed from " +
  586. nodecfg.Endpoint + " to " + extIP)
  587. fmt.Println("Updating address")
  588. nodecfg.Endpoint = extIP
  589. nodecfg.PostChanges = "true"
  590. node.Endpoint = extIP
  591. node.Postchanges = "true"
  592. ipchange = true
  593. }
  594. intIP, err := getPrivateAddr()
  595. if err != nil {
  596. fmt.Printf("Error encountered checking ip addresses: %v", err)
  597. }
  598. if nodecfg.LocalAddress != intIP && intIP != "" {
  599. fmt.Println("Local Address has changed from " +
  600. nodecfg.LocalAddress + " to " + intIP)
  601. fmt.Println("Updating address")
  602. nodecfg.LocalAddress = intIP
  603. nodecfg.PostChanges = "true"
  604. node.Localaddress = intIP
  605. node.Postchanges = "true"
  606. ipchange = true
  607. }
  608. if node.Postchanges != "true" {
  609. fmt.Println("Addresses have not changed.")
  610. }
  611. }
  612. if ipchange {
  613. err := modConfig(&node)
  614. if err != nil {
  615. return err
  616. log.Fatalf("Error: %v", err)
  617. }
  618. err = setWGConfig(network)
  619. if err != nil {
  620. return err
  621. log.Fatalf("Error: %v", err)
  622. }
  623. node = getNode(network)
  624. cfg, err := config.ReadConfig(network)
  625. if err != nil {
  626. return err
  627. }
  628. nodecfg = cfg.Node
  629. }
  630. var wcclient nodepb.NodeServiceClient
  631. var requestOpts grpc.DialOption
  632. requestOpts = grpc.WithInsecure()
  633. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  634. if err != nil {
  635. fmt.Printf("Cant dial GRPC server: %v", err)
  636. return err
  637. }
  638. wcclient = nodepb.NewNodeServiceClient(conn)
  639. ctx := context.Background()
  640. fmt.Println("Authenticating with GRPC Server")
  641. ctx, err = SetJWT(wcclient, network)
  642. if err != nil {
  643. fmt.Printf("Failed to authenticate: %v", err)
  644. return err
  645. }
  646. fmt.Println("Authenticated")
  647. fmt.Println("Checking In.")
  648. var header metadata.MD
  649. checkinres, err := wcclient.CheckIn(
  650. ctx,
  651. &nodepb.CheckInReq{
  652. Node: &node,
  653. },
  654. grpc.Header(&header),
  655. )
  656. if err != nil {
  657. if checkinres != nil && checkinres.Checkinresponse.Ispending {
  658. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
  659. return nil
  660. }
  661. fmt.Printf("Unable to process Check In request: %v", err)
  662. return err
  663. }
  664. fmt.Println("Checked in.")
  665. if checkinres.Checkinresponse.Ispending {
  666. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
  667. return err
  668. }
  669. newinterface := getNode(network).Interface
  670. readreq := &nodepb.ReadNodeReq{
  671. Macaddress: node.Macaddress,
  672. Group: node.Nodegroup,
  673. }
  674. readres, err := wcclient.ReadNode(ctx, readreq, grpc.Header(&header))
  675. if err != nil {
  676. fmt.Printf("Error: %v", err)
  677. } else {
  678. currentiface := readres.Node.Interface
  679. ifaceupdate := newinterface != currentiface
  680. if err != nil {
  681. log.Printf("Error retrieving interface: %v", err)
  682. }
  683. if ifaceupdate {
  684. fmt.Println("Interface update: " + currentiface +
  685. " >>>> " + newinterface)
  686. err := DeleteInterface(currentiface)
  687. if err != nil {
  688. fmt.Println("ERROR DELETING INTERFACE: " + currentiface)
  689. }
  690. }
  691. err = setWGConfig(network)
  692. }
  693. if checkinres.Checkinresponse.Needconfigupdate {
  694. fmt.Println("Server has requested that node update config.")
  695. fmt.Println("Updating config from remote server.")
  696. req := &nodepb.ReadNodeReq{
  697. Macaddress: node.Macaddress,
  698. Group: node.Nodegroup,
  699. }
  700. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  701. if err != nil {
  702. return err
  703. log.Fatalf("Error: %v", err)
  704. }
  705. err = modConfig(readres.Node)
  706. if err != nil {
  707. return err
  708. log.Fatalf("Error: %v", err)
  709. }
  710. err = setWGConfig(network)
  711. if err != nil {
  712. return err
  713. log.Fatalf("Error: %v", err)
  714. }
  715. setupcheck = false
  716. } else if nodecfg.PostChanges == "true" {
  717. fmt.Println("Node has requested to update remote config.")
  718. fmt.Println("Posting local config to remote server.")
  719. postnode := getNode(network)
  720. req := &nodepb.UpdateNodeReq{
  721. Node: &postnode,
  722. }
  723. res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  724. if err != nil {
  725. return err
  726. log.Fatalf("Error: %v", err)
  727. }
  728. res.Node.Postchanges = "false"
  729. err = modConfig(res.Node)
  730. if err != nil {
  731. return err
  732. log.Fatalf("Error: %v", err)
  733. }
  734. err = setWGConfig(network)
  735. if err != nil {
  736. return err
  737. log.Fatalf("Error: %v", err)
  738. }
  739. setupcheck = false
  740. }
  741. if checkinres.Checkinresponse.Needpeerupdate {
  742. fmt.Println("Server has requested that node update peer list.")
  743. fmt.Println("Updating peer list from remote server.")
  744. err = setWGConfig(network)
  745. if err != nil {
  746. return err
  747. log.Fatalf("Unable to process Set Peers request: %v", err)
  748. }
  749. setupcheck = false
  750. }
  751. if setupcheck {
  752. iface := nodecfg.Interface
  753. _, err := net.InterfaceByName(iface)
  754. if err != nil {
  755. fmt.Println("interface " + iface + " does not currently exist. Setting up WireGuard.")
  756. err = setWGConfig(network)
  757. if err != nil {
  758. return err
  759. log.Fatalf("Error: %v", err)
  760. }
  761. }
  762. }
  763. return nil
  764. }
  765. func needInterfaceUpdate(ctx context.Context, mac string, group string, iface string) (bool, string, error) {
  766. var header metadata.MD
  767. req := &nodepb.ReadNodeReq{
  768. Macaddress: mac,
  769. Group: group,
  770. }
  771. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  772. if err != nil {
  773. return false, "", err
  774. log.Fatalf("Error: %v", err)
  775. }
  776. oldiface := readres.Node.Interface
  777. return iface != oldiface, oldiface, err
  778. }
  779. func getNode(network string) nodepb.Node {
  780. modcfg, err := config.ReadConfig(network)
  781. if err != nil {
  782. log.Fatalf("Error: %v", err)
  783. }
  784. nodecfg := modcfg.Node
  785. var node nodepb.Node
  786. node.Name = nodecfg.Name
  787. node.Interface = nodecfg.Interface
  788. node.Nodegroup = nodecfg.Group
  789. node.Localaddress = nodecfg.LocalAddress
  790. node.Address = nodecfg.WGAddress
  791. node.Listenport = nodecfg.Port
  792. node.Keepalive = nodecfg.KeepAlive
  793. node.Postup = nodecfg.PostUp
  794. node.Preup = nodecfg.PreUp
  795. node.Publickey = nodecfg.PublicKey
  796. node.Macaddress = nodecfg.MacAddress
  797. node.Endpoint = nodecfg.Endpoint
  798. node.Password = nodecfg.Password
  799. //spew.Dump(node)
  800. return node
  801. }
  802. func Remove(network string) error {
  803. //need to implement checkin on server side
  804. cfg, err := config.ReadConfig(network)
  805. if err != nil {
  806. return err
  807. }
  808. servercfg := cfg.Server
  809. node := cfg.Node
  810. fmt.Println("Deleting remote node with MAC: " + node.MacAddress)
  811. var wcclient nodepb.NodeServiceClient
  812. var requestOpts grpc.DialOption
  813. requestOpts = grpc.WithInsecure()
  814. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  815. if err != nil {
  816. log.Printf("Unable to establish client connection to " + servercfg.Address + ": %v", err)
  817. //return err
  818. }else {
  819. wcclient = nodepb.NewNodeServiceClient(conn)
  820. ctx := context.Background()
  821. fmt.Println("Authenticating with GRPC Server")
  822. ctx, err = SetJWT(wcclient, network)
  823. if err != nil {
  824. //return err
  825. log.Printf("Failed to authenticate: %v", err)
  826. } else {
  827. fmt.Println("Authenticated")
  828. var header metadata.MD
  829. _, err = wcclient.DeleteNode(
  830. ctx,
  831. &nodepb.DeleteNodeReq{
  832. Macaddress: node.MacAddress,
  833. GroupName: node.Group,
  834. },
  835. grpc.Header(&header),
  836. )
  837. if err != nil {
  838. log.Printf("Encountered error deleting node: %v", err)
  839. fmt.Println(err)
  840. } else {
  841. fmt.Println("Deleted node " + node.MacAddress)
  842. }
  843. }
  844. }
  845. err = WipeLocal(network)
  846. if err != nil {
  847. log.Printf("Unable to wipe local config: %v", err)
  848. }
  849. err = RemoveSystemDServices(network)
  850. if err != nil {
  851. return err
  852. log.Printf("Unable to remove systemd services: %v", err)
  853. }
  854. fmt.Printf("Please investigate any stated errors to ensure proper removal.")
  855. fmt.Printf("Failure to delete node from server via gRPC will mean node still exists and needs to be manually deleted by administrator.")
  856. return nil
  857. }
  858. func WipeLocal(network string) error{
  859. cfg, err := config.ReadConfig(network)
  860. if err != nil {
  861. return err
  862. }
  863. nodecfg := cfg.Node
  864. ifacename := nodecfg.Interface
  865. //home, err := homedir.Dir()
  866. home := "/etc/netclient"
  867. err = os.Remove(home + "/netconfig-" + network)
  868. if err != nil {
  869. fmt.Println(err)
  870. }
  871. err = os.Remove(home + "/nettoken")
  872. if err != nil {
  873. fmt.Println(err)
  874. }
  875. ipExec, err := exec.LookPath("ip")
  876. if ifacename != "" {
  877. cmdIPLinkDel := &exec.Cmd {
  878. Path: ipExec,
  879. Args: []string{ ipExec, "link", "del", ifacename },
  880. Stdout: os.Stdout,
  881. Stderr: os.Stdout,
  882. }
  883. err = cmdIPLinkDel.Run()
  884. if err != nil {
  885. fmt.Println(err)
  886. }
  887. }
  888. return err
  889. }
  890. func DeleteInterface(ifacename string) error{
  891. ipExec, err := exec.LookPath("ip")
  892. cmdIPLinkDel := &exec.Cmd {
  893. Path: ipExec,
  894. Args: []string{ ipExec, "link", "del", ifacename },
  895. Stdout: os.Stdout,
  896. Stderr: os.Stdout,
  897. }
  898. err = cmdIPLinkDel.Run()
  899. if err != nil {
  900. fmt.Println(err)
  901. }
  902. return err
  903. }
  904. func getPeers(macaddress string, group string, server string) ([]wgtypes.PeerConfig, error) {
  905. //need to implement checkin on server side
  906. var peers []wgtypes.PeerConfig
  907. var wcclient nodepb.NodeServiceClient
  908. cfg, err := config.ReadConfig(group)
  909. if err != nil {
  910. log.Fatalf("Issue retrieving config for network: " + group + ". Please investigate: %v", err)
  911. }
  912. nodecfg := cfg.Node
  913. keepalive := nodecfg.KeepAlive
  914. keepalivedur, err := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s")
  915. if err != nil {
  916. log.Fatalf("Issue with format of keepalive value. Please update netconfig: %v", err)
  917. }
  918. fmt.Println("Registering with GRPC Server")
  919. requestOpts := grpc.WithInsecure()
  920. conn, err := grpc.Dial(server, requestOpts)
  921. if err != nil {
  922. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  923. }
  924. // Instantiate the BlogServiceClient with our client connection to the server
  925. wcclient = nodepb.NewNodeServiceClient(conn)
  926. req := &nodepb.GetPeersReq{
  927. Macaddress: macaddress,
  928. Group: group,
  929. }
  930. ctx := context.Background()
  931. fmt.Println("Authenticating with GRPC Server")
  932. ctx, err = SetJWT(wcclient, group)
  933. if err != nil {
  934. fmt.Println("Failed to authenticate.")
  935. return peers, err
  936. }
  937. var header metadata.MD
  938. stream, err := wcclient.GetPeers(ctx, req, grpc.Header(&header))
  939. if err != nil {
  940. return nil, err
  941. }
  942. fmt.Println("Parsing peers response")
  943. for {
  944. // stream.Recv returns a pointer to a ListBlogRes at the current iteration
  945. res, err := stream.Recv()
  946. // If end of stream, break the loop
  947. if err == io.EOF {
  948. break
  949. }
  950. // if err, return an error
  951. if err != nil {
  952. if strings.Contains(err.Error(), "mongo: no documents in result") {
  953. break
  954. } else {
  955. fmt.Println("ERROR ENCOUNTERED WITH RESPONSE")
  956. fmt.Println(res)
  957. return peers, err
  958. }
  959. }
  960. pubkey, err := wgtypes.ParseKey(res.Peers.Publickey)
  961. if err != nil {
  962. fmt.Println("error parsing key")
  963. return peers, err
  964. }
  965. var peer wgtypes.PeerConfig
  966. if keepalive != 0 {
  967. peer = wgtypes.PeerConfig{
  968. PublicKey: pubkey,
  969. PersistentKeepaliveInterval: &keepalivedur,
  970. Endpoint: &net.UDPAddr{
  971. IP: net.ParseIP(res.Peers.Endpoint),
  972. Port: int(res.Peers.Listenport),
  973. },
  974. ReplaceAllowedIPs: true,
  975. AllowedIPs: []net.IPNet{{
  976. IP: net.ParseIP(res.Peers.Address),
  977. Mask: net.CIDRMask(32, 32),
  978. }},
  979. }
  980. } else {
  981. peer = wgtypes.PeerConfig{
  982. PublicKey: pubkey,
  983. Endpoint: &net.UDPAddr{
  984. IP: net.ParseIP(res.Peers.Endpoint),
  985. Port: int(res.Peers.Listenport),
  986. },
  987. ReplaceAllowedIPs: true,
  988. AllowedIPs: []net.IPNet{{
  989. IP: net.ParseIP(res.Peers.Address),
  990. Mask: net.CIDRMask(32, 32),
  991. }},
  992. }
  993. }
  994. peers = append(peers, peer)
  995. }
  996. fmt.Println("Finished parsing peers response")
  997. return peers, err
  998. }