| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | // package for logicing client and server codepackage sysctlimport (	"bufio"	"bytes"	"fmt"	"os"	"path"	"runtime"	"strings"	"github.com/gravitl/netmaker/logic")type (	sysctl struct {		path   string		config map[string]string	})const (	NM_SYSCTL_CONF = "99-nm.conf")var (	sysctlPaths map[string]string = map[string]string{		"linux":   "/usr/local/lib/sysctl.d",		"darwin":  "/usr/local/lib/sysctl.d",		"freebsd": "/usr/local/lib/sysctl.d",		"windows": "",	})func (s *sysctl) set(key, value string) {	s.config[key] = value}func (s *sysctl) get(key string) (val string) {	val, _ = s.config[key]	return}func (s *sysctl) delete(key string) {	delete(s.config, key)}func (s *sysctl) update() error {	f, err := os.OpenFile(s.path, os.O_CREATE|os.O_RDWR, os.ModePerm)	if err != nil || f == nil {		return err	}	defer f.Close()	for k, v := range s.config {		ln := []byte(fmt.Sprintf("%s\n", strings.Join([]string{k, v}, "=")))		if _, err := f.Write(ln); err != nil {			return err		}	}	return nil}func load() (s *sysctl, err error) {	s = &sysctl{		path:   path.Join(sysctlPaths[runtime.GOOS], NM_SYSCTL_CONF),		config: make(map[string]string),	}	if !logic.FileExists(s.path) {		os.MkdirAll(sysctlPaths[runtime.GOOS], os.ModeDir)	}	f, err := os.OpenFile(s.path, os.O_CREATE|os.O_RDWR, os.ModePerm)	if err != nil {		return s, err	}	defer f.Close()	for sc := bufio.NewScanner(f); sc.Scan(); {		line := sc.Bytes()		if len(line) >= 1 && line[0] == '#' {			continue		}		if kvpair := bytes.Split(line, []byte{'='}); len(kvpair) == 2 {			s.config[string(kvpair[0])] = string(kvpair[1])		}	}	return}func SysctlSetIPForwarding() error {	conf, err := load()	if err != nil {		return err	}	conf.set("net.ipv4.ip_forward", "1")	return conf.update()}
 |