|
@@ -4,7 +4,7 @@ import (
|
|
|
"encoding/json"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
- "time"
|
|
|
+ "net"
|
|
|
|
|
|
"github.com/gravitl/netmaker/database"
|
|
|
"github.com/gravitl/netmaker/logger"
|
|
@@ -31,8 +31,6 @@ func CreateRelay(relay models.RelayRequest) ([]models.Node, models.Node, error)
|
|
|
return returnnodes, models.Node{}, err
|
|
|
}
|
|
|
node.IsRelay = true
|
|
|
- node.RelayAddrs = relay.RelayAddrs
|
|
|
-
|
|
|
node.SetLastModified()
|
|
|
nodeData, err := json.Marshal(&node)
|
|
|
if err != nil {
|
|
@@ -41,144 +39,80 @@ func CreateRelay(relay models.RelayRequest) ([]models.Node, models.Node, error)
|
|
|
if err = database.Insert(node.ID.String(), string(nodeData), database.NODES_TABLE_NAME); err != nil {
|
|
|
return returnnodes, models.Node{}, err
|
|
|
}
|
|
|
- returnnodes, err = SetRelayedNodes(true, node.Network, node.RelayAddrs)
|
|
|
- if err != nil {
|
|
|
- return returnnodes, node, err
|
|
|
- }
|
|
|
- return returnnodes, node, nil
|
|
|
-}
|
|
|
-
|
|
|
-// CreateHostRelay - creates a host relay
|
|
|
-func CreateHostRelay(relay models.HostRelayRequest) (relayHost *models.Host, relayedHosts []models.Host, err error) {
|
|
|
-
|
|
|
- relayHost, err = GetHost(relay.HostID)
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- err = validateHostRelay(relay)
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- relayHost.IsRelay = true
|
|
|
- relayHost.ProxyEnabled = true
|
|
|
- relayHost.RelayedHosts = relay.RelayedHosts
|
|
|
- err = UpsertHost(relayHost)
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- relayedHosts = SetRelayedHosts(true, relay.HostID, relay.RelayedHosts)
|
|
|
- return
|
|
|
-}
|
|
|
-
|
|
|
-// SetRelayedHosts - updates the relayed hosts status
|
|
|
-func SetRelayedHosts(setRelayed bool, relayHostID string, relayedHostIDs []string) []models.Host {
|
|
|
- var relayedHosts []models.Host
|
|
|
- for _, relayedHostID := range relayedHostIDs {
|
|
|
- host, err := GetHost(relayedHostID)
|
|
|
- if err == nil {
|
|
|
- if setRelayed {
|
|
|
- host.IsRelayed = true
|
|
|
- host.RelayedBy = relayHostID
|
|
|
- host.ProxyEnabled = true
|
|
|
- } else {
|
|
|
- host.IsRelayed = false
|
|
|
- host.RelayedBy = ""
|
|
|
- }
|
|
|
- err = UpsertHost(host)
|
|
|
- if err == nil {
|
|
|
- relayedHosts = append(relayedHosts, *host)
|
|
|
- }
|
|
|
+ returnnodes = SetRelayedNodes(true, relay.NodeID, relay.RelayedNodes)
|
|
|
+ for _, relayedNode := range returnnodes {
|
|
|
+ data, err := json.Marshal(&relayedNode)
|
|
|
+ if err != nil {
|
|
|
+ logger.Log(0, "marshalling relayed node", err.Error())
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if err := database.Insert(relayedNode.ID.String(), string(data), database.NODES_TABLE_NAME); err != nil {
|
|
|
+ logger.Log(0, "inserting relayed node", err.Error())
|
|
|
+ continue
|
|
|
}
|
|
|
}
|
|
|
- return relayedHosts
|
|
|
+ return returnnodes, node, nil
|
|
|
}
|
|
|
|
|
|
-// SetRelayedNodes- set relayed nodes
|
|
|
-func SetRelayedNodes(setRelayed bool, networkName string, addrs []string) ([]models.Node, error) {
|
|
|
+// SetRelayedNodes- sets and saves node as relayed
|
|
|
+func SetRelayedNodes(setRelayed bool, relay string, relayed []string) []models.Node {
|
|
|
var returnnodes []models.Node
|
|
|
- networkNodes, err := GetNetworkNodes(networkName)
|
|
|
- if err != nil {
|
|
|
- return returnnodes, err
|
|
|
- }
|
|
|
- for _, node := range networkNodes {
|
|
|
- for _, addr := range addrs {
|
|
|
- if addr == node.Address.IP.String() || addr == node.Address6.IP.String() {
|
|
|
- if setRelayed {
|
|
|
- node.IsRelayed = true
|
|
|
- } else {
|
|
|
- node.IsRelayed = false
|
|
|
- }
|
|
|
- data, err := json.Marshal(&node)
|
|
|
- if err != nil {
|
|
|
- return returnnodes, err
|
|
|
- }
|
|
|
- database.Insert(node.ID.String(), string(data), database.NODES_TABLE_NAME)
|
|
|
- returnnodes = append(returnnodes, node)
|
|
|
- }
|
|
|
+ for _, id := range relayed {
|
|
|
+ node, err := GetNodeByID(id)
|
|
|
+ if err != nil {
|
|
|
+ logger.Log(0, "setRelayedNodes.GetNodebyID", err.Error())
|
|
|
+ continue
|
|
|
}
|
|
|
- }
|
|
|
- return returnnodes, nil
|
|
|
-}
|
|
|
-func GetRelayedNodes(relayNode *models.Node) ([]models.Node, error) {
|
|
|
- var returnnodes []models.Node
|
|
|
- networkNodes, err := GetNetworkNodes(relayNode.Network)
|
|
|
- if err != nil {
|
|
|
- return returnnodes, err
|
|
|
- }
|
|
|
- for _, node := range networkNodes {
|
|
|
- for _, addr := range relayNode.RelayAddrs {
|
|
|
- if addr == node.Address.IP.String() || addr == node.Address6.IP.String() {
|
|
|
- returnnodes = append(returnnodes, node)
|
|
|
- }
|
|
|
+ node.IsRelayed = setRelayed
|
|
|
+ if node.IsRelayed {
|
|
|
+ node.RelayedBy = relay
|
|
|
}
|
|
|
- }
|
|
|
- return returnnodes, nil
|
|
|
-}
|
|
|
-
|
|
|
-// GetRelayedHosts - gets the relayed hosts of a relay host
|
|
|
-func GetRelayedHosts(relayHost *models.Host) []models.Host {
|
|
|
- relayedHosts := []models.Host{}
|
|
|
-
|
|
|
- for _, hostID := range relayHost.RelayedHosts {
|
|
|
- relayedHost, err := GetHost(hostID)
|
|
|
- if err == nil {
|
|
|
- relayedHosts = append(relayedHosts, *relayedHost)
|
|
|
+ node.SetLastModified()
|
|
|
+ data, err := json.Marshal(&node)
|
|
|
+ if err != nil {
|
|
|
+ logger.Log(0, "setRelayedNodes.Marshal", err.Error())
|
|
|
+ continue
|
|
|
}
|
|
|
+ if err := database.Insert(node.ID.String(), string(data), database.NODES_TABLE_NAME); err != nil {
|
|
|
+ logger.Log(0, "setRelayedNodes.Insert", err.Error())
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ returnnodes = append(returnnodes, node)
|
|
|
}
|
|
|
- return relayedHosts
|
|
|
+ return returnnodes
|
|
|
}
|
|
|
|
|
|
+//func GetRelayedNodes(relayNode *models.Node) (models.Node, error) {
|
|
|
+// var returnnodes []models.Node
|
|
|
+// networkNodes, err := GetNetworkNodes(relayNode.Network)
|
|
|
+// if err != nil {
|
|
|
+// return returnnodes, err
|
|
|
+// }
|
|
|
+// for _, node := range networkNodes {
|
|
|
+// for _, addr := range relayNode.RelayAddrs {
|
|
|
+// if addr == node.Address.IP.String() || addr == node.Address6.IP.String() {
|
|
|
+// returnnodes = append(returnnodes, node)
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return returnnodes, nil
|
|
|
+//}
|
|
|
+
|
|
|
// ValidateRelay - checks if relay is valid
|
|
|
func ValidateRelay(relay models.RelayRequest) error {
|
|
|
var err error
|
|
|
//isIp := functions.IsIpCIDR(gateway.RangeString)
|
|
|
- empty := len(relay.RelayAddrs) == 0
|
|
|
+ empty := len(relay.RelayedNodes) == 0
|
|
|
if empty {
|
|
|
err = errors.New("IP Ranges Cannot Be Empty")
|
|
|
}
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
-func validateHostRelay(relay models.HostRelayRequest) error {
|
|
|
- if len(relay.RelayedHosts) == 0 {
|
|
|
- return errors.New("relayed hosts are empty")
|
|
|
- }
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-// UpdateRelay - updates a relay
|
|
|
-func UpdateRelay(network string, oldAddrs []string, newAddrs []string) []models.Node {
|
|
|
- var returnnodes []models.Node
|
|
|
- time.Sleep(time.Second / 4)
|
|
|
- _, err := SetRelayedNodes(false, network, oldAddrs)
|
|
|
- if err != nil {
|
|
|
- logger.Log(1, err.Error())
|
|
|
- }
|
|
|
- returnnodes, err = SetRelayedNodes(true, network, newAddrs)
|
|
|
- if err != nil {
|
|
|
- logger.Log(1, err.Error())
|
|
|
- }
|
|
|
- return returnnodes
|
|
|
+// UpdateRelayed - updates relay nodes
|
|
|
+func UpdateRelayed(relay string, oldNodes []string, newNodes []string) []models.Node {
|
|
|
+ _ = SetRelayedNodes(false, relay, oldNodes)
|
|
|
+ return SetRelayedNodes(true, relay, newNodes)
|
|
|
}
|
|
|
|
|
|
// DeleteRelay - deletes a relay
|
|
@@ -188,15 +122,9 @@ func DeleteRelay(network, nodeid string) ([]models.Node, models.Node, error) {
|
|
|
if err != nil {
|
|
|
return returnnodes, models.Node{}, err
|
|
|
}
|
|
|
- returnnodes, err = SetRelayedNodes(false, node.Network, node.RelayAddrs)
|
|
|
- if err != nil {
|
|
|
- return returnnodes, node, err
|
|
|
- }
|
|
|
-
|
|
|
+ returnnodes = SetRelayedNodes(false, nodeid, node.RelayedNodes)
|
|
|
node.IsRelay = false
|
|
|
- node.RelayAddrs = []string{}
|
|
|
node.SetLastModified()
|
|
|
-
|
|
|
data, err := json.Marshal(&node)
|
|
|
if err != nil {
|
|
|
return returnnodes, models.Node{}, err
|
|
@@ -207,24 +135,18 @@ func DeleteRelay(network, nodeid string) ([]models.Node, models.Node, error) {
|
|
|
return returnnodes, node, nil
|
|
|
}
|
|
|
|
|
|
-// DeleteHostRelay - removes host as relay
|
|
|
-func DeleteHostRelay(relayHostID string) (relayHost *models.Host, relayedHosts []models.Host, err error) {
|
|
|
- relayHost, err = GetHost(relayHostID)
|
|
|
+func getRelayedAddresses(id string) []net.IPNet {
|
|
|
+ addrs := []net.IPNet{}
|
|
|
+ node, err := GetNodeByID(id)
|
|
|
if err != nil {
|
|
|
- return
|
|
|
+ logger.Log(0, "getRelayedAddresses: "+err.Error())
|
|
|
+ return addrs
|
|
|
}
|
|
|
- relayedHosts = SetRelayedHosts(false, relayHostID, relayHost.RelayedHosts)
|
|
|
- relayHost.IsRelay = false
|
|
|
- relayHost.RelayedHosts = []string{}
|
|
|
- err = UpsertHost(relayHost)
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
+ if node.Address.IP != nil {
|
|
|
+ addrs = append(addrs, node.Address)
|
|
|
}
|
|
|
- return
|
|
|
-}
|
|
|
-
|
|
|
-// UpdateHostRelay - updates the relay host with new relayed hosts
|
|
|
-func UpdateHostRelay(relayHostID string, oldRelayedHosts, newRelayedHosts []string) {
|
|
|
- _ = SetRelayedHosts(false, relayHostID, oldRelayedHosts)
|
|
|
- _ = SetRelayedHosts(true, relayHostID, newRelayedHosts)
|
|
|
+ if node.Address6.IP != nil {
|
|
|
+ addrs = append(addrs, node.Address6)
|
|
|
+ }
|
|
|
+ return addrs
|
|
|
}
|