common.go 42 KB

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