common.go 43 KB

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