mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-27 02:41:26 +08:00
server address enhancements
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package logic
|
package logic
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/binary"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -205,6 +206,43 @@ func UniqueAddress(networkName string) (string, error) {
|
|||||||
return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", err1
|
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
|
// IsIPUnique - checks if an IP is unique
|
||||||
func IsIPUnique(network string, ip string, tableName string, isIpv6 bool) bool {
|
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)
|
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 {
|
if err := ValidateNode(newNode, true); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -209,7 +215,11 @@ func CreateNode(node *models.Node) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
SetNodeDefaults(node)
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -609,3 +619,10 @@ func GetNetworkServerNodeID(network string) (string, error) {
|
|||||||
}
|
}
|
||||||
return "", errors.New("could not find server node")
|
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