Browse Source

server address enhancements

afeiszli 3 years ago
parent
commit
467ebfd7d7
2 changed files with 56 additions and 1 deletions
  1. 38 0
      logic/networks.go
  2. 18 1
      logic/nodes.go

+ 38 - 0
logic/networks.go

@@ -1,6 +1,7 @@
 package logic
 
 import (
+	"encoding/binary"
 	"encoding/json"
 	"errors"
 	"fmt"
@@ -205,6 +206,43 @@ func UniqueAddress(networkName string) (string, error) {
 	return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", err1
 }
 
+// UniqueAddressServer - get unique address starting from last available
+func UniqueAddressServer(networkName string) (string, error) {
+
+	var network models.Network
+	network, err := GetParentNetwork(networkName)
+	if err != nil {
+		logger.Log(0, "UniqueAddressServer encountered  an error")
+		return "666", err
+	}
+
+	_, ipv4Net, err := net.ParseCIDR(network.AddressRange)
+	if err != nil {
+		logger.Log(0, "UniqueAddressServer encountered  an error")
+		return "666", err
+	}
+
+	// convert IPNet struct mask and address to uint32
+	// network is BigEndian
+	mask := binary.BigEndian.Uint32(ipv4Net.Mask)
+	start := binary.BigEndian.Uint32(ipv4Net.IP)
+
+	// find the final address
+	finish := (start & mask) | (mask ^ 0xffffffff)
+
+	// loop through addresses as uint32
+	for i := finish - 1; i > start; i-- {
+		// convert back to net.IP
+		ip := make(net.IP, 4)
+		binary.BigEndian.PutUint32(ip, i)
+		if IsIPUnique(networkName, ip.String(), database.NODES_TABLE_NAME, false) && IsIPUnique(networkName, ip.String(), database.EXT_CLIENT_TABLE_NAME, false) {
+			return ip.String(), err
+		}
+	}
+
+	return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", fmt.Errorf("no unique server addresses found")
+}
+
 // IsIPUnique - checks if an IP is unique
 func IsIPUnique(network string, ip string, tableName string, isIpv6 bool) bool {
 

+ 18 - 1
logic/nodes.go

@@ -142,6 +142,12 @@ func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
 		}
 	}
 	newNode.Fill(currentNode)
+
+	if currentNode.IsServer == "yes" && !validateServer(currentNode, newNode) {
+		return fmt.Errorf("this operation is not supported on server nodes")
+	}
+
+	// check for un-settable server values
 	if err := ValidateNode(newNode, true); err != nil {
 		return err
 	}
@@ -209,7 +215,11 @@ func CreateNode(node *models.Node) error {
 		}
 	}
 	SetNodeDefaults(node)
-	node.Address, err = UniqueAddress(node.Network)
+	if node.IsServer == "yes" {
+		node.Address, err = UniqueAddressServer(node.Network)
+	} else {
+		node.Address, err = UniqueAddress(node.Network)
+	}
 	if err != nil {
 		return err
 	}
@@ -609,3 +619,10 @@ func GetNetworkServerNodeID(network string) (string, error) {
 	}
 	return "", errors.New("could not find server node")
 }
+
+// validateServer - make sure servers dont change port or address
+func validateServer(currentNode, newNode *models.Node) bool {
+	return (newNode.Address != currentNode.Address ||
+		newNode.ListenPort != currentNode.ListenPort ||
+		newNode.IsServer != "yes")
+}