common.go 34 KB

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