mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-04 00:17:21 +08:00
switch to smaller ip lib
This commit is contained in:
@@ -289,6 +289,7 @@ func TestIpv6Network(t *testing.T) {
|
|||||||
|
|
||||||
database.InitializeDatabase()
|
database.InitializeDatabase()
|
||||||
os.Setenv("MASTER_KEY", "secretkey")
|
os.Setenv("MASTER_KEY", "secretkey")
|
||||||
|
deleteAllNetworks()
|
||||||
createNet()
|
createNet()
|
||||||
createNetDualStack()
|
createNetDualStack()
|
||||||
network, err := logic.GetNetwork("skynet6")
|
network, err := logic.GetNetwork("skynet6")
|
||||||
@@ -300,7 +301,7 @@ func TestIpv6Network(t *testing.T) {
|
|||||||
nodeErr := logic.CreateNode(&node1)
|
nodeErr := logic.CreateNode(&node1)
|
||||||
t.Run("Test node on network IPv6", func(t *testing.T) {
|
t.Run("Test node on network IPv6", func(t *testing.T) {
|
||||||
assert.Nil(t, nodeErr)
|
assert.Nil(t, nodeErr)
|
||||||
assert.Equal(t, node1.Address6, "fde6:be04:fa5e:d076::1")
|
assert.Equal(t, "fde6:be04:fa5e:d076::", node1.Address6)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
go.mod
1
go.mod
@@ -32,6 +32,7 @@ require (
|
|||||||
require (
|
require (
|
||||||
filippo.io/edwards25519 v1.0.0-rc.1
|
filippo.io/edwards25519 v1.0.0-rc.1
|
||||||
fyne.io/fyne/v2 v2.1.4
|
fyne.io/fyne/v2 v2.1.4
|
||||||
|
github.com/c-robinson/iplib v1.0.3
|
||||||
github.com/cloverstd/tcping v0.1.1
|
github.com/cloverstd/tcping v0.1.1
|
||||||
github.com/guumaster/hostctl v1.1.2
|
github.com/guumaster/hostctl v1.1.2
|
||||||
github.com/kr/pretty v0.3.0
|
github.com/kr/pretty v0.3.0
|
||||||
|
2
go.sum
2
go.sum
@@ -19,6 +19,8 @@ github.com/antzucaro/matchr v0.0.0-20210222213004-b04723ef80f0/go.mod h1:v3ZDlfV
|
|||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
|
github.com/c-robinson/iplib v1.0.3 h1:NG0UF0GoEsrC1/vyfX1Lx2Ss7CySWl3KqqXh3q4DdPU=
|
||||||
|
github.com/c-robinson/iplib v1.0.3/go.mod h1:i3LuuFL1hRT5gFpBRnEydzw8R6yhGkF4szNDIbF8pgo=
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cloverstd/tcping v0.1.1 h1:3Yp9nvSDI7Z63zoVQDJzVk1PUczrF9tJoOrKGV30iOk=
|
github.com/cloverstd/tcping v0.1.1 h1:3Yp9nvSDI7Z63zoVQDJzVk1PUczrF9tJoOrKGV30iOk=
|
||||||
|
@@ -1,62 +0,0 @@
|
|||||||
package ips
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/seancfoley/ipaddress-go/ipaddr"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetFirstAddr - gets the first valid address in a given IPv4 CIDR
|
|
||||||
func GetFirstAddr(cidr4 string) (*ipaddr.IPAddress, error) {
|
|
||||||
currentCidr := ipaddr.NewIPAddressString(cidr4).GetAddress()
|
|
||||||
if !currentCidr.IsIPv4() {
|
|
||||||
return nil, fmt.Errorf("invalid IPv4 CIDR provided to GetFirstAddr")
|
|
||||||
}
|
|
||||||
lower := currentCidr.GetLower()
|
|
||||||
ipParts := strings.Split(lower.GetNetIPAddr().IP.String(), ".")
|
|
||||||
if ipParts[len(ipParts)-1] == "0" {
|
|
||||||
lower = lower.Increment(1)
|
|
||||||
}
|
|
||||||
return lower, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLastAddr - gets the last valid address in a given IPv4 CIDR
|
|
||||||
func GetLastAddr(cidr4 string) (*ipaddr.IPAddress, error) {
|
|
||||||
currentCidr := ipaddr.NewIPAddressString(cidr4).GetAddress()
|
|
||||||
if !currentCidr.IsIPv4() {
|
|
||||||
return nil, fmt.Errorf("invalid IPv4 CIDR provided to GetLastAddr")
|
|
||||||
}
|
|
||||||
upper := currentCidr.GetUpper()
|
|
||||||
ipParts := strings.Split(upper.GetNetIPAddr().IP.String(), ".")
|
|
||||||
if ipParts[len(ipParts)-1] == "255" {
|
|
||||||
upper = upper.Increment(-1)
|
|
||||||
}
|
|
||||||
return upper, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetFirstAddr6 - gets the first valid IPv6 address in a given IPv6 CIDR
|
|
||||||
func GetFirstAddr6(cidr6 string) (*ipaddr.IPAddress, error) {
|
|
||||||
currentCidr := ipaddr.NewIPAddressString(cidr6).GetAddress()
|
|
||||||
if !currentCidr.IsIPv6() {
|
|
||||||
return nil, fmt.Errorf("invalid IPv6 CIDR provided to GetFirstAddr6")
|
|
||||||
}
|
|
||||||
lower := currentCidr.GetLower()
|
|
||||||
ipParts := strings.Split(lower.GetNetIPAddr().IP.String(), "::")
|
|
||||||
if len(ipParts) == 2 {
|
|
||||||
if len(ipParts[len(ipParts)-1]) == 0 {
|
|
||||||
lower = lower.Increment(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lower, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLastAddr6 - gets the last valid IPv6 address in a given IPv6 CIDR
|
|
||||||
func GetLastAddr6(cidr6 string) (*ipaddr.IPAddress, error) {
|
|
||||||
currentCidr := ipaddr.NewIPAddressString(cidr6).GetAddress()
|
|
||||||
if !currentCidr.IsIPv6() {
|
|
||||||
return nil, fmt.Errorf("invalid IPv6 CIDR provided to GetLastAddr6")
|
|
||||||
}
|
|
||||||
upper := currentCidr.GetUpper()
|
|
||||||
return upper, nil
|
|
||||||
}
|
|
@@ -1,50 +0,0 @@
|
|||||||
package ips_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/gravitl/netmaker/logic/ips"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestIp4(t *testing.T) {
|
|
||||||
const ipv4Cidr = "192.168.0.0/16"
|
|
||||||
const ipv6Cidr = "fde6:be04:fa5e:d076::/64"
|
|
||||||
//delete all current users
|
|
||||||
t.Run("Valid Ipv4", func(t *testing.T) {
|
|
||||||
_, err := ips.GetFirstAddr(ipv4Cidr)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("Invalid Ipv4", func(t *testing.T) {
|
|
||||||
_, err := ips.GetFirstAddr(ipv6Cidr)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("Valid IPv6", func(t *testing.T) {
|
|
||||||
_, err := ips.GetFirstAddr6(ipv6Cidr)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("Invalid IPv6", func(t *testing.T) {
|
|
||||||
_, err := ips.GetFirstAddr6(ipv4Cidr)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("Last IPv4", func(t *testing.T) {
|
|
||||||
addr, err := ips.GetLastAddr(ipv4Cidr)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
assert.Equal(t, addr.GetNetIPAddr().IP.String(), "192.168.255.254")
|
|
||||||
})
|
|
||||||
t.Run("First IPv4", func(t *testing.T) {
|
|
||||||
addr, err := ips.GetFirstAddr(ipv4Cidr)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
assert.Equal(t, addr.GetNetIPAddr().IP.String(), "192.168.0.1")
|
|
||||||
})
|
|
||||||
t.Run("Last IPv6", func(t *testing.T) {
|
|
||||||
last, err := ips.GetLastAddr6(ipv6Cidr)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
assert.Equal(t, last.GetNetIPAddr().IP.String(), "fde6:be04:fa5e:d076:ffff:ffff:ffff:ffff")
|
|
||||||
})
|
|
||||||
t.Run("First IPv6", func(t *testing.T) {
|
|
||||||
first, err := ips.GetFirstAddr6(ipv6Cidr)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
assert.Equal(t, first.GetNetIPAddr().IP.String(), "fde6:be04:fa5e:d076::1")
|
|
||||||
})
|
|
||||||
}
|
|
@@ -8,11 +8,11 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/c-robinson/iplib"
|
||||||
"github.com/go-playground/validator/v10"
|
"github.com/go-playground/validator/v10"
|
||||||
"github.com/gravitl/netmaker/database"
|
"github.com/gravitl/netmaker/database"
|
||||||
"github.com/gravitl/netmaker/logger"
|
"github.com/gravitl/netmaker/logger"
|
||||||
"github.com/gravitl/netmaker/logic/acls/nodeacls"
|
"github.com/gravitl/netmaker/logic/acls/nodeacls"
|
||||||
"github.com/gravitl/netmaker/logic/ips"
|
|
||||||
"github.com/gravitl/netmaker/models"
|
"github.com/gravitl/netmaker/models"
|
||||||
"github.com/gravitl/netmaker/netclient/ncutils"
|
"github.com/gravitl/netmaker/netclient/ncutils"
|
||||||
"github.com/gravitl/netmaker/validation"
|
"github.com/gravitl/netmaker/validation"
|
||||||
@@ -185,29 +185,30 @@ func UniqueAddress(networkName string, reverse bool) (string, error) {
|
|||||||
if network.IsIPv4 == "no" {
|
if network.IsIPv4 == "no" {
|
||||||
return "", fmt.Errorf("IPv4 not active on network " + networkName)
|
return "", fmt.Errorf("IPv4 not active on network " + networkName)
|
||||||
}
|
}
|
||||||
|
//ensure AddressRange is valid
|
||||||
newAddr, err := ips.GetFirstAddr(network.AddressRange)
|
if _, _, err := net.ParseCIDR(network.AddressRange); err != nil {
|
||||||
if err != nil {
|
|
||||||
logger.Log(0, "UniqueAddress encountered an error")
|
logger.Log(0, "UniqueAddress encountered an error")
|
||||||
return "666", err
|
return "666", err
|
||||||
}
|
}
|
||||||
|
net4 := iplib.Net4FromStr(network.AddressRange)
|
||||||
|
newAddrs := net4.FirstAddress()
|
||||||
|
|
||||||
incVal := 1
|
|
||||||
if reverse {
|
if reverse {
|
||||||
incVal = -1
|
newAddrs = net4.LastAddress()
|
||||||
newAddr, err = ips.GetLastAddr(network.AddressRange)
|
|
||||||
if err != nil {
|
|
||||||
if err != nil {
|
|
||||||
logger.Log(0, "UniqueAddressServer encountered an error")
|
|
||||||
return "666", err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for ; newAddr.ToAddressString().IsValid(); newAddr = newAddr.Increment(int64(incVal)) {
|
for {
|
||||||
if IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, false) &&
|
if IsIPUnique(networkName, newAddrs.String(), database.NODES_TABLE_NAME, false) &&
|
||||||
IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, false) {
|
IsIPUnique(networkName, newAddrs.String(), database.EXT_CLIENT_TABLE_NAME, false) {
|
||||||
return newAddr.GetNetIPAddr().IP.String(), nil
|
return newAddrs.String(), nil
|
||||||
|
}
|
||||||
|
if reverse {
|
||||||
|
newAddrs, err = net4.PreviousIP(newAddrs)
|
||||||
|
} else {
|
||||||
|
newAddrs, err = net4.NextIP(newAddrs)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,27 +257,30 @@ func UniqueAddress6(networkName string, reverse bool) (string, error) {
|
|||||||
return "", fmt.Errorf("IPv6 not active on network " + networkName)
|
return "", fmt.Errorf("IPv6 not active on network " + networkName)
|
||||||
}
|
}
|
||||||
|
|
||||||
newAddr6, err := ips.GetFirstAddr6(network.AddressRange6)
|
//ensure AddressRange is valid
|
||||||
if err != nil {
|
if _, _, err := net.ParseCIDR(network.AddressRange6); err != nil {
|
||||||
return "666", err
|
return "666", err
|
||||||
}
|
}
|
||||||
|
net6 := iplib.Net6FromStr(network.AddressRange6)
|
||||||
|
newAddrs := net6.FirstAddress()
|
||||||
|
|
||||||
incVal := 1
|
|
||||||
if reverse {
|
if reverse {
|
||||||
incVal = -1
|
newAddrs = net6.LastAddress()
|
||||||
newAddr6, err = ips.GetLastAddr6(network.AddressRange6)
|
|
||||||
if err != nil {
|
|
||||||
if err != nil {
|
|
||||||
logger.Log(0, "UniqueAddress6Server encountered an error")
|
|
||||||
return "666", err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for ; newAddr6.ToAddressString().IsValid(); newAddr6 = newAddr6.Increment(int64(incVal)) {
|
for {
|
||||||
if IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, true) &&
|
|
||||||
IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, true) {
|
if IsIPUnique(networkName, newAddrs.String(), database.NODES_TABLE_NAME, true) &&
|
||||||
return newAddr6.GetNetIPAddr().IP.String(), nil
|
IsIPUnique(networkName, newAddrs.String(), database.EXT_CLIENT_TABLE_NAME, true) {
|
||||||
|
return newAddrs.String(), nil
|
||||||
|
}
|
||||||
|
if reverse {
|
||||||
|
newAddrs, err = net6.PreviousIP(newAddrs)
|
||||||
|
} else {
|
||||||
|
newAddrs, err = net6.NextIP(newAddrs)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user