mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-05 08:47:35 +08:00
remote route on delete
This commit is contained in:
@@ -29,10 +29,14 @@ func (s *NodeServiceServer) ReadNode(ctx context.Context, req *nodepb.Object) (*
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
node.NetworkSettings, err = logic.GetNetworkSettings(node.Network)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
node.SetLastCheckIn()
|
node.SetLastCheckIn()
|
||||||
// Cast to ReadNodeRes type
|
// Cast to ReadNodeRes type
|
||||||
nodeData, err := json.Marshal(&node)
|
nodeData, errN := json.Marshal(&node)
|
||||||
if err != nil {
|
if errN != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
logic.UpdateNode(&node, &node)
|
logic.UpdateNode(&node, &node)
|
||||||
@@ -75,7 +79,14 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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
|
// return the node in a CreateNodeRes type
|
||||||
response := &nodepb.Object{
|
response := &nodepb.Object{
|
||||||
Data: string(nodeData),
|
Data: string(nodeData),
|
||||||
@@ -107,10 +118,14 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.Object)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
nodeData, err := json.Marshal(&newnode)
|
newnode.NetworkSettings, err = logic.GetNetworkSettings(node.Network)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
nodeData, errN := json.Marshal(&newnode)
|
||||||
|
if errN != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return &nodepb.Object{
|
return &nodepb.Object{
|
||||||
Data: string(nodeData),
|
Data: string(nodeData),
|
||||||
Type: nodepb.NODE_TYPE,
|
Type: nodepb.NODE_TYPE,
|
||||||
|
@@ -51,6 +51,21 @@ func GetParentNetwork(networkname string) (models.Network, error) {
|
|||||||
return network, nil
|
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
|
// UniqueAddress - see if address is unique
|
||||||
func UniqueAddress(networkName string) (string, error) {
|
func UniqueAddress(networkName string) (string, error) {
|
||||||
|
|
||||||
|
@@ -31,7 +31,7 @@ type Node struct {
|
|||||||
Address6 string `json:"address6" bson:"address6" yaml:"address6" validate:"omitempty,ipv6"`
|
Address6 string `json:"address6" bson:"address6" yaml:"address6" validate:"omitempty,ipv6"`
|
||||||
LocalAddress string `json:"localaddress" bson:"localaddress" yaml:"localaddress" validate:"omitempty,ip"`
|
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"`
|
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"`
|
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"`
|
PublicKey string `json:"publickey" bson:"publickey" yaml:"publickey" validate:"required,base64"`
|
||||||
Endpoint string `json:"endpoint" bson:"endpoint" yaml:"endpoint" validate:"required,ip"`
|
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 == "" {
|
if newNode.ID == "" {
|
||||||
newNode.ID = currentNode.ID
|
newNode.ID = currentNode.ID
|
||||||
}
|
}
|
||||||
@@ -351,7 +351,6 @@ func (newNode *Node) Fill(currentNode *Node, nodeNetwork *Network) {
|
|||||||
if newNode.IsRelayed == "" {
|
if newNode.IsRelayed == "" {
|
||||||
newNode.IsRelayed = currentNode.IsRelayed
|
newNode.IsRelayed = currentNode.IsRelayed
|
||||||
}
|
}
|
||||||
newNode.NetworkSettings = *nodeNetwork
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func StringWithCharset(length int, charset string) string {
|
func StringWithCharset(length int, charset string) string {
|
||||||
|
@@ -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
|
|
||||||
}
|
|
@@ -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)
|
return RemoveLocalInstance(cfg, network)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -272,6 +272,16 @@ func GetLocalIP(localrange string) (string, error) {
|
|||||||
return local, nil
|
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
|
// GetFreePort - gets free port of machine
|
||||||
func GetFreePort(rangestart int32) (int32, error) {
|
func GetFreePort(rangestart int32) (int32, error) {
|
||||||
if rangestart == 0 {
|
if rangestart == 0 {
|
||||||
|
@@ -282,9 +282,13 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
|
|||||||
|
|
||||||
//extra network route setting required for freebsd and windows
|
//extra network route setting required for freebsd and windows
|
||||||
if ncutils.IsWindows() {
|
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() {
|
} 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
|
return err
|
||||||
|
Reference in New Issue
Block a user