common.go 32 KB

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