From 85ff04202fc374511d7d350b0f602cc420f65683 Mon Sep 17 00:00:00 2001 From: decentral1se Date: Sat, 13 Nov 2021 23:04:58 +0100 Subject: [PATCH] fix: ensure ipv4 is present for app deploys See https://git.coopcloud.tech/coop-cloud/organising/issues/227. --- cli/internal/deploy.go | 7 +++++++ cli/server/add.go | 28 ++-------------------------- pkg/dns/common.go | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 26 deletions(-) diff --git a/cli/internal/deploy.go b/cli/internal/deploy.go index c4514e42a..eac2eed61 100644 --- a/cli/internal/deploy.go +++ b/cli/internal/deploy.go @@ -8,6 +8,7 @@ import ( "coopcloud.tech/abra/pkg/catalogue" "coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/config" + "coopcloud.tech/abra/pkg/dns" "coopcloud.tech/abra/pkg/recipe" "coopcloud.tech/abra/pkg/upstream/stack" "github.com/AlecAivazis/survey/v2" @@ -107,6 +108,12 @@ func DeployAction(c *cli.Context) error { logrus.Fatal(err) } + domainName := app.Env["DOMAIN"] + ipv4, err := dns.EnsureIPv4(domainName) + if err != nil || ipv4 == "" { + logrus.Fatalf("could not find an IP address assigned to %s?", domainName) + } + if err := stack.RunDeploy(cl, deployOpts, compose); err != nil { logrus.Fatal(err) } diff --git a/cli/server/add.go b/cli/server/add.go index a6fe3de75..9094f48ac 100644 --- a/cli/server/add.go +++ b/cli/server/add.go @@ -1,23 +1,21 @@ package server import ( - "context" "errors" "fmt" - "net" "os" "os/exec" "os/user" "path" "path/filepath" "strings" - "time" abraFormatter "coopcloud.tech/abra/cli/formatter" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/config" contextPkg "coopcloud.tech/abra/pkg/context" + "coopcloud.tech/abra/pkg/dns" "coopcloud.tech/abra/pkg/server" "coopcloud.tech/abra/pkg/ssh" "github.com/AlecAivazis/survey/v2" @@ -268,33 +266,11 @@ func initSwarmLocal(c *cli.Context, cl *dockerClient.Client, domainName string) } func initSwarm(c *cli.Context, cl *dockerClient.Client, domainName string) error { - // comrade librehosters DNS resolver -> https://www.privacy-handbuch.de/handbuch_93d.htm - freifunkDNS := "5.1.66.255:53" - - resolver := &net.Resolver{ - PreferGo: false, - Dial: func(ctx context.Context, network, address string) (net.Conn, error) { - d := net.Dialer{ - Timeout: time.Millisecond * time.Duration(10000), - } - return d.DialContext(ctx, "udp", freifunkDNS) - }, - } - - logrus.Debugf("created DNS resolver via '%s'", freifunkDNS) - - ips, err := resolver.LookupIPAddr(c.Context, domainName) + ipv4, err := dns.EnsureIPv4(domainName) if err != nil { return err } - if len(ips) == 0 { - return fmt.Errorf("unable to retrieve ipv4 address for %s", domainName) - } - - ipv4 := ips[0].IP.To4().String() - logrus.Debugf("discovered the following ipv4 addr: %s", ipv4) - initReq := swarm.InitRequest{ ListenAddr: "0.0.0.0:2377", AdvertiseAddr: ipv4, diff --git a/pkg/dns/common.go b/pkg/dns/common.go index 731f1a83e..85b6c00fd 100644 --- a/pkg/dns/common.go +++ b/pkg/dns/common.go @@ -1,8 +1,11 @@ package dns import ( + "context" "fmt" + "net" "os" + "time" "github.com/AlecAivazis/survey/v2" "github.com/sirupsen/logrus" @@ -26,3 +29,38 @@ func NewToken(provider, providerTokenEnvVar string) (string, error) { return token, nil } + +// EnsureIPv4 ensures that an ipv4 address is set for a domain name +func EnsureIPv4(domainName string) (string, error) { + var ipv4 string + + // comrade librehosters DNS resolver -> https://www.privacy-handbuch.de/handbuch_93d.htm + freifunkDNS := "5.1.66.255:53" + + resolver := &net.Resolver{ + PreferGo: false, + Dial: func(ctx context.Context, network, address string) (net.Conn, error) { + d := net.Dialer{ + Timeout: time.Millisecond * time.Duration(10000), + } + return d.DialContext(ctx, "udp", freifunkDNS) + }, + } + + logrus.Debugf("created DNS resolver via '%s'", freifunkDNS) + + ctx := context.Background() + ips, err := resolver.LookupIPAddr(ctx, domainName) + if err != nil { + return ipv4, err + } + + if len(ips) == 0 { + return ipv4, fmt.Errorf("unable to retrieve ipv4 address for %s", domainName) + } + + ipv4 = ips[0].IP.To4().String() + logrus.Debugf("discovered the following ipv4 addr: %s", ipv4) + + return ipv4, nil +}