common.go 46 KB

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