common.go 34 KB

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