common.go 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518
  1. package functions
  2. import (
  3. "fmt"
  4. "time"
  5. "errors"
  6. "context"
  7. "net/http"
  8. "io/ioutil"
  9. "io"
  10. "strings"
  11. "log"
  12. "net"
  13. "os"
  14. "strconv"
  15. "os/exec"
  16. "github.com/gravitl/netmaker/netclient/config"
  17. nodepb "github.com/gravitl/netmaker/grpc"
  18. "golang.zx2c4.com/wireguard/wgctrl"
  19. "google.golang.org/grpc"
  20. "encoding/base64"
  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 ListPorts() error{
  29. wgclient, err := wgctrl.New()
  30. if err != nil {
  31. return err
  32. }
  33. devices, err := wgclient.Devices()
  34. if err != nil {
  35. return err
  36. }
  37. fmt.Println("Here are your ports:")
  38. for _, i := range devices {
  39. fmt.Println(i.ListenPort)
  40. }
  41. return err
  42. }
  43. func GetFreePort(rangestart int32) (int32, error){
  44. wgclient, err := wgctrl.New()
  45. if err != nil {
  46. return 0, err
  47. }
  48. devices, err := wgclient.Devices()
  49. if err != nil {
  50. return 0, err
  51. }
  52. var portno int32
  53. portno = 0
  54. for x := rangestart; x <= 60000; x++ {
  55. conflict := false
  56. for _, i := range devices {
  57. if int32(i.ListenPort) == x {
  58. conflict = true
  59. break;
  60. }
  61. }
  62. if conflict {
  63. continue
  64. }
  65. portno = x
  66. break
  67. }
  68. return portno, err
  69. }
  70. func Install(accesskey string, password string, server string, network string, noauto bool, accesstoken string, inputname string, pubip string, dnsoff bool) error {
  71. tserver := ""
  72. tnetwork := ""
  73. tkey := ""
  74. trange := ""
  75. var localrange *net.IPNet
  76. islocal := false
  77. if FileExists("/etc/systemd/system/netclient-"+network+".timer") ||
  78. FileExists("/etc/netclient/netconfig-"+network) {
  79. err := errors.New("ALREADY_INSTALLED. Netclient appears to already be installed for network " + network + ". To re-install, please remove by executing 'sudo netclient -c remove -n " + network + "'. Then re-run the install command.")
  80. return err
  81. }
  82. if accesstoken != "" && accesstoken != "badtoken" {
  83. btoken, err := base64.StdEncoding.DecodeString(accesstoken)
  84. if err != nil {
  85. log.Fatalf("Something went wrong decoding your token: %v", err)
  86. }
  87. token := string(btoken)
  88. tokenvals := strings.Split(token, "|")
  89. tserver = tokenvals[0]
  90. tnetwork = tokenvals[1]
  91. tkey = tokenvals[2]
  92. trange = tokenvals[3]
  93. printrange := ""
  94. if server == "localhost:50051" {
  95. server = tserver
  96. }
  97. if network == "nonetwork" {
  98. network = tnetwork
  99. }
  100. if accesskey == "badkey" {
  101. accesskey = tkey
  102. }
  103. fmt.Println(trange)
  104. if trange != "" {
  105. fmt.Println("This is a local network. Proceeding with local address as endpoint.")
  106. islocal = true
  107. _, localrange, err = net.ParseCIDR(trange)
  108. if err == nil {
  109. printrange = localrange.String()
  110. } else {
  111. //localrange = ""
  112. }
  113. } else {
  114. printrange = "Not a local network. Will use public address for endpoint."
  115. }
  116. fmt.Println("Decoded values from token:")
  117. fmt.Println(" Server: " + server)
  118. fmt.Println(" Network: " + network)
  119. fmt.Println(" Key: " + accesskey)
  120. fmt.Println(" Local Range: " + printrange)
  121. }
  122. wgclient, err := wgctrl.New()
  123. if err != nil {
  124. log.Fatalf("failed to open client: %v", err)
  125. }
  126. defer wgclient.Close()
  127. cfg, err := config.ReadConfig(network)
  128. if err != nil {
  129. log.Printf("No Config Yet. Will Write: %v", err)
  130. }
  131. nodecfg := cfg.Node
  132. servercfg := cfg.Server
  133. fmt.Println("SERVER SETTINGS:")
  134. nodecfg.DNSOff = dnsoff
  135. if server == "" {
  136. if servercfg.Address == "" && tserver == "" {
  137. log.Fatal("no server provided")
  138. } else {
  139. server = servercfg.Address
  140. }
  141. }
  142. fmt.Println(" Server: " + server)
  143. if accesskey == "" {
  144. if servercfg.AccessKey == "" && tkey == "" {
  145. fmt.Println("no access key provided.Proceeding anyway.")
  146. } else {
  147. accesskey = servercfg.AccessKey
  148. }
  149. }
  150. fmt.Println(" AccessKey: " + accesskey)
  151. err = config.WriteServer(server, accesskey, network)
  152. if err != nil {
  153. fmt.Println("Error encountered while writing Server Config.")
  154. return err
  155. }
  156. fmt.Println("NODE REQUESTING SETTINGS:")
  157. if password == "" {
  158. if nodecfg.Password == "" {
  159. //create error here
  160. log.Fatal("no password provided")
  161. } else {
  162. password = nodecfg.Password
  163. }
  164. }
  165. fmt.Println(" Password: " + password)
  166. if network == "badnetwork" {
  167. if nodecfg.Network == "" && tnetwork == "" {
  168. //create error here
  169. log.Fatal("no network provided")
  170. } else {
  171. network = nodecfg.Network
  172. }
  173. }
  174. fmt.Println(" Network: " + network)
  175. var macaddress string
  176. var localaddress string
  177. var listenport int32
  178. var keepalive int32
  179. var publickey wgtypes.Key
  180. var privatekey wgtypes.Key
  181. var privkeystring string
  182. var endpoint string
  183. var postup string
  184. var postdown string
  185. var name string
  186. var wginterface string
  187. if nodecfg.LocalAddress == "" {
  188. ifaces, err := net.Interfaces()
  189. if err != nil {
  190. return err
  191. }
  192. var local string
  193. found := false
  194. for _, i := range ifaces {
  195. if i.Flags&net.FlagUp == 0 {
  196. continue // interface down
  197. }
  198. if i.Flags&net.FlagLoopback != 0 {
  199. continue // loopback interface
  200. }
  201. addrs, err := i.Addrs()
  202. if err != nil {
  203. return err
  204. }
  205. for _, addr := range addrs {
  206. var ip net.IP
  207. switch v := addr.(type) {
  208. case *net.IPNet:
  209. if !found {
  210. ip = v.IP
  211. local = ip.String()
  212. if islocal {
  213. found = localrange.Contains(ip)
  214. } else {
  215. found = true
  216. }
  217. }
  218. case *net.IPAddr:
  219. if !found {
  220. ip = v.IP
  221. local = ip.String()
  222. if islocal {
  223. found = localrange.Contains(ip)
  224. } else {
  225. found = true
  226. }
  227. }
  228. }
  229. }
  230. }
  231. localaddress = local
  232. } else {
  233. localaddress = nodecfg.LocalAddress
  234. }
  235. fmt.Println(" Local Address: " + localaddress)
  236. if pubip != "" && pubip != "nopubip" {
  237. endpoint = pubip
  238. } else {
  239. if nodecfg.Endpoint == "" {
  240. if islocal && localaddress != "" {
  241. endpoint = localaddress
  242. fmt.Println("Endpoint is local. Setting to address: " + endpoint)
  243. } else {
  244. endpoint, err = getPublicIP()
  245. if err != nil {
  246. fmt.Println("Error setting endpoint.")
  247. return err
  248. }
  249. fmt.Println("Endpoint is public. Setting to address: " + endpoint)
  250. }
  251. } else {
  252. endpoint = nodecfg.Endpoint
  253. fmt.Println("Endpoint set in config. Setting to address: " + endpoint)
  254. }
  255. }
  256. fmt.Println(" Endpoint: " + endpoint)
  257. if nodecfg.Name != "" {
  258. name = nodecfg.Name
  259. }
  260. if inputname != "" && inputname != "noname" {
  261. name = inputname
  262. }
  263. fmt.Println(" Name: " + name)
  264. if nodecfg.Interface != "" {
  265. wginterface = nodecfg.Interface
  266. }
  267. fmt.Println(" Interface: " + wginterface)
  268. if nodecfg.PostUp != "" {
  269. postup = nodecfg.PostUp
  270. }
  271. fmt.Println(" PostUp: " + postup)
  272. if nodecfg.PostDown!= "" {
  273. postdown = nodecfg.PostDown
  274. }
  275. fmt.Println(" PostDown: " + postdown)
  276. if nodecfg.KeepAlive != 0 {
  277. keepalive = nodecfg.KeepAlive
  278. }
  279. fmt.Println(" KeepAlive: " + wginterface)
  280. if nodecfg.Port != 0 {
  281. listenport = nodecfg.Port
  282. }
  283. if listenport == 0 {
  284. listenport, err = GetFreePort(51821)
  285. if err != nil {
  286. fmt.Printf("Error retrieving port: %v", err)
  287. }
  288. }
  289. fmt.Printf(" Port: %v", listenport)
  290. fmt.Println("")
  291. if nodecfg.PrivateKey != "" {
  292. privkeystring = nodecfg.PrivateKey
  293. privatekey, err := wgtypes.ParseKey(nodecfg.PrivateKey)
  294. if err != nil {
  295. log.Fatal(err)
  296. }
  297. if nodecfg.PublicKey != "" {
  298. publickey, err = wgtypes.ParseKey(nodecfg.PublicKey)
  299. if err != nil {
  300. log.Fatal(err)
  301. }
  302. } else {
  303. publickey = privatekey.PublicKey()
  304. }
  305. } else {
  306. privatekey, err := wgtypes.GeneratePrivateKey()
  307. if err != nil {
  308. log.Fatal(err)
  309. }
  310. privkeystring = privatekey.String()
  311. publickey = privatekey.PublicKey()
  312. }
  313. if nodecfg.MacAddress != "" {
  314. macaddress = nodecfg.MacAddress
  315. } else {
  316. macs, err := getMacAddr()
  317. if err != nil {
  318. return err
  319. } else if len(macs) == 0 {
  320. log.Fatal()
  321. } else {
  322. macaddress = macs[0]
  323. }
  324. }
  325. fmt.Println(" Mac Address: " + macaddress)
  326. fmt.Println(" Private Key: " + privatekey.String())
  327. fmt.Println(" Public Key: " + publickey.String())
  328. var wcclient nodepb.NodeServiceClient
  329. var requestOpts grpc.DialOption
  330. requestOpts = grpc.WithInsecure()
  331. conn, err := grpc.Dial(server, requestOpts)
  332. if err != nil {
  333. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  334. }
  335. wcclient = nodepb.NewNodeServiceClient(conn)
  336. postnode := &nodepb.Node{
  337. Password: password,
  338. Macaddress: macaddress,
  339. Accesskey: accesskey,
  340. Nodenetwork: network,
  341. Listenport: listenport,
  342. Postup: postup,
  343. Postdown: postdown,
  344. Keepalive: keepalive,
  345. Localaddress: localaddress,
  346. Interface: wginterface,
  347. Publickey: publickey.String(),
  348. Name: name,
  349. Endpoint: endpoint,
  350. }
  351. fmt.Println("Writing node settings to netconfig file.")
  352. err = modConfig(postnode)
  353. if err != nil {
  354. return err
  355. }
  356. res, err := wcclient.CreateNode(
  357. context.TODO(),
  358. &nodepb.CreateNodeReq{
  359. Node: postnode,
  360. },
  361. )
  362. if err != nil {
  363. return err
  364. }
  365. node := res.Node
  366. fmt.Println("Setting local config from server response")
  367. if err != nil {
  368. return err
  369. }
  370. fmt.Println("NODE RECIEVED SETTINGS: ")
  371. fmt.Println(" Password: " + node.Password)
  372. fmt.Println(" WG Address: " + node.Address)
  373. fmt.Println(" Network: " + node.Nodenetwork)
  374. fmt.Println(" Public Endpoint: " + node.Endpoint)
  375. fmt.Println(" Local Address: " + node.Localaddress)
  376. fmt.Println(" Name: " + node.Name)
  377. fmt.Println(" Interface: " + node.Interface)
  378. fmt.Println(" PostUp: " + node.Postup)
  379. fmt.Println(" PostDown: " + node.Postdown)
  380. fmt.Println(" Port: " + strconv.FormatInt(int64(node.Listenport), 10))
  381. fmt.Println(" KeepAlive: " + strconv.FormatInt(int64(node.Keepalive), 10))
  382. fmt.Println(" Public Key: " + node.Publickey)
  383. fmt.Println(" Mac Address: " + node.Macaddress)
  384. fmt.Println(" Is Local?: " + strconv.FormatBool(node.Islocal))
  385. fmt.Println(" Local Range: " + node.Localrange)
  386. if !islocal && node.Islocal && node.Localrange != "" {
  387. fmt.Println("Resetting local settings for local network.")
  388. node.Localaddress, err = getLocalIP(node.Localrange)
  389. if err != nil {
  390. return err
  391. }
  392. node.Endpoint = node.Localaddress
  393. }
  394. err = modConfig(node)
  395. if err != nil {
  396. return err
  397. }
  398. if node.Ispending {
  399. fmt.Println("Node is marked as PENDING.")
  400. fmt.Println("Awaiting approval from Admin before configuring WireGuard.")
  401. if !noauto {
  402. fmt.Println("Configuring Netmaker Service.")
  403. err = ConfigureSystemD(network)
  404. return err
  405. }
  406. }
  407. peers, hasGateway, gateways, err := getPeers(node.Macaddress, network, server)
  408. if err != nil {
  409. return err
  410. }
  411. fmt.Println("retrived peers, setting wireguard config.")
  412. err = storePrivKey(privkeystring, network)
  413. if err != nil {
  414. return err
  415. }
  416. err = initWireguard(node, privkeystring, peers, hasGateway, gateways)
  417. if err != nil {
  418. return err
  419. }
  420. if !noauto {
  421. err = ConfigureSystemD(network)
  422. }
  423. if err != nil {
  424. return err
  425. }
  426. return err
  427. }
  428. func getLocalIP(localrange string) (string, error) {
  429. _, localRange, err := net.ParseCIDR(localrange)
  430. if err != nil {
  431. return "", err
  432. }
  433. ifaces, err := net.Interfaces()
  434. if err != nil {
  435. return "", err
  436. }
  437. var local string
  438. found := false
  439. for _, i := range ifaces {
  440. if i.Flags&net.FlagUp == 0 {
  441. continue // interface down
  442. }
  443. if i.Flags&net.FlagLoopback != 0 {
  444. continue // loopback interface
  445. }
  446. addrs, err := i.Addrs()
  447. if err != nil {
  448. return "", err
  449. }
  450. for _, addr := range addrs {
  451. var ip net.IP
  452. switch v := addr.(type) {
  453. case *net.IPNet:
  454. if !found {
  455. ip = v.IP
  456. local = ip.String()
  457. found = localRange.Contains(ip)
  458. }
  459. case *net.IPAddr:
  460. if !found {
  461. ip = v.IP
  462. local = ip.String()
  463. found = localRange.Contains(ip)
  464. }
  465. }
  466. }
  467. }
  468. if !found || local == "" {
  469. return "", errors.New("Failed to find local IP in range " + localrange)
  470. }
  471. return local, nil
  472. }
  473. func getPublicIP() (string, error) {
  474. iplist := []string{"http://ip.client.gravitl.com","https://ifconfig.me", "http://api.ipify.org", "http://ipinfo.io/ip"}
  475. endpoint := ""
  476. var err error
  477. for _, ipserver := range iplist {
  478. resp, err := http.Get(ipserver)
  479. if err != nil {
  480. continue
  481. }
  482. defer resp.Body.Close()
  483. if resp.StatusCode == http.StatusOK {
  484. bodyBytes, err := ioutil.ReadAll(resp.Body)
  485. if err != nil {
  486. continue
  487. }
  488. endpoint = string(bodyBytes)
  489. break
  490. }
  491. }
  492. if err == nil && endpoint == "" {
  493. err = errors.New("Public Address Not Found.")
  494. }
  495. return endpoint, err
  496. }
  497. func modConfig(node *nodepb.Node) error{
  498. network := node.Nodenetwork
  499. if network == "" {
  500. return errors.New("No Network Provided")
  501. }
  502. modconfig, err := config.ReadConfig(network)
  503. if err != nil {
  504. return err
  505. }
  506. nodecfg := modconfig.Node
  507. if node.Name != ""{
  508. nodecfg.Name = node.Name
  509. }
  510. if node.Interface != ""{
  511. nodecfg.Interface = node.Interface
  512. }
  513. if node.Nodenetwork != ""{
  514. nodecfg.Network = node.Nodenetwork
  515. }
  516. if node.Macaddress != ""{
  517. nodecfg.MacAddress = node.Macaddress
  518. }
  519. if node.Localaddress != ""{
  520. nodecfg.LocalAddress = node.Localaddress
  521. }
  522. if node.Postup != ""{
  523. nodecfg.PostUp = node.Postup
  524. }
  525. if node.Postdown != ""{
  526. nodecfg.PostDown = node.Postdown
  527. }
  528. if node.Listenport != 0{
  529. nodecfg.Port = node.Listenport
  530. }
  531. if node.Keepalive != 0{
  532. nodecfg.KeepAlive = node.Keepalive
  533. }
  534. if node.Publickey != ""{
  535. nodecfg.PublicKey = node.Publickey
  536. }
  537. if node.Endpoint != ""{
  538. nodecfg.Endpoint = node.Endpoint
  539. }
  540. if node.Password != ""{
  541. nodecfg.Password = node.Password
  542. }
  543. if node.Address != ""{
  544. nodecfg.WGAddress = node.Address
  545. }
  546. if node.Address != ""{
  547. nodecfg.WGAddress = node.Address
  548. }
  549. if node.Postchanges != "" {
  550. nodecfg.PostChanges = node.Postchanges
  551. }
  552. if node.Localrange != "" && node.Islocal {
  553. nodecfg.IsLocal = true
  554. nodecfg.LocalRange = node.Localrange
  555. }
  556. modconfig.Node = nodecfg
  557. err = config.Write(modconfig, network)
  558. return err
  559. }
  560. func getMacAddr() ([]string, error) {
  561. ifas, err := net.Interfaces()
  562. if err != nil {
  563. return nil, err
  564. }
  565. var as []string
  566. for _, ifa := range ifas {
  567. a := ifa.HardwareAddr.String()
  568. if a != "" {
  569. as = append(as, a)
  570. }
  571. }
  572. return as, nil
  573. }
  574. func initWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig, hasGateway bool, gateways []string) error {
  575. ipExec, err := exec.LookPath("ip")
  576. if err != nil {
  577. return err
  578. }
  579. key, err := wgtypes.ParseKey(privkey)
  580. if err != nil {
  581. return err
  582. }
  583. wgclient, err := wgctrl.New()
  584. //modcfg := config.Config
  585. //modcfg.ReadConfig()
  586. modcfg, err := config.ReadConfig(node.Nodenetwork)
  587. if err != nil {
  588. return err
  589. }
  590. nodecfg := modcfg.Node
  591. fmt.Println("beginning local WG config")
  592. if err != nil {
  593. log.Fatalf("failed to open client: %v", err)
  594. }
  595. defer wgclient.Close()
  596. fmt.Println("setting local settings")
  597. ifacename := node.Interface
  598. if nodecfg.Interface != "" {
  599. ifacename = nodecfg.Interface
  600. } else if node.Interface != "" {
  601. ifacename = node.Interface
  602. } else {
  603. log.Fatal("no interface to configure")
  604. }
  605. if node.Address == "" {
  606. log.Fatal("no address to configure")
  607. }
  608. cmdIPDevLinkAdd := &exec.Cmd {
  609. Path: ipExec,
  610. Args: []string{ ipExec, "link", "add", "dev", ifacename, "type", "wireguard" },
  611. Stdout: os.Stdout,
  612. Stderr: os.Stdout,
  613. }
  614. cmdIPAddrAdd := &exec.Cmd {
  615. Path: ipExec,
  616. Args: []string{ ipExec, "address", "add", "dev", ifacename, node.Address+"/24"},
  617. Stdout: os.Stdout,
  618. Stderr: os.Stdout,
  619. }
  620. currentiface, err := net.InterfaceByName(ifacename)
  621. if err != nil {
  622. err = cmdIPDevLinkAdd.Run()
  623. if err != nil && !strings.Contains(err.Error(), "exists") {
  624. fmt.Println("Error creating interface")
  625. //fmt.Println(err.Error())
  626. //return err
  627. }
  628. }
  629. match := false
  630. addrs, _ := currentiface.Addrs()
  631. for _, a := range addrs {
  632. if strings.Contains(a.String(), node.Address){
  633. match = true
  634. }
  635. }
  636. if !match {
  637. err = cmdIPAddrAdd.Run()
  638. if err != nil {
  639. fmt.Println("Error adding address")
  640. //return err
  641. }
  642. }
  643. var nodeport int
  644. nodeport = int(node.Listenport)
  645. fmt.Println("setting WG config from node and peers")
  646. //pubkey := privkey.PublicKey()
  647. conf := wgtypes.Config{
  648. PrivateKey: &key,
  649. ListenPort: &nodeport,
  650. ReplacePeers: true,
  651. Peers: peers,
  652. }
  653. _, err = wgclient.Device(ifacename)
  654. if err != nil {
  655. if os.IsNotExist(err) {
  656. fmt.Println("Device does not exist: ")
  657. fmt.Println(err)
  658. } else {
  659. log.Fatalf("Unknown config error: %v", err)
  660. }
  661. }
  662. fmt.Println("configuring WG device")
  663. err = wgclient.ConfigureDevice(ifacename, conf)
  664. if err != nil {
  665. if os.IsNotExist(err) {
  666. fmt.Println("Device does not exist: ")
  667. fmt.Println(err)
  668. } else {
  669. fmt.Printf("This is inconvenient: %v", err)
  670. }
  671. }
  672. cmdIPLinkUp := &exec.Cmd {
  673. Path: ipExec,
  674. Args: []string{ ipExec, "link", "set", "up", "dev", ifacename},
  675. Stdout: os.Stdout,
  676. Stderr: os.Stdout,
  677. }
  678. cmdIPLinkDown := &exec.Cmd {
  679. Path: ipExec,
  680. Args: []string{ ipExec, "link", "set", "down", "dev", ifacename},
  681. Stdout: os.Stdout,
  682. Stderr: os.Stdout,
  683. }
  684. err = cmdIPLinkDown.Run()
  685. if nodecfg.PostDown != "" {
  686. runcmds := strings.Split(nodecfg.PostDown, "; ")
  687. err = runCmds(runcmds)
  688. if err != nil {
  689. fmt.Println("Error encountered running PostDown: " + err.Error())
  690. }
  691. }
  692. err = cmdIPLinkUp.Run()
  693. if err != nil {
  694. return err
  695. }
  696. if nodecfg.PostUp != "" {
  697. runcmds := strings.Split(nodecfg.PostUp, "; ")
  698. err = runCmds(runcmds)
  699. if err != nil {
  700. fmt.Println("Error encountered running PostUp: " + err.Error())
  701. }
  702. }
  703. if (hasGateway) {
  704. for _, gateway := range gateways {
  705. out, err := exec.Command(ipExec,"-4","route","add",gateway,"dev",ifacename).Output()
  706. fmt.Println(string(out))
  707. if err != nil {
  708. fmt.Println("Error encountered adding gateway: " + err.Error())
  709. }
  710. }
  711. }
  712. return err
  713. }
  714. func runCmds(commands []string) error {
  715. var err error
  716. for _, command := range commands {
  717. fmt.Println("Running command: " + command)
  718. args := strings.Fields(command)
  719. out, err := exec.Command(args[0], args[1:]...).Output()
  720. fmt.Println(string(out))
  721. if err != nil {
  722. return err
  723. }
  724. }
  725. return err
  726. }
  727. func setWGKeyConfig(network string, serveraddr string) error {
  728. ctx := context.Background()
  729. var header metadata.MD
  730. var wcclient nodepb.NodeServiceClient
  731. var requestOpts grpc.DialOption
  732. requestOpts = grpc.WithInsecure()
  733. conn, err := grpc.Dial(serveraddr, requestOpts)
  734. if err != nil {
  735. fmt.Printf("Cant dial GRPC server: %v", err)
  736. return err
  737. }
  738. wcclient = nodepb.NewNodeServiceClient(conn)
  739. fmt.Println("Authenticating with GRPC Server")
  740. ctx, err = SetJWT(wcclient, network)
  741. if err != nil {
  742. fmt.Printf("Failed to authenticate: %v", err)
  743. return err
  744. }
  745. fmt.Println("Authenticated")
  746. node := getNode(network)
  747. privatekey, err := wgtypes.GeneratePrivateKey()
  748. if err != nil {
  749. return err
  750. }
  751. privkeystring := privatekey.String()
  752. publickey := privatekey.PublicKey()
  753. node.Publickey = publickey.String()
  754. err = storePrivKey(privkeystring, network)
  755. if err != nil {
  756. return err
  757. }
  758. err = modConfig(&node)
  759. if err != nil {
  760. return err
  761. }
  762. postnode := getNode(network)
  763. req := &nodepb.UpdateNodeReq{
  764. Node: &postnode,
  765. }
  766. _, err = wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  767. if err != nil {
  768. return err
  769. }
  770. err = setWGConfig(network)
  771. if err != nil {
  772. return err
  773. log.Fatalf("Error: %v", err)
  774. }
  775. return err
  776. }
  777. func setWGConfig(network string) error {
  778. cfg, err := config.ReadConfig(network)
  779. if err != nil {
  780. return err
  781. }
  782. servercfg := cfg.Server
  783. nodecfg := cfg.Node
  784. node := getNode(network)
  785. peers, hasGateway, gateways, err := getPeers(node.Macaddress, nodecfg.Network, servercfg.Address)
  786. if err != nil {
  787. return err
  788. }
  789. privkey, err := retrievePrivKey(network)
  790. if err != nil {
  791. return err
  792. }
  793. err = initWireguard(&node, privkey, peers, hasGateway, gateways)
  794. if err != nil {
  795. return err
  796. }
  797. return err
  798. }
  799. func storePrivKey(key string, network string) error{
  800. d1 := []byte(key)
  801. err := ioutil.WriteFile("/etc/netclient/wgkey-" + network, d1, 0644)
  802. return err
  803. }
  804. func retrievePrivKey(network string) (string, error) {
  805. dat, err := ioutil.ReadFile("/etc/netclient/wgkey-" + network)
  806. return string(dat), err
  807. }
  808. func getPrivateAddr() (string, error) {
  809. ifaces, err := net.Interfaces()
  810. if err != nil {
  811. return "", err
  812. }
  813. var local string
  814. found := false
  815. for _, i := range ifaces {
  816. if i.Flags&net.FlagUp == 0 {
  817. continue // interface down
  818. }
  819. if i.Flags&net.FlagLoopback != 0 {
  820. continue // loopback interface
  821. }
  822. addrs, err := i.Addrs()
  823. if err != nil {
  824. return "", err
  825. }
  826. for _, addr := range addrs {
  827. var ip net.IP
  828. switch v := addr.(type) {
  829. case *net.IPNet:
  830. if !found {
  831. ip = v.IP
  832. local = ip.String()
  833. found = true
  834. }
  835. case *net.IPAddr:
  836. if !found {
  837. ip = v.IP
  838. local = ip.String()
  839. found = true
  840. }
  841. }
  842. }
  843. }
  844. if !found {
  845. err := errors.New("Local Address Not Found.")
  846. return "", err
  847. }
  848. return local, err
  849. }
  850. func CheckIn(network string) error {
  851. node := getNode(network)
  852. cfg, err := config.ReadConfig(network)
  853. if err != nil {
  854. return err
  855. }
  856. nodecfg := cfg.Node
  857. servercfg := cfg.Server
  858. fmt.Println("Checking into server: " + servercfg.Address)
  859. setupcheck := true
  860. ipchange := false
  861. if !nodecfg.DNSOff {
  862. vals := strings.Split(servercfg.Address, ":")
  863. server := vals[0]
  864. err = SetDNS(server)
  865. if err != nil {
  866. fmt.Printf("Error encountered setting dns: %v", err)
  867. }
  868. }
  869. if !nodecfg.RoamingOff {
  870. if !nodecfg.IsLocal {
  871. fmt.Println("Checking to see if public addresses have changed")
  872. extIP, err := getPublicIP()
  873. if err != nil {
  874. fmt.Printf("Error encountered checking ip addresses: %v", err)
  875. }
  876. if nodecfg.Endpoint != extIP && extIP != "" {
  877. fmt.Println("Endpoint has changed from " +
  878. nodecfg.Endpoint + " to " + extIP)
  879. fmt.Println("Updating address")
  880. nodecfg.Endpoint = extIP
  881. nodecfg.PostChanges = "true"
  882. node.Endpoint = extIP
  883. node.Postchanges = "true"
  884. ipchange = true
  885. }
  886. intIP, err := getPrivateAddr()
  887. if err != nil {
  888. fmt.Printf("Error encountered checking ip addresses: %v", err)
  889. }
  890. if nodecfg.LocalAddress != intIP && intIP != "" {
  891. fmt.Println("Local Address has changed from " +
  892. nodecfg.LocalAddress + " to " + intIP)
  893. fmt.Println("Updating address")
  894. nodecfg.LocalAddress = intIP
  895. nodecfg.PostChanges = "true"
  896. node.Localaddress = intIP
  897. node.Postchanges = "true"
  898. ipchange = true
  899. }
  900. } else {
  901. fmt.Println("Checking to see if local addresses have changed")
  902. localIP, err := getLocalIP(nodecfg.LocalRange)
  903. if err != nil {
  904. fmt.Printf("Error encountered checking ip addresses: %v", err)
  905. }
  906. if nodecfg.Endpoint != localIP && localIP != "" {
  907. fmt.Println("Endpoint has changed from " +
  908. nodecfg.Endpoint + " to " + localIP)
  909. fmt.Println("Updating address")
  910. nodecfg.Endpoint = localIP
  911. nodecfg.LocalAddress = localIP
  912. nodecfg.PostChanges = "true"
  913. node.Endpoint = localIP
  914. node.Localaddress = localIP
  915. node.Postchanges = "true"
  916. ipchange = true
  917. }
  918. }
  919. if node.Postchanges != "true" {
  920. fmt.Println("Addresses have not changed.")
  921. }
  922. }
  923. if ipchange {
  924. err := modConfig(&node)
  925. if err != nil {
  926. return err
  927. log.Fatalf("Error: %v", err)
  928. }
  929. err = setWGConfig(network)
  930. if err != nil {
  931. return err
  932. log.Fatalf("Error: %v", err)
  933. }
  934. node = getNode(network)
  935. cfg, err := config.ReadConfig(network)
  936. if err != nil {
  937. return err
  938. }
  939. nodecfg = cfg.Node
  940. }
  941. var wcclient nodepb.NodeServiceClient
  942. var requestOpts grpc.DialOption
  943. requestOpts = grpc.WithInsecure()
  944. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  945. if err != nil {
  946. fmt.Printf("Cant dial GRPC server: %v", err)
  947. return err
  948. }
  949. wcclient = nodepb.NewNodeServiceClient(conn)
  950. ctx := context.Background()
  951. fmt.Println("Authenticating with GRPC Server")
  952. ctx, err = SetJWT(wcclient, network)
  953. if err != nil {
  954. fmt.Printf("Failed to authenticate: %v", err)
  955. return err
  956. }
  957. fmt.Println("Authenticated")
  958. fmt.Println("Checking In.")
  959. var header metadata.MD
  960. node.Nodenetwork = network
  961. checkinres, err := wcclient.CheckIn(
  962. ctx,
  963. &nodepb.CheckInReq{
  964. Node: &node,
  965. },
  966. grpc.Header(&header),
  967. )
  968. if err != nil {
  969. if checkinres != nil && checkinres.Checkinresponse.Ispending {
  970. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
  971. return nil
  972. }
  973. fmt.Printf("Unable to process Check In request: %v", err)
  974. return err
  975. }
  976. fmt.Println("Checked in.")
  977. if checkinres.Checkinresponse.Ispending {
  978. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
  979. return err
  980. }
  981. newinterface := getNode(network).Interface
  982. readreq := &nodepb.ReadNodeReq{
  983. Macaddress: node.Macaddress,
  984. Network: node.Nodenetwork,
  985. }
  986. readres, err := wcclient.ReadNode(ctx, readreq, grpc.Header(&header))
  987. if err != nil {
  988. fmt.Printf("Error: %v", err)
  989. } else {
  990. currentiface := readres.Node.Interface
  991. ifaceupdate := newinterface != currentiface
  992. if err != nil {
  993. log.Printf("Error retrieving interface: %v", err)
  994. }
  995. if ifaceupdate {
  996. fmt.Println("Interface update: " + currentiface +
  997. " >>>> " + newinterface)
  998. err := DeleteInterface(currentiface, nodecfg.PostDown)
  999. if err != nil {
  1000. fmt.Println("ERROR DELETING INTERFACE: " + currentiface)
  1001. }
  1002. err = setWGConfig(network)
  1003. if err != nil {
  1004. log.Printf("Error updating interface: %v", err)
  1005. }
  1006. }
  1007. }
  1008. if checkinres.Checkinresponse.Needconfigupdate {
  1009. fmt.Println("Server has requested that node update config.")
  1010. fmt.Println("Updating config from remote server.")
  1011. req := &nodepb.ReadNodeReq{
  1012. Macaddress: node.Macaddress,
  1013. Network: node.Nodenetwork,
  1014. }
  1015. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  1016. if err != nil {
  1017. return err
  1018. log.Fatalf("Error: %v", err)
  1019. }
  1020. err = modConfig(readres.Node)
  1021. if err != nil {
  1022. return err
  1023. log.Fatalf("Error: %v", err)
  1024. }
  1025. err = setWGConfig(network)
  1026. if err != nil {
  1027. return err
  1028. log.Fatalf("Error: %v", err)
  1029. }
  1030. setupcheck = false
  1031. } else if nodecfg.PostChanges == "true" {
  1032. fmt.Println("Node has requested to update remote config.")
  1033. fmt.Println("Posting local config to remote server.")
  1034. postnode := getNode(network)
  1035. req := &nodepb.UpdateNodeReq{
  1036. Node: &postnode,
  1037. }
  1038. res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  1039. if err != nil {
  1040. return err
  1041. log.Fatalf("Error: %v", err)
  1042. }
  1043. res.Node.Postchanges = "false"
  1044. err = modConfig(res.Node)
  1045. if err != nil {
  1046. return err
  1047. log.Fatalf("Error: %v", err)
  1048. }
  1049. err = setWGConfig(network)
  1050. if err != nil {
  1051. return err
  1052. log.Fatalf("Error: %v", err)
  1053. }
  1054. setupcheck = false
  1055. }
  1056. if checkinres.Checkinresponse.Needkeyupdate {
  1057. fmt.Println("Server has requested that node update key pairs.")
  1058. fmt.Println("Proceeding to re-generate key pairs for Wiregard.")
  1059. err = setWGKeyConfig(network, servercfg.Address)
  1060. if err != nil {
  1061. return err
  1062. log.Fatalf("Unable to process reset keys request: %v", err)
  1063. }
  1064. setupcheck = false
  1065. }
  1066. if checkinres.Checkinresponse.Needpeerupdate {
  1067. fmt.Println("Server has requested that node update peer list.")
  1068. fmt.Println("Updating peer list from remote server.")
  1069. err = setWGConfig(network)
  1070. if err != nil {
  1071. return err
  1072. log.Fatalf("Unable to process Set Peers request: %v", err)
  1073. }
  1074. setupcheck = false
  1075. }
  1076. if checkinres.Checkinresponse.Needdelete {
  1077. fmt.Println("This machine got the delete signal. Deleting.")
  1078. err := Remove(network)
  1079. if err != nil {
  1080. return err
  1081. log.Fatalf("Error: %v", err)
  1082. }
  1083. }
  1084. if setupcheck {
  1085. iface := nodecfg.Interface
  1086. _, err := net.InterfaceByName(iface)
  1087. if err != nil {
  1088. fmt.Println("interface " + iface + " does not currently exist. Setting up WireGuard.")
  1089. err = setWGKeyConfig(network, servercfg.Address)
  1090. if err != nil {
  1091. return err
  1092. log.Fatalf("Error: %v", err)
  1093. }
  1094. }
  1095. }
  1096. return nil
  1097. }
  1098. func needInterfaceUpdate(ctx context.Context, mac string, network string, iface string) (bool, string, error) {
  1099. var header metadata.MD
  1100. req := &nodepb.ReadNodeReq{
  1101. Macaddress: mac,
  1102. Network: network,
  1103. }
  1104. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  1105. if err != nil {
  1106. return false, "", err
  1107. log.Fatalf("Error: %v", err)
  1108. }
  1109. oldiface := readres.Node.Interface
  1110. return iface != oldiface, oldiface, err
  1111. }
  1112. func getNode(network string) nodepb.Node {
  1113. modcfg, err := config.ReadConfig(network)
  1114. if err != nil {
  1115. log.Fatalf("Error: %v", err)
  1116. }
  1117. nodecfg := modcfg.Node
  1118. var node nodepb.Node
  1119. node.Name = nodecfg.Name
  1120. node.Interface = nodecfg.Interface
  1121. node.Nodenetwork = nodecfg.Network
  1122. node.Localaddress = nodecfg.LocalAddress
  1123. node.Address = nodecfg.WGAddress
  1124. node.Listenport = nodecfg.Port
  1125. node.Keepalive = nodecfg.KeepAlive
  1126. node.Postup = nodecfg.PostUp
  1127. node.Postdown = nodecfg.PostDown
  1128. node.Publickey = nodecfg.PublicKey
  1129. node.Macaddress = nodecfg.MacAddress
  1130. node.Endpoint = nodecfg.Endpoint
  1131. node.Password = nodecfg.Password
  1132. //spew.Dump(node)
  1133. return node
  1134. }
  1135. func Remove(network string) error {
  1136. //need to implement checkin on server side
  1137. cfg, err := config.ReadConfig(network)
  1138. if err != nil {
  1139. return err
  1140. }
  1141. servercfg := cfg.Server
  1142. node := cfg.Node
  1143. fmt.Println("Deleting remote node with MAC: " + node.MacAddress)
  1144. var wcclient nodepb.NodeServiceClient
  1145. var requestOpts grpc.DialOption
  1146. requestOpts = grpc.WithInsecure()
  1147. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  1148. if err != nil {
  1149. log.Printf("Unable to establish client connection to " + servercfg.Address + ": %v", err)
  1150. //return err
  1151. }else {
  1152. wcclient = nodepb.NewNodeServiceClient(conn)
  1153. ctx := context.Background()
  1154. fmt.Println("Authenticating with GRPC Server")
  1155. ctx, err = SetJWT(wcclient, network)
  1156. if err != nil {
  1157. //return err
  1158. log.Printf("Failed to authenticate: %v", err)
  1159. } else {
  1160. fmt.Println("Authenticated")
  1161. var header metadata.MD
  1162. _, err = wcclient.DeleteNode(
  1163. ctx,
  1164. &nodepb.DeleteNodeReq{
  1165. Macaddress: node.MacAddress,
  1166. NetworkName: node.Network,
  1167. },
  1168. grpc.Header(&header),
  1169. )
  1170. if err != nil {
  1171. log.Printf("Encountered error deleting node: %v", err)
  1172. fmt.Println(err)
  1173. } else {
  1174. fmt.Println("Deleted node " + node.MacAddress)
  1175. }
  1176. }
  1177. }
  1178. err = WipeLocal(network)
  1179. if err != nil {
  1180. log.Printf("Unable to wipe local config: %v", err)
  1181. }
  1182. err = RemoveSystemDServices(network)
  1183. if err != nil {
  1184. return err
  1185. log.Printf("Unable to remove systemd services: %v", err)
  1186. }
  1187. fmt.Printf("Please investigate any stated errors to ensure proper removal.")
  1188. fmt.Printf("Failure to delete node from server via gRPC will mean node still exists and needs to be manually deleted by administrator.")
  1189. return nil
  1190. }
  1191. func WipeLocal(network string) error{
  1192. cfg, err := config.ReadConfig(network)
  1193. if err != nil {
  1194. return err
  1195. }
  1196. nodecfg := cfg.Node
  1197. ifacename := nodecfg.Interface
  1198. //home, err := homedir.Dir()
  1199. home := "/etc/netclient"
  1200. err = os.Remove(home + "/netconfig-" + network)
  1201. if err != nil {
  1202. fmt.Println(err)
  1203. }
  1204. err = os.Remove(home + "/nettoken-" + network)
  1205. if err != nil {
  1206. fmt.Println(err)
  1207. }
  1208. err = os.Remove(home + "/wgkey-" + network)
  1209. if err != nil {
  1210. fmt.Println(err)
  1211. }
  1212. ipExec, err := exec.LookPath("ip")
  1213. if ifacename != "" {
  1214. cmdIPLinkDel := &exec.Cmd {
  1215. Path: ipExec,
  1216. Args: []string{ ipExec, "link", "del", ifacename },
  1217. Stdout: os.Stdout,
  1218. Stderr: os.Stdout,
  1219. }
  1220. err = cmdIPLinkDel.Run()
  1221. if err != nil {
  1222. fmt.Println(err)
  1223. }
  1224. if nodecfg.PostDown != "" {
  1225. runcmds := strings.Split(nodecfg.PostDown, "; ")
  1226. err = runCmds(runcmds)
  1227. if err != nil {
  1228. fmt.Println("Error encountered running PostDown: " + err.Error())
  1229. }
  1230. }
  1231. }
  1232. return err
  1233. }
  1234. func DeleteInterface(ifacename string, postdown string) error{
  1235. ipExec, err := exec.LookPath("ip")
  1236. cmdIPLinkDel := &exec.Cmd {
  1237. Path: ipExec,
  1238. Args: []string{ ipExec, "link", "del", ifacename },
  1239. Stdout: os.Stdout,
  1240. Stderr: os.Stdout,
  1241. }
  1242. err = cmdIPLinkDel.Run()
  1243. if err != nil {
  1244. fmt.Println(err)
  1245. }
  1246. if postdown != "" {
  1247. runcmds := strings.Split(postdown, "; ")
  1248. err = runCmds(runcmds)
  1249. if err != nil {
  1250. fmt.Println("Error encountered running PostDown: " + err.Error())
  1251. }
  1252. }
  1253. return err
  1254. }
  1255. func getPeers(macaddress string, network string, server string) ([]wgtypes.PeerConfig, bool, []string, error) {
  1256. //need to implement checkin on server side
  1257. hasGateway := false
  1258. var gateways []string
  1259. var peers []wgtypes.PeerConfig
  1260. var wcclient nodepb.NodeServiceClient
  1261. cfg, err := config.ReadConfig(network)
  1262. if err != nil {
  1263. log.Fatalf("Issue retrieving config for network: " + network + ". Please investigate: %v", err)
  1264. }
  1265. nodecfg := cfg.Node
  1266. keepalive := nodecfg.KeepAlive
  1267. keepalivedur, err := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s")
  1268. if err != nil {
  1269. log.Fatalf("Issue with format of keepalive value. Please update netconfig: %v", err)
  1270. }
  1271. fmt.Println("Registering with GRPC Server")
  1272. requestOpts := grpc.WithInsecure()
  1273. conn, err := grpc.Dial(server, requestOpts)
  1274. if err != nil {
  1275. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  1276. }
  1277. // Instantiate the BlogServiceClient with our client connection to the server
  1278. wcclient = nodepb.NewNodeServiceClient(conn)
  1279. req := &nodepb.GetPeersReq{
  1280. Macaddress: macaddress,
  1281. Network: network,
  1282. }
  1283. ctx := context.Background()
  1284. fmt.Println("Authenticating with GRPC Server")
  1285. ctx, err = SetJWT(wcclient, network)
  1286. if err != nil {
  1287. fmt.Println("Failed to authenticate.")
  1288. return peers, hasGateway, gateways, err
  1289. }
  1290. var header metadata.MD
  1291. stream, err := wcclient.GetPeers(ctx, req, grpc.Header(&header))
  1292. if err != nil {
  1293. fmt.Println("Error retrieving peers")
  1294. fmt.Println(err)
  1295. return nil, hasGateway, gateways, err
  1296. }
  1297. fmt.Println("Parsing peers response")
  1298. for {
  1299. res, err := stream.Recv()
  1300. // If end of stream, break the loop
  1301. if err == io.EOF {
  1302. break
  1303. }
  1304. // if err, return an error
  1305. if err != nil {
  1306. if strings.Contains(err.Error(), "mongo: no documents in result") {
  1307. continue
  1308. } else {
  1309. fmt.Println("ERROR ENCOUNTERED WITH RESPONSE")
  1310. fmt.Println(res)
  1311. return peers, hasGateway, gateways, err
  1312. }
  1313. }
  1314. pubkey, err := wgtypes.ParseKey(res.Peers.Publickey)
  1315. if err != nil {
  1316. fmt.Println("error parsing key")
  1317. return peers, hasGateway, gateways, err
  1318. }
  1319. if nodecfg.PublicKey == res.Peers.Publickey {
  1320. fmt.Println("Peer is self. Skipping")
  1321. continue
  1322. }
  1323. if nodecfg.Endpoint == res.Peers.Endpoint {
  1324. fmt.Println("Peer is self. Skipping")
  1325. continue
  1326. }
  1327. var peer wgtypes.PeerConfig
  1328. var peeraddr = net.IPNet{
  1329. IP: net.ParseIP(res.Peers.Address),
  1330. Mask: net.CIDRMask(32, 32),
  1331. }
  1332. var allowedips []net.IPNet
  1333. allowedips = append(allowedips, peeraddr)
  1334. if res.Peers.Isgateway {
  1335. hasGateway = true
  1336. gateways = append(gateways,res.Peers.Gatewayrange)
  1337. _, ipnet, err := net.ParseCIDR(res.Peers.Gatewayrange)
  1338. if err != nil {
  1339. fmt.Println("ERROR ENCOUNTERED SETTING GATEWAY")
  1340. fmt.Println("NOT SETTING GATEWAY")
  1341. fmt.Println(err)
  1342. } else {
  1343. fmt.Println(" Gateway Range: " + res.Peers.Gatewayrange)
  1344. allowedips = append(allowedips, *ipnet)
  1345. }
  1346. }
  1347. if keepalive != 0 {
  1348. peer = wgtypes.PeerConfig{
  1349. PublicKey: pubkey,
  1350. PersistentKeepaliveInterval: &keepalivedur,
  1351. Endpoint: &net.UDPAddr{
  1352. IP: net.ParseIP(res.Peers.Endpoint),
  1353. Port: int(res.Peers.Listenport),
  1354. },
  1355. ReplaceAllowedIPs: true,
  1356. AllowedIPs: allowedips,
  1357. }
  1358. } else {
  1359. peer = wgtypes.PeerConfig{
  1360. PublicKey: pubkey,
  1361. Endpoint: &net.UDPAddr{
  1362. IP: net.ParseIP(res.Peers.Endpoint),
  1363. Port: int(res.Peers.Listenport),
  1364. },
  1365. ReplaceAllowedIPs: true,
  1366. AllowedIPs: allowedips,
  1367. }
  1368. }
  1369. peers = append(peers, peer)
  1370. }
  1371. fmt.Println("Finished parsing peers response")
  1372. return peers, hasGateway, gateways, err
  1373. }