common.go 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307
  1. package functions
  2. import (
  3. //"github.com/davecgh/go-spew/spew"
  4. "fmt"
  5. "time"
  6. "errors"
  7. "context"
  8. "net/http"
  9. "io/ioutil"
  10. "io"
  11. "strings"
  12. "log"
  13. "net"
  14. "os"
  15. "strconv"
  16. "os/exec"
  17. "github.com/gravitl/netmaker/netclient/config"
  18. nodepb "github.com/gravitl/netmaker/grpc"
  19. "golang.zx2c4.com/wireguard/wgctrl"
  20. "google.golang.org/grpc"
  21. "encoding/base64"
  22. "google.golang.org/grpc/metadata"
  23. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  24. //homedir "github.com/mitchellh/go-homedir"
  25. )
  26. var (
  27. wcclient nodepb.NodeServiceClient
  28. )
  29. func ListPorts() error{
  30. wgclient, err := wgctrl.New()
  31. if err != nil {
  32. return err
  33. }
  34. devices, err := wgclient.Devices()
  35. if err != nil {
  36. return err
  37. }
  38. fmt.Println("Here are your ports:")
  39. for _, i := range devices {
  40. fmt.Println(i.ListenPort)
  41. }
  42. return err
  43. }
  44. func GetFreePort(rangestart int32) (int32, error){
  45. wgclient, err := wgctrl.New()
  46. if err != nil {
  47. return 0, err
  48. }
  49. devices, err := wgclient.Devices()
  50. if err != nil {
  51. return 0, err
  52. }
  53. var portno int32
  54. portno = 0
  55. for x := rangestart; x <= 60000; x++ {
  56. conflict := false
  57. for _, i := range devices {
  58. if int32(i.ListenPort) == x {
  59. conflict = true
  60. break;
  61. }
  62. }
  63. if conflict {
  64. continue
  65. }
  66. portno = x
  67. break
  68. }
  69. return portno, err
  70. }
  71. func Install(accesskey string, password string, server string, network string, noauto bool, accesstoken string, inputname string) error {
  72. tserver := ""
  73. tnetwork := ""
  74. tkey := ""
  75. trange := ""
  76. var localrange *net.IPNet
  77. islocal := false
  78. if FileExists("/etc/systemd/system/netclient-"+network+".timer") ||
  79. FileExists("/etc/netclient/netconfig-"+network) {
  80. 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.")
  81. return err
  82. }
  83. if accesstoken != "" && accesstoken != "badtoken" {
  84. btoken, err := base64.StdEncoding.DecodeString(accesstoken)
  85. if err != nil {
  86. log.Fatalf("Something went wrong decoding your token: %v", err)
  87. }
  88. token := string(btoken)
  89. tokenvals := strings.Split(token, "|")
  90. tserver = tokenvals[0]
  91. tnetwork = tokenvals[1]
  92. tkey = tokenvals[2]
  93. trange = tokenvals[3]
  94. printrange := ""
  95. if server == "localhost:50051" {
  96. server = tserver
  97. }
  98. if network == "nonetwork" {
  99. network = tnetwork
  100. }
  101. if accesskey == "badkey" {
  102. accesskey = tkey
  103. }
  104. fmt.Println(trange)
  105. if trange != "" {
  106. islocal = true
  107. _, localrange, err = net.ParseCIDR(trange)
  108. if err == nil {
  109. printrange = localrange.String()
  110. } else {
  111. //localrange = ""
  112. }
  113. } else {
  114. printrange = "Not a local network. Will use public address for endpoint."
  115. }
  116. fmt.Println("Decoded values from token:")
  117. fmt.Println(" Server: " + server)
  118. fmt.Println(" Network: " + network)
  119. fmt.Println(" Key: " + accesskey)
  120. fmt.Println(" Local Range: " + printrange)
  121. }
  122. wgclient, err := wgctrl.New()
  123. if err != nil {
  124. log.Fatalf("failed to open client: %v", err)
  125. }
  126. defer wgclient.Close()
  127. cfg, err := config.ReadConfig(network)
  128. if err != nil {
  129. log.Printf("No Config Yet. Will Write: %v", err)
  130. }
  131. nodecfg := cfg.Node
  132. servercfg := cfg.Server
  133. fmt.Println("SERVER SETTINGS:")
  134. if server == "" {
  135. if servercfg.Address == "" && tserver == "" {
  136. log.Fatal("no server provided")
  137. } else {
  138. server = servercfg.Address
  139. }
  140. }
  141. fmt.Println(" Server: " + server)
  142. if accesskey == "" {
  143. if servercfg.AccessKey == "" && tkey == "" {
  144. fmt.Println("no access key provided.Proceeding anyway.")
  145. } else {
  146. accesskey = servercfg.AccessKey
  147. }
  148. }
  149. fmt.Println(" AccessKey: " + accesskey)
  150. err = config.WriteServer(server, accesskey, network)
  151. if err != nil {
  152. fmt.Println("Error encountered while writing Server Config.")
  153. return err
  154. }
  155. fmt.Println("NODE REQUESTING SETTINGS:")
  156. if password == "" {
  157. if nodecfg.Password == "" {
  158. //create error here
  159. log.Fatal("no password provided")
  160. } else {
  161. password = nodecfg.Password
  162. }
  163. }
  164. fmt.Println(" Password: " + password)
  165. if network == "badnetwork" {
  166. if nodecfg.Network == "" && tnetwork == "" {
  167. //create error here
  168. log.Fatal("no network provided")
  169. } else {
  170. network = nodecfg.Network
  171. }
  172. }
  173. fmt.Println(" Network: " + network)
  174. var macaddress string
  175. var localaddress string
  176. var listenport int32
  177. var keepalive int32
  178. var publickey wgtypes.Key
  179. var privatekey wgtypes.Key
  180. var privkeystring string
  181. var endpoint string
  182. var name string
  183. var wginterface string
  184. if nodecfg.Endpoint == "" {
  185. endpoint, err = getPublicIP()
  186. if err != nil {
  187. return err
  188. }
  189. } else {
  190. endpoint = nodecfg.Endpoint
  191. }
  192. fmt.Println(" Public Endpoint: " + endpoint)
  193. if nodecfg.LocalAddress == "" {
  194. ifaces, err := net.Interfaces()
  195. if err != nil {
  196. return err
  197. }
  198. var local string
  199. found := false
  200. for _, i := range ifaces {
  201. if i.Flags&net.FlagUp == 0 {
  202. continue // interface down
  203. }
  204. if i.Flags&net.FlagLoopback != 0 {
  205. continue // loopback interface
  206. }
  207. addrs, err := i.Addrs()
  208. if err != nil {
  209. return err
  210. }
  211. for _, addr := range addrs {
  212. var ip net.IP
  213. switch v := addr.(type) {
  214. case *net.IPNet:
  215. if !found {
  216. ip = v.IP
  217. local = ip.String()
  218. if islocal {
  219. found = localrange.Contains(ip)
  220. } else {
  221. found = true
  222. }
  223. }
  224. case *net.IPAddr:
  225. if !found {
  226. ip = v.IP
  227. local = ip.String()
  228. if islocal {
  229. found = localrange.Contains(ip)
  230. } else {
  231. found = true
  232. }
  233. }
  234. }
  235. }
  236. }
  237. localaddress = local
  238. } else {
  239. localaddress = nodecfg.LocalAddress
  240. }
  241. fmt.Println(" Local Address: " + localaddress)
  242. if nodecfg.Name != "" {
  243. name = nodecfg.Name
  244. }
  245. if inputname != "" && inputname != "noname" {
  246. name = inputname
  247. }
  248. fmt.Println(" Name: " + name)
  249. if nodecfg.Interface != "" {
  250. wginterface = nodecfg.Interface
  251. }
  252. fmt.Println(" Interface: " + wginterface)
  253. if nodecfg.KeepAlive != 0 {
  254. keepalive = nodecfg.KeepAlive
  255. }
  256. fmt.Println(" KeepAlive: " + wginterface)
  257. if nodecfg.Port != 0 {
  258. listenport = nodecfg.Port
  259. }
  260. if listenport == 0 {
  261. listenport, err = GetFreePort(51821)
  262. if err != nil {
  263. fmt.Printf("Error retrieving port: %v", err)
  264. }
  265. }
  266. fmt.Printf(" Port: %v", listenport)
  267. fmt.Println("")
  268. if nodecfg.PrivateKey != "" {
  269. privkeystring = nodecfg.PrivateKey
  270. privatekey, err := wgtypes.ParseKey(nodecfg.PrivateKey)
  271. if err != nil {
  272. log.Fatal(err)
  273. }
  274. if nodecfg.PublicKey != "" {
  275. publickey, err = wgtypes.ParseKey(nodecfg.PublicKey)
  276. if err != nil {
  277. log.Fatal(err)
  278. }
  279. } else {
  280. publickey = privatekey.PublicKey()
  281. }
  282. } else {
  283. privatekey, err := wgtypes.GeneratePrivateKey()
  284. if err != nil {
  285. log.Fatal(err)
  286. }
  287. privkeystring = privatekey.String()
  288. publickey = privatekey.PublicKey()
  289. }
  290. if nodecfg.MacAddress != "" {
  291. macaddress = nodecfg.MacAddress
  292. } else {
  293. macs, err := getMacAddr()
  294. if err != nil {
  295. return err
  296. } else if len(macs) == 0 {
  297. log.Fatal()
  298. } else {
  299. macaddress = macs[0]
  300. }
  301. }
  302. fmt.Println(" Mac Address: " + macaddress)
  303. fmt.Println(" Private Key: " + privatekey.String())
  304. fmt.Println(" Public Key: " + publickey.String())
  305. var wcclient nodepb.NodeServiceClient
  306. var requestOpts grpc.DialOption
  307. requestOpts = grpc.WithInsecure()
  308. conn, err := grpc.Dial(server, requestOpts)
  309. if err != nil {
  310. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  311. }
  312. wcclient = nodepb.NewNodeServiceClient(conn)
  313. postnode := &nodepb.Node{
  314. Password: password,
  315. Macaddress: macaddress,
  316. Accesskey: accesskey,
  317. Nodenetwork: network,
  318. Listenport: listenport,
  319. Keepalive: keepalive,
  320. Localaddress: localaddress,
  321. Interface: wginterface,
  322. Publickey: publickey.String(),
  323. Name: name,
  324. Endpoint: endpoint,
  325. }
  326. fmt.Println("Writing node settings to netconfig file.")
  327. err = modConfig(postnode)
  328. if err != nil {
  329. return err
  330. }
  331. res, err := wcclient.CreateNode(
  332. context.TODO(),
  333. &nodepb.CreateNodeReq{
  334. Node: postnode,
  335. },
  336. )
  337. if err != nil {
  338. return err
  339. }
  340. node := res.Node
  341. fmt.Println("Setting local config from server response")
  342. if err != nil {
  343. return err
  344. }
  345. fmt.Println("NODE RECIEVED SETTINGS: ")
  346. fmt.Println(" Password: " + node.Password)
  347. fmt.Println(" WG Address: " + node.Address)
  348. fmt.Println(" Network: " + node.Nodenetwork)
  349. fmt.Println(" Public Endpoint: " + node.Endpoint)
  350. fmt.Println(" Local Address: " + node.Localaddress)
  351. fmt.Println(" Name: " + node.Name)
  352. fmt.Println(" Interface: " + node.Interface)
  353. fmt.Println(" Port: " + strconv.FormatInt(int64(node.Listenport), 10))
  354. fmt.Println(" KeepAlive: " + strconv.FormatInt(int64(node.Keepalive), 10))
  355. fmt.Println(" Public Key: " + node.Publickey)
  356. fmt.Println(" Mac Address: " + node.Macaddress)
  357. err = modConfig(node)
  358. if err != nil {
  359. return err
  360. }
  361. if node.Ispending {
  362. fmt.Println("Node is marked as PENDING.")
  363. fmt.Println("Awaiting approval from Admin before configuring WireGuard.")
  364. if !noauto {
  365. fmt.Println("Configuring Netmaker Service.")
  366. err = ConfigureSystemD(network)
  367. return err
  368. }
  369. }
  370. peers, err := getPeers(node.Macaddress, network, server)
  371. if err != nil {
  372. return err
  373. }
  374. fmt.Println("retrived peers, setting wireguard config.")
  375. err = storePrivKey(privkeystring, network)
  376. if err != nil {
  377. return err
  378. }
  379. err = initWireguard(node, privkeystring, peers)
  380. if err != nil {
  381. return err
  382. }
  383. if !noauto {
  384. err = ConfigureSystemD(network)
  385. }
  386. if err != nil {
  387. return err
  388. }
  389. return err
  390. }
  391. func getPublicIP() (string, error) {
  392. iplist := []string{"https://ifconfig.me", "http://api.ipify.org", "http://ipinfo.io/ip"}
  393. endpoint := ""
  394. var err error
  395. for _, ipserver := range iplist {
  396. resp, err := http.Get(ipserver)
  397. if err != nil {
  398. continue
  399. }
  400. defer resp.Body.Close()
  401. if resp.StatusCode == http.StatusOK {
  402. bodyBytes, err := ioutil.ReadAll(resp.Body)
  403. if err != nil {
  404. continue
  405. }
  406. endpoint = string(bodyBytes)
  407. break
  408. }
  409. }
  410. if err == nil && endpoint == "" {
  411. err = errors.New("Public Address Not Found.")
  412. }
  413. return endpoint, err
  414. }
  415. func modConfig(node *nodepb.Node) error{
  416. network := node.Nodenetwork
  417. if network == "" {
  418. return errors.New("No Network Provided")
  419. }
  420. //modconfig := config.Config
  421. modconfig, err := config.ReadConfig(network)
  422. //modconfig.ReadConfig()
  423. if err != nil {
  424. return err
  425. }
  426. nodecfg := modconfig.Node
  427. if node.Name != ""{
  428. nodecfg.Name = node.Name
  429. }
  430. if node.Interface != ""{
  431. nodecfg.Interface = node.Interface
  432. }
  433. if node.Nodenetwork != ""{
  434. nodecfg.Network = node.Nodenetwork
  435. }
  436. if node.Macaddress != ""{
  437. nodecfg.MacAddress = node.Macaddress
  438. }
  439. if node.Localaddress != ""{
  440. nodecfg.LocalAddress = node.Localaddress
  441. }
  442. if node.Listenport != 0{
  443. nodecfg.Port = node.Listenport
  444. }
  445. if node.Keepalive != 0{
  446. nodecfg.KeepAlive = node.Keepalive
  447. }
  448. if node.Publickey != ""{
  449. nodecfg.PublicKey = node.Publickey
  450. }
  451. if node.Endpoint != ""{
  452. nodecfg.Endpoint = node.Endpoint
  453. }
  454. if node.Password != ""{
  455. nodecfg.Password = node.Password
  456. }
  457. if node.Address != ""{
  458. nodecfg.WGAddress = node.Address
  459. }
  460. if node.Postchanges != "" {
  461. nodecfg.PostChanges = node.Postchanges
  462. }
  463. modconfig.Node = nodecfg
  464. err = config.Write(modconfig, network)
  465. return err
  466. }
  467. func getMacAddr() ([]string, error) {
  468. ifas, err := net.Interfaces()
  469. if err != nil {
  470. return nil, err
  471. }
  472. var as []string
  473. for _, ifa := range ifas {
  474. a := ifa.HardwareAddr.String()
  475. if a != "" {
  476. as = append(as, a)
  477. }
  478. }
  479. return as, nil
  480. }
  481. func initWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig) error {
  482. ipExec, err := exec.LookPath("ip")
  483. if err != nil {
  484. return err
  485. }
  486. key, err := wgtypes.ParseKey(privkey)
  487. if err != nil {
  488. return err
  489. }
  490. wgclient, err := wgctrl.New()
  491. //modcfg := config.Config
  492. //modcfg.ReadConfig()
  493. modcfg, err := config.ReadConfig(node.Nodenetwork)
  494. if err != nil {
  495. return err
  496. }
  497. nodecfg := modcfg.Node
  498. fmt.Println("beginning local WG config")
  499. if err != nil {
  500. log.Fatalf("failed to open client: %v", err)
  501. }
  502. defer wgclient.Close()
  503. fmt.Println("setting local settings")
  504. ifacename := node.Interface
  505. if nodecfg.Interface != "" {
  506. ifacename = nodecfg.Interface
  507. } else if node.Interface != "" {
  508. ifacename = node.Interface
  509. } else {
  510. log.Fatal("no interface to configure")
  511. }
  512. if node.Address == "" {
  513. log.Fatal("no address to configure")
  514. }
  515. cmdIPDevLinkAdd := &exec.Cmd {
  516. Path: ipExec,
  517. Args: []string{ ipExec, "link", "add", "dev", ifacename, "type", "wireguard" },
  518. Stdout: os.Stdout,
  519. Stderr: os.Stdout,
  520. }
  521. cmdIPAddrAdd := &exec.Cmd {
  522. Path: ipExec,
  523. Args: []string{ ipExec, "address", "add", "dev", ifacename, node.Address+"/24"},
  524. Stdout: os.Stdout,
  525. Stderr: os.Stdout,
  526. }
  527. currentiface, err := net.InterfaceByName(ifacename)
  528. if err != nil {
  529. err = cmdIPDevLinkAdd.Run()
  530. if err != nil && !strings.Contains(err.Error(), "exists") {
  531. fmt.Println("Error creating interface")
  532. //fmt.Println(err.Error())
  533. //return err
  534. }
  535. }
  536. match := false
  537. addrs, _ := currentiface.Addrs()
  538. for _, a := range addrs {
  539. if strings.Contains(a.String(), node.Address){
  540. match = true
  541. }
  542. }
  543. if !match {
  544. err = cmdIPAddrAdd.Run()
  545. if err != nil {
  546. fmt.Println("Error adding address")
  547. //return err
  548. }
  549. }
  550. var nodeport int
  551. nodeport = int(node.Listenport)
  552. fmt.Println("setting WG config from node and peers")
  553. //pubkey := privkey.PublicKey()
  554. conf := wgtypes.Config{
  555. PrivateKey: &key,
  556. ListenPort: &nodeport,
  557. ReplacePeers: true,
  558. Peers: peers,
  559. }
  560. _, err = wgclient.Device(ifacename)
  561. if err != nil {
  562. if os.IsNotExist(err) {
  563. fmt.Println("Device does not exist: ")
  564. fmt.Println(err)
  565. } else {
  566. log.Fatalf("Unknown config error: %v", err)
  567. }
  568. }
  569. fmt.Println("configuring WG device")
  570. err = wgclient.ConfigureDevice(ifacename, conf)
  571. if err != nil {
  572. if os.IsNotExist(err) {
  573. fmt.Println("Device does not exist: ")
  574. fmt.Println(err)
  575. } else {
  576. fmt.Printf("This is inconvenient: %v", err)
  577. }
  578. }
  579. cmdIPLinkUp := &exec.Cmd {
  580. Path: ipExec,
  581. Args: []string{ ipExec, "link", "set", "up", "dev", ifacename},
  582. Stdout: os.Stdout,
  583. Stderr: os.Stdout,
  584. }
  585. cmdIPLinkDown := &exec.Cmd {
  586. Path: ipExec,
  587. Args: []string{ ipExec, "link", "set", "down", "dev", ifacename},
  588. Stdout: os.Stdout,
  589. Stderr: os.Stdout,
  590. }
  591. err = cmdIPLinkDown.Run()
  592. err = cmdIPLinkUp.Run()
  593. if err != nil {
  594. return err
  595. }
  596. return err
  597. }
  598. func setWGKeyConfig(network string, serveraddr string) error {
  599. ctx := context.Background()
  600. var header metadata.MD
  601. var wcclient nodepb.NodeServiceClient
  602. var requestOpts grpc.DialOption
  603. requestOpts = grpc.WithInsecure()
  604. conn, err := grpc.Dial(serveraddr, requestOpts)
  605. if err != nil {
  606. fmt.Printf("Cant dial GRPC server: %v", err)
  607. return err
  608. }
  609. wcclient = nodepb.NewNodeServiceClient(conn)
  610. fmt.Println("Authenticating with GRPC Server")
  611. ctx, err = SetJWT(wcclient, network)
  612. if err != nil {
  613. fmt.Printf("Failed to authenticate: %v", err)
  614. return err
  615. }
  616. fmt.Println("Authenticated")
  617. node := getNode(network)
  618. privatekey, err := wgtypes.GeneratePrivateKey()
  619. if err != nil {
  620. return err
  621. }
  622. privkeystring := privatekey.String()
  623. publickey := privatekey.PublicKey()
  624. node.Publickey = publickey.String()
  625. err = storePrivKey(privkeystring, network)
  626. if err != nil {
  627. return err
  628. }
  629. err = modConfig(&node)
  630. if err != nil {
  631. return err
  632. }
  633. postnode := getNode(network)
  634. req := &nodepb.UpdateNodeReq{
  635. Node: &postnode,
  636. }
  637. _, err = wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  638. if err != nil {
  639. return err
  640. }
  641. err = setWGConfig(network)
  642. if err != nil {
  643. return err
  644. log.Fatalf("Error: %v", err)
  645. }
  646. return err
  647. }
  648. func setWGConfig(network string) error {
  649. cfg, err := config.ReadConfig(network)
  650. if err != nil {
  651. return err
  652. }
  653. servercfg := cfg.Server
  654. nodecfg := cfg.Node
  655. node := getNode(network)
  656. peers, err := getPeers(node.Macaddress, nodecfg.Network, servercfg.Address)
  657. if err != nil {
  658. return err
  659. }
  660. privkey, err := retrievePrivKey(network)
  661. if err != nil {
  662. return err
  663. }
  664. err = initWireguard(&node, privkey, peers)
  665. if err != nil {
  666. return err
  667. }
  668. return err
  669. }
  670. func storePrivKey(key string, network string) error{
  671. d1 := []byte(key)
  672. err := ioutil.WriteFile("/etc/netclient/wgkey-" + network, d1, 0644)
  673. return err
  674. }
  675. func retrievePrivKey(network string) (string, error) {
  676. dat, err := ioutil.ReadFile("/etc/netclient/wgkey-" + network)
  677. return string(dat), err
  678. }
  679. func getPrivateAddr() (string, error) {
  680. ifaces, err := net.Interfaces()
  681. if err != nil {
  682. return "", err
  683. }
  684. var local string
  685. found := false
  686. for _, i := range ifaces {
  687. if i.Flags&net.FlagUp == 0 {
  688. continue // interface down
  689. }
  690. if i.Flags&net.FlagLoopback != 0 {
  691. continue // loopback interface
  692. }
  693. addrs, err := i.Addrs()
  694. if err != nil {
  695. return "", err
  696. }
  697. for _, addr := range addrs {
  698. var ip net.IP
  699. switch v := addr.(type) {
  700. case *net.IPNet:
  701. if !found {
  702. ip = v.IP
  703. local = ip.String()
  704. found = true
  705. }
  706. case *net.IPAddr:
  707. if !found {
  708. ip = v.IP
  709. local = ip.String()
  710. found = true
  711. }
  712. }
  713. }
  714. }
  715. if !found {
  716. err := errors.New("Local Address Not Found.")
  717. return "", err
  718. }
  719. return local, err
  720. }
  721. func CheckIn(network string) error {
  722. node := getNode(network)
  723. cfg, err := config.ReadConfig(network)
  724. if err != nil {
  725. return err
  726. }
  727. nodecfg := cfg.Node
  728. servercfg := cfg.Server
  729. fmt.Println("Checking into server: " + servercfg.Address)
  730. setupcheck := true
  731. ipchange := false
  732. if !nodecfg.RoamingOff {
  733. fmt.Println("Checking to see if addresses have changed")
  734. extIP, err := getPublicIP()
  735. if err != nil {
  736. fmt.Printf("Error encountered checking ip addresses: %v", err)
  737. }
  738. if nodecfg.Endpoint != extIP && extIP != "" {
  739. fmt.Println("Endpoint has changed from " +
  740. nodecfg.Endpoint + " to " + extIP)
  741. fmt.Println("Updating address")
  742. nodecfg.Endpoint = extIP
  743. nodecfg.PostChanges = "true"
  744. node.Endpoint = extIP
  745. node.Postchanges = "true"
  746. ipchange = true
  747. }
  748. intIP, err := getPrivateAddr()
  749. if err != nil {
  750. fmt.Printf("Error encountered checking ip addresses: %v", err)
  751. }
  752. if nodecfg.LocalAddress != intIP && intIP != "" {
  753. fmt.Println("Local Address has changed from " +
  754. nodecfg.LocalAddress + " to " + intIP)
  755. fmt.Println("Updating address")
  756. nodecfg.LocalAddress = intIP
  757. nodecfg.PostChanges = "true"
  758. node.Localaddress = intIP
  759. node.Postchanges = "true"
  760. ipchange = true
  761. }
  762. if node.Postchanges != "true" {
  763. fmt.Println("Addresses have not changed.")
  764. }
  765. }
  766. if ipchange {
  767. err := modConfig(&node)
  768. if err != nil {
  769. return err
  770. log.Fatalf("Error: %v", err)
  771. }
  772. err = setWGConfig(network)
  773. if err != nil {
  774. return err
  775. log.Fatalf("Error: %v", err)
  776. }
  777. node = getNode(network)
  778. cfg, err := config.ReadConfig(network)
  779. if err != nil {
  780. return err
  781. }
  782. nodecfg = cfg.Node
  783. }
  784. var wcclient nodepb.NodeServiceClient
  785. var requestOpts grpc.DialOption
  786. requestOpts = grpc.WithInsecure()
  787. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  788. if err != nil {
  789. fmt.Printf("Cant dial GRPC server: %v", err)
  790. return err
  791. }
  792. wcclient = nodepb.NewNodeServiceClient(conn)
  793. ctx := context.Background()
  794. fmt.Println("Authenticating with GRPC Server")
  795. ctx, err = SetJWT(wcclient, network)
  796. if err != nil {
  797. fmt.Printf("Failed to authenticate: %v", err)
  798. return err
  799. }
  800. fmt.Println("Authenticated")
  801. fmt.Println("Checking In.")
  802. var header metadata.MD
  803. checkinres, err := wcclient.CheckIn(
  804. ctx,
  805. &nodepb.CheckInReq{
  806. Node: &node,
  807. },
  808. grpc.Header(&header),
  809. )
  810. if err != nil {
  811. if checkinres != nil && checkinres.Checkinresponse.Ispending {
  812. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
  813. return nil
  814. }
  815. fmt.Printf("Unable to process Check In request: %v", err)
  816. return err
  817. }
  818. fmt.Println("Checked in.")
  819. if checkinres.Checkinresponse.Ispending {
  820. fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
  821. return err
  822. }
  823. newinterface := getNode(network).Interface
  824. readreq := &nodepb.ReadNodeReq{
  825. Macaddress: node.Macaddress,
  826. Network: node.Nodenetwork,
  827. }
  828. readres, err := wcclient.ReadNode(ctx, readreq, grpc.Header(&header))
  829. if err != nil {
  830. fmt.Printf("Error: %v", err)
  831. } else {
  832. currentiface := readres.Node.Interface
  833. ifaceupdate := newinterface != currentiface
  834. if err != nil {
  835. log.Printf("Error retrieving interface: %v", err)
  836. }
  837. if ifaceupdate {
  838. fmt.Println("Interface update: " + currentiface +
  839. " >>>> " + newinterface)
  840. err := DeleteInterface(currentiface)
  841. if err != nil {
  842. fmt.Println("ERROR DELETING INTERFACE: " + currentiface)
  843. }
  844. }
  845. err = setWGConfig(network)
  846. }
  847. if checkinres.Checkinresponse.Needconfigupdate {
  848. fmt.Println("Server has requested that node update config.")
  849. fmt.Println("Updating config from remote server.")
  850. req := &nodepb.ReadNodeReq{
  851. Macaddress: node.Macaddress,
  852. Network: node.Nodenetwork,
  853. }
  854. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  855. if err != nil {
  856. return err
  857. log.Fatalf("Error: %v", err)
  858. }
  859. err = modConfig(readres.Node)
  860. if err != nil {
  861. return err
  862. log.Fatalf("Error: %v", err)
  863. }
  864. err = setWGConfig(network)
  865. if err != nil {
  866. return err
  867. log.Fatalf("Error: %v", err)
  868. }
  869. setupcheck = false
  870. } else if nodecfg.PostChanges == "true" {
  871. fmt.Println("Node has requested to update remote config.")
  872. fmt.Println("Posting local config to remote server.")
  873. postnode := getNode(network)
  874. req := &nodepb.UpdateNodeReq{
  875. Node: &postnode,
  876. }
  877. res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
  878. if err != nil {
  879. return err
  880. log.Fatalf("Error: %v", err)
  881. }
  882. res.Node.Postchanges = "false"
  883. err = modConfig(res.Node)
  884. if err != nil {
  885. return err
  886. log.Fatalf("Error: %v", err)
  887. }
  888. err = setWGConfig(network)
  889. if err != nil {
  890. return err
  891. log.Fatalf("Error: %v", err)
  892. }
  893. setupcheck = false
  894. }
  895. if checkinres.Checkinresponse.Needkeyupdate {
  896. fmt.Println("Server has requested that node update key pairs.")
  897. fmt.Println("Proceeding to re-generate key pairs for Wiregard.")
  898. err = setWGKeyConfig(network, servercfg.Address)
  899. if err != nil {
  900. return err
  901. log.Fatalf("Unable to process reset keys request: %v", err)
  902. }
  903. setupcheck = false
  904. }
  905. if checkinres.Checkinresponse.Needpeerupdate {
  906. fmt.Println("Server has requested that node update peer list.")
  907. fmt.Println("Updating peer list from remote server.")
  908. err = setWGConfig(network)
  909. if err != nil {
  910. return err
  911. log.Fatalf("Unable to process Set Peers request: %v", err)
  912. }
  913. setupcheck = false
  914. }
  915. if checkinres.Checkinresponse.Needdelete {
  916. fmt.Println("This machine got the delete signal. Deleting.")
  917. err := Remove(network)
  918. if err != nil {
  919. return err
  920. log.Fatalf("Error: %v", err)
  921. }
  922. }
  923. if setupcheck {
  924. iface := nodecfg.Interface
  925. _, err := net.InterfaceByName(iface)
  926. if err != nil {
  927. fmt.Println("interface " + iface + " does not currently exist. Setting up WireGuard.")
  928. err = setWGKeyConfig(network, servercfg.Address)
  929. if err != nil {
  930. return err
  931. log.Fatalf("Error: %v", err)
  932. }
  933. }
  934. }
  935. return nil
  936. }
  937. func needInterfaceUpdate(ctx context.Context, mac string, network string, iface string) (bool, string, error) {
  938. var header metadata.MD
  939. req := &nodepb.ReadNodeReq{
  940. Macaddress: mac,
  941. Network: network,
  942. }
  943. readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
  944. if err != nil {
  945. return false, "", err
  946. log.Fatalf("Error: %v", err)
  947. }
  948. oldiface := readres.Node.Interface
  949. return iface != oldiface, oldiface, err
  950. }
  951. func getNode(network string) nodepb.Node {
  952. modcfg, err := config.ReadConfig(network)
  953. if err != nil {
  954. log.Fatalf("Error: %v", err)
  955. }
  956. nodecfg := modcfg.Node
  957. var node nodepb.Node
  958. node.Name = nodecfg.Name
  959. node.Interface = nodecfg.Interface
  960. node.Nodenetwork = nodecfg.Network
  961. node.Localaddress = nodecfg.LocalAddress
  962. node.Address = nodecfg.WGAddress
  963. node.Listenport = nodecfg.Port
  964. node.Keepalive = nodecfg.KeepAlive
  965. node.Postup = nodecfg.PostUp
  966. node.Preup = nodecfg.PreUp
  967. node.Publickey = nodecfg.PublicKey
  968. node.Macaddress = nodecfg.MacAddress
  969. node.Endpoint = nodecfg.Endpoint
  970. node.Password = nodecfg.Password
  971. //spew.Dump(node)
  972. return node
  973. }
  974. func Remove(network string) error {
  975. //need to implement checkin on server side
  976. cfg, err := config.ReadConfig(network)
  977. if err != nil {
  978. return err
  979. }
  980. servercfg := cfg.Server
  981. node := cfg.Node
  982. fmt.Println("Deleting remote node with MAC: " + node.MacAddress)
  983. var wcclient nodepb.NodeServiceClient
  984. var requestOpts grpc.DialOption
  985. requestOpts = grpc.WithInsecure()
  986. conn, err := grpc.Dial(servercfg.Address, requestOpts)
  987. if err != nil {
  988. log.Printf("Unable to establish client connection to " + servercfg.Address + ": %v", err)
  989. //return err
  990. }else {
  991. wcclient = nodepb.NewNodeServiceClient(conn)
  992. ctx := context.Background()
  993. fmt.Println("Authenticating with GRPC Server")
  994. ctx, err = SetJWT(wcclient, network)
  995. if err != nil {
  996. //return err
  997. log.Printf("Failed to authenticate: %v", err)
  998. } else {
  999. fmt.Println("Authenticated")
  1000. var header metadata.MD
  1001. _, err = wcclient.DeleteNode(
  1002. ctx,
  1003. &nodepb.DeleteNodeReq{
  1004. Macaddress: node.MacAddress,
  1005. NetworkName: node.Network,
  1006. },
  1007. grpc.Header(&header),
  1008. )
  1009. if err != nil {
  1010. log.Printf("Encountered error deleting node: %v", err)
  1011. fmt.Println(err)
  1012. } else {
  1013. fmt.Println("Deleted node " + node.MacAddress)
  1014. }
  1015. }
  1016. }
  1017. err = WipeLocal(network)
  1018. if err != nil {
  1019. log.Printf("Unable to wipe local config: %v", err)
  1020. }
  1021. err = RemoveSystemDServices(network)
  1022. if err != nil {
  1023. return err
  1024. log.Printf("Unable to remove systemd services: %v", err)
  1025. }
  1026. fmt.Printf("Please investigate any stated errors to ensure proper removal.")
  1027. fmt.Printf("Failure to delete node from server via gRPC will mean node still exists and needs to be manually deleted by administrator.")
  1028. return nil
  1029. }
  1030. func WipeLocal(network string) error{
  1031. cfg, err := config.ReadConfig(network)
  1032. if err != nil {
  1033. return err
  1034. }
  1035. nodecfg := cfg.Node
  1036. ifacename := nodecfg.Interface
  1037. //home, err := homedir.Dir()
  1038. home := "/etc/netclient"
  1039. err = os.Remove(home + "/netconfig-" + network)
  1040. if err != nil {
  1041. fmt.Println(err)
  1042. }
  1043. err = os.Remove(home + "/nettoken-" + network)
  1044. if err != nil {
  1045. fmt.Println(err)
  1046. }
  1047. err = os.Remove(home + "/wgkey-" + network)
  1048. if err != nil {
  1049. fmt.Println(err)
  1050. }
  1051. ipExec, err := exec.LookPath("ip")
  1052. if ifacename != "" {
  1053. cmdIPLinkDel := &exec.Cmd {
  1054. Path: ipExec,
  1055. Args: []string{ ipExec, "link", "del", ifacename },
  1056. Stdout: os.Stdout,
  1057. Stderr: os.Stdout,
  1058. }
  1059. err = cmdIPLinkDel.Run()
  1060. if err != nil {
  1061. fmt.Println(err)
  1062. }
  1063. }
  1064. return err
  1065. }
  1066. func DeleteInterface(ifacename string) error{
  1067. ipExec, err := exec.LookPath("ip")
  1068. cmdIPLinkDel := &exec.Cmd {
  1069. Path: ipExec,
  1070. Args: []string{ ipExec, "link", "del", ifacename },
  1071. Stdout: os.Stdout,
  1072. Stderr: os.Stdout,
  1073. }
  1074. err = cmdIPLinkDel.Run()
  1075. if err != nil {
  1076. fmt.Println(err)
  1077. }
  1078. return err
  1079. }
  1080. func getPeers(macaddress string, network string, server string) ([]wgtypes.PeerConfig, error) {
  1081. //need to implement checkin on server side
  1082. var peers []wgtypes.PeerConfig
  1083. var wcclient nodepb.NodeServiceClient
  1084. cfg, err := config.ReadConfig(network)
  1085. if err != nil {
  1086. log.Fatalf("Issue retrieving config for network: " + network + ". Please investigate: %v", err)
  1087. }
  1088. nodecfg := cfg.Node
  1089. keepalive := nodecfg.KeepAlive
  1090. keepalivedur, err := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s")
  1091. if err != nil {
  1092. log.Fatalf("Issue with format of keepalive value. Please update netconfig: %v", err)
  1093. }
  1094. fmt.Println("Registering with GRPC Server")
  1095. requestOpts := grpc.WithInsecure()
  1096. conn, err := grpc.Dial(server, requestOpts)
  1097. if err != nil {
  1098. log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
  1099. }
  1100. // Instantiate the BlogServiceClient with our client connection to the server
  1101. wcclient = nodepb.NewNodeServiceClient(conn)
  1102. req := &nodepb.GetPeersReq{
  1103. Macaddress: macaddress,
  1104. Network: network,
  1105. }
  1106. ctx := context.Background()
  1107. fmt.Println("Authenticating with GRPC Server")
  1108. ctx, err = SetJWT(wcclient, network)
  1109. if err != nil {
  1110. fmt.Println("Failed to authenticate.")
  1111. return peers, err
  1112. }
  1113. var header metadata.MD
  1114. stream, err := wcclient.GetPeers(ctx, req, grpc.Header(&header))
  1115. if err != nil {
  1116. return nil, err
  1117. }
  1118. fmt.Println("Parsing peers response")
  1119. for {
  1120. // stream.Recv returns a pointer to a ListBlogRes at the current iteration
  1121. res, err := stream.Recv()
  1122. // If end of stream, break the loop
  1123. if err == io.EOF {
  1124. break
  1125. }
  1126. // if err, return an error
  1127. if err != nil {
  1128. if strings.Contains(err.Error(), "mongo: no documents in result") {
  1129. break
  1130. } else {
  1131. fmt.Println("ERROR ENCOUNTERED WITH RESPONSE")
  1132. fmt.Println(res)
  1133. return peers, err
  1134. }
  1135. }
  1136. pubkey, err := wgtypes.ParseKey(res.Peers.Publickey)
  1137. if err != nil {
  1138. fmt.Println("error parsing key")
  1139. return peers, err
  1140. }
  1141. var peer wgtypes.PeerConfig
  1142. if keepalive != 0 {
  1143. peer = wgtypes.PeerConfig{
  1144. PublicKey: pubkey,
  1145. PersistentKeepaliveInterval: &keepalivedur,
  1146. Endpoint: &net.UDPAddr{
  1147. IP: net.ParseIP(res.Peers.Endpoint),
  1148. Port: int(res.Peers.Listenport),
  1149. },
  1150. ReplaceAllowedIPs: true,
  1151. AllowedIPs: []net.IPNet{{
  1152. IP: net.ParseIP(res.Peers.Address),
  1153. Mask: net.CIDRMask(32, 32),
  1154. }},
  1155. }
  1156. } else {
  1157. peer = wgtypes.PeerConfig{
  1158. PublicKey: pubkey,
  1159. Endpoint: &net.UDPAddr{
  1160. IP: net.ParseIP(res.Peers.Endpoint),
  1161. Port: int(res.Peers.Listenport),
  1162. },
  1163. ReplaceAllowedIPs: true,
  1164. AllowedIPs: []net.IPNet{{
  1165. IP: net.ParseIP(res.Peers.Address),
  1166. Mask: net.CIDRMask(32, 32),
  1167. }},
  1168. }
  1169. }
  1170. peers = append(peers, peer)
  1171. }
  1172. fmt.Println("Finished parsing peers response")
  1173. return peers, err
  1174. }