From 750609dc3d79b93307456f4b5ea213c7a26cadbe Mon Sep 17 00:00:00 2001 From: Johan Siebens Date: Fri, 26 Apr 2024 14:19:43 +0200 Subject: [PATCH] fix: handle relative name and zones correctly --- internal/dns/provider.go | 21 ++++++++++++++------- internal/mapping/mapping.go | 32 +++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/internal/dns/provider.go b/internal/dns/provider.go index eea6f07e..a3061057 100644 --- a/internal/dns/provider.go +++ b/internal/dns/provider.go @@ -65,7 +65,7 @@ func configureAzureProvider(zone string, values map[string]string) (Provider, er return nil, err } - return &externalProvider{zone: zone, setter: p}, nil + return &externalProvider{zone: fqdn(zone), setter: p}, nil } func configureCloudflareProvider(zone string, values map[string]string) (Provider, error) { @@ -83,7 +83,7 @@ func configureCloudflareProvider(zone string, values map[string]string) (Provide return nil, err } - return &externalProvider{zone: zone, setter: p}, nil + return &externalProvider{zone: fqdn(zone), setter: p}, nil } func configureDigitalOceanProvider(zone string, values map[string]string) (Provider, error) { @@ -101,7 +101,7 @@ func configureDigitalOceanProvider(zone string, values map[string]string) (Provi return nil, err } - return &externalProvider{zone: zone, setter: p}, nil + return &externalProvider{zone: fqdn(zone), setter: p}, nil } func configureGoogleCloudDNSProvider(zone string, values map[string]string) (Provider, error) { @@ -120,7 +120,7 @@ func configureGoogleCloudDNSProvider(zone string, values map[string]string) (Pro return nil, err } - return &externalProvider{zone: zone, setter: p}, nil + return &externalProvider{zone: fqdn(zone), setter: p}, nil } func configureRoute53Provider(zone string, values map[string]string) (Provider, error) { @@ -145,7 +145,7 @@ func configureRoute53Provider(zone string, values map[string]string) (Provider, return nil, err } - return &externalProvider{zone: zone, setter: p}, nil + return &externalProvider{zone: fqdn(zone), setter: p}, nil } type externalProvider struct { @@ -154,11 +154,18 @@ type externalProvider struct { } func (p *externalProvider) SetRecord(ctx context.Context, recordType, recordName, value string) error { - _, err := p.setter.SetRecords(ctx, fmt.Sprintf("%s.", p.zone), []libdns.Record{{ + _, err := p.setter.SetRecords(ctx, p.zone, []libdns.Record{{ Type: recordType, - Name: strings.TrimSuffix(recordName, p.zone), + Name: libdns.RelativeName(recordName, p.zone), Value: value, TTL: 1 * time.Minute, }}) return err } + +func fqdn(v string) string { + if strings.HasSuffix(v, ".") { + return v + } + return fmt.Sprintf("%s.", v) +} diff --git a/internal/mapping/mapping.go b/internal/mapping/mapping.go index ab46aa6e..aba507d7 100644 --- a/internal/mapping/mapping.go +++ b/internal/mapping/mapping.go @@ -7,7 +7,6 @@ import ( "github.com/jsiebens/ionscale/internal/domain" "github.com/jsiebens/ionscale/internal/util" "net/netip" - "slices" "strconv" "tailscale.com/tailcfg" "tailscale.com/types/dnstype" @@ -175,6 +174,24 @@ func ToNode(capVer tailcfg.CapabilityVersion, m *domain.Machine, tailnet *domain User: tailcfg.UserID(m.UserID), } + if peer { + var capabilities []tailcfg.NodeCapability + capMap := make(tailcfg.NodeCapMap) + + { + capabilities = append(capabilities, "funnel") + capabilities = append(capabilities, "https://tailscale.com/cap/funnel-ports?ports=80,443") + capMap["funnel"] = []tailcfg.RawMessage{} + capMap["https://tailscale.com/cap/funnel-ports?ports=80,443"] = []tailcfg.RawMessage{} + } + + if capVer >= 74 { + n.CapMap = capMap + } else { + n.Capabilities = capabilities + } + } + if !peer { var capabilities []tailcfg.NodeCapability capMap := make(tailcfg.NodeCapMap) @@ -205,9 +222,18 @@ func ToNode(capVer tailcfg.CapabilityVersion, m *domain.Machine, tailnet *domain } // ionscale has no support for Funnel yet, so remove Funnel attribute if set via ACL policy + /* + { + slices.DeleteFunc(capabilities, func(c tailcfg.NodeCapability) bool { return c == tailcfg.NodeAttrFunnel }) + delete(capMap, tailcfg.NodeAttrFunnel) + } + */ + { - slices.DeleteFunc(capabilities, func(c tailcfg.NodeCapability) bool { return c == tailcfg.NodeAttrFunnel }) - delete(capMap, tailcfg.NodeAttrFunnel) + capabilities = append(capabilities, "funnel") + capabilities = append(capabilities, "https://tailscale.com/cap/funnel-ports?ports=80,443") + capMap["funnel"] = []tailcfg.RawMessage{} + capMap["https://tailscale.com/cap/funnel-ports?ports=80,443"] = []tailcfg.RawMessage{} } if capVer >= 74 {