common.go 30 KB

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