sysctl.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // package for logicing client and server code
  2. package sysctl
  3. import (
  4. "bufio"
  5. "bytes"
  6. "fmt"
  7. "os"
  8. "path"
  9. "runtime"
  10. "strings"
  11. "github.com/gravitl/netmaker/logic"
  12. )
  13. type (
  14. sysctl struct {
  15. path string
  16. config map[string]string
  17. }
  18. )
  19. const (
  20. NM_SYSCTL_CONF = "99-nm.conf"
  21. )
  22. var (
  23. sysctlPaths map[string]string = map[string]string{
  24. "linux": "/usr/local/lib/sysctl.d",
  25. "darwin": "/usr/local/lib/sysctl.d",
  26. "freebsd": "/usr/local/lib/sysctl.d",
  27. "windows": "",
  28. }
  29. )
  30. func (s *sysctl) set(key, value string) {
  31. s.config[key] = value
  32. }
  33. func (s *sysctl) get(key string) (val string) {
  34. val, _ = s.config[key]
  35. return
  36. }
  37. func (s *sysctl) delete(key string) {
  38. delete(s.config, key)
  39. }
  40. func (s *sysctl) update() error {
  41. f, err := os.OpenFile(s.path, os.O_CREATE|os.O_RDWR, os.ModePerm)
  42. if err != nil || f == nil {
  43. return err
  44. }
  45. defer f.Close()
  46. for k, v := range s.config {
  47. ln := []byte(fmt.Sprintf("%s\n", strings.Join([]string{k, v}, "=")))
  48. if _, err := f.Write(ln); err != nil {
  49. return err
  50. }
  51. }
  52. return nil
  53. }
  54. func load() (s *sysctl, err error) {
  55. s = &sysctl{
  56. path: path.Join(sysctlPaths[runtime.GOOS], NM_SYSCTL_CONF),
  57. config: make(map[string]string),
  58. }
  59. if !logic.FileExists(s.path) {
  60. os.MkdirAll(sysctlPaths[runtime.GOOS], os.ModeDir)
  61. }
  62. f, err := os.OpenFile(s.path, os.O_CREATE|os.O_RDWR, os.ModePerm)
  63. if err != nil {
  64. return s, err
  65. }
  66. defer f.Close()
  67. for sc := bufio.NewScanner(f); sc.Scan(); {
  68. line := sc.Bytes()
  69. if len(line) >= 1 && line[0] == '#' {
  70. continue
  71. }
  72. if kvpair := bytes.Split(line, []byte{'='}); len(kvpair) == 2 {
  73. s.config[string(kvpair[0])] = string(kvpair[1])
  74. }
  75. }
  76. return
  77. }
  78. func SysctlSetIPForwarding() error {
  79. conf, err := load()
  80. if err != nil {
  81. return err
  82. }
  83. conf.set("net.ipv4.ip_forward", "1")
  84. return conf.update()
  85. }