mirror of
https://github.com/gravitl/netmaker.git
synced 2024-09-22 00:06:04 +08:00
119 lines
3.2 KiB
Go
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
|
||
|
}
|