common.go 39 KB

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