Files
netmaker/netclient/local/local.go
2021-09-19 14:03:47 -04:00

101 lines
2.4 KiB
Go

package local
import (
//"github.com/davecgh/go-spew/spew"
"errors"
"log"
"runtime"
"strings"
"github.com/gravitl/netmaker/netclient/ncutils"
)
func SetIPForwarding() error {
os := runtime.GOOS
var err error
switch os {
case "linux":
err = SetIPForwardingLinux()
case "darwin":
err = SetIPForwardingMac()
default:
err = errors.New("This OS is not supported")
}
return err
}
func SetIPForwardingLinux() error {
out, err := ncutils.RunCmd("sysctl net.ipv4.ip_forward", true)
if err != nil {
log.Println("WARNING: Error encountered setting ip forwarding. This can break functionality.")
return err
} else {
s := strings.Fields(string(out))
if s[2] != "1" {
_, err = ncutils.RunCmd("sysctl -w net.ipv4.ip_forward=1", true)
if err != nil {
log.Println("WARNING: Error encountered setting ip forwarding. You may want to investigate this.")
return err
}
}
}
return nil
}
func SetIPForwardingMac() error {
_, err := ncutils.RunCmd("sysctl -w net.inet.ip.forwarding=1", true)
if err != nil {
log.Println("WARNING: Error encountered setting ip forwarding. This can break functionality.")
}
return err
}
func IsWGInstalled() bool {
out, err := ncutils.RunCmd("wg help", true)
if err != nil {
return false
}
return strings.Contains(out, "Available subcommand")
}
func GetMacIface(addr string) (string, error) {
out, err := ncutils.RunCmd("route get "+addr, false)
var iface string
if err != nil {
return iface, errors.New(string(out))
}
for _, line := range strings.Split(strings.TrimSuffix(string(out), "\n"), "\n") {
if strings.Contains(line, "interface: ") {
iface = getLineAfter(string(out), "interface: ")
iface = strings.Split(iface, "\n")[0]
break
}
}
if iface == "" {
err = errors.New("could not find iface for ip addr " + addr)
}
return iface, err
}
func getLineAfter(value string, a string) string {
// Get substring after a string.
pos := strings.LastIndex(value, a)
if pos == -1 {
return ""
}
adjustedPos := pos + len(a)
if adjustedPos >= len(value) {
return ""
}
return value[adjustedPos:len(value)]
}
func HasNetwork(network string) bool {
if ncutils.IsWindows() {
return ncutils.FileExists(ncutils.GetNetclientPathSpecific() + "netconfig-" + network)
}
return ncutils.FileExists("/etc/systemd/system/netclient-"+network+".timer") ||
ncutils.FileExists(ncutils.GetNetclientPathSpecific()+"netconfig-"+network)
}