common.go 35 KB

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