common.go 35 KB

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