diff --git a/logic/extpeers.go b/logic/extpeers.go index 1cf21184..de8abffe 100644 --- a/logic/extpeers.go +++ b/logic/extpeers.go @@ -125,16 +125,21 @@ func CreateExtClient(extclient *models.ExtClient) error { extclient.PublicKey = privateKey.PublicKey().String() } - if extclient.Address == "" { - newAddress, err := UniqueAddress(extclient.Network) + parentNetwork, err := GetNetwork(extclient.Network) + if err != nil { + return err + } + + if extclient.Address == "" && parentNetwork.IsIPv4 == "yes" { + newAddress, err := UniqueAddress(extclient.Network, false) if err != nil { return err } extclient.Address = newAddress } - if extclient.Address6 == "" { - addr6, err := UniqueAddress6(extclient.Network) + if extclient.Address6 == "" && parentNetwork.IsIPv6 == "yes" { + addr6, err := UniqueAddress6(extclient.Network, false) if err != nil { return err } diff --git a/logic/networks.go b/logic/networks.go index fe20b76e..b4573cb4 100644 --- a/logic/networks.go +++ b/logic/networks.go @@ -173,7 +173,7 @@ func GetNetworkSettings(networkname string) (models.Network, error) { } // UniqueAddress - see if address is unique -func UniqueAddress(networkName string) (string, error) { +func UniqueAddress(networkName string, reverse bool) (string, error) { var network models.Network network, err := GetParentNetwork(networkName) @@ -192,7 +192,12 @@ func UniqueAddress(networkName string) (string, error) { 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) && IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, false) { 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") } -// 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 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 -func UniqueAddress6(networkName string) (string, error) { +func UniqueAddress6(networkName string, reverse bool) (string, error) { var network models.Network network, err := GetParentNetwork(networkName) @@ -307,7 +254,12 @@ func UniqueAddress6(networkName string) (string, error) { 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) && IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, true) { return newAddr6.GetNetIPAddr().IP.String(), nil @@ -395,9 +347,9 @@ func UpdateNetworkLocalAddresses(networkName string) error { var ipaddr string var iperr error if node.IsServer == "yes" { - ipaddr, iperr = UniqueAddressServer(networkName) + ipaddr, iperr = UniqueAddress(networkName, true) } else { - ipaddr, iperr = UniqueAddress(networkName) + ipaddr, iperr = UniqueAddress(networkName, false) } if iperr != nil { fmt.Println("error in node address assignment!") @@ -489,9 +441,9 @@ func UpdateNetworkNodeAddresses(networkName string) error { var ipaddr string var iperr error if node.IsServer == "yes" { - ipaddr, iperr = UniqueAddressServer(networkName) + ipaddr, iperr = UniqueAddress(networkName, true) } else { - ipaddr, iperr = UniqueAddress(networkName) + ipaddr, iperr = UniqueAddress(networkName, false) } if iperr != nil { 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.") } -// 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 func GetNetwork(networkname string) (models.Network, error) { diff --git a/logic/nodes.go b/logic/nodes.go index ce46cde1..d8401f81 100644 --- a/logic/nodes.go +++ b/logic/nodes.go @@ -270,20 +270,25 @@ func CreateNode(node *models.Node) error { SetNodeDefaults(node) - if node.IsServer == "yes" { - if node.Address, err = UniqueAddressServer(node.Network); err != nil { - return err + defaultACLVal := acls.Allowed + parentNetwork, err := GetNetwork(node.Network) + 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 } } else if !IsIPUnique(node.Network, node.Address, database.NODES_TABLE_NAME, false) { return fmt.Errorf("invalid address: ipv4 " + node.Address + " is not unique") } - if node.Address6 == "" { - if node.Address6, err = UniqueAddress6(node.Network); err != nil { + if node.Address6 == "" && parentNetwork.IsIPv6 == "yes" { + if node.Address6, err = UniqueAddress6(node.Network, reverse); err != nil { return err } } else if !IsIPUnique(node.Network, node.Address6, database.NODES_TABLE_NAME, true) { @@ -312,14 +317,6 @@ func CreateNode(node *models.Node) error { 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) if err != nil { logger.Log(1, "failed to create node ACL for node,", node.ID, "err:", err.Error())