common.go 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514
  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, dnsoff bool) error {
  71. tserver := ""
  72. tnetwork := ""
  73. tkey := ""
  74. trange := ""
  75. var localrange *net.IPNet
  76. islocal := false
  77. if FileExists("/etc/systemd/system/netclient-"+network+".timer") ||
  78. FileExists("/etc/netclient/netconfig-"+network) {
  79. err := errors.New("ALREADY_INSTALLED. Netclient appears to already be installed for network " + network + ". To re-install, please remove by executing 'sudo netclient -c remove -n " + network + "'. Then re-run the install command.")
  80. return err
  81. }
  82. if accesstoken != "" && accesstoken != "badtoken" {
  83. btoken, err := base64.StdEncoding.DecodeString(accesstoken)
  84. if err != nil {
  85. log.Fatalf("Something went wrong decoding your token: %v", err)
  86. }
  87. token := string(btoken)
  88. tokenvals := strings.Split(token, "|")
  89. tserver = tokenvals[0]
  90. tnetwork = tokenvals[1]
  91. tkey = tokenvals[2]
  92. trange = tokenvals[3]
  93. printrange := ""
  94. if server == "localhost:50051" {
  95. server = tserver
  96. }
  97. if network == "nonetwork" {
  98. network = tnetwork
  99. }
  100. if accesskey == "badkey" {
  101. accesskey = tkey
  102. }
  103. fmt.Println(trange)
  104. if trange != "" {
  105. fmt.Println("This is a local network. Proceeding with local address as endpoint.")
  106. islocal = true
  107. _, localrange, err = net.ParseCIDR(trange)
  108. if err == nil {
  109. printrange = localrange.String()
  110. } else {
  111. //localrange = ""
  112. }
  113. } else {
  114. printrange = "Not a local network. Will use public address for endpoint."
  115. }
  116. fmt.Println("Decoded values from token:")
  117. fmt.Println(" Server: " + server)
  118. fmt.Println(" Network: " + network)
  119. fmt.Println(" Key: " + accesskey)
  120. fmt.Println(" Local Range: " + printrange)
  121. }
  122. wgclient, err := wgctrl.New()
  123. if err != nil {
  124. log.Fatalf("failed to open client: %v", err)
  125. }
  126. defer wgclient.Close()
  127. cfg, err := config.ReadConfig(network)
  128. if err != nil {
  129. log.Printf("No Config Yet. Will Write: %v", err)
  130. }
  131. nodecfg := cfg.Node
  132. servercfg := cfg.Server
  133. fmt.Println("SERVER SETTINGS:")
  134. nodecfg.DNSOff = dnsoff
  135. if server == "" {
  136. if servercfg.Address == "" && tserver == "" {
  137. log.Fatal("no server provided")
  138. } else {
  139. server = servercfg.Address
  140. }
  141. }
  142. fmt.Println(" Server: " + server)
  143. if accesskey == "" {
  144. if servercfg.AccessKey == "" && tkey == "" {
  145. fmt.Println("no access key provided.Proceeding anyway.")
  146. } else {
  147. accesskey = servercfg.AccessKey
  148. }
  149. }
  150. fmt.Println(" AccessKey: " + accesskey)
  151. err = config.WriteServer(server, accesskey, network)
  152. if err != nil {
  153. fmt.Println("Error encountered while writing Server Config.")
  154. return err
  155. }
  156. fmt.Println("NODE REQUESTING SETTINGS:")
  157. if password == "" {
  158. if nodecfg.Password == "" {
  159. //create error here
  160. log.Fatal("no password provided")
  161. } else {
  162. password = nodecfg.Password
  163. }
  164. }
  165. fmt.Println(" Password: " + password)
  166. if network == "badnetwork" {
  167. if nodecfg.Network == "" && tnetwork == "" {
  168. //create error here
  169. log.Fatal("no network provided")
  170. } else {
  171. network = nodecfg.Network
  172. }
  173. }
  174. fmt.Println(" Network: " + network)
  175. var macaddress string
  176. var localaddress string
  177. var listenport int32
  178. var keepalive int32
  179. var publickey wgtypes.Key
  180. var privatekey wgtypes.Key
  181. var privkeystring string
  182. var endpoint string
  183. var postup string
  184. var postdown string
  185. var name string
  186. var wginterface string
  187. if nodecfg.LocalAddress == "" {
  188. ifaces, err := net.Interfaces()
  189. if err != nil {
  190. return err
  191. }
  192. var local string
  193. found := false
  194. for _, i := range ifaces {
  195. if i.Flags&net.FlagUp == 0 {
  196. continue // interface down
  197. }
  198. if i.Flags&net.FlagLoopback != 0 {
  199. continue // loopback interface
  200. }
  201. addrs, err := i.Addrs()
  202. if err != nil {
  203. return err
  204. }
  205. for _, addr := range addrs {
  206. var ip net.IP
  207. switch v := addr.(type) {
  208. case *net.IPNet:
  209. if !found {
  210. ip = v.IP
  211. local = ip.String()
  212. if islocal {
  213. found = localrange.Contains(ip)
  214. } else {
  215. found = true
  216. }
  217. }
  218. case *net.IPAddr:
  219. if !found {
  220. ip = v.IP
  221. local = ip.String()
  222. if islocal {
  223. found = localrange.Contains(ip)
  224. } else {
  225. found = true
  226. }
  227. }
  228. }
  229. }
  230. }
  231. localaddress = local
  232. } else {
  233. localaddress = nodecfg.LocalAddress
  234. }
  235. fmt.Println(" Local Address: " + localaddress)
  236. if nodecfg.Endpoint == "" {
  237. if islocal && localaddress != "" {
  238. endpoint = localaddress
  239. fmt.Println("Endpoint is local. Setting to address: " + endpoint)
  240. } else {
  241. endpoint, err = getPublicIP()
  242. if err != nil {
  243. fmt.Println("Error setting endpoint.")
  244. return err
  245. }
  246. fmt.Println("Endpoint is public. Setting to address: " + endpoint)
  247. }
  248. } else {
  249. endpoint = nodecfg.Endpoint
  250. fmt.Println("Endpoint set in config. Setting to address: " + endpoint)
  251. }
  252. fmt.Println(" Endpoint: " + endpoint)
  253. if nodecfg.Name != "" {
  254. name = nodecfg.Name
  255. }
  256. if inputname != "" && inputname != "noname" {
  257. name = inputname
  258. }
  259. fmt.Println(" Name: " + name)
  260. if nodecfg.Interface != "" {
  261. wginterface = nodecfg.Interface
  262. }
  263. fmt.Println(" Interface: " + wginterface)
  264. if nodecfg.PostUp != "" {
  265. postup = nodecfg.PostUp
  266. }
  267. fmt.Println(" PostUp: " + postup)
  268. if nodecfg.PostDown!= "" {
  269. postdown = nodecfg.PostDown
  270. }
  271. fmt.Println(" PostDown: " + postdown)
  272. if nodecfg.KeepAlive != 0 {
  273. keepalive = nodecfg.KeepAlive
  274. }
  275. fmt.Println(" KeepAlive: " + wginterface)
  276. if nodecfg.Port != 0 {
  277. listenport = nodecfg.Port
  278. }
  279. if listenport == 0 {
  280. listenport, err = GetFreePort(51821)
  281. if err != nil {
  282. fmt.Printf("Error retrieving port: %v", err)
  283. }
  284. }
  285. fmt.Printf(" Port: %v", listenport)
  286. fmt.Println("")
  287. if nodecfg.PrivateKey != "" {
  288. privkeystring = nodecfg.PrivateKey
  289. privatekey, err := wgtypes.ParseKey(nodecfg.PrivateKey)
  290. if err != nil {
  291. log.Fatal(err)
  292. }
  293. if nodecfg.PublicKey != "" {
  294. publickey, err = wgtypes.ParseKey(nodecfg.PublicKey)
  295. if err != nil {
  296. log.Fatal(err)
  297. }
  298. } else {
  299. publickey = privatekey.PublicKey()
  300. }
  301. } else {
  302. privatekey, err := wgtypes.GeneratePrivateKey()
  303. if err != nil {
  304. log.Fatal(err)
  305. }
  306. privkeystring = privatekey.String()
  307. publickey = privatekey.PublicKey()
  308. }
  309. if nodecfg.MacAddress != "" {
  310. macaddress = nodecfg.MacAddress
  311. } else {
  312. macs, err := getMacAddr()
  313. if err != nil {
  314. return err
  315. } else if len(macs) == 0 {
  316. log.Fatal()
  317. } else {
  318. macaddress = macs[0]
  319. }
  320. }
  321. fmt.Println(" Mac Address: " + macaddress)
  322. fmt.Println(" Private Key: " + privatekey.String())
  323. fmt.Println(" Public Key: " + publickey.String())
  324. var wcclient nodepb.NodeServiceClient
  325. var requestOpts grpc.DialOption
  326. requestOpts = grpc.WithInsecure()
  327. conn, err := grpc.Dial(server, requestOpts)
  328. if err != nil {
  329. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  330. }
  331. wcclient = nodepb.NewNodeServiceClient(conn)
  332. postnode := &nodepb.Node{
  333. Password: password,
  334. Macaddress: macaddress,
  335. Accesskey: accesskey,
  336. Nodenetwork: network,
  337. Listenport: listenport,
  338. Postup: postup,
  339. Postdown: postdown,
  340. Keepalive: keepalive,
  341. Localaddress: localaddress,
  342. Interface: wginterface,
  343. Publickey: publickey.String(),
  344. Name: name,
  345. Endpoint: endpoint,
  346. }
  347. fmt.Println("Writing node settings to netconfig file.")
  348. err = modConfig(postnode)
  349. if err != nil {
  350. return err
  351. }
  352. res, err := wcclient.CreateNode(
  353. context.TODO(),
  354. &nodepb.CreateNodeReq{
  355. Node: postnode,
  356. },
  357. )
  358. if err != nil {
  359. return err
  360. }
  361. node := res.Node
  362. fmt.Println("Setting local config from server response")
  363. if err != nil {
  364. return err
  365. }
  366. fmt.Println("NODE RECIEVED SETTINGS: ")
  367. fmt.Println(" Password: " + node.Password)
  368. fmt.Println(" WG Address: " + node.Address)
  369. fmt.Println(" Network: " + node.Nodenetwork)
  370. fmt.Println(" Public Endpoint: " + node.Endpoint)
  371. fmt.Println(" Local Address: " + node.Localaddress)
  372. fmt.Println(" Name: " + node.Name)
  373. fmt.Println(" Interface: " + node.Interface)
  374. fmt.Println(" PostUp: " + node.Postup)
  375. fmt.Println(" PostDown: " + node.Postdown)
  376. fmt.Println(" Port: " + strconv.FormatInt(int64(node.Listenport), 10))
  377. fmt.Println(" KeepAlive: " + strconv.FormatInt(int64(node.Keepalive), 10))
  378. fmt.Println(" Public Key: " + node.Publickey)
  379. fmt.Println(" Mac Address: " + node.Macaddress)
  380. fmt.Println(" Is Local?: " + strconv.FormatBool(node.Islocal))
  381. fmt.Println(" Local Range: " + node.Localrange)
  382. if !islocal && node.Islocal && node.Localrange != "" {
  383. fmt.Println("Resetting local settings for local network.")
  384. node.Localaddress, err = getLocalIP(node.Localrange)
  385. if err != nil {
  386. return err
  387. }
  388. node.Endpoint = node.Localaddress
  389. }
  390. err = modConfig(node)
  391. if err != nil {
  392. return err
  393. }
  394. if node.Ispending {
  395. fmt.Println("Node is marked as PENDING.")
  396. fmt.Println("Awaiting approval from Admin before configuring WireGuard.")
  397. if !noauto {
  398. fmt.Println("Configuring Netmaker Service.")
  399. err = ConfigureSystemD(network)
  400. return err
  401. }
  402. }
  403. peers, hasGateway, gateways, err := getPeers(node.Macaddress, network, server)
  404. if err != nil {
  405. return err
  406. }
  407. fmt.Println("retrived peers, setting wireguard config.")
  408. err = storePrivKey(privkeystring, network)
  409. if err != nil {
  410. return err
  411. }
  412. err = initWireguard(node, privkeystring, peers, hasGateway, gateways)
  413. if err != nil {
  414. return err
  415. }
  416. if !noauto {
  417. err = ConfigureSystemD(network)
  418. }
  419. if err != nil {
  420. return err
  421. }
  422. return err
  423. }
  424. func getLocalIP(localrange string) (string, error) {
  425. _, localRange, err := net.ParseCIDR(localrange)
  426. if err != nil {
  427. return "", err
  428. }
  429. ifaces, err := net.Interfaces()
  430. if err != nil {
  431. return "", err
  432. }
  433. var local string
  434. found := false
  435. for _, i := range ifaces {
  436. if i.Flags&net.FlagUp == 0 {
  437. continue // interface down
  438. }
  439. if i.Flags&net.FlagLoopback != 0 {
  440. continue // loopback interface
  441. }
  442. addrs, err := i.Addrs()
  443. if err != nil {
  444. return "", err
  445. }
  446. for _, addr := range addrs {
  447. var ip net.IP
  448. switch v := addr.(type) {
  449. case *net.IPNet:
  450. if !found {
  451. ip = v.IP
  452. local = ip.String()
  453. found = localRange.Contains(ip)
  454. }
  455. case *net.IPAddr:
  456. if !found {
  457. ip = v.IP
  458. local = ip.String()
  459. found = localRange.Contains(ip)
  460. }
  461. }
  462. }
  463. }
  464. if !found || local == "" {
  465. return "", errors.New("Failed to find local IP in range " + localrange)
  466. }
  467. return local, nil
  468. }
  469. func getPublicIP() (string, error) {
  470. iplist := []string{"https://ifconfig.me", "http://api.ipify.org", "http://ipinfo.io/ip"}
  471. endpoint := ""
  472. var err error
  473. for _, ipserver := range iplist {
  474. resp, err := http.Get(ipserver)
  475. if err != nil {
  476. continue
  477. }
  478. defer resp.Body.Close()
  479. if resp.StatusCode == http.StatusOK {
  480. bodyBytes, err := ioutil.ReadAll(resp.Body)
  481. if err != nil {
  482. continue
  483. }
  484. endpoint = string(bodyBytes)
  485. break
  486. }
  487. }
  488. if err == nil && endpoint == "" {
  489. err = errors.New("Public Address Not Found.")
  490. }
  491. return endpoint, err
  492. }
  493. func modConfig(node *nodepb.Node) error{
  494. network := node.Nodenetwork
  495. if network == "" {
  496. return errors.New("No Network Provided")
  497. }
  498. modconfig, err := config.ReadConfig(network)
  499. if err != nil {
  500. return err
  501. }
  502. nodecfg := modconfig.Node
  503. if node.Name != ""{
  504. nodecfg.Name = node.Name
  505. }
  506. if node.Interface != ""{
  507. nodecfg.Interface = node.Interface
  508. }
  509. if node.Nodenetwork != ""{
  510. nodecfg.Network = node.Nodenetwork
  511. }
  512. if node.Macaddress != ""{
  513. nodecfg.MacAddress = node.Macaddress
  514. }
  515. if node.Localaddress != ""{
  516. nodecfg.LocalAddress = node.Localaddress
  517. }
  518. if node.Postup != ""{
  519. nodecfg.PostUp = node.Postup
  520. }
  521. if node.Postdown != ""{
  522. nodecfg.PostDown = node.Postdown
  523. }
  524. if node.Listenport != 0{
  525. nodecfg.Port = node.Listenport
  526. }
  527. if node.Keepalive != 0{
  528. nodecfg.KeepAlive = node.Keepalive
  529. }
  530. if node.Publickey != ""{
  531. nodecfg.PublicKey = node.Publickey
  532. }
  533. if node.Endpoint != ""{
  534. nodecfg.Endpoint = node.Endpoint
  535. }
  536. if node.Password != ""{
  537. nodecfg.Password = node.Password
  538. }
  539. if node.Address != ""{
  540. nodecfg.WGAddress = node.Address
  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.DNSOff {
  858. vals := strings.Split(servercfg.Address, ":")
  859. server := vals[0]
  860. err = SetDNS(server)
  861. if err != nil {
  862. fmt.Printf("Error encountered setting dns: %v", err)
  863. }
  864. }
  865. if !nodecfg.RoamingOff {
  866. if !nodecfg.IsLocal {
  867. fmt.Println("Checking to see if public addresses have changed")
  868. extIP, err := getPublicIP()
  869. if err != nil {
  870. fmt.Printf("Error encountered checking ip addresses: %v", err)
  871. }
  872. if nodecfg.Endpoint != extIP && extIP != "" {
  873. fmt.Println("Endpoint has changed from " +
  874. nodecfg.Endpoint + " to " + extIP)
  875. fmt.Println("Updating address")
  876. nodecfg.Endpoint = extIP
  877. nodecfg.PostChanges = "true"
  878. node.Endpoint = extIP
  879. node.Postchanges = "true"
  880. ipchange = true
  881. }
  882. intIP, err := getPrivateAddr()
  883. if err != nil {
  884. fmt.Printf("Error encountered checking ip addresses: %v", err)
  885. }
  886. if nodecfg.LocalAddress != intIP && intIP != "" {
  887. fmt.Println("Local Address has changed from " +
  888. nodecfg.LocalAddress + " to " + intIP)
  889. fmt.Println("Updating address")
  890. nodecfg.LocalAddress = intIP
  891. nodecfg.PostChanges = "true"
  892. node.Localaddress = intIP
  893. node.Postchanges = "true"
  894. ipchange = true
  895. }
  896. } else {
  897. fmt.Println("Checking to see if local addresses have changed")
  898. localIP, err := getLocalIP(nodecfg.LocalRange)
  899. if err != nil {
  900. fmt.Printf("Error encountered checking ip addresses: %v", err)
  901. }
  902. if nodecfg.Endpoint != localIP && localIP != "" {
  903. fmt.Println("Endpoint has changed from " +
  904. nodecfg.Endpoint + " to " + localIP)
  905. fmt.Println("Updating address")
  906. nodecfg.Endpoint = localIP
  907. nodecfg.LocalAddress = localIP
  908. nodecfg.PostChanges = "true"
  909. node.Endpoint = localIP
  910. node.Localaddress = localIP
  911. node.Postchanges = "true"
  912. ipchange = true
  913. }
  914. }
  915. if node.Postchanges != "true" {
  916. fmt.Println("Addresses have not changed.")
  917. }
  918. }
  919. if ipchange {
  920. err := modConfig(&node)
  921. if err != nil {
  922. return err
  923. log.Fatalf("Error: %v", err)
  924. }
  925. err = setWGConfig(network)
  926. if err != nil {
  927. return err
  928. log.Fatalf("Error: %v", err)
  929. }
  930. node = getNode(network)
  931. cfg, err := config.ReadConfig(network)
  932. if err != nil {
  933. return err
  934. }
  935. nodecfg = cfg.Node
  936. }
  937. var wcclient nodepb.NodeServiceClient
  938. var requestOpts grpc.DialOption
  939. requestOpts = grpc.WithInsecure()
  940. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  941. if err != nil {
  942. fmt.Printf("Cant dial GRPC server: %v", err)
  943. return err
  944. }
  945. wcclient = nodepb.NewNodeServiceClient(conn)
  946. ctx := context.Background()
  947. fmt.Println("Authenticating with GRPC Server")
  948. ctx, err = SetJWT(wcclient, network)
  949. if err != nil {
  950. fmt.Printf("Failed to authenticate: %v", err)
  951. return err
  952. }
  953. fmt.Println("Authenticated")
  954. fmt.Println("Checking In.")
  955. var header metadata.MD
  956. node.Nodenetwork = network
  957. checkinres, err := wcclient.CheckIn(
  958. ctx,
  959. &nodepb.CheckInReq{
  960. Node: &node,
  961. },
  962. grpc.Header(&header),
  963. )
  964. if err != nil {
  965. if checkinres != nil && checkinres.Checkinresponse.Ispending {
  966. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
  967. return nil
  968. }
  969. fmt.Printf("Unable to process Check In request: %v", err)
  970. return err
  971. }
  972. fmt.Println("Checked in.")
  973. if checkinres.Checkinresponse.Ispending {
  974. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
  975. return err
  976. }
  977. newinterface := getNode(network).Interface
  978. readreq := &nodepb.ReadNodeReq{
  979. Macaddress: node.Macaddress,
  980. Network: node.Nodenetwork,
  981. }
  982. readres, err := wcclient.ReadNode(ctx, readreq, grpc.Header(&header))
  983. if err != nil {
  984. fmt.Printf("Error: %v", err)
  985. } else {
  986. currentiface := readres.Node.Interface
  987. ifaceupdate := newinterface != currentiface
  988. if err != nil {
  989. log.Printf("Error retrieving interface: %v", err)
  990. }
  991. if ifaceupdate {
  992. fmt.Println("Interface update: " + currentiface +
  993. " >>>> " + newinterface)
  994. err := DeleteInterface(currentiface, nodecfg.PostDown)
  995. if err != nil {
  996. fmt.Println("ERROR DELETING INTERFACE: " + currentiface)
  997. }
  998. err = setWGConfig(network)
  999. if err != nil {
  1000. log.Printf("Error updating interface: %v", err)
  1001. }
  1002. }
  1003. }
  1004. if checkinres.Checkinresponse.Needconfigupdate {
  1005. fmt.Println("Server has requested that node update config.")
  1006. fmt.Println("Updating config from remote server.")
  1007. req := &nodepb.ReadNodeReq{
  1008. Macaddress: node.Macaddress,
  1009. Network: node.Nodenetwork,
  1010. }
  1011. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  1012. if err != nil {
  1013. return err
  1014. log.Fatalf("Error: %v", err)
  1015. }
  1016. err = modConfig(readres.Node)
  1017. if err != nil {
  1018. return err
  1019. log.Fatalf("Error: %v", err)
  1020. }
  1021. err = setWGConfig(network)
  1022. if err != nil {
  1023. return err
  1024. log.Fatalf("Error: %v", err)
  1025. }
  1026. setupcheck = false
  1027. } else if nodecfg.PostChanges == "true" {
  1028. fmt.Println("Node has requested to update remote config.")
  1029. fmt.Println("Posting local config to remote server.")
  1030. postnode := getNode(network)
  1031. req := &nodepb.UpdateNodeReq{
  1032. Node: &postnode,
  1033. }
  1034. res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  1035. if err != nil {
  1036. return err
  1037. log.Fatalf("Error: %v", err)
  1038. }
  1039. res.Node.Postchanges = "false"
  1040. err = modConfig(res.Node)
  1041. if err != nil {
  1042. return err
  1043. log.Fatalf("Error: %v", err)
  1044. }
  1045. err = setWGConfig(network)
  1046. if err != nil {
  1047. return err
  1048. log.Fatalf("Error: %v", err)
  1049. }
  1050. setupcheck = false
  1051. }
  1052. if checkinres.Checkinresponse.Needkeyupdate {
  1053. fmt.Println("Server has requested that node update key pairs.")
  1054. fmt.Println("Proceeding to re-generate key pairs for Wiregard.")
  1055. err = setWGKeyConfig(network, servercfg.Address)
  1056. if err != nil {
  1057. return err
  1058. log.Fatalf("Unable to process reset keys request: %v", err)
  1059. }
  1060. setupcheck = false
  1061. }
  1062. if checkinres.Checkinresponse.Needpeerupdate {
  1063. fmt.Println("Server has requested that node update peer list.")
  1064. fmt.Println("Updating peer list from remote server.")
  1065. err = setWGConfig(network)
  1066. if err != nil {
  1067. return err
  1068. log.Fatalf("Unable to process Set Peers request: %v", err)
  1069. }
  1070. setupcheck = false
  1071. }
  1072. if checkinres.Checkinresponse.Needdelete {
  1073. fmt.Println("This machine got the delete signal. Deleting.")
  1074. err := Remove(network)
  1075. if err != nil {
  1076. return err
  1077. log.Fatalf("Error: %v", err)
  1078. }
  1079. }
  1080. if setupcheck {
  1081. iface := nodecfg.Interface
  1082. _, err := net.InterfaceByName(iface)
  1083. if err != nil {
  1084. fmt.Println("interface " + iface + " does not currently exist. Setting up WireGuard.")
  1085. err = setWGKeyConfig(network, servercfg.Address)
  1086. if err != nil {
  1087. return err
  1088. log.Fatalf("Error: %v", err)
  1089. }
  1090. }
  1091. }
  1092. return nil
  1093. }
  1094. func needInterfaceUpdate(ctx context.Context, mac string, network string, iface string) (bool, string, error) {
  1095. var header metadata.MD
  1096. req := &nodepb.ReadNodeReq{
  1097. Macaddress: mac,
  1098. Network: network,
  1099. }
  1100. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  1101. if err != nil {
  1102. return false, "", err
  1103. log.Fatalf("Error: %v", err)
  1104. }
  1105. oldiface := readres.Node.Interface
  1106. return iface != oldiface, oldiface, err
  1107. }
  1108. func getNode(network string) nodepb.Node {
  1109. modcfg, err := config.ReadConfig(network)
  1110. if err != nil {
  1111. log.Fatalf("Error: %v", err)
  1112. }
  1113. nodecfg := modcfg.Node
  1114. var node nodepb.Node
  1115. node.Name = nodecfg.Name
  1116. node.Interface = nodecfg.Interface
  1117. node.Nodenetwork = nodecfg.Network
  1118. node.Localaddress = nodecfg.LocalAddress
  1119. node.Address = nodecfg.WGAddress
  1120. node.Listenport = nodecfg.Port
  1121. node.Keepalive = nodecfg.KeepAlive
  1122. node.Postup = nodecfg.PostUp
  1123. node.Postdown = nodecfg.PostDown
  1124. node.Publickey = nodecfg.PublicKey
  1125. node.Macaddress = nodecfg.MacAddress
  1126. node.Endpoint = nodecfg.Endpoint
  1127. node.Password = nodecfg.Password
  1128. //spew.Dump(node)
  1129. return node
  1130. }
  1131. func Remove(network string) error {
  1132. //need to implement checkin on server side
  1133. cfg, err := config.ReadConfig(network)
  1134. if err != nil {
  1135. return err
  1136. }
  1137. servercfg := cfg.Server
  1138. node := cfg.Node
  1139. fmt.Println("Deleting remote node with MAC: " + node.MacAddress)
  1140. var wcclient nodepb.NodeServiceClient
  1141. var requestOpts grpc.DialOption
  1142. requestOpts = grpc.WithInsecure()
  1143. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  1144. if err != nil {
  1145. log.Printf("Unable to establish client connection to " + servercfg.Address + ": %v", err)
  1146. //return err
  1147. }else {
  1148. wcclient = nodepb.NewNodeServiceClient(conn)
  1149. ctx := context.Background()
  1150. fmt.Println("Authenticating with GRPC Server")
  1151. ctx, err = SetJWT(wcclient, network)
  1152. if err != nil {
  1153. //return err
  1154. log.Printf("Failed to authenticate: %v", err)
  1155. } else {
  1156. fmt.Println("Authenticated")
  1157. var header metadata.MD
  1158. _, err = wcclient.DeleteNode(
  1159. ctx,
  1160. &nodepb.DeleteNodeReq{
  1161. Macaddress: node.MacAddress,
  1162. NetworkName: node.Network,
  1163. },
  1164. grpc.Header(&header),
  1165. )
  1166. if err != nil {
  1167. log.Printf("Encountered error deleting node: %v", err)
  1168. fmt.Println(err)
  1169. } else {
  1170. fmt.Println("Deleted node " + node.MacAddress)
  1171. }
  1172. }
  1173. }
  1174. err = WipeLocal(network)
  1175. if err != nil {
  1176. log.Printf("Unable to wipe local config: %v", err)
  1177. }
  1178. err = RemoveSystemDServices(network)
  1179. if err != nil {
  1180. return err
  1181. log.Printf("Unable to remove systemd services: %v", err)
  1182. }
  1183. fmt.Printf("Please investigate any stated errors to ensure proper removal.")
  1184. fmt.Printf("Failure to delete node from server via gRPC will mean node still exists and needs to be manually deleted by administrator.")
  1185. return nil
  1186. }
  1187. func WipeLocal(network string) error{
  1188. cfg, err := config.ReadConfig(network)
  1189. if err != nil {
  1190. return err
  1191. }
  1192. nodecfg := cfg.Node
  1193. ifacename := nodecfg.Interface
  1194. //home, err := homedir.Dir()
  1195. home := "/etc/netclient"
  1196. err = os.Remove(home + "/netconfig-" + network)
  1197. if err != nil {
  1198. fmt.Println(err)
  1199. }
  1200. err = os.Remove(home + "/nettoken-" + network)
  1201. if err != nil {
  1202. fmt.Println(err)
  1203. }
  1204. err = os.Remove(home + "/wgkey-" + network)
  1205. if err != nil {
  1206. fmt.Println(err)
  1207. }
  1208. ipExec, err := exec.LookPath("ip")
  1209. if ifacename != "" {
  1210. cmdIPLinkDel := &exec.Cmd {
  1211. Path: ipExec,
  1212. Args: []string{ ipExec, "link", "del", ifacename },
  1213. Stdout: os.Stdout,
  1214. Stderr: os.Stdout,
  1215. }
  1216. err = cmdIPLinkDel.Run()
  1217. if err != nil {
  1218. fmt.Println(err)
  1219. }
  1220. if nodecfg.PostDown != "" {
  1221. runcmds := strings.Split(nodecfg.PostDown, "; ")
  1222. err = runCmds(runcmds)
  1223. if err != nil {
  1224. fmt.Println("Error encountered running PostDown: " + err.Error())
  1225. }
  1226. }
  1227. }
  1228. return err
  1229. }
  1230. func DeleteInterface(ifacename string, postdown string) error{
  1231. ipExec, err := exec.LookPath("ip")
  1232. cmdIPLinkDel := &exec.Cmd {
  1233. Path: ipExec,
  1234. Args: []string{ ipExec, "link", "del", ifacename },
  1235. Stdout: os.Stdout,
  1236. Stderr: os.Stdout,
  1237. }
  1238. err = cmdIPLinkDel.Run()
  1239. if err != nil {
  1240. fmt.Println(err)
  1241. }
  1242. if postdown != "" {
  1243. runcmds := strings.Split(postdown, "; ")
  1244. err = runCmds(runcmds)
  1245. if err != nil {
  1246. fmt.Println("Error encountered running PostDown: " + err.Error())
  1247. }
  1248. }
  1249. return err
  1250. }
  1251. func getPeers(macaddress string, network string, server string) ([]wgtypes.PeerConfig, bool, []string, error) {
  1252. //need to implement checkin on server side
  1253. hasGateway := false
  1254. var gateways []string
  1255. var peers []wgtypes.PeerConfig
  1256. var wcclient nodepb.NodeServiceClient
  1257. cfg, err := config.ReadConfig(network)
  1258. if err != nil {
  1259. log.Fatalf("Issue retrieving config for network: " + network + ". Please investigate: %v", err)
  1260. }
  1261. nodecfg := cfg.Node
  1262. keepalive := nodecfg.KeepAlive
  1263. keepalivedur, err := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s")
  1264. if err != nil {
  1265. log.Fatalf("Issue with format of keepalive value. Please update netconfig: %v", err)
  1266. }
  1267. fmt.Println("Registering with GRPC Server")
  1268. requestOpts := grpc.WithInsecure()
  1269. conn, err := grpc.Dial(server, requestOpts)
  1270. if err != nil {
  1271. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  1272. }
  1273. // Instantiate the BlogServiceClient with our client connection to the server
  1274. wcclient = nodepb.NewNodeServiceClient(conn)
  1275. req := &nodepb.GetPeersReq{
  1276. Macaddress: macaddress,
  1277. Network: network,
  1278. }
  1279. ctx := context.Background()
  1280. fmt.Println("Authenticating with GRPC Server")
  1281. ctx, err = SetJWT(wcclient, network)
  1282. if err != nil {
  1283. fmt.Println("Failed to authenticate.")
  1284. return peers, hasGateway, gateways, err
  1285. }
  1286. var header metadata.MD
  1287. stream, err := wcclient.GetPeers(ctx, req, grpc.Header(&header))
  1288. if err != nil {
  1289. fmt.Println("Error retrieving peers")
  1290. fmt.Println(err)
  1291. return nil, hasGateway, gateways, err
  1292. }
  1293. fmt.Println("Parsing peers response")
  1294. for {
  1295. res, err := stream.Recv()
  1296. // If end of stream, break the loop
  1297. if err == io.EOF {
  1298. break
  1299. }
  1300. // if err, return an error
  1301. if err != nil {
  1302. if strings.Contains(err.Error(), "mongo: no documents in result") {
  1303. continue
  1304. } else {
  1305. fmt.Println("ERROR ENCOUNTERED WITH RESPONSE")
  1306. fmt.Println(res)
  1307. return peers, hasGateway, gateways, err
  1308. }
  1309. }
  1310. pubkey, err := wgtypes.ParseKey(res.Peers.Publickey)
  1311. if err != nil {
  1312. fmt.Println("error parsing key")
  1313. return peers, hasGateway, gateways, err
  1314. }
  1315. if nodecfg.PublicKey == res.Peers.Publickey {
  1316. fmt.Println("Peer is self. Skipping")
  1317. continue
  1318. }
  1319. if nodecfg.Endpoint == res.Peers.Endpoint {
  1320. fmt.Println("Peer is self. Skipping")
  1321. continue
  1322. }
  1323. var peer wgtypes.PeerConfig
  1324. var peeraddr = net.IPNet{
  1325. IP: net.ParseIP(res.Peers.Address),
  1326. Mask: net.CIDRMask(32, 32),
  1327. }
  1328. var allowedips []net.IPNet
  1329. allowedips = append(allowedips, peeraddr)
  1330. if res.Peers.Isgateway {
  1331. hasGateway = true
  1332. gateways = append(gateways,res.Peers.Gatewayrange)
  1333. _, ipnet, err := net.ParseCIDR(res.Peers.Gatewayrange)
  1334. if err != nil {
  1335. fmt.Println("ERROR ENCOUNTERED SETTING GATEWAY")
  1336. fmt.Println("NOT SETTING GATEWAY")
  1337. fmt.Println(err)
  1338. } else {
  1339. fmt.Println(" Gateway Range: " + res.Peers.Gatewayrange)
  1340. allowedips = append(allowedips, *ipnet)
  1341. }
  1342. }
  1343. if keepalive != 0 {
  1344. peer = wgtypes.PeerConfig{
  1345. PublicKey: pubkey,
  1346. PersistentKeepaliveInterval: &keepalivedur,
  1347. Endpoint: &net.UDPAddr{
  1348. IP: net.ParseIP(res.Peers.Endpoint),
  1349. Port: int(res.Peers.Listenport),
  1350. },
  1351. ReplaceAllowedIPs: true,
  1352. AllowedIPs: allowedips,
  1353. }
  1354. } else {
  1355. peer = wgtypes.PeerConfig{
  1356. PublicKey: pubkey,
  1357. Endpoint: &net.UDPAddr{
  1358. IP: net.ParseIP(res.Peers.Endpoint),
  1359. Port: int(res.Peers.Listenport),
  1360. },
  1361. ReplaceAllowedIPs: true,
  1362. AllowedIPs: allowedips,
  1363. }
  1364. }
  1365. peers = append(peers, peer)
  1366. }
  1367. fmt.Println("Finished parsing peers response")
  1368. return peers, hasGateway, gateways, err
  1369. }