mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-06 01:07:41 +08:00
set addresses appropriately based on if network is using ipv6/4
This commit is contained in:
@@ -125,16 +125,21 @@ func CreateExtClient(extclient *models.ExtClient) error {
|
|||||||
extclient.PublicKey = privateKey.PublicKey().String()
|
extclient.PublicKey = privateKey.PublicKey().String()
|
||||||
}
|
}
|
||||||
|
|
||||||
if extclient.Address == "" {
|
parentNetwork, err := GetNetwork(extclient.Network)
|
||||||
newAddress, err := UniqueAddress(extclient.Network)
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if extclient.Address == "" && parentNetwork.IsIPv4 == "yes" {
|
||||||
|
newAddress, err := UniqueAddress(extclient.Network, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
extclient.Address = newAddress
|
extclient.Address = newAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
if extclient.Address6 == "" {
|
if extclient.Address6 == "" && parentNetwork.IsIPv6 == "yes" {
|
||||||
addr6, err := UniqueAddress6(extclient.Network)
|
addr6, err := UniqueAddress6(extclient.Network, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@@ -173,7 +173,7 @@ func GetNetworkSettings(networkname string) (models.Network, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UniqueAddress - see if address is unique
|
// UniqueAddress - see if address is unique
|
||||||
func UniqueAddress(networkName string) (string, error) {
|
func UniqueAddress(networkName string, reverse bool) (string, error) {
|
||||||
|
|
||||||
var network models.Network
|
var network models.Network
|
||||||
network, err := GetParentNetwork(networkName)
|
network, err := GetParentNetwork(networkName)
|
||||||
@@ -192,7 +192,12 @@ func UniqueAddress(networkName string) (string, error) {
|
|||||||
return "666", err
|
return "666", err
|
||||||
}
|
}
|
||||||
|
|
||||||
for ; newAddr.ToAddressString().IsValid(); newAddr = newAddr.Increment(1) {
|
incVal := 1
|
||||||
|
if reverse {
|
||||||
|
incVal = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
for ; newAddr.ToAddressString().IsValid(); newAddr = newAddr.Increment(int64(incVal)) {
|
||||||
if IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, false) &&
|
if IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, false) &&
|
||||||
IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, false) {
|
IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, false) {
|
||||||
return newAddr.GetNetIPAddr().IP.String(), nil
|
return newAddr.GetNetIPAddr().IP.String(), nil
|
||||||
@@ -202,64 +207,6 @@ func UniqueAddress(networkName string) (string, error) {
|
|||||||
return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", errors.New("ERROR: No unique addresses available. Check network subnet")
|
return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", errors.New("ERROR: No unique addresses available. Check network subnet")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
|
|
||||||
if network.IsIPv4 == "no" {
|
|
||||||
return "", fmt.Errorf("IPv4 not active on network " + networkName)
|
|
||||||
}
|
|
||||||
|
|
||||||
newAddr, err := ips.GetLastAddr(network.AddressRange)
|
|
||||||
if err != nil {
|
|
||||||
logger.Log(0, "UniqueAddressServer encountered an error")
|
|
||||||
return "666", err
|
|
||||||
}
|
|
||||||
|
|
||||||
for ; newAddr.ToAddressString().IsValid(); newAddr = newAddr.Increment(-1) {
|
|
||||||
if IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, false) &&
|
|
||||||
IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, false) {
|
|
||||||
return newAddr.GetNetIPAddr().IP.String(), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", fmt.Errorf("no unique server addresses found")
|
|
||||||
}
|
|
||||||
|
|
||||||
// UniqueAddress6Server - get unique address starting from last available
|
|
||||||
func UniqueAddress6Server(networkName string) (string, error) {
|
|
||||||
|
|
||||||
network, err := GetParentNetwork(networkName)
|
|
||||||
if err != nil {
|
|
||||||
logger.Log(0, "UniqueAddressServer encountered an error")
|
|
||||||
return "666", err
|
|
||||||
}
|
|
||||||
|
|
||||||
if network.IsIPv6 == "no" {
|
|
||||||
return "", fmt.Errorf("IPv6 not active on network " + networkName)
|
|
||||||
}
|
|
||||||
|
|
||||||
newAddr6, err := ips.GetLastAddr6(network.AddressRange6)
|
|
||||||
if err != nil {
|
|
||||||
return "666", err
|
|
||||||
}
|
|
||||||
|
|
||||||
for ; newAddr6.ToAddressString().IsValid(); newAddr6 = newAddr6.Increment(-1) {
|
|
||||||
if IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, true) &&
|
|
||||||
IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, true) {
|
|
||||||
return newAddr6.GetNetIPAddr().IP.String(), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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 {
|
||||||
|
|
||||||
@@ -290,7 +237,7 @@ func IsIPUnique(network string, ip string, tableName string, isIpv6 bool) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UniqueAddress6 - see if ipv6 address is unique
|
// UniqueAddress6 - see if ipv6 address is unique
|
||||||
func UniqueAddress6(networkName string) (string, error) {
|
func UniqueAddress6(networkName string, reverse bool) (string, error) {
|
||||||
|
|
||||||
var network models.Network
|
var network models.Network
|
||||||
network, err := GetParentNetwork(networkName)
|
network, err := GetParentNetwork(networkName)
|
||||||
@@ -307,7 +254,12 @@ func UniqueAddress6(networkName string) (string, error) {
|
|||||||
return "666", err
|
return "666", err
|
||||||
}
|
}
|
||||||
|
|
||||||
for ; newAddr6.ToAddressString().IsValid(); newAddr6 = newAddr6.Increment(1) {
|
incVal := 1
|
||||||
|
if reverse {
|
||||||
|
incVal = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
for ; newAddr6.ToAddressString().IsValid(); newAddr6 = newAddr6.Increment(int64(incVal)) {
|
||||||
if IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, true) &&
|
if IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, true) &&
|
||||||
IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, true) {
|
IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, true) {
|
||||||
return newAddr6.GetNetIPAddr().IP.String(), nil
|
return newAddr6.GetNetIPAddr().IP.String(), nil
|
||||||
@@ -395,9 +347,9 @@ func UpdateNetworkLocalAddresses(networkName string) error {
|
|||||||
var ipaddr string
|
var ipaddr string
|
||||||
var iperr error
|
var iperr error
|
||||||
if node.IsServer == "yes" {
|
if node.IsServer == "yes" {
|
||||||
ipaddr, iperr = UniqueAddressServer(networkName)
|
ipaddr, iperr = UniqueAddress(networkName, true)
|
||||||
} else {
|
} else {
|
||||||
ipaddr, iperr = UniqueAddress(networkName)
|
ipaddr, iperr = UniqueAddress(networkName, false)
|
||||||
}
|
}
|
||||||
if iperr != nil {
|
if iperr != nil {
|
||||||
fmt.Println("error in node address assignment!")
|
fmt.Println("error in node address assignment!")
|
||||||
@@ -489,9 +441,9 @@ func UpdateNetworkNodeAddresses(networkName string) error {
|
|||||||
var ipaddr string
|
var ipaddr string
|
||||||
var iperr error
|
var iperr error
|
||||||
if node.IsServer == "yes" {
|
if node.IsServer == "yes" {
|
||||||
ipaddr, iperr = UniqueAddressServer(networkName)
|
ipaddr, iperr = UniqueAddress(networkName, true)
|
||||||
} else {
|
} else {
|
||||||
ipaddr, iperr = UniqueAddress(networkName)
|
ipaddr, iperr = UniqueAddress(networkName, false)
|
||||||
}
|
}
|
||||||
if iperr != nil {
|
if iperr != nil {
|
||||||
fmt.Println("error in node address assignment!")
|
fmt.Println("error in node address assignment!")
|
||||||
@@ -552,16 +504,6 @@ func UpdateNetwork(currentNetwork *models.Network, newNetwork *models.Network) (
|
|||||||
return false, false, false, errors.New("failed to update network " + newNetwork.NetID + ", cannot change netid.")
|
return false, false, false, errors.New("failed to update network " + newNetwork.NetID + ", cannot change netid.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inc - increments an IP
|
|
||||||
func Inc(ip net.IP) {
|
|
||||||
for j := len(ip) - 1; j >= 0; j-- {
|
|
||||||
ip[j]++
|
|
||||||
if ip[j] > 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetNetwork - gets a network from database
|
// GetNetwork - gets a network from database
|
||||||
func GetNetwork(networkname string) (models.Network, error) {
|
func GetNetwork(networkname string) (models.Network, error) {
|
||||||
|
|
||||||
|
@@ -270,20 +270,25 @@ func CreateNode(node *models.Node) error {
|
|||||||
|
|
||||||
SetNodeDefaults(node)
|
SetNodeDefaults(node)
|
||||||
|
|
||||||
if node.IsServer == "yes" {
|
defaultACLVal := acls.Allowed
|
||||||
if node.Address, err = UniqueAddressServer(node.Network); err != nil {
|
parentNetwork, err := GetNetwork(node.Network)
|
||||||
return err
|
if err == nil {
|
||||||
|
if parentNetwork.DefaultACL != "yes" {
|
||||||
|
defaultACLVal = acls.NotAllowed
|
||||||
}
|
}
|
||||||
} else if node.Address == "" {
|
}
|
||||||
if node.Address, err = UniqueAddress(node.Network); err != nil {
|
|
||||||
|
reverse := node.IsServer == "yes"
|
||||||
|
if node.Address == "" && parentNetwork.IsIPv4 == "yes" {
|
||||||
|
if node.Address, err = UniqueAddress(node.Network, reverse); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if !IsIPUnique(node.Network, node.Address, database.NODES_TABLE_NAME, false) {
|
} else if !IsIPUnique(node.Network, node.Address, database.NODES_TABLE_NAME, false) {
|
||||||
return fmt.Errorf("invalid address: ipv4 " + node.Address + " is not unique")
|
return fmt.Errorf("invalid address: ipv4 " + node.Address + " is not unique")
|
||||||
}
|
}
|
||||||
|
|
||||||
if node.Address6 == "" {
|
if node.Address6 == "" && parentNetwork.IsIPv6 == "yes" {
|
||||||
if node.Address6, err = UniqueAddress6(node.Network); err != nil {
|
if node.Address6, err = UniqueAddress6(node.Network, reverse); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if !IsIPUnique(node.Network, node.Address6, database.NODES_TABLE_NAME, true) {
|
} else if !IsIPUnique(node.Network, node.Address6, database.NODES_TABLE_NAME, true) {
|
||||||
@@ -312,14 +317,6 @@ func CreateNode(node *models.Node) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultACLVal := acls.Allowed
|
|
||||||
parentNetwork, err := GetNetwork(node.Network)
|
|
||||||
if err == nil {
|
|
||||||
if parentNetwork.DefaultACL != "yes" {
|
|
||||||
defaultACLVal = acls.NotAllowed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = nodeacls.CreateNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID), defaultACLVal)
|
_, err = nodeacls.CreateNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID), defaultACLVal)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Log(1, "failed to create node ACL for node,", node.ID, "err:", err.Error())
|
logger.Log(1, "failed to create node ACL for node,", node.ID, "err:", err.Error())
|
||||||
|
Reference in New Issue
Block a user