mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-26 18:30:23 +08:00
server address enhancements
This commit is contained in:
@@ -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 {
|
||||
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user