config.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590
  1. package config
  2. import (
  3. //"github.com/davecgh/go-spew/spew"
  4. "github.com/urfave/cli/v2"
  5. "os"
  6. "encoding/base64"
  7. "errors"
  8. "fmt"
  9. "log"
  10. "encoding/json"
  11. "gopkg.in/yaml.v3"
  12. nodepb "github.com/gravitl/netmaker/grpc"
  13. "github.com/gravitl/netmaker/models"
  14. )
  15. type GlobalConfig struct {
  16. GRPCWireGuard string `yaml:"grpcwg"`
  17. Client models.IntClient
  18. }
  19. type ClientConfig struct {
  20. Server ServerConfig `yaml:"server"`
  21. Node NodeConfig `yaml:"node"`
  22. Network string `yaml:"network"`
  23. Daemon string `yaml:"daemon"`
  24. OperatingSystem string `yaml:"operatingsystem"`
  25. }
  26. type ServerConfig struct {
  27. GRPCAddress string `yaml:"grpcaddress"`
  28. APIAddress string `yaml:"apiaddress"`
  29. AccessKey string `yaml:"accesskey"`
  30. GRPCSSL string `yaml:"grpcssl"`
  31. GRPCWireGuard string `yaml:"grpcwg"`
  32. }
  33. type ListConfig struct {
  34. Name string `yaml:"name"`
  35. Interface string `yaml:"interface"`
  36. PrivateIPv4 string `yaml:"wgaddress"`
  37. PrivateIPv6 string `yaml:"wgaddress6"`
  38. PublicEndpoint string `yaml:"endpoint"`
  39. }
  40. type NodeConfig struct {
  41. Name string `yaml:"name"`
  42. Interface string `yaml:"interface"`
  43. Network string `yaml:"network"`
  44. Password string `yaml:"password"`
  45. MacAddress string `yaml:"macaddress"`
  46. LocalAddress string `yaml:"localaddress"`
  47. WGAddress string `yaml:"wgaddress"`
  48. WGAddress6 string `yaml:"wgaddress6"`
  49. Roaming string `yaml:"roaming"`
  50. DNS string `yaml:"dns"`
  51. IsLocal string `yaml:"islocal"`
  52. IsDualStack string `yaml:"isdualstack"`
  53. IsIngressGateway string `yaml:"isingressgateway"`
  54. AllowedIPs []string `yaml:"allowedips"`
  55. LocalRange string `yaml:"localrange"`
  56. PostUp string `yaml:"postup"`
  57. PostDown string `yaml:"postdown"`
  58. Port int32 `yaml:"port"`
  59. KeepAlive int32 `yaml:"keepalive"`
  60. PublicKey string `yaml:"publickey"`
  61. ServerPubKey string `yaml:"serverpubkey"`
  62. PrivateKey string `yaml:"privatekey"`
  63. Endpoint string `yaml:"endpoint"`
  64. PostChanges string `yaml:"postchanges"`
  65. StaticIP string `yaml:"staticip"`
  66. StaticPubKey string `yaml:"staticpubkey"`
  67. IPForwarding string `yaml:"ipforwarding"`
  68. }
  69. //reading in the env file
  70. func Write(config *ClientConfig, network string) error{
  71. if network == "" {
  72. err := errors.New("No network provided. Exiting.")
  73. return err
  74. }
  75. _, err := os.Stat("/etc/netclient")
  76. if os.IsNotExist(err) {
  77. os.Mkdir("/etc/netclient", 744)
  78. } else if err != nil {
  79. return err
  80. }
  81. home := "/etc/netclient"
  82. if err != nil {
  83. log.Fatal(err)
  84. }
  85. file := fmt.Sprintf(home + "/netconfig-" + network)
  86. f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm)
  87. defer f.Close()
  88. err = yaml.NewEncoder(f).Encode(config)
  89. if err != nil {
  90. return err
  91. }
  92. return err
  93. }
  94. //reading in the env file
  95. func WriteGlobal(config *GlobalConfig) error{
  96. _, err := os.Stat("/etc/netclient")
  97. if os.IsNotExist(err) {
  98. os.Mkdir("/etc/netclient", 744)
  99. } else if err != nil {
  100. return err
  101. }
  102. home := "/etc/netclient"
  103. if err != nil {
  104. log.Fatal(err)
  105. }
  106. file := fmt.Sprintf(home + "/netconfig-global-001")
  107. f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm)
  108. defer f.Close()
  109. err = yaml.NewEncoder(f).Encode(config)
  110. if err != nil {
  111. return err
  112. }
  113. return err
  114. }
  115. func WriteServer(server string, accesskey string, network string) error{
  116. if network == "" {
  117. err := errors.New("No network provided. Exiting.")
  118. return err
  119. }
  120. nofile := false
  121. //home, err := homedir.Dir()
  122. _, err := os.Stat("/etc/netclient")
  123. if os.IsNotExist(err) {
  124. os.Mkdir("/etc/netclient", 744)
  125. } else if err != nil {
  126. fmt.Println("couldnt find or create /etc/netclient")
  127. return err
  128. }
  129. home := "/etc/netclient"
  130. file := fmt.Sprintf(home + "/netconfig-" + network)
  131. //f, err := os.Open(file)
  132. f, err := os.OpenFile(file, os.O_CREATE|os.O_RDWR, 0666)
  133. //f, err := ioutil.ReadFile(file)
  134. if err != nil {
  135. fmt.Println("couldnt open netconfig-" + network)
  136. fmt.Println(err)
  137. nofile = true
  138. //err = nil
  139. return err
  140. }
  141. defer f.Close()
  142. //cfg := &ClientConfig{}
  143. var cfg ClientConfig
  144. if !nofile {
  145. fmt.Println("Writing to existing config file at " + home + "/netconfig-" + network)
  146. decoder := yaml.NewDecoder(f)
  147. err = decoder.Decode(&cfg)
  148. //err = yaml.Unmarshal(f, &cfg)
  149. if err != nil {
  150. //fmt.Println(err)
  151. //return err
  152. }
  153. f.Close()
  154. f, err = os.OpenFile(file, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666)
  155. if err != nil {
  156. fmt.Println("couldnt open netconfig")
  157. fmt.Println(err)
  158. nofile = true
  159. //err = nil
  160. return err
  161. }
  162. defer f.Close()
  163. if err != nil {
  164. fmt.Println("trouble opening file")
  165. fmt.Println(err)
  166. }
  167. cfg.Server.GRPCAddress = server
  168. cfg.Server.AccessKey = accesskey
  169. err = yaml.NewEncoder(f).Encode(cfg)
  170. //_, err = yaml.Marshal(f, &cfg)
  171. if err != nil {
  172. fmt.Println("trouble encoding file")
  173. return err
  174. }
  175. } else {
  176. fmt.Println("Creating new config file at " + home + "/netconfig-" + network)
  177. cfg.Server.GRPCAddress = server
  178. cfg.Server.AccessKey = accesskey
  179. newf, err := os.Create(home + "/netconfig-" + network)
  180. err = yaml.NewEncoder(newf).Encode(cfg)
  181. defer newf.Close()
  182. if err != nil {
  183. return err
  184. }
  185. }
  186. return err
  187. }
  188. func(config *ClientConfig) ReadConfig() {
  189. nofile := false
  190. //home, err := homedir.Dir()
  191. home := "/etc/netclient"
  192. file := fmt.Sprintf(home + "/netconfig-" + config.Network)
  193. //f, err := os.Open(file)
  194. f, err := os.OpenFile(file, os.O_RDONLY, 0666)
  195. if err != nil {
  196. fmt.Println("trouble opening file")
  197. fmt.Println(err)
  198. nofile = true
  199. //fmt.Println("Could not access " + home + "/.netconfig, proceeding...")
  200. }
  201. defer f.Close()
  202. //var cfg ClientConfig
  203. if !nofile {
  204. decoder := yaml.NewDecoder(f)
  205. err = decoder.Decode(&config)
  206. if err != nil {
  207. fmt.Println("no config or invalid")
  208. fmt.Println(err)
  209. log.Fatal(err)
  210. } else {
  211. //config = cfg
  212. }
  213. }
  214. }
  215. func ModGlobalConfig(cfg models.IntClient) error{
  216. var modconfig GlobalConfig
  217. var err error
  218. if FileExists("/etc/netclient/netconfig-global-001") {
  219. useconfig, err := ReadGlobalConfig()
  220. if err != nil {
  221. return err
  222. }
  223. modconfig = *useconfig
  224. }
  225. if cfg.ServerWGPort != ""{
  226. modconfig.Client.ServerWGPort = cfg.ServerWGPort
  227. }
  228. if cfg.ServerGRPCPort != ""{
  229. modconfig.Client.ServerGRPCPort = cfg.ServerGRPCPort
  230. }
  231. if cfg.ServerAPIPort != ""{
  232. modconfig.Client.ServerAPIPort = cfg.ServerAPIPort
  233. }
  234. if cfg.PublicKey != ""{
  235. modconfig.Client.PublicKey = cfg.PublicKey
  236. }
  237. if cfg.PrivateKey != ""{
  238. modconfig.Client.PrivateKey = cfg.PrivateKey
  239. }
  240. if cfg.ServerPublicEndpoint != ""{
  241. modconfig.Client.ServerPublicEndpoint = cfg.ServerPublicEndpoint
  242. }
  243. if cfg.ServerPrivateAddress != ""{
  244. modconfig.Client.ServerPrivateAddress = cfg.ServerPrivateAddress
  245. }
  246. if cfg.Address != ""{
  247. modconfig.Client.Address = cfg.Address
  248. }
  249. if cfg.Address6 != ""{
  250. modconfig.Client.Address6 = cfg.Address6
  251. }
  252. if cfg.Network != ""{
  253. modconfig.Client.Network = cfg.Network
  254. }
  255. if cfg.ServerKey != ""{
  256. modconfig.Client.ServerKey = cfg.ServerKey
  257. }
  258. if cfg.AccessKey != ""{
  259. modconfig.Client.AccessKey = cfg.AccessKey
  260. }
  261. if cfg.ClientID != ""{
  262. modconfig.Client.ClientID = cfg.ClientID
  263. }
  264. err = WriteGlobal(&modconfig)
  265. return err
  266. }
  267. func ModConfig(node *nodepb.Node) error{
  268. network := node.Nodenetwork
  269. if network == "" {
  270. return errors.New("No Network Provided")
  271. }
  272. var modconfig ClientConfig
  273. var err error
  274. if FileExists("/etc/netclient/netconfig-"+network) {
  275. useconfig, err := ReadConfig(network)
  276. if err != nil {
  277. return err
  278. }
  279. modconfig = *useconfig
  280. }
  281. nodecfg := modconfig.Node
  282. if node.Name != ""{
  283. nodecfg.Name = node.Name
  284. }
  285. if node.Interface != ""{
  286. nodecfg.Interface = node.Interface
  287. }
  288. if node.Nodenetwork != ""{
  289. nodecfg.Network = node.Nodenetwork
  290. }
  291. if node.Macaddress != ""{
  292. nodecfg.MacAddress = node.Macaddress
  293. }
  294. if node.Localaddress != ""{
  295. nodecfg.LocalAddress = node.Localaddress
  296. }
  297. if node.Postup != ""{
  298. nodecfg.PostUp = node.Postup
  299. }
  300. if node.Postdown != ""{
  301. nodecfg.PostDown = node.Postdown
  302. }
  303. if node.Listenport != 0{
  304. nodecfg.Port = node.Listenport
  305. }
  306. if node.Keepalive != 0{
  307. nodecfg.KeepAlive = node.Keepalive
  308. }
  309. if node.Publickey != ""{
  310. nodecfg.PublicKey = node.Publickey
  311. }
  312. if node.Endpoint != ""{
  313. nodecfg.Endpoint = node.Endpoint
  314. }
  315. if node.Password != ""{
  316. nodecfg.Password = node.Password
  317. }
  318. if node.Address != ""{
  319. nodecfg.WGAddress = node.Address
  320. }
  321. if node.Address6 != ""{
  322. nodecfg.WGAddress6 = node.Address6
  323. }
  324. if node.Postchanges != "" {
  325. nodecfg.PostChanges = node.Postchanges
  326. }
  327. if node.Dnsoff == true {
  328. nodecfg.DNS = "off"
  329. }
  330. if node.Isdualstack == true {
  331. nodecfg.IsDualStack = "yes"
  332. }
  333. if node.Isingressgateway {
  334. nodecfg.IsIngressGateway = "yes"
  335. } else {
  336. nodecfg.IsIngressGateway = "no"
  337. }
  338. if node.Localrange != "" && node.Islocal {
  339. nodecfg.IsLocal = "yes"
  340. nodecfg.LocalRange = node.Localrange
  341. }
  342. modconfig.Node = nodecfg
  343. err = Write(&modconfig, network)
  344. return err
  345. }
  346. func GetCLIConfig(c *cli.Context) (ClientConfig, error){
  347. var cfg ClientConfig
  348. if c.String("token") != "" {
  349. tokenbytes, err := base64.StdEncoding.DecodeString(c.String("token"))
  350. if err != nil {
  351. log.Println("error decoding token")
  352. return cfg, err
  353. }
  354. var accesstoken models.AccessToken
  355. if err := json.Unmarshal(tokenbytes, &accesstoken); err != nil {
  356. log.Println("error converting token json to object", tokenbytes )
  357. return cfg, err
  358. }
  359. if accesstoken.ServerConfig.APIConnString != "" {
  360. cfg.Server.APIAddress = accesstoken.ServerConfig.APIConnString
  361. } else {
  362. cfg.Server.APIAddress = accesstoken.ServerConfig.APIHost
  363. if accesstoken.ServerConfig.APIPort != "" {
  364. cfg.Server.APIAddress = cfg.Server.APIAddress + ":" + accesstoken.ServerConfig.APIPort
  365. }
  366. }
  367. if accesstoken.ServerConfig.GRPCConnString != "" {
  368. cfg.Server.GRPCAddress = accesstoken.ServerConfig.GRPCConnString
  369. } else {
  370. cfg.Server.GRPCAddress = accesstoken.ServerConfig.GRPCHost
  371. if accesstoken.ServerConfig.GRPCPort != "" {
  372. cfg.Server.GRPCAddress = cfg.Server.GRPCAddress + ":" + accesstoken.ServerConfig.GRPCPort
  373. }
  374. }
  375. cfg.Network = accesstoken.ClientConfig.Network
  376. cfg.Node.Network = accesstoken.ClientConfig.Network
  377. cfg.Server.AccessKey = accesstoken.ClientConfig.Key
  378. cfg.Node.LocalRange = accesstoken.ClientConfig.LocalRange
  379. cfg.Server.GRPCSSL = accesstoken.ServerConfig.GRPCSSL
  380. cfg.Server.GRPCWireGuard = accesstoken.WG.GRPCWireGuard
  381. if c.String("grpcserver") != "" {
  382. cfg.Server.GRPCAddress = c.String("grpcserver")
  383. }
  384. if c.String("apiserver") != "" {
  385. cfg.Server.APIAddress = c.String("apiserver")
  386. }
  387. if c.String("key") != "" {
  388. cfg.Server.AccessKey = c.String("key")
  389. }
  390. if c.String("network") != "all" {
  391. cfg.Network = c.String("network")
  392. cfg.Node.Network = c.String("network")
  393. }
  394. if c.String("localrange") != "" {
  395. cfg.Node.LocalRange = c.String("localrange")
  396. }
  397. if c.String("grpcssl") != "" {
  398. cfg.Server.GRPCSSL = c.String("grpcssl")
  399. }
  400. if c.String("grpcwg") != "" {
  401. cfg.Server.GRPCWireGuard = c.String("grpcwg")
  402. }
  403. } else {
  404. cfg.Server.GRPCAddress = c.String("grpcserver")
  405. cfg.Server.APIAddress = c.String("apiserver")
  406. cfg.Server.AccessKey = c.String("key")
  407. cfg.Network = c.String("network")
  408. cfg.Node.Network = c.String("network")
  409. cfg.Node.LocalRange = c.String("localrange")
  410. cfg.Server.GRPCWireGuard = c.String("grpcwg")
  411. cfg.Server.GRPCSSL = c.String("grpcssl")
  412. }
  413. cfg.Node.Name = c.String("name")
  414. cfg.Node.Interface = c.String("interface")
  415. cfg.Node.Password = c.String("password")
  416. cfg.Node.MacAddress = c.String("macaddress")
  417. cfg.Node.LocalAddress = c.String("localaddress")
  418. cfg.Node.WGAddress = c.String("address")
  419. cfg.Node.WGAddress6 = c.String("addressIPV6")
  420. cfg.Node.Roaming = c.String("roaming")
  421. cfg.Node.DNS = c.String("dns")
  422. cfg.Node.IsLocal = c.String("islocal")
  423. cfg.Node.IsDualStack = c.String("isdualstack")
  424. cfg.Node.PostUp = c.String("postup")
  425. cfg.Node.PostDown = c.String("postdown")
  426. cfg.Node.Port = int32(c.Int("port"))
  427. cfg.Node.KeepAlive = int32(c.Int("keepalive"))
  428. cfg.Node.PublicKey = c.String("publickey")
  429. cfg.Node.PrivateKey = c.String("privatekey")
  430. cfg.Node.Endpoint = c.String("endpoint")
  431. cfg.Node.IPForwarding = c.String("ipforwarding")
  432. cfg.OperatingSystem = c.String("operatingsystem")
  433. cfg.Daemon = c.String("daemon")
  434. return cfg, nil
  435. }
  436. func GetCLIConfigRegister(c *cli.Context) (GlobalConfig, error){
  437. var cfg GlobalConfig
  438. if c.String("token") != "" {
  439. tokenbytes, err := base64.StdEncoding.DecodeString(c.String("token"))
  440. if err != nil {
  441. log.Println("error decoding token")
  442. return cfg, err
  443. }
  444. var accesstoken models.AccessToken
  445. if err := json.Unmarshal(tokenbytes, &accesstoken); err != nil {
  446. log.Println("error converting token json to object", tokenbytes )
  447. return cfg, err
  448. }
  449. cfg.GRPCWireGuard = accesstoken.WG.GRPCWireGuard
  450. cfg.Client.ServerPrivateAddress = accesstoken.WG.GRPCWGAddress
  451. cfg.Client.ServerGRPCPort = accesstoken.WG.GRPCWGPort
  452. if err != nil {
  453. log.Println("error decoding token grpcserver")
  454. return cfg, err
  455. }
  456. if err != nil {
  457. log.Println("error decoding token apiserver")
  458. return cfg, err
  459. }
  460. if accesstoken.ServerConfig.APIConnString != "" {
  461. cfg.Client.ServerPublicEndpoint = accesstoken.ServerConfig.APIConnString
  462. } else {
  463. cfg.Client.ServerPublicEndpoint = accesstoken.ServerConfig.APIHost
  464. if accesstoken.ServerConfig.APIPort != "" {
  465. cfg.Client.ServerAPIPort = accesstoken.ServerConfig.APIPort
  466. }
  467. }
  468. cfg.Client.ServerWGPort = accesstoken.WG.GRPCWGPort
  469. cfg.Client.ServerKey = accesstoken.ClientConfig.Key
  470. cfg.Client.ServerKey = accesstoken.WG.GRPCWGPubKey
  471. if c.String("grpcserver") != "" {
  472. cfg.Client.ServerPrivateAddress = c.String("grpcserver")
  473. }
  474. if c.String("apiserver") != "" {
  475. cfg.Client.ServerPublicEndpoint = c.String("apiserver")
  476. }
  477. if c.String("pubkey") != "" {
  478. cfg.Client.ServerKey = c.String("pubkey")
  479. }
  480. if c.String("network") != "all" {
  481. cfg.Client.Network = c.String("network")
  482. }
  483. } else {
  484. cfg.Client.ServerPrivateAddress = c.String("grpcserver")
  485. cfg.Client.ServerPublicEndpoint = c.String("apiserver")
  486. cfg.Client.ServerKey = c.String("key")
  487. cfg.Client.Network = c.String("network")
  488. }
  489. cfg.Client.Address = c.String("address")
  490. cfg.Client.Address6 = c.String("addressIPV6")
  491. cfg.Client.PublicKey = c.String("pubkey")
  492. cfg.Client.PrivateKey = c.String("privkey")
  493. return cfg, nil
  494. }
  495. func ReadConfig(network string) (*ClientConfig, error) {
  496. if network == "" {
  497. err := errors.New("No network provided. Exiting.")
  498. return nil, err
  499. }
  500. nofile := false
  501. home := "/etc/netclient"
  502. file := fmt.Sprintf(home + "/netconfig-" + network)
  503. f, err := os.Open(file)
  504. if err != nil {
  505. nofile = true
  506. }
  507. defer f.Close()
  508. var cfg ClientConfig
  509. if !nofile {
  510. decoder := yaml.NewDecoder(f)
  511. err = decoder.Decode(&cfg)
  512. if err != nil {
  513. fmt.Println("trouble decoding file")
  514. return nil, err
  515. }
  516. }
  517. return &cfg, err
  518. }
  519. func ReadGlobalConfig() (*GlobalConfig, error) {
  520. nofile := false
  521. home := "/etc/netclient"
  522. file := fmt.Sprintf(home + "/netconfig-global-001")
  523. f, err := os.Open(file)
  524. if err != nil {
  525. nofile = true
  526. }
  527. defer f.Close()
  528. var cfg GlobalConfig
  529. if !nofile {
  530. decoder := yaml.NewDecoder(f)
  531. err = decoder.Decode(&cfg)
  532. if err != nil {
  533. fmt.Println("trouble decoding file")
  534. return nil, err
  535. }
  536. }
  537. return &cfg, err
  538. }
  539. func FileExists(f string) bool {
  540. info, err := os.Stat(f)
  541. if os.IsNotExist(err) {
  542. return false
  543. }
  544. return !info.IsDir()
  545. }