netmaker/netclient/local/routes_linux.go
2022-02-03 09:51:37 -05:00

119 lines
3.2 KiB
Go

//go:build linux
// +build linux
package local
import (
//"github.com/davecgh/go-spew/spew"
"net"
"github.com/gravitl/netmaker/netclient/ncutils"
"golang.zx2c4.com/wireguard/wgctrl"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
)
func routeExists(iface, address, mask string) bool {
return false
}
func setRoute(iface, address, mask string) error {
_, err := ncutils.RunCmd("ip route add", true)
return err
}
func DeleteRoute(iface, address string) error {
var err error
return err
}
func ApplyRoutesFromConf(confPath string) error {
var err error
return err
}
//func SetLinuxPeerRoutes(currentPeers []wgtypes.PeerConfig, newPeers []wgtypes.PeerConfig) {
func SetLinuxPeerRoutes(iface string, oldPeers map[string][]net.IP, newPeers []wgtypes.PeerConfig) {
// traverse through all recieved peers
for _, peer := range newPeers {
// if pubkey found in existing peers, check against existing peer
currPeerAllowedIPs := oldPeers[peer.PublicKey.String()]
if currPeerAllowedIPs != nil {
// traverse IPs, check to see if old peer contains each IP
for _, allowedIP := range peer.AllowedIPs {
if !ncutils.StringSliceContains(currPeerAllowedIPs, allowedIP.IP.String()) {
if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil {
ncutils.PrintLog(err.Error(), 1)
}
}
}
for _, allowedIP := range currPeerAllowedIPs {
if !ncutils.StringSliceContains(currPeerAllowedIPs, allowedIP) {
if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil {
ncutils.PrintLog(err.Error(), 1)
}
}
}
delete(oldPeers, peer.PublicKey.String())
} else {
for _, allowedIP := range peer.AllowedIPs {
if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil {
ncutils.PrintLog(err.Error(), 1)
}
}
}
}
// traverse through all existing peers
for _, peer := range oldPeers {
// if pubkey found in existing peers, check against existing peer
currPeerAllowedIPs := oldPeers[peer.PublicKey.String()]
if currPeerAllowedIPs != nil {
// traverse IPs, check to see if old peer contains each IP
for _, allowedIP := range peer.AllowedIPs {
if !ncutils.StringSliceContains(currPeerAllowedIPs, allowedIP.IP.String()) {
if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil {
ncutils.PrintLog(err.Error(), 1)
}
}
}
} else {
for _, allowedIP := range peer.AllowedIPs {
if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil {
ncutils.PrintLog(err.Error(), 1)
}
}
}
}
// delete removed AllowedIPs
/*
for _, currentPeer := range currentPeers {
for _, oldIP := range currentPeer.AllowedIPs {
found := true
for _, newPeer := range newPeers {
for _, newIP := range newPeer.AllowedIPs {
if
}
}
}
}
*/
}
func GetCurrentIPs() []string {
client, err := wgctrl.New()
if err != nil {
ncutils.PrintLog("failed to start wgctrl", 0)
return err
}
defer client.Close()
device, err := client.Device(iface)
if err != nil {
ncutils.PrintLog("failed to parse interface", 0)
return err
}
devicePeers = device.Peers
}