forked from toolshed/abra
.gitea
cli
cmd
pkg
app
autocomplete
catalogue
client
compose
config
container
context
dns
gandi
common.go
formatter
git
integration
jsontable
limit
lint
recipe
runtime
secret
server
service
ssh
test
upstream
web
scripts
tests
.dockerignore
.drone.yml
.e2e.env.sample
.envrc.sample
.gitignore
.goreleaser.yml
AUTHORS.md
Dockerfile
LICENSE
Makefile
README.md
go.mod
go.sum
renovate.json
Closes coop-cloud/organising#389. Closes coop-cloud/organising#341. Closes coop-cloud/organising#326. Closes coop-cloud/organising#380. Closes coop-cloud/organising#360.
84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
package dns
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/AlecAivazis/survey/v2"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// NewToken constructs a new DNS provider token.
|
|
func NewToken(provider, providerTokenEnvVar string) (string, error) {
|
|
if token, present := os.LookupEnv(providerTokenEnvVar); present {
|
|
return token, nil
|
|
}
|
|
|
|
logrus.Debugf("no %s in environment, asking via stdin", providerTokenEnvVar)
|
|
|
|
var token string
|
|
prompt := &survey.Input{
|
|
Message: fmt.Sprintf("%s API token?", provider),
|
|
}
|
|
if err := survey.AskOne(prompt, &token); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return token, nil
|
|
}
|
|
|
|
// EnsureIPv4 ensures that an ipv4 address is set for a domain name
|
|
func EnsureIPv4(domainName string) (string, error) {
|
|
ipv4, err := net.ResolveIPAddr("ip", domainName)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return ipv4.String(), nil
|
|
}
|
|
|
|
// EnsureDomainsResolveSameIPv4 ensures that domains resolve to the same ipv4 address
|
|
func EnsureDomainsResolveSameIPv4(domainName, server string) (string, error) {
|
|
if server == "default" || server == "local" {
|
|
return "", nil
|
|
}
|
|
|
|
var ipv4 string
|
|
|
|
domainIPv4, err := EnsureIPv4(domainName)
|
|
if err != nil {
|
|
return ipv4, err
|
|
}
|
|
|
|
if domainIPv4 == "" {
|
|
return ipv4, fmt.Errorf("cannot resolve ipv4 for %s?", domainName)
|
|
}
|
|
|
|
serverIPv4, err := EnsureIPv4(server)
|
|
if err != nil {
|
|
return ipv4, err
|
|
}
|
|
|
|
if serverIPv4 == "" {
|
|
return ipv4, fmt.Errorf("cannot resolve ipv4 for %s?", server)
|
|
}
|
|
|
|
if domainIPv4 != serverIPv4 {
|
|
err := "app domain %s (%s) does not appear to resolve to app server %s (%s)?"
|
|
return ipv4, fmt.Errorf(err, domainName, domainIPv4, server, serverIPv4)
|
|
}
|
|
|
|
return ipv4, nil
|
|
}
|
|
|
|
// GetTTL parses a ttl string into a duration
|
|
func GetTTL(ttl string) (time.Duration, error) {
|
|
val, err := time.ParseDuration(ttl)
|
|
if err != nil {
|
|
return val, err
|
|
}
|
|
return val, nil
|
|
}
|