common.go 38 KB

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