common.go 36 KB

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