common.go 43 KB

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