server address enhancements

This commit is contained in:
afeiszli
2022-01-31 20:29:00 -05:00
parent 6e292dd0fa
commit 467ebfd7d7
2 changed files with 56 additions and 1 deletions

View File

@@ -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 {

View File

@@ -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)
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")
}