From d99526fd543b8d4436c94875645adbf17df96004 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Wed, 4 Jan 2023 10:04:17 +0530 Subject: [PATCH 01/16] peer update for host --- logic/peers.go | 117 ++++++++++++++++++++++++++++++++++++++++++++++ models/metrics.go | 3 ++ models/mqtt.go | 14 ++++++ models/node.go | 1 + 4 files changed, 135 insertions(+) diff --git a/logic/peers.go b/logic/peers.go index c4b858f1..a5198e70 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -192,6 +192,123 @@ func GetPeersForProxy(node *models.Node, onlyPeers bool) (proxy_models.ProxyMana return proxyPayload, nil } +func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) { + hostPeerUpdate := models.HostPeerUpdate{ + Network: make(map[string]models.NetworkInfo), + PeerIDs: make(models.HostPeerMap), + } + peerIndexMap := make(map[string]int) + for _, nodeID := range host.Nodes { + node, err := GetNodeByID(nodeID) + if err != nil { + continue + } + log.Println("peer update for node ", node.ID) + hostPeerUpdate.Network[node.Network] = models.NetworkInfo{ + ServerVersion: servercfg.GetVersion(), + ServerAddr: node.Server, + DNS: getPeerDNS(node.Network), + } + currentPeers, err := GetNetworkNodes(node.Network) + if err != nil { + log.Println("no network nodes") + return models.HostPeerUpdate{}, err + } + for _, peer := range currentPeers { + var peerConfig wgtypes.PeerConfig + peerHost, err := GetHost(peer.HostID.String()) + if err != nil { + log.Println("no peer host", err) + return models.HostPeerUpdate{}, err + } + if peer.ID == node.ID { + log.Println("peer update, skipping self") + //skip yourself + + continue + } + if !peer.Connected { + log.Println("peer update, skipping unconnected node") + //skip unconnected nodes + continue + } + if !nodeacls.AreNodesAllowed(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), nodeacls.NodeID(peer.ID.String())) { + log.Println("peer update, skipping node for acl") + //skip if not permitted by acl + continue + } + peerConfig.PublicKey = peerHost.PublicKey + peerConfig.PersistentKeepaliveInterval = &peer.PersistentKeepalive + peerConfig.ReplaceAllowedIPs = true + uselocal := false + if host.EndpointIP.String() == peerHost.EndpointIP.String() { + //peer is on same network + // set to localaddress + uselocal = true + if node.LocalAddress.IP == nil { + // use public endpint + uselocal = false + } + if node.LocalAddress.String() == peer.LocalAddress.String() { + uselocal = false + } + } + peerConfig.Endpoint = &net.UDPAddr{ + IP: peerHost.EndpointIP, + Port: peerHost.ListenPort, + } + if !host.ProxyEnabled && peerHost.ProxyEnabled { + peerConfig.Endpoint.Port = peerHost.ProxyListenPort + } + if uselocal { + peerConfig.Endpoint.IP = peer.LocalAddress.IP + } + allowedips := getNodeAllowedIPs(&peer, &node) + if peer.IsIngressGateway { + for _, entry := range peer.IngressGatewayRange { + _, cidr, err := net.ParseCIDR(string(entry)) + if err == nil { + allowedips = append(allowedips, *cidr) + } + } + } + if peer.IsRelay { + allowedips = append(allowedips, getRelayAllowedIPs(&node, &peer)...) + } + if peer.IsEgressGateway { + allowedips = append(allowedips, getEgressIPs(&node, &peer)...) + } + peerConfig.AllowedIPs = allowedips + if _, ok := hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()]; !ok { + hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()] = make(map[string]models.IDandAddr) + } + if _, ok := hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()]; !ok { + hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, peerConfig) + peerIndexMap[peerHost.PublicKey.String()] = len(hostPeerUpdate.Peers) - 1 + hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()][peer.ID.String()] = models.IDandAddr{ + ID: peer.ID.String(), + Address: peer.PrimaryAddress(), + Name: peer.Name, + Network: peer.Network, + } + } else { + peerAllowedIPs := hostPeerUpdate.Peers[peerIndexMap[peerHost.PublicKey.String()]].AllowedIPs + peerAllowedIPs = append(peerAllowedIPs, allowedips...) + hostPeerUpdate.Peers[peerIndexMap[peerHost.PublicKey.String()]].AllowedIPs = peerAllowedIPs + hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()][peer.ID.String()] = models.IDandAddr{ + ID: peer.ID.String(), + Address: peer.PrimaryAddress(), + Name: peer.Name, + Network: peer.Network, + } + } + + } + } + + return hostPeerUpdate, nil +} + // GetPeerUpdate - gets a wireguard peer config for each peer of a node func GetPeerUpdate(node *models.Node, host *models.Host) (models.PeerUpdate, error) { log.Println("peer update for node ", node.ID) diff --git a/models/metrics.go b/models/metrics.go index 11abdf4d..7015c180 100644 --- a/models/metrics.go +++ b/models/metrics.go @@ -37,11 +37,14 @@ type IDandAddr struct { Address string `json:"address" bson:"address" yaml:"address"` Name string `json:"name" bson:"name" yaml:"name"` IsServer string `json:"isserver" bson:"isserver" yaml:"isserver" validate:"checkyesorno"` + Network string `json:"network" bson:"network" yaml:"network" validate:"network"` } // PeerMap - peer map for ids and addresses in metrics type PeerMap map[string]IDandAddr +type HostPeerMap map[string]map[string]IDandAddr + // MetricsMap - map for holding multiple metrics in memory type MetricsMap map[string]Metrics diff --git a/models/mqtt.go b/models/mqtt.go index eb05514e..b13fcf8c 100644 --- a/models/mqtt.go +++ b/models/mqtt.go @@ -16,6 +16,20 @@ type PeerUpdate struct { ProxyUpdate proxy_models.ProxyManagerPayload `json:"proxy_update" bson:"proxy_update" yaml:"proxy_update"` } +// HostPeerUpdate +type HostPeerUpdate struct { + Network map[string]NetworkInfo `json:"network" bson:"network" yaml:"network"` + Peers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` + PeerIDs HostPeerMap `json:"peerids" bson:"peerids" yaml:"peerids"` + ProxyUpdate proxy_models.ProxyManagerPayload `json:"proxy_update" bson:"proxy_update" yaml:"proxy_update"` +} + +type NetworkInfo struct { + ServerVersion string `json:"serverversion" bson:"serverversion" yaml:"serverversion"` + ServerAddr string `json:"serveraddr" bson:"serveraddr" yaml:"serveraddr"` + DNS string `json:"dns" bson:"dns" yaml:"dns"` +} + // KeyUpdate - key update struct type KeyUpdate struct { Network string `json:"network" bson:"network"` diff --git a/models/node.go b/models/node.go index 368e2da2..8de356e2 100644 --- a/models/node.go +++ b/models/node.go @@ -58,6 +58,7 @@ type Iface struct { type CommonNode struct { ID uuid.UUID `json:"id" yaml:"id"` HostID uuid.UUID `json:"hostid" yaml:"hostid"` + Name string `json:"name" yaml:"name"` Network string `json:"network" yaml:"network"` NetworkRange net.IPNet `json:"networkrange" yaml:"networkrange"` NetworkRange6 net.IPNet `json:"networkrange6" yaml:"networkrange6"` From 4c0866723f084175564fca4add60f6962712a039 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Wed, 4 Jan 2023 10:05:05 +0530 Subject: [PATCH 02/16] add new host role with acls --- mq/dynsec_clients.go | 12 +++++++++-- mq/dynsec_helper.go | 51 +++++++++++++++++++++++++++++++++++++++++--- mq/handlers.go | 8 +++++-- mq/publishers.go | 39 ++++++++++++++++----------------- mq/util.go | 10 +++------ 5 files changed, 85 insertions(+), 35 deletions(-) diff --git a/mq/dynsec_clients.go b/mq/dynsec_clients.go index d9653d4d..b1bafd9c 100644 --- a/mq/dynsec_clients.go +++ b/mq/dynsec_clients.go @@ -13,7 +13,7 @@ func ModifyClient(client *MqClient) error { roles := []MqDynSecRole{ { - Rolename: HostRole, + Rolename: HostGenericRole, Priority: -1, }, } @@ -57,9 +57,17 @@ func DeleteMqClient(hostID string) error { // CreateMqClient - creates an MQ DynSec client func CreateMqClient(client *MqClient) error { + err := createHostRole(client.ID) + if err != nil { + return err + } roles := []MqDynSecRole{ { - Rolename: HostRole, + Rolename: HostGenericRole, + Priority: -1, + }, + { + Rolename: getHostRoleName(client.ID), Priority: -1, }, } diff --git a/mq/dynsec_helper.go b/mq/dynsec_helper.go index 60c6e790..87e8082c 100644 --- a/mq/dynsec_helper.go +++ b/mq/dynsec_helper.go @@ -19,8 +19,8 @@ const ( exporterRole = "exporter" // constant for node role NodeRole = "node" - // HostRole constant for host role - HostRole = "host" + // HostGenericRole constant for host role + HostGenericRole = "host" // const for dynamic security file dynamicSecurityFile = "dynamic-security.json" @@ -66,7 +66,7 @@ var ( Acls: fetchServerAcls(), }, { - Rolename: HostRole, + Rolename: HostGenericRole, Acls: fetchNodeAcls(), }, exporterMQRole, @@ -169,6 +169,18 @@ func ListClients(client mqtt.Client) (ListClientsData, error) { return resp, errors.New("resp not found") } +// fetches host related acls +func fetchHostAcls(hostID string) []Acl { + return []Acl{ + { + AclType: "publishClientReceive", + Topic: fmt.Sprintf("peers/host/%s", hostID), + Priority: -1, + Allow: true, + }, + } +} + // FetchNetworkAcls - fetches network acls func FetchNetworkAcls(network string) []Acl { return []Acl{ @@ -237,6 +249,27 @@ func CreateNetworkRole(network string) error { return publishEventToDynSecTopic(event) } +// creates role for the host with ID. +func createHostRole(hostID string) error { + // Create Role with acls for the host + event := MqDynsecPayload{ + Commands: []MqDynSecCmd{ + { + Command: CreateRoleCmd, + RoleName: getHostRoleName(hostID), + Textname: "host role with Acls for hosts", + Acls: fetchHostAcls(hostID), + }, + }, + } + + return publishEventToDynSecTopic(event) +} + +func getHostRoleName(hostID string) string { + return fmt.Sprintf("host-%s", hostID) +} + // serverAcls - fetches server role related acls func fetchServerAcls() []Acl { return []Acl{ @@ -252,6 +285,12 @@ func fetchServerAcls() []Acl { Priority: -1, Allow: true, }, + { + AclType: "publishClientSend", + Topic: "peers/host/#", + Priority: -1, + Allow: true, + }, { AclType: "publishClientSend", Topic: "update/#", @@ -332,6 +371,12 @@ func fetchNodeAcls() []Acl { Priority: -1, Allow: true, }, + { + AclType: "publishClientReceive", + Topic: "peers/host", + Priority: -1, + Allow: true, + }, { AclType: "subscribePattern", Topic: "#", diff --git a/mq/handlers.go b/mq/handlers.go index 4ea670b1..1baa2d9d 100644 --- a/mq/handlers.go +++ b/mq/handlers.go @@ -165,9 +165,13 @@ func UpdateMetrics(client mqtt.Client, msg mqtt.Message) { if shouldUpdate { logger.Log(2, "updating peers after node", currentNode.ID.String(), currentNode.Network, "detected connectivity issues") - if err = PublishSinglePeerUpdate(¤tNode); err != nil { - logger.Log(0, "failed to publish update after failover peer change for node", currentNode.ID.String(), currentNode.Network) + host, err := logic.GetHost(currentNode.HostID.String()) + if err == nil { + if err = PublishSingleHostUpdate(host); err != nil { + logger.Log(0, "failed to publish update after failover peer change for node", currentNode.ID.String(), currentNode.Network) + } } + } logger.Log(1, "updated node metrics", id) diff --git a/mq/publishers.go b/mq/publishers.go index 164adc7d..c42dd3b0 100644 --- a/mq/publishers.go +++ b/mq/publishers.go @@ -19,15 +19,16 @@ func PublishPeerUpdate(network string, publishToSelf bool) error { if !servercfg.IsMessageQueueBackend() { return nil } - networkNodes, err := logic.GetNetworkNodes(network) + + hosts, err := logic.GetAllHosts() if err != nil { - logger.Log(1, "err getting Network Nodes", err.Error()) + logger.Log(1, "err getting all hosts", err.Error()) return err } - for _, node := range networkNodes { - err = PublishSinglePeerUpdate(&node) + for _, host := range hosts { + err = PublishSingleHostUpdate(&host) if err != nil { - logger.Log(1, "failed to publish peer update to node", node.ID.String(), "on network", node.Network, ":", err.Error()) + logger.Log(1, "failed to publish peer update to host", host.ID.String(), ": ", err.Error()) } } return err @@ -48,23 +49,19 @@ func PublishProxyPeerUpdate(node *models.Node) error { } // PublishSinglePeerUpdate --- determines and publishes a peer update to one node -func PublishSinglePeerUpdate(node *models.Node) error { - host, err := logic.GetHost(node.HostID.String()) - if err != nil { - return nil - } +func PublishSingleHostUpdate(host *models.Host) error { - peerUpdate, err := logic.GetPeerUpdate(node, host) + peerUpdate, err := logic.GetPeerUpdateForHost(host) if err != nil { return err } if host.ProxyEnabled { - proxyUpdate, err := logic.GetPeersForProxy(node, false) - if err != nil { - return err - } - proxyUpdate.Action = proxy_models.AddNetwork - peerUpdate.ProxyUpdate = proxyUpdate + // proxyUpdate, err := logic.GetPeersForProxy(node, false) + // if err != nil { + // return err + // } + // proxyUpdate.Action = proxy_models.AddNetwork + // peerUpdate.ProxyUpdate = proxyUpdate } @@ -72,7 +69,7 @@ func PublishSinglePeerUpdate(node *models.Node) error { if err != nil { return err } - return publish(node, fmt.Sprintf("peers/%s/%s", node.Network, node.ID), data) + return publish(host, "peers/host", data) } // PublishPeerUpdate --- publishes a peer update to all the peers of a node @@ -99,7 +96,7 @@ func PublishExtPeerUpdate(node *models.Node) error { } } - if err = publish(node, fmt.Sprintf("peers/%s/%s", node.Network, node.ID), data); err != nil { + if err = publish(host, fmt.Sprintf("peers/%s/%s", node.Network, node.ID), data); err != nil { return err } go PublishPeerUpdate(node.Network, false) @@ -126,7 +123,7 @@ func NodeUpdate(node *models.Node) error { logger.Log(2, "error marshalling node update ", err.Error()) return err } - if err = publish(node, fmt.Sprintf("update/%s/%s", node.Network, node.ID), data); err != nil { + if err = publish(host, fmt.Sprintf("update/%s/%s", node.Network, node.ID), data); err != nil { logger.Log(2, "error publishing node update to peer ", node.ID.String(), err.Error()) return err } @@ -156,7 +153,7 @@ func ProxyUpdate(proxyPayload *proxy_models.ProxyManagerPayload, node *models.No logger.Log(2, "error marshalling node update ", err.Error()) return err } - if err = publish(node, fmt.Sprintf("proxy/%s/%s", node.Network, node.ID), data); err != nil { + if err = publish(host, fmt.Sprintf("proxy/%s/%s", node.Network, node.ID), data); err != nil { logger.Log(2, "error publishing proxy update to peer ", node.ID.String(), err.Error()) return err } diff --git a/mq/util.go b/mq/util.go index eafa35db..2ca4942f 100644 --- a/mq/util.go +++ b/mq/util.go @@ -40,7 +40,7 @@ func decryptMsg(node *models.Node, msg []byte) ([]byte, error) { return ncutils.DeChunk(msg, nodePubTKey, serverPrivTKey) } -func encryptMsg(node *models.Node, msg []byte) ([]byte, error) { +func encryptMsg(host *models.Host, msg []byte) ([]byte, error) { // fetch server public key to be certain hasn't changed in transit trafficKey, trafficErr := logic.RetrievePrivateTrafficKey() if trafficErr != nil { @@ -52,10 +52,6 @@ func encryptMsg(node *models.Node, msg []byte) ([]byte, error) { return nil, err } - host, err := logic.GetHost(node.HostID.String()) - if err != nil { - return nil, err - } nodePubKey, err := ncutils.ConvertBytesToKey(host.TrafficKeyPublic) if err != nil { return nil, err @@ -68,8 +64,8 @@ func encryptMsg(node *models.Node, msg []byte) ([]byte, error) { return ncutils.Chunk(msg, nodePubKey, serverPrivKey) } -func publish(node *models.Node, dest string, msg []byte) error { - encrypted, encryptErr := encryptMsg(node, msg) +func publish(host *models.Host, dest string, msg []byte) error { + encrypted, encryptErr := encryptMsg(host, msg) if encryptErr != nil { return encryptErr } From f789e9202336b682198fcd863bef43a7a6f17682 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Wed, 4 Jan 2023 10:07:29 +0530 Subject: [PATCH 03/16] delete host role when client is delete --- mq/dynsec_clients.go | 1 + mq/dynsec_helper.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/mq/dynsec_clients.go b/mq/dynsec_clients.go index b1bafd9c..3f122a39 100644 --- a/mq/dynsec_clients.go +++ b/mq/dynsec_clients.go @@ -43,6 +43,7 @@ func ModifyClient(client *MqClient) error { // DeleteMqClient - removes a client from the DynSec system func DeleteMqClient(hostID string) error { + deleteHostRole(hostID) event := MqDynsecPayload{ Commands: []MqDynSecCmd{ { diff --git a/mq/dynsec_helper.go b/mq/dynsec_helper.go index 87e8082c..ab9974d4 100644 --- a/mq/dynsec_helper.go +++ b/mq/dynsec_helper.go @@ -232,6 +232,20 @@ func DeleteNetworkRole(network string) error { return publishEventToDynSecTopic(event) } +func deleteHostRole(hostID string) error { + // Deletes the hostID role from MQ + event := MqDynsecPayload{ + Commands: []MqDynSecCmd{ + { + Command: DeleteRoleCmd, + RoleName: getHostRoleName(hostID), + }, + }, + } + + return publishEventToDynSecTopic(event) +} + // CreateNetworkRole - createss a network role from DynSec system func CreateNetworkRole(network string) error { // Create Role with acls for the network From 88902f7823d5ab07d5c043451dcc64b9a8d34916 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Wed, 4 Jan 2023 11:03:13 +0530 Subject: [PATCH 04/16] fix host peer update model,add server name to peer update topic --- logic/peers.go | 10 +++++----- models/mqtt.go | 14 +++++++------- mq/dynsec_helper.go | 2 +- mq/publishers.go | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/logic/peers.go b/logic/peers.go index a5198e70..1c0fc3fb 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -194,8 +194,10 @@ func GetPeersForProxy(node *models.Node, onlyPeers bool) (proxy_models.ProxyMana func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) { hostPeerUpdate := models.HostPeerUpdate{ - Network: make(map[string]models.NetworkInfo), - PeerIDs: make(models.HostPeerMap), + Network: make(map[string]models.NetworkInfo), + PeerIDs: make(models.HostPeerMap), + ServerVersion: servercfg.GetVersion(), + ServerAddrs: []models.ServerAddr{}, } peerIndexMap := make(map[string]int) for _, nodeID := range host.Nodes { @@ -205,9 +207,7 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) { } log.Println("peer update for node ", node.ID) hostPeerUpdate.Network[node.Network] = models.NetworkInfo{ - ServerVersion: servercfg.GetVersion(), - ServerAddr: node.Server, - DNS: getPeerDNS(node.Network), + DNS: getPeerDNS(node.Network), } currentPeers, err := GetNetworkNodes(node.Network) if err != nil { diff --git a/models/mqtt.go b/models/mqtt.go index b13fcf8c..6eaf0fd6 100644 --- a/models/mqtt.go +++ b/models/mqtt.go @@ -18,16 +18,16 @@ type PeerUpdate struct { // HostPeerUpdate type HostPeerUpdate struct { - Network map[string]NetworkInfo `json:"network" bson:"network" yaml:"network"` - Peers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` - PeerIDs HostPeerMap `json:"peerids" bson:"peerids" yaml:"peerids"` - ProxyUpdate proxy_models.ProxyManagerPayload `json:"proxy_update" bson:"proxy_update" yaml:"proxy_update"` + ServerVersion string `json:"serverversion" bson:"serverversion" yaml:"serverversion"` + ServerAddrs []ServerAddr `json:"serveraddrs" bson:"serveraddrs" yaml:"serveraddrs"` + Network map[string]NetworkInfo `json:"network" bson:"network" yaml:"network"` + Peers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` + PeerIDs HostPeerMap `json:"peerids" bson:"peerids" yaml:"peerids"` + ProxyUpdate proxy_models.ProxyManagerPayload `json:"proxy_update" bson:"proxy_update" yaml:"proxy_update"` } type NetworkInfo struct { - ServerVersion string `json:"serverversion" bson:"serverversion" yaml:"serverversion"` - ServerAddr string `json:"serveraddr" bson:"serveraddr" yaml:"serveraddr"` - DNS string `json:"dns" bson:"dns" yaml:"dns"` + DNS string `json:"dns" bson:"dns" yaml:"dns"` } // KeyUpdate - key update struct diff --git a/mq/dynsec_helper.go b/mq/dynsec_helper.go index ab9974d4..d0fb5f99 100644 --- a/mq/dynsec_helper.go +++ b/mq/dynsec_helper.go @@ -174,7 +174,7 @@ func fetchHostAcls(hostID string) []Acl { return []Acl{ { AclType: "publishClientReceive", - Topic: fmt.Sprintf("peers/host/%s", hostID), + Topic: fmt.Sprintf("peers/host/%s/#", hostID), Priority: -1, Allow: true, }, diff --git a/mq/publishers.go b/mq/publishers.go index c42dd3b0..6fecf5db 100644 --- a/mq/publishers.go +++ b/mq/publishers.go @@ -69,7 +69,7 @@ func PublishSingleHostUpdate(host *models.Host) error { if err != nil { return err } - return publish(host, "peers/host", data) + return publish(host, fmt.Sprintf("peers/host/%s/%s", host.ID.String(), servercfg.GetServer()), data) } // PublishPeerUpdate --- publishes a peer update to all the peers of a node From 21133bca7dc19fd6fe528b51784e39190a0ecf3d Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Wed, 4 Jan 2023 20:02:02 +0530 Subject: [PATCH 05/16] host based updates --- controllers/node.go | 2 +- logic/hosts.go | 20 ++++++++++++++++++++ logic/peers.go | 5 ++--- mq/dynsec_helper.go | 2 +- mq/publishers.go | 2 +- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/controllers/node.go b/controllers/node.go index 6451cc9b..03db781f 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -435,7 +435,7 @@ func getNode(w http.ResponseWriter, r *http.Request) { logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) return } - peerUpdate, err := logic.GetPeerUpdate(&node, host) + peerUpdate, err := logic.GetPeerUpdateForHost(host) if err != nil && !database.IsEmptyRecord(err) { logger.Log(0, r.Header.Get("user"), fmt.Sprintf("error fetching wg peers config for node [ %s ]: %v", nodeid, err)) diff --git a/logic/hosts.go b/logic/hosts.go index 0dfeedec..c50fddae 100644 --- a/logic/hosts.go +++ b/logic/hosts.go @@ -63,6 +63,26 @@ func GetHostsMap() (map[string]*models.Host, error) { return currHostMap, nil } +func GetNetworkHosts(network string) ([]models.Host, error) { + networkHosts := []models.Host{} + hosts, err := GetAllHosts() + if err != nil { + return networkHosts, err + } + for _, host := range hosts { + for _, nodeID := range host.Nodes { + node, err := GetNodeByID(nodeID) + if err == nil { + if node.Network == network { + networkHosts = append(networkHosts, host) + break + } + } + } + } + return networkHosts, nil +} + // GetHost - gets a host from db given id func GetHost(hostid string) (*models.Host, error) { record, err := database.FetchRecord(database.HOSTS_TABLE_NAME, hostid) diff --git a/logic/peers.go b/logic/peers.go index 1c0fc3fb..75507d94 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -199,13 +199,13 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) { ServerVersion: servercfg.GetVersion(), ServerAddrs: []models.ServerAddr{}, } + log.Println("peer update for host ", host.ID.String()) peerIndexMap := make(map[string]int) for _, nodeID := range host.Nodes { node, err := GetNodeByID(nodeID) if err != nil { continue } - log.Println("peer update for node ", node.ID) hostPeerUpdate.Network[node.Network] = models.NetworkInfo{ DNS: getPeerDNS(node.Network), } @@ -279,10 +279,9 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) { allowedips = append(allowedips, getEgressIPs(&node, &peer)...) } peerConfig.AllowedIPs = allowedips + if _, ok := hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()]; !ok { hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()] = make(map[string]models.IDandAddr) - } - if _, ok := hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()]; !ok { hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, peerConfig) peerIndexMap[peerHost.PublicKey.String()] = len(hostPeerUpdate.Peers) - 1 hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()][peer.ID.String()] = models.IDandAddr{ diff --git a/mq/dynsec_helper.go b/mq/dynsec_helper.go index d0fb5f99..ab2f6e29 100644 --- a/mq/dynsec_helper.go +++ b/mq/dynsec_helper.go @@ -271,7 +271,7 @@ func createHostRole(hostID string) error { { Command: CreateRoleCmd, RoleName: getHostRoleName(hostID), - Textname: "host role with Acls for hosts", + Textname: "host role with Acls for hosts", Acls: fetchHostAcls(hostID), }, }, diff --git a/mq/publishers.go b/mq/publishers.go index 6fecf5db..5c86ae18 100644 --- a/mq/publishers.go +++ b/mq/publishers.go @@ -20,7 +20,7 @@ func PublishPeerUpdate(network string, publishToSelf bool) error { return nil } - hosts, err := logic.GetAllHosts() + hosts, err := logic.GetNetworkHosts(network) if err != nil { logger.Log(1, "err getting all hosts", err.Error()) return err From 72e4b914b93975ac7fa13026a60926fd1817363f Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Thu, 5 Jan 2023 09:24:46 +0530 Subject: [PATCH 06/16] move peers to host level --- controllers/node.go | 8 +++--- models/api_node.go | 2 +- models/host.go | 59 +++++++++++++++++++++++---------------------- models/node.go | 41 +++++++++++++++---------------- models/structs.go | 2 -- mq/publishers.go | 24 ------------------ 6 files changed, 54 insertions(+), 82 deletions(-) diff --git a/controllers/node.go b/controllers/node.go index 7aa804d0..caa7f0e7 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -455,7 +455,6 @@ func getNode(w http.ResponseWriter, r *http.Request) { Node: *legacy, Peers: peerUpdate.Peers, ServerConfig: server, - PeerIDs: peerUpdate.PeerIDs, } if servercfg.Is_EE && nodeRequest { @@ -637,19 +636,18 @@ func createNode(w http.ResponseWriter, r *http.Request) { return } } - peerUpdate, err := logic.GetPeerUpdate(&data.Node, &data.Host) + peerUpdate, err := logic.GetPeerUpdateForHost(&data.Host) if err != nil && !database.IsEmptyRecord(err) { logger.Log(0, r.Header.Get("user"), fmt.Sprintf("error fetching wg peers config for node [ %s ]: %v", data.Node.ID.String(), err)) logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) return } - data.Node.Peers = peerUpdate.Peers - + data.Host.Peers = peerUpdate.Peers response := models.NodeJoinResponse{ Node: data.Node, ServerConfig: server, - PeerIDs: peerUpdate.PeerIDs, + Host: data.Host, } logger.Log(1, r.Header.Get("user"), "created new node", data.Host.Name, "on network", networkName) w.WriteHeader(http.StatusOK) diff --git a/models/api_node.go b/models/api_node.go index 88816ab8..9a78b8a9 100644 --- a/models/api_node.go +++ b/models/api_node.go @@ -59,7 +59,7 @@ func (a *ApiNode) ConvertToServerNode(currentNode *Node) *Node { convertedNode.IsRelay = a.IsRelay convertedNode.IsRelayed = a.IsRelayed convertedNode.PendingDelete = a.PendingDelete - convertedNode.Peers = currentNode.Peers + //convertedNode.Peers = currentNode.Peers convertedNode.Failover = a.Failover convertedNode.IsEgressGateway = a.IsEgressGateway convertedNode.IsIngressGateway = a.IsIngressGateway diff --git a/models/host.go b/models/host.go index 861c57e3..aa1fa54d 100644 --- a/models/host.go +++ b/models/host.go @@ -12,35 +12,36 @@ const WIREGUARD_INTERFACE = "netmaker" // Host - represents a host on the network type Host struct { - ID uuid.UUID `json:"id" yaml:"id"` - Verbosity int `json:"verbosity" yaml:"verbosity"` - FirewallInUse string `json:"firewallinuse" yaml:"firewallinuse"` - Version string `json:"version" yaml:"version"` - IPForwarding bool `json:"ipforwarding" yaml:"ipforwarding"` - DaemonInstalled bool `json:"daemoninstalled" yaml:"daemoninstalled"` - HostPass string `json:"hostpass" yaml:"hostpass"` - Name string `json:"name" yaml:"name"` - OS string `json:"os" yaml:"os"` - Interface string `json:"interface" yaml:"interface"` - Debug bool `json:"debug" yaml:"debug"` - ListenPort int `json:"listenport" yaml:"listenport"` - LocalAddress net.IPNet `json:"localaddress" yaml:"localaddress"` - LocalRange net.IPNet `json:"localrange" yaml:"localrange"` - LocalListenPort int `json:"locallistenport" yaml:"locallistenport"` - ProxyListenPort int `json:"proxy_listen_port" yaml:"proxy_listen_port"` - MTU int `json:"mtu" yaml:"mtu"` - PublicKey wgtypes.Key `json:"publickey" yaml:"publickey"` - MacAddress net.HardwareAddr `json:"macaddress" yaml:"macaddress"` - TrafficKeyPublic []byte `json:"traffickeypublic" yaml:"trafficekeypublic"` - InternetGateway net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` - Nodes []string `json:"nodes" yaml:"nodes"` - Interfaces []Iface `json:"interfaces" yaml:"interfaces"` - EndpointIP net.IP `json:"endpointip" yaml:"endpointip"` - ProxyEnabled bool `json:"proxy_enabled" yaml:"proxy_enabled"` - IsDocker bool `json:"isdocker" yaml:"isdocker"` - IsK8S bool `json:"isk8s" yaml:"isk8s"` - IsStatic bool `json:"isstatic" yaml:"isstatic"` - IsDefault bool `json:"isdefault" yaml:"isdefault"` + ID uuid.UUID `json:"id" yaml:"id"` + Verbosity int `json:"verbosity" yaml:"verbosity"` + FirewallInUse string `json:"firewallinuse" yaml:"firewallinuse"` + Version string `json:"version" yaml:"version"` + IPForwarding bool `json:"ipforwarding" yaml:"ipforwarding"` + DaemonInstalled bool `json:"daemoninstalled" yaml:"daemoninstalled"` + HostPass string `json:"hostpass" yaml:"hostpass"` + Name string `json:"name" yaml:"name"` + OS string `json:"os" yaml:"os"` + Interface string `json:"interface" yaml:"interface"` + Debug bool `json:"debug" yaml:"debug"` + ListenPort int `json:"listenport" yaml:"listenport"` + LocalAddress net.IPNet `json:"localaddress" yaml:"localaddress"` + LocalRange net.IPNet `json:"localrange" yaml:"localrange"` + LocalListenPort int `json:"locallistenport" yaml:"locallistenport"` + ProxyListenPort int `json:"proxy_listen_port" yaml:"proxy_listen_port"` + MTU int `json:"mtu" yaml:"mtu"` + PublicKey wgtypes.Key `json:"publickey" yaml:"publickey"` + MacAddress net.HardwareAddr `json:"macaddress" yaml:"macaddress"` + TrafficKeyPublic []byte `json:"traffickeypublic" yaml:"trafficekeypublic"` + InternetGateway net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` + Nodes []string `json:"nodes" yaml:"nodes"` + Interfaces []Iface `json:"interfaces" yaml:"interfaces"` + EndpointIP net.IP `json:"endpointip" yaml:"endpointip"` + ProxyEnabled bool `json:"proxy_enabled" yaml:"proxy_enabled"` + IsDocker bool `json:"isdocker" yaml:"isdocker"` + IsK8S bool `json:"isk8s" yaml:"isk8s"` + IsStatic bool `json:"isstatic" yaml:"isstatic"` + IsDefault bool `json:"isdefault" yaml:"isdefault"` + Peers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` } // FormatBool converts a boolean to a [yes|no] string diff --git a/models/node.go b/models/node.go index 8de356e2..24870a4b 100644 --- a/models/node.go +++ b/models/node.go @@ -56,27 +56,26 @@ type Iface struct { // CommonNode - represents a commonn node data elements shared by netmaker and netclient type CommonNode struct { - ID uuid.UUID `json:"id" yaml:"id"` - HostID uuid.UUID `json:"hostid" yaml:"hostid"` - Name string `json:"name" yaml:"name"` - Network string `json:"network" yaml:"network"` - NetworkRange net.IPNet `json:"networkrange" yaml:"networkrange"` - NetworkRange6 net.IPNet `json:"networkrange6" yaml:"networkrange6"` - InternetGateway *net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` - Server string `json:"server" yaml:"server"` - Connected bool `json:"connected" yaml:"connected"` - Address net.IPNet `json:"address" yaml:"address"` - Address6 net.IPNet `json:"address6" yaml:"address6"` - PostUp string `json:"postup" yaml:"postup"` - PostDown string `json:"postdown" yaml:"postdown"` - Action string `json:"action" yaml:"action"` - LocalAddress net.IPNet `json:"localaddress" yaml:"localaddress"` - IsLocal bool `json:"islocal" yaml:"islocal"` - IsEgressGateway bool `json:"isegressgateway" yaml:"isegressgateway"` - IsIngressGateway bool `json:"isingressgateway" yaml:"isingressgateway"` - DNSOn bool `json:"dnson" yaml:"dnson"` - PersistentKeepalive time.Duration `json:"persistentkeepalive" yaml:"persistentkeepalive"` - Peers []wgtypes.PeerConfig `json:"peers" yaml:"peers"` + ID uuid.UUID `json:"id" yaml:"id"` + HostID uuid.UUID `json:"hostid" yaml:"hostid"` + Name string `json:"name" yaml:"name"` + Network string `json:"network" yaml:"network"` + NetworkRange net.IPNet `json:"networkrange" yaml:"networkrange"` + NetworkRange6 net.IPNet `json:"networkrange6" yaml:"networkrange6"` + InternetGateway *net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` + Server string `json:"server" yaml:"server"` + Connected bool `json:"connected" yaml:"connected"` + Address net.IPNet `json:"address" yaml:"address"` + Address6 net.IPNet `json:"address6" yaml:"address6"` + PostUp string `json:"postup" yaml:"postup"` + PostDown string `json:"postdown" yaml:"postdown"` + Action string `json:"action" yaml:"action"` + LocalAddress net.IPNet `json:"localaddress" yaml:"localaddress"` + IsLocal bool `json:"islocal" yaml:"islocal"` + IsEgressGateway bool `json:"isegressgateway" yaml:"isegressgateway"` + IsIngressGateway bool `json:"isingressgateway" yaml:"isingressgateway"` + DNSOn bool `json:"dnson" yaml:"dnson"` + PersistentKeepalive time.Duration `json:"persistentkeepalive" yaml:"persistentkeepalive"` } // Node - a model of a network node diff --git a/models/structs.go b/models/structs.go index 970f9fd6..625210fe 100644 --- a/models/structs.go +++ b/models/structs.go @@ -206,7 +206,6 @@ type NodeGet struct { Host Host `json:"host" yaml:"host"` Peers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` ServerConfig ServerConfig `json:"serverconfig" bson:"serverconfig" yaml:"serverconfig"` - PeerIDs PeerMap `json:"peerids,omitempty" bson:"peerids,omitempty" yaml:"peerids,omitempty"` } // NodeJoinResponse data returned to node in response to join @@ -214,7 +213,6 @@ type NodeJoinResponse struct { Node Node `json:"node" bson:"node" yaml:"node"` Host Host `json:"host" yaml:"host"` ServerConfig ServerConfig `json:"serverconfig" bson:"serverconfig" yaml:"serverconfig"` - PeerIDs PeerMap `json:"peerids,omitempty" bson:"peerids,omitempty" yaml:"peerids,omitempty"` } // ServerConfig - struct for dealing with the server information for a netclient diff --git a/mq/publishers.go b/mq/publishers.go index 5c86ae18..05fbcb9f 100644 --- a/mq/publishers.go +++ b/mq/publishers.go @@ -74,31 +74,7 @@ func PublishSingleHostUpdate(host *models.Host) error { // PublishPeerUpdate --- publishes a peer update to all the peers of a node func PublishExtPeerUpdate(node *models.Node) error { - host, err := logic.GetHost(node.HostID.String()) - if err != nil { - return nil - } - if !servercfg.IsMessageQueueBackend() { - return nil - } - peerUpdate, err := logic.GetPeerUpdate(node, host) - if err != nil { - return err - } - data, err := json.Marshal(&peerUpdate) - if err != nil { - return err - } - if host.ProxyEnabled { - proxyUpdate, err := logic.GetPeersForProxy(node, false) - if err == nil { - peerUpdate.ProxyUpdate = proxyUpdate - } - } - if err = publish(host, fmt.Sprintf("peers/%s/%s", node.Network, node.ID), data); err != nil { - return err - } go PublishPeerUpdate(node.Network, false) return nil } From 4c63478888009afaadd734af5239a4379ce52443 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Thu, 5 Jan 2023 09:31:31 +0530 Subject: [PATCH 07/16] get node fix --- controllers/node.go | 3 ++- models/structs.go | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/controllers/node.go b/controllers/node.go index caa7f0e7..d5c7c699 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -435,7 +435,7 @@ func getNode(w http.ResponseWriter, r *http.Request) { logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) return } - peerUpdate, err := logic.GetPeerUpdateForHost(host) + peerUpdate, err := logic.GetPeerUpdate(&node, host) if err != nil && !database.IsEmptyRecord(err) { logger.Log(0, r.Header.Get("user"), fmt.Sprintf("error fetching wg peers config for node [ %s ]: %v", nodeid, err)) @@ -455,6 +455,7 @@ func getNode(w http.ResponseWriter, r *http.Request) { Node: *legacy, Peers: peerUpdate.Peers, ServerConfig: server, + PeerIDs: peerUpdate.PeerIDs, } if servercfg.Is_EE && nodeRequest { diff --git a/models/structs.go b/models/structs.go index 625210fe..bf1f6df5 100644 --- a/models/structs.go +++ b/models/structs.go @@ -206,6 +206,7 @@ type NodeGet struct { Host Host `json:"host" yaml:"host"` Peers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` ServerConfig ServerConfig `json:"serverconfig" bson:"serverconfig" yaml:"serverconfig"` + PeerIDs PeerMap `json:"peerids,omitempty" bson:"peerids,omitempty" yaml:"peerids,omitempty"` } // NodeJoinResponse data returned to node in response to join From 2ff8684fd4b906382dfa36a5982ba81b9a25de93 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Thu, 5 Jan 2023 09:42:41 +0530 Subject: [PATCH 08/16] keep node level peers for now --- controllers/node.go | 12 ++++++++++-- models/api_node.go | 2 +- models/node.go | 41 +++++++++++++++++++++-------------------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/controllers/node.go b/controllers/node.go index d5c7c699..8f159ffc 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -637,14 +637,22 @@ func createNode(w http.ResponseWriter, r *http.Request) { return } } - peerUpdate, err := logic.GetPeerUpdateForHost(&data.Host) + hostPeerUpdate, err := logic.GetPeerUpdateForHost(&data.Host) + if err != nil && !database.IsEmptyRecord(err) { + logger.Log(0, r.Header.Get("user"), + fmt.Sprintf("error fetching wg peers config for host [ %s ]: %v", data.Host.ID.String(), err)) + logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) + return + } + peerUpdate, err := logic.GetPeerUpdate(&data.Node, &data.Host) if err != nil && !database.IsEmptyRecord(err) { logger.Log(0, r.Header.Get("user"), fmt.Sprintf("error fetching wg peers config for node [ %s ]: %v", data.Node.ID.String(), err)) logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) return } - data.Host.Peers = peerUpdate.Peers + data.Host.Peers = hostPeerUpdate.Peers + data.Node.Peers = peerUpdate.Peers response := models.NodeJoinResponse{ Node: data.Node, ServerConfig: server, diff --git a/models/api_node.go b/models/api_node.go index 9a78b8a9..88816ab8 100644 --- a/models/api_node.go +++ b/models/api_node.go @@ -59,7 +59,7 @@ func (a *ApiNode) ConvertToServerNode(currentNode *Node) *Node { convertedNode.IsRelay = a.IsRelay convertedNode.IsRelayed = a.IsRelayed convertedNode.PendingDelete = a.PendingDelete - //convertedNode.Peers = currentNode.Peers + convertedNode.Peers = currentNode.Peers convertedNode.Failover = a.Failover convertedNode.IsEgressGateway = a.IsEgressGateway convertedNode.IsIngressGateway = a.IsIngressGateway diff --git a/models/node.go b/models/node.go index 24870a4b..8de356e2 100644 --- a/models/node.go +++ b/models/node.go @@ -56,26 +56,27 @@ type Iface struct { // CommonNode - represents a commonn node data elements shared by netmaker and netclient type CommonNode struct { - ID uuid.UUID `json:"id" yaml:"id"` - HostID uuid.UUID `json:"hostid" yaml:"hostid"` - Name string `json:"name" yaml:"name"` - Network string `json:"network" yaml:"network"` - NetworkRange net.IPNet `json:"networkrange" yaml:"networkrange"` - NetworkRange6 net.IPNet `json:"networkrange6" yaml:"networkrange6"` - InternetGateway *net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` - Server string `json:"server" yaml:"server"` - Connected bool `json:"connected" yaml:"connected"` - Address net.IPNet `json:"address" yaml:"address"` - Address6 net.IPNet `json:"address6" yaml:"address6"` - PostUp string `json:"postup" yaml:"postup"` - PostDown string `json:"postdown" yaml:"postdown"` - Action string `json:"action" yaml:"action"` - LocalAddress net.IPNet `json:"localaddress" yaml:"localaddress"` - IsLocal bool `json:"islocal" yaml:"islocal"` - IsEgressGateway bool `json:"isegressgateway" yaml:"isegressgateway"` - IsIngressGateway bool `json:"isingressgateway" yaml:"isingressgateway"` - DNSOn bool `json:"dnson" yaml:"dnson"` - PersistentKeepalive time.Duration `json:"persistentkeepalive" yaml:"persistentkeepalive"` + ID uuid.UUID `json:"id" yaml:"id"` + HostID uuid.UUID `json:"hostid" yaml:"hostid"` + Name string `json:"name" yaml:"name"` + Network string `json:"network" yaml:"network"` + NetworkRange net.IPNet `json:"networkrange" yaml:"networkrange"` + NetworkRange6 net.IPNet `json:"networkrange6" yaml:"networkrange6"` + InternetGateway *net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` + Server string `json:"server" yaml:"server"` + Connected bool `json:"connected" yaml:"connected"` + Address net.IPNet `json:"address" yaml:"address"` + Address6 net.IPNet `json:"address6" yaml:"address6"` + PostUp string `json:"postup" yaml:"postup"` + PostDown string `json:"postdown" yaml:"postdown"` + Action string `json:"action" yaml:"action"` + LocalAddress net.IPNet `json:"localaddress" yaml:"localaddress"` + IsLocal bool `json:"islocal" yaml:"islocal"` + IsEgressGateway bool `json:"isegressgateway" yaml:"isegressgateway"` + IsIngressGateway bool `json:"isingressgateway" yaml:"isingressgateway"` + DNSOn bool `json:"dnson" yaml:"dnson"` + PersistentKeepalive time.Duration `json:"persistentkeepalive" yaml:"persistentkeepalive"` + Peers []wgtypes.PeerConfig `json:"peers" yaml:"peers"` } // Node - a model of a network node From bff68bd94541146e3cd99d18f3ed4f472f8c8626 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Thu, 5 Jan 2023 14:56:20 +0530 Subject: [PATCH 09/16] rm peers from node model --- controllers/node.go | 8 -------- models/api_node.go | 1 - models/node.go | 41 ++++++++++++++++++++--------------------- 3 files changed, 20 insertions(+), 30 deletions(-) diff --git a/controllers/node.go b/controllers/node.go index 8f159ffc..bf5a4800 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -644,15 +644,7 @@ func createNode(w http.ResponseWriter, r *http.Request) { logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) return } - peerUpdate, err := logic.GetPeerUpdate(&data.Node, &data.Host) - if err != nil && !database.IsEmptyRecord(err) { - logger.Log(0, r.Header.Get("user"), - fmt.Sprintf("error fetching wg peers config for node [ %s ]: %v", data.Node.ID.String(), err)) - logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) - return - } data.Host.Peers = hostPeerUpdate.Peers - data.Node.Peers = peerUpdate.Peers response := models.NodeJoinResponse{ Node: data.Node, ServerConfig: server, diff --git a/models/api_node.go b/models/api_node.go index 88816ab8..a87c44e1 100644 --- a/models/api_node.go +++ b/models/api_node.go @@ -59,7 +59,6 @@ func (a *ApiNode) ConvertToServerNode(currentNode *Node) *Node { convertedNode.IsRelay = a.IsRelay convertedNode.IsRelayed = a.IsRelayed convertedNode.PendingDelete = a.PendingDelete - convertedNode.Peers = currentNode.Peers convertedNode.Failover = a.Failover convertedNode.IsEgressGateway = a.IsEgressGateway convertedNode.IsIngressGateway = a.IsIngressGateway diff --git a/models/node.go b/models/node.go index 8de356e2..24870a4b 100644 --- a/models/node.go +++ b/models/node.go @@ -56,27 +56,26 @@ type Iface struct { // CommonNode - represents a commonn node data elements shared by netmaker and netclient type CommonNode struct { - ID uuid.UUID `json:"id" yaml:"id"` - HostID uuid.UUID `json:"hostid" yaml:"hostid"` - Name string `json:"name" yaml:"name"` - Network string `json:"network" yaml:"network"` - NetworkRange net.IPNet `json:"networkrange" yaml:"networkrange"` - NetworkRange6 net.IPNet `json:"networkrange6" yaml:"networkrange6"` - InternetGateway *net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` - Server string `json:"server" yaml:"server"` - Connected bool `json:"connected" yaml:"connected"` - Address net.IPNet `json:"address" yaml:"address"` - Address6 net.IPNet `json:"address6" yaml:"address6"` - PostUp string `json:"postup" yaml:"postup"` - PostDown string `json:"postdown" yaml:"postdown"` - Action string `json:"action" yaml:"action"` - LocalAddress net.IPNet `json:"localaddress" yaml:"localaddress"` - IsLocal bool `json:"islocal" yaml:"islocal"` - IsEgressGateway bool `json:"isegressgateway" yaml:"isegressgateway"` - IsIngressGateway bool `json:"isingressgateway" yaml:"isingressgateway"` - DNSOn bool `json:"dnson" yaml:"dnson"` - PersistentKeepalive time.Duration `json:"persistentkeepalive" yaml:"persistentkeepalive"` - Peers []wgtypes.PeerConfig `json:"peers" yaml:"peers"` + ID uuid.UUID `json:"id" yaml:"id"` + HostID uuid.UUID `json:"hostid" yaml:"hostid"` + Name string `json:"name" yaml:"name"` + Network string `json:"network" yaml:"network"` + NetworkRange net.IPNet `json:"networkrange" yaml:"networkrange"` + NetworkRange6 net.IPNet `json:"networkrange6" yaml:"networkrange6"` + InternetGateway *net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` + Server string `json:"server" yaml:"server"` + Connected bool `json:"connected" yaml:"connected"` + Address net.IPNet `json:"address" yaml:"address"` + Address6 net.IPNet `json:"address6" yaml:"address6"` + PostUp string `json:"postup" yaml:"postup"` + PostDown string `json:"postdown" yaml:"postdown"` + Action string `json:"action" yaml:"action"` + LocalAddress net.IPNet `json:"localaddress" yaml:"localaddress"` + IsLocal bool `json:"islocal" yaml:"islocal"` + IsEgressGateway bool `json:"isegressgateway" yaml:"isegressgateway"` + IsIngressGateway bool `json:"isingressgateway" yaml:"isingressgateway"` + DNSOn bool `json:"dnson" yaml:"dnson"` + PersistentKeepalive time.Duration `json:"persistentkeepalive" yaml:"persistentkeepalive"` } // Node - a model of a network node From 950fd3c290b2c33f74a7e118a0fb347a4550e132 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Thu, 5 Jan 2023 16:17:09 +0530 Subject: [PATCH 10/16] rm peer from host model --- controllers/node.go | 11 ++++++++- models/host.go | 59 ++++++++++++++++++++++----------------------- models/structs.go | 8 +++--- 3 files changed, 44 insertions(+), 34 deletions(-) diff --git a/controllers/node.go b/controllers/node.go index bf5a4800..86d1c71b 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -442,6 +442,13 @@ func getNode(w http.ResponseWriter, r *http.Request) { logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) return } + hostPeerUpdate, err := logic.GetPeerUpdateForHost(host) + if err != nil && !database.IsEmptyRecord(err) { + logger.Log(0, r.Header.Get("user"), + fmt.Sprintf("error fetching wg peers config for host [ %s ]: %v", host.ID.String(), err)) + logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) + return + } server := servercfg.GetServerInfo() network, err := logic.GetNetwork(node.Network) if err != nil { @@ -453,7 +460,9 @@ func getNode(w http.ResponseWriter, r *http.Request) { legacy := node.Legacy(host, &server, &network) response := models.NodeGet{ Node: *legacy, + Host: *host, Peers: peerUpdate.Peers, + HostPeers: hostPeerUpdate.Peers, ServerConfig: server, PeerIDs: peerUpdate.PeerIDs, } @@ -644,11 +653,11 @@ func createNode(w http.ResponseWriter, r *http.Request) { logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) return } - data.Host.Peers = hostPeerUpdate.Peers response := models.NodeJoinResponse{ Node: data.Node, ServerConfig: server, Host: data.Host, + Peers: hostPeerUpdate.Peers, } logger.Log(1, r.Header.Get("user"), "created new node", data.Host.Name, "on network", networkName) w.WriteHeader(http.StatusOK) diff --git a/models/host.go b/models/host.go index aa1fa54d..861c57e3 100644 --- a/models/host.go +++ b/models/host.go @@ -12,36 +12,35 @@ const WIREGUARD_INTERFACE = "netmaker" // Host - represents a host on the network type Host struct { - ID uuid.UUID `json:"id" yaml:"id"` - Verbosity int `json:"verbosity" yaml:"verbosity"` - FirewallInUse string `json:"firewallinuse" yaml:"firewallinuse"` - Version string `json:"version" yaml:"version"` - IPForwarding bool `json:"ipforwarding" yaml:"ipforwarding"` - DaemonInstalled bool `json:"daemoninstalled" yaml:"daemoninstalled"` - HostPass string `json:"hostpass" yaml:"hostpass"` - Name string `json:"name" yaml:"name"` - OS string `json:"os" yaml:"os"` - Interface string `json:"interface" yaml:"interface"` - Debug bool `json:"debug" yaml:"debug"` - ListenPort int `json:"listenport" yaml:"listenport"` - LocalAddress net.IPNet `json:"localaddress" yaml:"localaddress"` - LocalRange net.IPNet `json:"localrange" yaml:"localrange"` - LocalListenPort int `json:"locallistenport" yaml:"locallistenport"` - ProxyListenPort int `json:"proxy_listen_port" yaml:"proxy_listen_port"` - MTU int `json:"mtu" yaml:"mtu"` - PublicKey wgtypes.Key `json:"publickey" yaml:"publickey"` - MacAddress net.HardwareAddr `json:"macaddress" yaml:"macaddress"` - TrafficKeyPublic []byte `json:"traffickeypublic" yaml:"trafficekeypublic"` - InternetGateway net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` - Nodes []string `json:"nodes" yaml:"nodes"` - Interfaces []Iface `json:"interfaces" yaml:"interfaces"` - EndpointIP net.IP `json:"endpointip" yaml:"endpointip"` - ProxyEnabled bool `json:"proxy_enabled" yaml:"proxy_enabled"` - IsDocker bool `json:"isdocker" yaml:"isdocker"` - IsK8S bool `json:"isk8s" yaml:"isk8s"` - IsStatic bool `json:"isstatic" yaml:"isstatic"` - IsDefault bool `json:"isdefault" yaml:"isdefault"` - Peers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` + ID uuid.UUID `json:"id" yaml:"id"` + Verbosity int `json:"verbosity" yaml:"verbosity"` + FirewallInUse string `json:"firewallinuse" yaml:"firewallinuse"` + Version string `json:"version" yaml:"version"` + IPForwarding bool `json:"ipforwarding" yaml:"ipforwarding"` + DaemonInstalled bool `json:"daemoninstalled" yaml:"daemoninstalled"` + HostPass string `json:"hostpass" yaml:"hostpass"` + Name string `json:"name" yaml:"name"` + OS string `json:"os" yaml:"os"` + Interface string `json:"interface" yaml:"interface"` + Debug bool `json:"debug" yaml:"debug"` + ListenPort int `json:"listenport" yaml:"listenport"` + LocalAddress net.IPNet `json:"localaddress" yaml:"localaddress"` + LocalRange net.IPNet `json:"localrange" yaml:"localrange"` + LocalListenPort int `json:"locallistenport" yaml:"locallistenport"` + ProxyListenPort int `json:"proxy_listen_port" yaml:"proxy_listen_port"` + MTU int `json:"mtu" yaml:"mtu"` + PublicKey wgtypes.Key `json:"publickey" yaml:"publickey"` + MacAddress net.HardwareAddr `json:"macaddress" yaml:"macaddress"` + TrafficKeyPublic []byte `json:"traffickeypublic" yaml:"trafficekeypublic"` + InternetGateway net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` + Nodes []string `json:"nodes" yaml:"nodes"` + Interfaces []Iface `json:"interfaces" yaml:"interfaces"` + EndpointIP net.IP `json:"endpointip" yaml:"endpointip"` + ProxyEnabled bool `json:"proxy_enabled" yaml:"proxy_enabled"` + IsDocker bool `json:"isdocker" yaml:"isdocker"` + IsK8S bool `json:"isk8s" yaml:"isk8s"` + IsStatic bool `json:"isstatic" yaml:"isstatic"` + IsDefault bool `json:"isdefault" yaml:"isdefault"` } // FormatBool converts a boolean to a [yes|no] string diff --git a/models/structs.go b/models/structs.go index bf1f6df5..bb88b16b 100644 --- a/models/structs.go +++ b/models/structs.go @@ -205,15 +205,17 @@ type NodeGet struct { Node LegacyNode `json:"node" bson:"node" yaml:"node"` Host Host `json:"host" yaml:"host"` Peers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` + HostPeers []wgtypes.PeerConfig `json:"host_peers" bson:"host_peers" yaml:"host_peers"` ServerConfig ServerConfig `json:"serverconfig" bson:"serverconfig" yaml:"serverconfig"` PeerIDs PeerMap `json:"peerids,omitempty" bson:"peerids,omitempty" yaml:"peerids,omitempty"` } // NodeJoinResponse data returned to node in response to join type NodeJoinResponse struct { - Node Node `json:"node" bson:"node" yaml:"node"` - Host Host `json:"host" yaml:"host"` - ServerConfig ServerConfig `json:"serverconfig" bson:"serverconfig" yaml:"serverconfig"` + Node Node `json:"node" bson:"node" yaml:"node"` + Host Host `json:"host" yaml:"host"` + ServerConfig ServerConfig `json:"serverconfig" bson:"serverconfig" yaml:"serverconfig"` + Peers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` } // ServerConfig - struct for dealing with the server information for a netclient From 9f0ef1628c55a16aea065ec25c6151ce08f1bd6a Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Fri, 6 Jan 2023 00:29:55 +0530 Subject: [PATCH 11/16] node update fix, nil pointer errors fix --- logic/nodes.go | 16 ++++------------ logic/peers.go | 17 +++++++++++------ logic/zombie.go | 3 ++- models/node.go | 44 ++++++++++++++++++++++++++++++-------------- mq/handlers.go | 9 +++++---- 5 files changed, 52 insertions(+), 37 deletions(-) diff --git a/logic/nodes.go b/logic/nodes.go index 85b7a936..933741f6 100644 --- a/logic/nodes.go +++ b/logic/nodes.go @@ -48,9 +48,9 @@ func GetNetworkNodes(network string) ([]models.Node, error) { // UpdateNode - takes a node and updates another node with it's values func UpdateNode(currentNode *models.Node, newNode *models.Node) error { - if newNode.Address.String() != currentNode.Address.String() { + if newNode.Address.IP.String() != currentNode.Address.IP.String() { if network, err := GetParentNetwork(newNode.Network); err == nil { - if !IsAddressInCIDR(newNode.Address.String(), network.AddressRange) { + if !IsAddressInCIDR(newNode.Address.IP.String(), network.AddressRange) { return fmt.Errorf("invalid address provided; out of network range for node %s", newNode.ID) } } @@ -561,11 +561,7 @@ func createNode(node *models.Node) error { if node.Address.IP, err = UniqueAddress(node.Network, false); err != nil { return err } - _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange) - if err != nil { - return err - } - node.Address.Mask = net.CIDRMask(cidr.Mask.Size()) + node.Address.Mask = net.CIDRMask(32, 32) } } else if !IsIPUnique(node.Network, node.Address.String(), database.NODES_TABLE_NAME, false) { return fmt.Errorf("invalid address: ipv4 " + node.Address.String() + " is not unique") @@ -575,11 +571,7 @@ func createNode(node *models.Node) error { if node.Address6.IP, err = UniqueAddress6(node.Network, false); err != nil { return err } - _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange6) - if err != nil { - return err - } - node.Address6.Mask = net.CIDRMask(cidr.Mask.Size()) + node.Address6.Mask = net.CIDRMask(128, 128) } } else if !IsIPUnique(node.Network, node.Address6.String(), database.NODES_TABLE_NAME, true) { return fmt.Errorf("invalid address: ipv6 " + node.Address6.String() + " is not unique") diff --git a/logic/peers.go b/logic/peers.go index fcd20c65..1bde8e5e 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -207,6 +207,9 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) { if err != nil { continue } + if !node.Connected { + continue + } hostPeerUpdate.Network[node.Network] = models.NetworkInfo{ DNS: getPeerDNS(node.Network), } @@ -216,18 +219,19 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) { return models.HostPeerUpdate{}, err } for _, peer := range currentPeers { - var peerConfig wgtypes.PeerConfig - peerHost, err := GetHost(peer.HostID.String()) - if err != nil { - log.Println("no peer host", err) - return models.HostPeerUpdate{}, err - } if peer.ID == node.ID { log.Println("peer update, skipping self") //skip yourself continue } + var peerConfig wgtypes.PeerConfig + peerHost, err := GetHost(peer.HostID.String()) + if err != nil { + log.Println("no peer host", err) + return models.HostPeerUpdate{}, err + } + if !peer.Connected { log.Println("peer update, skipping unconnected node") //skip unconnected nodes @@ -847,6 +851,7 @@ func getPeerDNS(network string) string { host, err := GetHost(node.HostID.String()) if err != nil { logger.Log(0, "error retrieving host for node", node.ID.String(), err.Error()) + continue } dns = dns + fmt.Sprintf("%s %s.%s\n", nodes[i].Address, host.Name, nodes[i].Network) } diff --git a/logic/zombie.go b/logic/zombie.go index e09e1116..92654985 100644 --- a/logic/zombie.go +++ b/logic/zombie.go @@ -34,7 +34,8 @@ func CheckZombies(newnode *models.Node, mac net.HardwareAddr) { for _, node := range nodes { host, err := GetHost(node.HostID.String()) if err != nil { - + // should we delete the node if host not found ?? + continue } if host.MacAddress.String() == mac.String() { logger.Log(0, "adding ", node.ID.String(), " to zombie list") diff --git a/models/node.go b/models/node.go index 24870a4b..782fcf8a 100644 --- a/models/node.go +++ b/models/node.go @@ -365,7 +365,7 @@ func (node *LegacyNode) SetDefaultFailover() { // Node.Fill - fills other node data into calling node data if not set on calling node func (newNode *Node) Fill(currentNode *Node) { // TODO add new field for nftables present newNode.ID = currentNode.ID - + newNode.HostID = currentNode.HostID // Revisit the logic for boolean values // TODO ---- !!!!!!!!!!!!!!!!!!!!!!!!!!!! // TODO ---- !!!!!!!!!!!!!!!!!!!!!!!!!! @@ -499,17 +499,23 @@ func (ln *LegacyNode) ConvertToNewNode() (*Host, *Node) { host.HostPass = ln.Password host.Name = ln.Name host.ListenPort = int(ln.ListenPort) - _, cidr, _ := net.ParseCIDR(ln.LocalAddress) - _, cidr, _ = net.ParseCIDR(ln.LocalRange) - host.LocalRange = *cidr + if _, cidr, err := net.ParseCIDR(ln.LocalAddress); err == nil { + host.LocalRange = *cidr + } else { + if _, cidr, err := net.ParseCIDR(ln.LocalRange); err == nil { + host.LocalRange = *cidr + } + } host.LocalListenPort = int(ln.LocalListenPort) host.ProxyListenPort = int(ln.ProxyListenPort) host.MTU = int(ln.MTU) host.PublicKey, _ = wgtypes.ParseKey(ln.PublicKey) host.MacAddress, _ = net.ParseMAC(ln.MacAddress) host.TrafficKeyPublic = ln.TrafficKeys.Mine - gateway, _ := net.ResolveUDPAddr("udp", ln.InternetGateway) - host.InternetGateway = *gateway + gateway, err := net.ResolveUDPAddr("udp", ln.InternetGateway) + if err == nil { + host.InternetGateway = *gateway + } id, _ := uuid.Parse(ln.ID) host.Nodes = append(host.Nodes, id.String()) host.Interfaces = ln.Interfaces @@ -519,16 +525,26 @@ func (ln *LegacyNode) ConvertToNewNode() (*Host, *Node) { id, _ := uuid.Parse(ln.ID) node.ID = id node.Network = ln.Network - _, cidr, _ := net.ParseCIDR(ln.NetworkSettings.AddressRange) - node.NetworkRange = *cidr - _, cidr, _ = net.ParseCIDR(ln.NetworkSettings.AddressRange6) - node.NetworkRange6 = *cidr + if _, cidr, err := net.ParseCIDR(ln.NetworkSettings.AddressRange); err == nil { + node.NetworkRange = *cidr + } + if _, cidr, err := net.ParseCIDR(ln.NetworkSettings.AddressRange6); err == nil { + node.NetworkRange6 = *cidr + } node.Server = ln.Server node.Connected = parseBool(ln.Connected) - _, cidr, _ = net.ParseCIDR(ln.Address) - node.Address = *cidr - _, cidr, _ = net.ParseCIDR(ln.Address6) - node.Address6 = *cidr + if ln.Address != "" { + node.Address = net.IPNet{ + IP: net.ParseIP(ln.Address), + Mask: net.CIDRMask(32, 32), + } + } + if ln.Address6 != "" { + node.Address = net.IPNet{ + IP: net.ParseIP(ln.Address6), + Mask: net.CIDRMask(128, 128), + } + } node.PostUp = ln.PostUp node.PostDown = ln.PostDown node.Action = ln.Action diff --git a/mq/handlers.go b/mq/handlers.go index 1baa2d9d..a1d97b5c 100644 --- a/mq/handlers.go +++ b/mq/handlers.go @@ -90,19 +90,20 @@ func UpdateNode(client mqtt.Client, msg mqtt.Message) { logger.Log(1, "failed to decrypt message for node ", id, decryptErr.Error()) return } - var newNode models.Node - if err := json.Unmarshal(decrypted, &newNode); err != nil { + var oldNode models.LegacyNode + if err := json.Unmarshal(decrypted, &oldNode); err != nil { logger.Log(1, "error unmarshaling payload ", err.Error()) return } - ifaceDelta := logic.IfaceDelta(¤tNode, &newNode) + _, newNode := oldNode.ConvertToNewNode() + ifaceDelta := logic.IfaceDelta(¤tNode, newNode) if servercfg.Is_EE && ifaceDelta { if err = logic.EnterpriseResetAllPeersFailovers(currentNode.ID.String(), currentNode.Network); err != nil { logger.Log(1, "failed to reset failover list during node update", currentNode.ID.String(), currentNode.Network) } } newNode.SetLastCheckIn() - if err := logic.UpdateNode(¤tNode, &newNode); err != nil { + if err := logic.UpdateNode(¤tNode, newNode); err != nil { logger.Log(1, "error saving node", err.Error()) return } From ca3d9dc40b78e968608f89619fdcd08283f8845a Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Fri, 6 Jan 2023 16:58:41 +0530 Subject: [PATCH 12/16] fix node update --- controllers/node.go | 38 +++++++++++--------------------------- logic/hosts.go | 20 -------------------- logic/nodes.go | 12 ++++++++++-- logic/peers.go | 4 ++-- models/node.go | 4 ---- mq/publishers.go | 2 +- 6 files changed, 24 insertions(+), 56 deletions(-) diff --git a/controllers/node.go b/controllers/node.go index 86d1c71b..4ea427ad 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -7,7 +7,6 @@ import ( "net/http" "strings" - "github.com/google/uuid" "github.com/gorilla/mux" proxy_models "github.com/gravitl/netclient/nmproxy/models" "github.com/gravitl/netmaker/database" @@ -1069,28 +1068,14 @@ func deleteNode(w http.ResponseWriter, r *http.Request) { }, &node) } if fromNode { - // check if server should be removed from mq - // err is irrelevent - nodes, _ := logic.GetAllNodes() - var foundNode models.Node - for _, nodetocheck := range nodes { - if nodetocheck.HostID == node.HostID { - foundNode = nodetocheck - break - } - } - // TODO: Address how to remove host - if foundNode.HostID != uuid.Nil { - if err = logic.DissasociateNodeFromHost(&foundNode, host); err == nil { - currNets := logic.GetHostNetworks(host.ID.String()) - if len(currNets) > 0 { - mq.ModifyClient(&mq.MqClient{ - ID: host.ID.String(), - Text: host.Name, - Networks: currNets, - }) - } - } + // update networks for host mq client + currNets := logic.GetHostNetworks(host.ID.String()) + if len(currNets) > 0 { + mq.ModifyClient(&mq.MqClient{ + ID: host.ID.String(), + Text: host.Name, + Networks: currNets, + }) } } logic.ReturnSuccessResponse(w, r, nodeid+" deleted.") @@ -1099,12 +1084,11 @@ func deleteNode(w http.ResponseWriter, r *http.Request) { runUpdates(&node, false) return } - go func() { - if err := mq.PublishPeerUpdate(node.Network, false); err != nil { + go func(network string) { + if err := mq.PublishPeerUpdate(network, false); err != nil { logger.Log(1, "error publishing peer update ", err.Error()) - return } - }() + }(node.Network) } diff --git a/logic/hosts.go b/logic/hosts.go index c50fddae..0dfeedec 100644 --- a/logic/hosts.go +++ b/logic/hosts.go @@ -63,26 +63,6 @@ func GetHostsMap() (map[string]*models.Host, error) { return currHostMap, nil } -func GetNetworkHosts(network string) ([]models.Host, error) { - networkHosts := []models.Host{} - hosts, err := GetAllHosts() - if err != nil { - return networkHosts, err - } - for _, host := range hosts { - for _, nodeID := range host.Nodes { - node, err := GetNodeByID(nodeID) - if err == nil { - if node.Network == network { - networkHosts = append(networkHosts, host) - break - } - } - } - } - return networkHosts, nil -} - // GetHost - gets a host from db given id func GetHost(hostid string) (*models.Host, error) { record, err := database.FetchRecord(database.HOSTS_TABLE_NAME, hostid) diff --git a/logic/nodes.go b/logic/nodes.go index 933741f6..d3691824 100644 --- a/logic/nodes.go +++ b/logic/nodes.go @@ -561,7 +561,11 @@ func createNode(node *models.Node) error { if node.Address.IP, err = UniqueAddress(node.Network, false); err != nil { return err } - node.Address.Mask = net.CIDRMask(32, 32) + _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange) + if err != nil { + return err + } + node.Address.Mask = net.CIDRMask(cidr.Mask.Size()) } } else if !IsIPUnique(node.Network, node.Address.String(), database.NODES_TABLE_NAME, false) { return fmt.Errorf("invalid address: ipv4 " + node.Address.String() + " is not unique") @@ -571,7 +575,11 @@ func createNode(node *models.Node) error { if node.Address6.IP, err = UniqueAddress6(node.Network, false); err != nil { return err } - node.Address6.Mask = net.CIDRMask(128, 128) + _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange6) + if err != nil { + return err + } + node.Address6.Mask = net.CIDRMask(cidr.Mask.Size()) } } else if !IsIPUnique(node.Network, node.Address6.String(), database.NODES_TABLE_NAME, true) { return fmt.Errorf("invalid address: ipv6 " + node.Address6.String() + " is not unique") diff --git a/logic/peers.go b/logic/peers.go index 1bde8e5e..487d7511 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -292,7 +292,7 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) { hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()][peer.ID.String()] = models.IDandAddr{ ID: peer.ID.String(), Address: peer.PrimaryAddress(), - Name: peer.Name, + Name: peerHost.Name, Network: peer.Network, } } else { @@ -302,7 +302,7 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) { hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()][peer.ID.String()] = models.IDandAddr{ ID: peer.ID.String(), Address: peer.PrimaryAddress(), - Name: peer.Name, + Name: peerHost.Name, Network: peer.Network, } } diff --git a/models/node.go b/models/node.go index 782fcf8a..30920658 100644 --- a/models/node.go +++ b/models/node.go @@ -58,7 +58,6 @@ type Iface struct { type CommonNode struct { ID uuid.UUID `json:"id" yaml:"id"` HostID uuid.UUID `json:"hostid" yaml:"hostid"` - Name string `json:"name" yaml:"name"` Network string `json:"network" yaml:"network"` NetworkRange net.IPNet `json:"networkrange" yaml:"networkrange"` NetworkRange6 net.IPNet `json:"networkrange6" yaml:"networkrange6"` @@ -435,9 +434,6 @@ func (newNode *Node) Fill(currentNode *Node) { // TODO add new field for nftable if newNode.Server == "" { newNode.Server = currentNode.Server } - if newNode.Connected != currentNode.Connected { - newNode.Connected = currentNode.Connected - } if newNode.DefaultACL == "" { newNode.DefaultACL = currentNode.DefaultACL } diff --git a/mq/publishers.go b/mq/publishers.go index 05fbcb9f..181dd98f 100644 --- a/mq/publishers.go +++ b/mq/publishers.go @@ -20,7 +20,7 @@ func PublishPeerUpdate(network string, publishToSelf bool) error { return nil } - hosts, err := logic.GetNetworkHosts(network) + hosts, err := logic.GetAllHosts() if err != nil { logger.Log(1, "err getting all hosts", err.Error()) return err From 68ed1b8b33f7285f9db4e0f9eb175370fea928fb Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Fri, 6 Jan 2023 17:52:17 +0530 Subject: [PATCH 13/16] periodic host updates --- mq/publishers.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mq/publishers.go b/mq/publishers.go index 181dd98f..ef981523 100644 --- a/mq/publishers.go +++ b/mq/publishers.go @@ -139,7 +139,7 @@ func ProxyUpdate(proxyPayload *proxy_models.ProxyManagerPayload, node *models.No // sendPeers - retrieve networks, send peer ports to all peers func sendPeers() { - networks, err := logic.GetNetworks() + hosts, err := logic.GetAllHosts() if err != nil { logger.Log(1, "error retrieving networks for keepalive", err.Error()) } @@ -164,13 +164,12 @@ func sendPeers() { //collectServerMetrics(networks[:]) } - for _, network := range networks { + for _, host := range hosts { if force { logger.Log(2, "sending scheduled peer update (5 min)") - err = PublishPeerUpdate(network.NetID, false) + err = PublishSingleHostUpdate(&host) if err != nil { - logger.Log(1, "error publishing udp port updates for network", network.NetID) - logger.Log(1, err.Error()) + logger.Log(1, "error publishing peer updates for host: ", host.ID.String(), " Err: ", err.Error()) } } } From 6bc3417caf65eaa9b48179c63f5c45e34d8003c6 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Fri, 6 Jan 2023 18:18:25 +0530 Subject: [PATCH 14/16] comments for exported funcs --- logic/peers.go | 1 + models/mqtt.go | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/logic/peers.go b/logic/peers.go index 487d7511..b66401a6 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -193,6 +193,7 @@ func GetPeersForProxy(node *models.Node, onlyPeers bool) (proxy_models.ProxyMana return proxyPayload, nil } +// GetPeerUpdateForHost - gets the consolidated peer update for the host from all networks func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) { hostPeerUpdate := models.HostPeerUpdate{ Network: make(map[string]models.NetworkInfo), diff --git a/models/mqtt.go b/models/mqtt.go index 6eaf0fd6..3f723b54 100644 --- a/models/mqtt.go +++ b/models/mqtt.go @@ -16,7 +16,7 @@ type PeerUpdate struct { ProxyUpdate proxy_models.ProxyManagerPayload `json:"proxy_update" bson:"proxy_update" yaml:"proxy_update"` } -// HostPeerUpdate +// HostPeerUpdate - struct for host peer updates type HostPeerUpdate struct { ServerVersion string `json:"serverversion" bson:"serverversion" yaml:"serverversion"` ServerAddrs []ServerAddr `json:"serveraddrs" bson:"serveraddrs" yaml:"serveraddrs"` @@ -26,6 +26,7 @@ type HostPeerUpdate struct { ProxyUpdate proxy_models.ProxyManagerPayload `json:"proxy_update" bson:"proxy_update" yaml:"proxy_update"` } +// NetworkInfo - struct for network info type NetworkInfo struct { DNS string `json:"dns" bson:"dns" yaml:"dns"` } From 2e7f9524e31f6cfba67e4a23d9df64438180daaa Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Fri, 6 Jan 2023 19:03:08 +0530 Subject: [PATCH 15/16] rm unwanted acl --- mq/dynsec_helper.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mq/dynsec_helper.go b/mq/dynsec_helper.go index ab2f6e29..746492d9 100644 --- a/mq/dynsec_helper.go +++ b/mq/dynsec_helper.go @@ -385,12 +385,6 @@ func fetchNodeAcls() []Acl { Priority: -1, Allow: true, }, - { - AclType: "publishClientReceive", - Topic: "peers/host", - Priority: -1, - Allow: true, - }, { AclType: "subscribePattern", Topic: "#", From 023f29ee71bc51f149cbcbf16b039e8867b345e1 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Fri, 6 Jan 2023 21:27:40 +0530 Subject: [PATCH 16/16] pr comments --- models/metrics.go | 1 + mq/publishers.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/models/metrics.go b/models/metrics.go index 7015c180..5227520e 100644 --- a/models/metrics.go +++ b/models/metrics.go @@ -43,6 +43,7 @@ type IDandAddr struct { // PeerMap - peer map for ids and addresses in metrics type PeerMap map[string]IDandAddr +// HostPeerMap - host peer map for ids and addresses type HostPeerMap map[string]map[string]IDandAddr // MetricsMap - map for holding multiple metrics in memory diff --git a/mq/publishers.go b/mq/publishers.go index ef981523..78cc86a4 100644 --- a/mq/publishers.go +++ b/mq/publishers.go @@ -14,7 +14,7 @@ import ( "github.com/gravitl/netmaker/serverctl" ) -// PublishPeerUpdate --- deterines and publishes a peer update to all the peers of a node +// PublishPeerUpdate --- determines and publishes a peer update to all the hosts func PublishPeerUpdate(network string, publishToSelf bool) error { if !servercfg.IsMessageQueueBackend() { return nil @@ -48,7 +48,7 @@ func PublishProxyPeerUpdate(node *models.Node) error { return nil } -// PublishSinglePeerUpdate --- determines and publishes a peer update to one node +// PublishSingleHostUpdate --- determines and publishes a peer update to one host func PublishSingleHostUpdate(host *models.Host) error { peerUpdate, err := logic.GetPeerUpdateForHost(host)