common.go 35 KB

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