mirror of
				https://github.com/gravitl/netmaker.git
				synced 2025-11-01 00:49:04 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			123 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package local
 | |
| 
 | |
| import (
 | |
| 	//"github.com/davecgh/go-spew/spew"
 | |
| 	"errors"
 | |
| 	"log"
 | |
| 	"net"
 | |
| 	"os"
 | |
| 	"os/exec"
 | |
| 	"runtime"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/gravitl/netmaker/netclient/ncutils"
 | |
| )
 | |
| 
 | |
| // SetIPForwarding - Sets IP forwarding if it's mac or linux
 | |
| func SetIPForwarding() error {
 | |
| 	os := runtime.GOOS
 | |
| 	var err error
 | |
| 	switch os {
 | |
| 	case "linux":
 | |
| 		err = SetIPForwardingUnix()
 | |
| 	case "freebsd":
 | |
| 		err = SetIPForwardingFreeBSD()
 | |
| 	case "darwin":
 | |
| 		err = SetIPForwardingMac()
 | |
| 	default:
 | |
| 		err = errors.New("this OS is not currently supported")
 | |
| 	}
 | |
| 	return err
 | |
| }
 | |
| 
 | |
| // SetIPForwardingLinux - sets the ipforwarding for linux
 | |
| func SetIPForwardingUnix() 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
 | |
| }
 | |
| 
 | |
| // SetIPForwardingLinux - sets the ipforwarding for linux
 | |
| func SetIPForwardingFreeBSD() error {
 | |
| 	out, err := ncutils.RunCmd("sysctl net.inet.ip.forwarding", 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[1] != "1" {
 | |
| 			_, err = ncutils.RunCmd("sysctl -w net.inet.ip.forwarding=1", true)
 | |
| 			if err != nil {
 | |
| 				log.Println("WARNING: Error encountered setting ip forwarding. You may want to investigate this.")
 | |
| 				return err
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // SetIPForwardingMac - sets ip forwarding for mac
 | |
| 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
 | |
| }
 | |
| 
 | |
| // IsWGInstalled - checks if WireGuard is installed
 | |
| func IsWGInstalled() bool {
 | |
| 	out, err := ncutils.RunCmd("wg help", true)
 | |
| 	if err != nil {
 | |
| 		_, err = exec.LookPath(os.Getenv("WG_QUICK_USERSPACE_IMPLEMENTATION"))
 | |
| 		return err == nil
 | |
| 	}
 | |
| 	return strings.Contains(out, "Available subcommand")
 | |
| }
 | |
| 
 | |
| // GetMacIface - gets mac interface
 | |
| func GetMacIface(ipstring string) (string, error) {
 | |
| 	var wgiface string
 | |
| 	_, checknet, err := net.ParseCIDR(ipstring + "/24")
 | |
| 	if err != nil {
 | |
| 		return wgiface, errors.New("could not parse ip " + ipstring)
 | |
| 	}
 | |
| 	ifaces, err := net.Interfaces()
 | |
| 	if err != nil {
 | |
| 		return wgiface, err
 | |
| 	}
 | |
| 	for _, iface := range ifaces {
 | |
| 		addrs, err := iface.Addrs()
 | |
| 		if err != nil {
 | |
| 			continue
 | |
| 		}
 | |
| 		for _, addr := range addrs {
 | |
| 			ip := addr.(*net.IPNet).IP
 | |
| 			if checknet.Contains(ip) {
 | |
| 				wgiface = iface.Name
 | |
| 				break
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	if wgiface == "" {
 | |
| 		err = errors.New("could not find iface for address " + ipstring)
 | |
| 	}
 | |
| 	return wgiface, err
 | |
| }
 | |
| 
 | |
| // HasNetwork - checks if a network exists locally
 | |
| func HasNetwork(network string) bool {
 | |
| 	return ncutils.FileExists(ncutils.GetNetclientPathSpecific() + "netconfig-" + network)
 | |
| }
 |