diff --git a/controllers/nodeGrpcController.go b/controllers/nodeGrpcController.go index 6c999cc1..1bd41c58 100644 --- a/controllers/nodeGrpcController.go +++ b/controllers/nodeGrpcController.go @@ -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, diff --git a/logic/networks.go b/logic/networks.go index 38e2b76e..8fae80ef 100644 --- a/logic/networks.go +++ b/logic/networks.go @@ -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) { diff --git a/models/node.go b/models/node.go index cd18d5e0..1976481c 100644 --- a/models/node.go +++ b/models/node.go @@ -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 { diff --git a/netclient/freebsd/peers.go b/netclient/freebsd/peers.go deleted file mode 100644 index fe94b3d8..00000000 --- a/netclient/freebsd/peers.go +++ /dev/null @@ -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 -} diff --git a/netclient/functions/common.go b/netclient/functions/common.go index 6000cf70..6d73445b 100644 --- a/netclient/functions/common.go +++ b/netclient/functions/common.go @@ -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) } diff --git a/netclient/ncutils/netclientutils.go b/netclient/ncutils/netclientutils.go index 8712a27a..a39e1ecb 100644 --- a/netclient/ncutils/netclientutils.go +++ b/netclient/ncutils/netclientutils.go @@ -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 { diff --git a/netclient/wireguard/common.go b/netclient/wireguard/common.go index cc1b8d5d..76895bd3 100644 --- a/netclient/wireguard/common.go +++ b/netclient/wireguard/common.go @@ -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