remote route on delete

This commit is contained in:
afeiszli
2021-11-14 19:17:30 -05:00
parent 437955ab90
commit 05d27c8af3
7 changed files with 62 additions and 95 deletions

View File

@@ -29,10 +29,14 @@ func (s *NodeServiceServer) ReadNode(ctx context.Context, req *nodepb.Object) (*
if err != nil {
return nil, err
}
node.NetworkSettings, err = logic.GetNetworkSettings(node.Network)
if err != nil {
return nil, err
}
node.SetLastCheckIn()
// Cast to ReadNodeRes type
nodeData, err := json.Marshal(&node)
if err != nil {
nodeData, errN := json.Marshal(&node)
if errN != nil {
return nil, err
}
logic.UpdateNode(&node, &node)
@@ -75,7 +79,14 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object)
if err != nil {
return nil, err
}
nodeData, err := json.Marshal(&node)
node.NetworkSettings, err = logic.GetNetworkSettings(node.Network)
if err != nil {
return nil, err
}
nodeData, errN := json.Marshal(&node)
if errN != nil {
return nil, err
}
// return the node in a CreateNodeRes type
response := &nodepb.Object{
Data: string(nodeData),
@@ -107,10 +118,14 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.Object)
if err != nil {
return nil, err
}
nodeData, err := json.Marshal(&newnode)
newnode.NetworkSettings, err = logic.GetNetworkSettings(node.Network)
if err != nil {
return nil, err
}
nodeData, errN := json.Marshal(&newnode)
if errN != nil {
return nil, err
}
return &nodepb.Object{
Data: string(nodeData),
Type: nodepb.NODE_TYPE,

View File

@@ -51,6 +51,21 @@ func GetParentNetwork(networkname string) (models.Network, error) {
return network, nil
}
// GetParentNetwork - get parent network
func GetNetworkSettings(networkname string) (models.Network, error) {
var network models.Network
networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, networkname)
if err != nil {
return network, err
}
if err = json.Unmarshal([]byte(networkData), &network); err != nil {
return models.Network{}, err
}
network.AccessKeys = []models.AccessKey{}
return network, nil
}
// UniqueAddress - see if address is unique
func UniqueAddress(networkName string) (string, error) {

View File

@@ -31,7 +31,7 @@ type Node struct {
Address6 string `json:"address6" bson:"address6" yaml:"address6" validate:"omitempty,ipv6"`
LocalAddress string `json:"localaddress" bson:"localaddress" yaml:"localaddress" validate:"omitempty,ip"`
Name string `json:"name" bson:"name" yaml:"name" validate:"omitempty,max=32,in_charset"`
NetworkSettings Network `json:"networksettings" bson:"networksettings" yaml:"networksettings"`
NetworkSettings Network `json:"networksettings" bson:"networksettings" yaml:"networksettings" validate:"-"`
ListenPort int32 `json:"listenport" bson:"listenport" yaml:"listenport" validate:"omitempty,numeric,min=1024,max=65535"`
PublicKey string `json:"publickey" bson:"publickey" yaml:"publickey" validate:"required,base64"`
Endpoint string `json:"endpoint" bson:"endpoint" yaml:"endpoint" validate:"required,ip"`
@@ -205,7 +205,7 @@ func (node *Node) SetDefaultName() {
}
}
func (newNode *Node) Fill(currentNode *Node, nodeNetwork *Network) {
func (newNode *Node) Fill(currentNode *Node) {
if newNode.ID == "" {
newNode.ID = currentNode.ID
}
@@ -351,7 +351,6 @@ func (newNode *Node) Fill(currentNode *Node, nodeNetwork *Network) {
if newNode.IsRelayed == "" {
newNode.IsRelayed = currentNode.IsRelayed
}
newNode.NetworkSettings = *nodeNetwork
}
func StringWithCharset(length int, charset string) string {

View File

@@ -1,86 +0,0 @@
package wireguard
import (
"log"
"strconv"
"strings"
"github.com/gravitl/netmaker/netclient/ncutils"
"golang.zx2c4.com/wireguard/wgctrl/internal/wguser"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
)
// SetPeers - sets peers on a given WireGuard interface
func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error {
client, err := wguser.New()
if err != nil {
ncutils.PrintLog("failed to start wgctrl", 0)
return err
}
device, err := client.Device(iface)
if err != nil {
ncutils.PrintLog("failed to parse interface", 0)
return err
}
devicePeers := device.Peers
if len(devicePeers) > 1 && len(peers) == 0 {
ncutils.PrintLog("no peers pulled", 1)
return err
}
for _, peer := range peers {
for _, currentPeer := range devicePeers {
if currentPeer.AllowedIPs[0].String() == peer.AllowedIPs[0].String() &&
currentPeer.PublicKey.String() != peer.PublicKey.String() {
_, err := ncutils.RunCmd("wg set "+iface+" peer "+currentPeer.PublicKey.String()+" remove", true)
if err != nil {
log.Println("error removing peer", peer.Endpoint.String())
}
}
}
udpendpoint := peer.Endpoint.String()
var allowedips string
var iparr []string
for _, ipaddr := range peer.AllowedIPs {
iparr = append(iparr, ipaddr.String())
}
allowedips = strings.Join(iparr, ",")
keepAliveString := strconv.Itoa(int(keepalive))
if keepAliveString == "0" {
keepAliveString = "5"
}
if peer.Endpoint != nil {
_, err = ncutils.RunCmd("wg set "+iface+" peer "+peer.PublicKey.String()+
" endpoint "+udpendpoint+
" persistent-keepalive "+keepAliveString+
" allowed-ips "+allowedips, true)
} else {
_, err = ncutils.RunCmd("wg set "+iface+" peer "+peer.PublicKey.String()+
" persistent-keepalive "+keepAliveString+
" allowed-ips "+allowedips, true)
}
if err != nil {
log.Println("error setting peer", peer.PublicKey.String())
}
}
for _, currentPeer := range devicePeers {
shouldDelete := true
for _, peer := range peers {
if peer.AllowedIPs[0].String() == currentPeer.AllowedIPs[0].String() {
shouldDelete = false
}
}
if shouldDelete {
output, err := ncutils.RunCmd("wg set "+iface+" peer "+currentPeer.PublicKey.String()+" remove", true)
if err != nil {
log.Println(output, "error removing peer", currentPeer.PublicKey.String())
}
}
}
return nil
}

View File

@@ -206,6 +206,16 @@ func LeaveNetwork(network string) error {
}
}
}
//extra network route setting required for freebsd and windows
if ncutils.IsWindows() {
ip, mask, err := ncutils.GetNetworkIPMask(node.NetworkSettings.AddressRange)
if err != nil {
ncutils.PrintLog(err.Error(), 1)
}
_, _ = ncutils.RunCmd("route delete "+ip+" mask "+mask+" "+node.Address, true)
} else if ncutils.IsFreeBSD() {
_, _ = ncutils.RunCmd("route del -net "+node.NetworkSettings.AddressRange+" -interface "+node.Interface, true)
}
return RemoveLocalInstance(cfg, network)
}

View File

@@ -272,6 +272,16 @@ func GetLocalIP(localrange string) (string, error) {
return local, nil
}
func GetNetworkIPMask(networkstring string) (string, string, error) {
ip, ipnet, err := net.ParseCIDR(networkstring)
if err != nil {
return "", "", err
}
ipstring := ip.String()
maskstring := ipnet.Mask.String()
return ipstring, maskstring, err
}
// GetFreePort - gets free port of machine
func GetFreePort(rangestart int32) (int32, error) {
if rangestart == 0 {

View File

@@ -282,9 +282,13 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
//extra network route setting required for freebsd and windows
if ncutils.IsWindows() {
_, _ = ncutils.RunCmd("route add -net "+subnet+" -interface "+ifacename, true)
ip, mask, err := ncutils.GetNetworkIPMask(nodecfg.NetworkSettings.AddressRange)
if err != nil {
return err
}
_, _ = ncutils.RunCmd("route add "+ip+" mask "+mask+" "+node.Address, true)
} else if ncutils.IsFreeBSD() {
_, _ = ncutils.RunCmd(ipExec+" -4 route add "+gateway+" dev "+ifacename, true)
_, _ = ncutils.RunCmd("route add -net "+nodecfg.NetworkSettings.AddressRange+" -interface "+ifacename, true)
}
return err