common.go 36 KB

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