mirror of
https://github.com/juanfont/headscale.git
synced 2024-12-22 16:07:34 +00:00
Migrate utils to net/netip
This commit is contained in:
parent
a24710a961
commit
cdf48b1216
35
utils.go
35
utils.go
@ -13,6 +13,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"net"
|
"net"
|
||||||
|
"net/netip"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -21,7 +22,7 @@ import (
|
|||||||
|
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"inet.af/netaddr"
|
"go4.org/netipx"
|
||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
"tailscale.com/types/key"
|
"tailscale.com/types/key"
|
||||||
)
|
)
|
||||||
@ -140,7 +141,7 @@ func (h *Headscale) getAvailableIPs() (MachineAddresses, error) {
|
|||||||
var err error
|
var err error
|
||||||
ipPrefixes := h.cfg.IPPrefixes
|
ipPrefixes := h.cfg.IPPrefixes
|
||||||
for _, ipPrefix := range ipPrefixes {
|
for _, ipPrefix := range ipPrefixes {
|
||||||
var ip *netaddr.IP
|
var ip *netip.Addr
|
||||||
ip, err = h.getAvailableIP(ipPrefix)
|
ip, err = h.getAvailableIP(ipPrefix)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ips, err
|
return ips, err
|
||||||
@ -151,16 +152,16 @@ func (h *Headscale) getAvailableIPs() (MachineAddresses, error) {
|
|||||||
return ips, err
|
return ips, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetIPPrefixEndpoints(na netaddr.IPPrefix) (netaddr.IP, netaddr.IP) {
|
func GetIPPrefixEndpoints(na netip.Prefix) (netip.Addr, netip.Addr) {
|
||||||
var network, broadcast netaddr.IP
|
var network, broadcast netip.Addr
|
||||||
ipRange := na.Range()
|
ipRange := netipx.RangeOfPrefix(na)
|
||||||
network = ipRange.From()
|
network = ipRange.From()
|
||||||
broadcast = ipRange.To()
|
broadcast = ipRange.To()
|
||||||
|
|
||||||
return network, broadcast
|
return network, broadcast
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Headscale) getAvailableIP(ipPrefix netaddr.IPPrefix) (*netaddr.IP, error) {
|
func (h *Headscale) getAvailableIP(ipPrefix netip.Prefix) (*netip.Addr, error) {
|
||||||
usedIps, err := h.getUsedIPs()
|
usedIps, err := h.getUsedIPs()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -181,7 +182,7 @@ func (h *Headscale) getAvailableIP(ipPrefix netaddr.IPPrefix) (*netaddr.IP, erro
|
|||||||
fallthrough
|
fallthrough
|
||||||
case usedIps.Contains(ip):
|
case usedIps.Contains(ip):
|
||||||
fallthrough
|
fallthrough
|
||||||
case ip.IsZero() || ip.IsLoopback():
|
case ip == netip.Addr{} || ip.IsLoopback():
|
||||||
ip = ip.Next()
|
ip = ip.Next()
|
||||||
|
|
||||||
continue
|
continue
|
||||||
@ -192,19 +193,19 @@ func (h *Headscale) getAvailableIP(ipPrefix netaddr.IPPrefix) (*netaddr.IP, erro
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Headscale) getUsedIPs() (*netaddr.IPSet, error) {
|
func (h *Headscale) getUsedIPs() (*netipx.IPSet, error) {
|
||||||
// FIXME: This really deserves a better data model,
|
// FIXME: This really deserves a better data model,
|
||||||
// but this was quick to get running and it should be enough
|
// but this was quick to get running and it should be enough
|
||||||
// to begin experimenting with a dual stack tailnet.
|
// to begin experimenting with a dual stack tailnet.
|
||||||
var addressesSlices []string
|
var addressesSlices []string
|
||||||
h.db.Model(&Machine{}).Pluck("ip_addresses", &addressesSlices)
|
h.db.Model(&Machine{}).Pluck("ip_addresses", &addressesSlices)
|
||||||
|
|
||||||
var ips netaddr.IPSetBuilder
|
var ips netipx.IPSetBuilder
|
||||||
for _, slice := range addressesSlices {
|
for _, slice := range addressesSlices {
|
||||||
var machineAddresses MachineAddresses
|
var machineAddresses MachineAddresses
|
||||||
err := machineAddresses.Scan(slice)
|
err := machineAddresses.Scan(slice)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &netaddr.IPSet{}, fmt.Errorf(
|
return &netipx.IPSet{}, fmt.Errorf(
|
||||||
"failed to read ip from database: %w",
|
"failed to read ip from database: %w",
|
||||||
err,
|
err,
|
||||||
)
|
)
|
||||||
@ -217,7 +218,7 @@ func (h *Headscale) getUsedIPs() (*netaddr.IPSet, error) {
|
|||||||
|
|
||||||
ipSet, err := ips.IPSet()
|
ipSet, err := ips.IPSet()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &netaddr.IPSet{}, fmt.Errorf(
|
return &netipx.IPSet{}, fmt.Errorf(
|
||||||
"failed to build IP Set: %w",
|
"failed to build IP Set: %w",
|
||||||
err,
|
err,
|
||||||
)
|
)
|
||||||
@ -250,7 +251,7 @@ func GrpcSocketDialer(ctx context.Context, addr string) (net.Conn, error) {
|
|||||||
return d.DialContext(ctx, "unix", addr)
|
return d.DialContext(ctx, "unix", addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ipPrefixToString(prefixes []netaddr.IPPrefix) []string {
|
func ipPrefixToString(prefixes []netip.Prefix) []string {
|
||||||
result := make([]string, len(prefixes))
|
result := make([]string, len(prefixes))
|
||||||
|
|
||||||
for index, prefix := range prefixes {
|
for index, prefix := range prefixes {
|
||||||
@ -260,13 +261,13 @@ func ipPrefixToString(prefixes []netaddr.IPPrefix) []string {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func stringToIPPrefix(prefixes []string) ([]netaddr.IPPrefix, error) {
|
func stringToIPPrefix(prefixes []string) ([]netip.Prefix, error) {
|
||||||
result := make([]netaddr.IPPrefix, len(prefixes))
|
result := make([]netip.Prefix, len(prefixes))
|
||||||
|
|
||||||
for index, prefixStr := range prefixes {
|
for index, prefixStr := range prefixes {
|
||||||
prefix, err := netaddr.ParseIPPrefix(prefixStr)
|
prefix, err := netip.ParsePrefix(prefixStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []netaddr.IPPrefix{}, err
|
return []netip.Prefix{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
result[index] = prefix
|
result[index] = prefix
|
||||||
@ -275,7 +276,7 @@ func stringToIPPrefix(prefixes []string) ([]netaddr.IPPrefix, error) {
|
|||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func contains[T string | netaddr.IPPrefix](ts []T, t T) bool {
|
func contains[T string | netip.Prefix](ts []T, t T) bool {
|
||||||
for _, v := range ts {
|
for _, v := range ts {
|
||||||
if reflect.DeepEqual(v, t) {
|
if reflect.DeepEqual(v, t) {
|
||||||
return true
|
return true
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package headscale
|
package headscale
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/netip"
|
||||||
|
|
||||||
|
"go4.org/netipx"
|
||||||
"gopkg.in/check.v1"
|
"gopkg.in/check.v1"
|
||||||
"inet.af/netaddr"
|
"inet.af/netaddr"
|
||||||
)
|
)
|
||||||
@ -10,7 +13,7 @@ func (s *Suite) TestGetAvailableIp(c *check.C) {
|
|||||||
|
|
||||||
c.Assert(err, check.IsNil)
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
expected := netaddr.MustParseIP("10.27.0.1")
|
expected := netip.MustParseAddr("10.27.0.1")
|
||||||
|
|
||||||
c.Assert(len(ips), check.Equals, 1)
|
c.Assert(len(ips), check.Equals, 1)
|
||||||
c.Assert(ips[0].String(), check.Equals, expected.String())
|
c.Assert(ips[0].String(), check.Equals, expected.String())
|
||||||
@ -46,8 +49,8 @@ func (s *Suite) TestGetUsedIps(c *check.C) {
|
|||||||
|
|
||||||
c.Assert(err, check.IsNil)
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
expected := netaddr.MustParseIP("10.27.0.1")
|
expected := netip.MustParseAddr("10.27.0.1")
|
||||||
expectedIPSetBuilder := netaddr.IPSetBuilder{}
|
expectedIPSetBuilder := netipx.IPSetBuilder{}
|
||||||
expectedIPSetBuilder.Add(expected)
|
expectedIPSetBuilder.Add(expected)
|
||||||
expectedIPSet, _ := expectedIPSetBuilder.IPSet()
|
expectedIPSet, _ := expectedIPSetBuilder.IPSet()
|
||||||
|
|
||||||
@ -96,11 +99,11 @@ func (s *Suite) TestGetMultiIp(c *check.C) {
|
|||||||
usedIps, err := app.getUsedIPs()
|
usedIps, err := app.getUsedIPs()
|
||||||
c.Assert(err, check.IsNil)
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
expected0 := netaddr.MustParseIP("10.27.0.1")
|
expected0 := netip.MustParseAddr("10.27.0.1")
|
||||||
expected9 := netaddr.MustParseIP("10.27.0.10")
|
expected9 := netip.MustParseAddr("10.27.0.10")
|
||||||
expected300 := netaddr.MustParseIP("10.27.0.45")
|
expected300 := netip.MustParseAddr("10.27.0.45")
|
||||||
|
|
||||||
notExpectedIPSetBuilder := netaddr.IPSetBuilder{}
|
notExpectedIPSetBuilder := netipx.IPSetBuilder{}
|
||||||
notExpectedIPSetBuilder.Add(expected0)
|
notExpectedIPSetBuilder.Add(expected0)
|
||||||
notExpectedIPSetBuilder.Add(expected9)
|
notExpectedIPSetBuilder.Add(expected9)
|
||||||
notExpectedIPSetBuilder.Add(expected300)
|
notExpectedIPSetBuilder.Add(expected300)
|
||||||
@ -121,7 +124,7 @@ func (s *Suite) TestGetMultiIp(c *check.C) {
|
|||||||
c.Assert(
|
c.Assert(
|
||||||
machine1.IPAddresses[0],
|
machine1.IPAddresses[0],
|
||||||
check.Equals,
|
check.Equals,
|
||||||
netaddr.MustParseIP("10.27.0.1"),
|
netip.MustParseAddr("10.27.0.1"),
|
||||||
)
|
)
|
||||||
|
|
||||||
machine50, err := app.GetMachineByID(50)
|
machine50, err := app.GetMachineByID(50)
|
||||||
@ -130,10 +133,10 @@ func (s *Suite) TestGetMultiIp(c *check.C) {
|
|||||||
c.Assert(
|
c.Assert(
|
||||||
machine50.IPAddresses[0],
|
machine50.IPAddresses[0],
|
||||||
check.Equals,
|
check.Equals,
|
||||||
netaddr.MustParseIP("10.27.0.50"),
|
netip.MustParseAddr("10.27.0.50"),
|
||||||
)
|
)
|
||||||
|
|
||||||
expectedNextIP := netaddr.MustParseIP("10.27.1.95")
|
expectedNextIP := netip.MustParseAddr("10.27.1.95")
|
||||||
nextIP, err := app.getAvailableIPs()
|
nextIP, err := app.getAvailableIPs()
|
||||||
c.Assert(err, check.IsNil)
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user