config.go 15 KB

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