mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-09-20 14:56:20 +08:00
MAINT: Unify provider outputs to pkg/printer (#1546)
* Unify provider outputs to pkg/printer Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me> * No need for custom Errorf Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me> * Add missing import for activedir Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me> * Add missing fmt import for activedir Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
This commit is contained in:
parent
ba2c7f9c0e
commit
bcb968411a
|
@ -27,7 +27,9 @@ type CLI interface {
|
||||||
type Printer interface {
|
type Printer interface {
|
||||||
Debugf(fmt string, args ...interface{})
|
Debugf(fmt string, args ...interface{})
|
||||||
Printf(fmt string, args ...interface{})
|
Printf(fmt string, args ...interface{})
|
||||||
|
Println(lines ...string)
|
||||||
Warnf(fmt string, args ...interface{})
|
Warnf(fmt string, args ...interface{})
|
||||||
|
Errorf(fmt string, args ...interface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debugf is called to print/format debug information.
|
// Debugf is called to print/format debug information.
|
||||||
|
@ -40,11 +42,21 @@ func Printf(fmt string, args ...interface{}) {
|
||||||
DefaultPrinter.Printf(fmt, args...)
|
DefaultPrinter.Printf(fmt, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Println is called to print/format information.
|
||||||
|
func Println(lines ...string) {
|
||||||
|
DefaultPrinter.Println(lines...)
|
||||||
|
}
|
||||||
|
|
||||||
// Warnf is called to print/format a warning.
|
// Warnf is called to print/format a warning.
|
||||||
func Warnf(fmt string, args ...interface{}) {
|
func Warnf(fmt string, args ...interface{}) {
|
||||||
DefaultPrinter.Warnf(fmt, args...)
|
DefaultPrinter.Warnf(fmt, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Errorf is called to print/format an error.
|
||||||
|
func Errorf(fmt string, args ...interface{}) {
|
||||||
|
DefaultPrinter.Errorf(fmt, args...)
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// DefaultPrinter is the default Printer, used by Debugf, Printf, and Warnf.
|
// DefaultPrinter is the default Printer, used by Debugf, Printf, and Warnf.
|
||||||
DefaultPrinter = &ConsolePrinter{
|
DefaultPrinter = &ConsolePrinter{
|
||||||
|
@ -143,7 +155,17 @@ func (c ConsolePrinter) Printf(format string, args ...interface{}) {
|
||||||
fmt.Fprintf(c.Writer, format, args...)
|
fmt.Fprintf(c.Writer, format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Println is called to print/format information.
|
||||||
|
func (c ConsolePrinter) Println(lines ...string) {
|
||||||
|
fmt.Fprintln(c.Writer, lines)
|
||||||
|
}
|
||||||
|
|
||||||
// Warnf is called to print/format a warning.
|
// Warnf is called to print/format a warning.
|
||||||
func (c ConsolePrinter) Warnf(format string, args ...interface{}) {
|
func (c ConsolePrinter) Warnf(format string, args ...interface{}) {
|
||||||
fmt.Fprintf(c.Writer, "WARNING: "+format, args...)
|
fmt.Fprintf(c.Writer, "WARNING: "+format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Errorf is called to print/format an error.
|
||||||
|
func (c ConsolePrinter) Errorf(format string, args ...interface{}) {
|
||||||
|
fmt.Fprintf(c.Writer, "ERROR: "+format, args...)
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package activedir
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"github.com/StackExchange/dnscontrol/v3/providers"
|
"github.com/StackExchange/dnscontrol/v3/providers"
|
||||||
|
@ -38,7 +39,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newDNS(config map[string]string, metadata json.RawMessage) (providers.DNSServiceProvider, error) {
|
func newDNS(config map[string]string, metadata json.RawMessage) (providers.DNSServiceProvider, error) {
|
||||||
fmt.Printf("WARNING: ACTIVEDIRECTORY_PS provider is being replaced by MSDNS. Please convert. Details in https://stackexchange.github.io/dnscontrol/providers/msdns\n")
|
printer.Printf("WARNING: ACTIVEDIRECTORY_PS provider is being replaced by MSDNS. Please convert. Details in https://stackexchange.github.io/dnscontrol/providers/msdns\n")
|
||||||
|
|
||||||
fake := false
|
fake := false
|
||||||
if fVal := config["fakeps"]; fVal == "true" {
|
if fVal := config["fakeps"]; fVal == "true" {
|
||||||
|
@ -67,6 +68,6 @@ func newDNS(config map[string]string, metadata json.RawMessage) (providers.DNSSe
|
||||||
p.adServer = srv
|
p.adServer = srv
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
fmt.Printf("WARNING: PowerShell not available. Active Directory will not be updated.\n")
|
printer.Printf("WARNING: PowerShell not available. Active Directory will not be updated.\n")
|
||||||
return providers.None{}, nil
|
return providers.None{}, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,8 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
)
|
)
|
||||||
|
|
||||||
var checkPS sync.Once
|
var checkPS sync.Once
|
||||||
|
@ -20,12 +22,12 @@ func (c *activedirProvider) getRecords(domainname string) ([]byte, error) {
|
||||||
checkPS.Do(func() {
|
checkPS.Do(func() {
|
||||||
psAvailible = c.isPowerShellReady()
|
psAvailible = c.isPowerShellReady()
|
||||||
if !psAvailible {
|
if !psAvailible {
|
||||||
fmt.Printf("\n\n\n")
|
printer.Printf("\n\n\n")
|
||||||
fmt.Printf("***********************************************\n")
|
printer.Printf("***********************************************\n")
|
||||||
fmt.Printf("PowerShell DnsServer module not installed.\n")
|
printer.Printf("PowerShell DnsServer module not installed.\n")
|
||||||
fmt.Printf("See http://social.technet.microsoft.com/wiki/contents/articles/2202.remote-server-administration-tools-rsat-for-windows-client-and-windows-server-dsforum2wiki.aspx\n")
|
printer.Printf("See http://social.technet.microsoft.com/wiki/contents/articles/2202.remote-server-administration-tools-rsat-for-windows-client-and-windows-server-dsforum2wiki.aspx\n")
|
||||||
fmt.Printf("***********************************************\n")
|
printer.Printf("***********************************************\n")
|
||||||
fmt.Printf("\n\n\n")
|
printer.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if !psAvailible {
|
if !psAvailible {
|
||||||
|
|
|
@ -3,6 +3,7 @@ package autodns
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
@ -102,17 +103,17 @@ func (api *autoDnsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mo
|
||||||
|
|
||||||
for _, m := range del {
|
for _, m := range del {
|
||||||
// Just notify, these records don't have to be deleted explicitly
|
// Just notify, these records don't have to be deleted explicitly
|
||||||
fmt.Println(m)
|
printer.Debugf(m.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, m := range create {
|
for _, m := range create {
|
||||||
fmt.Println(m)
|
printer.Debugf(m.String())
|
||||||
changes = append(changes, m.Desired)
|
changes = append(changes, m.Desired)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, m := range modify {
|
for _, m := range modify {
|
||||||
fmt.Println("mod")
|
printer.Debugf("mod")
|
||||||
fmt.Println(m)
|
printer.Debugf(m.String())
|
||||||
changes = append(changes, m.Desired)
|
changes = append(changes, m.Desired)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,7 +169,7 @@ func (api *autoDnsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mo
|
||||||
err := api.updateZone(domain, resourceRecords, nameServers, zoneTTL)
|
err := api.updateZone(domain, resourceRecords, nameServers, zoneTTL)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Errorf(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -17,6 +17,7 @@ import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"math"
|
"math"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
|
@ -96,7 +97,7 @@ func initAxfrDdns(config map[string]string, providermeta json.RawMessage) (provi
|
||||||
case "udp":
|
case "udp":
|
||||||
api.updateMode = ""
|
api.updateMode = ""
|
||||||
default:
|
default:
|
||||||
fmt.Printf("[Warning] AXFRDDNS: Unknown update-mode in `creds.json` (%s)\n", config["update-mode"])
|
printer.Printf("[Warning] AXFRDDNS: Unknown update-mode in `creds.json` (%s)\n", config["update-mode"])
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
api.updateMode = ""
|
api.updateMode = ""
|
||||||
|
@ -107,7 +108,7 @@ func initAxfrDdns(config map[string]string, providermeta json.RawMessage) (provi
|
||||||
"tcp-tls":
|
"tcp-tls":
|
||||||
api.transferMode = config["transfer-mode"]
|
api.transferMode = config["transfer-mode"]
|
||||||
default:
|
default:
|
||||||
fmt.Printf("[Warning] AXFRDDNS: Unknown transfer-mode in `creds.json` (%s)\n", config["transfer-mode"])
|
printer.Printf("[Warning] AXFRDDNS: Unknown transfer-mode in `creds.json` (%s)\n", config["transfer-mode"])
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
api.transferMode = "tcp"
|
api.transferMode = "tcp"
|
||||||
|
@ -140,7 +141,7 @@ func initAxfrDdns(config map[string]string, providermeta json.RawMessage) (provi
|
||||||
"transfer-mode":
|
"transfer-mode":
|
||||||
continue
|
continue
|
||||||
default:
|
default:
|
||||||
fmt.Printf("[Warning] AXFRDDNS: unknown key in `creds.json` (%s)\n", key)
|
printer.Printf("[Warning] AXFRDDNS: unknown key in `creds.json` (%s)\n", key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return api, err
|
return api, err
|
||||||
|
@ -336,10 +337,10 @@ func (c *axfrddnsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mod
|
||||||
|
|
||||||
// TODO(tlim): This check should be done on all providers. Move to the global validation code.
|
// TODO(tlim): This check should be done on all providers. Move to the global validation code.
|
||||||
if dc.AutoDNSSEC == "on" && !hasDnssecRecords {
|
if dc.AutoDNSSEC == "on" && !hasDnssecRecords {
|
||||||
fmt.Printf("Warning: AUTODNSSEC is enabled, but no DNSKEY or RRSIG record was found in the AXFR answer!\n")
|
printer.Printf("Warning: AUTODNSSEC is enabled, but no DNSKEY or RRSIG record was found in the AXFR answer!\n")
|
||||||
}
|
}
|
||||||
if dc.AutoDNSSEC == "off" && hasDnssecRecords {
|
if dc.AutoDNSSEC == "off" && hasDnssecRecords {
|
||||||
fmt.Printf("Warning: AUTODNSSEC is disabled, but DNSKEY or RRSIG records were found in the AXFR answer!\n")
|
printer.Printf("Warning: AUTODNSSEC is disabled, but DNSKEY or RRSIG records were found in the AXFR answer!\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normalize
|
// Normalize
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -586,7 +587,7 @@ func (a *azurednsProvider) EnsureDomainExists(domain string) error {
|
||||||
if _, ok := a.zones[domain]; ok {
|
if _, ok := a.zones[domain]; ok {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
fmt.Printf("Adding zone for %s to Azure dns account\n", domain)
|
printer.Printf("Adding zone for %s to Azure dns account\n", domain)
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 6000*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 6000*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
|
@ -17,6 +17,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -156,7 +157,7 @@ func (c *bindProvider) GetZoneRecords(domain string) (models.Records, error) {
|
||||||
foundRecords := models.Records{}
|
foundRecords := models.Records{}
|
||||||
|
|
||||||
if _, err := os.Stat(c.directory); os.IsNotExist(err) {
|
if _, err := os.Stat(c.directory); os.IsNotExist(err) {
|
||||||
fmt.Printf("\nWARNING: BIND directory %q does not exist!\n", c.directory)
|
printer.Printf("\nWARNING: BIND directory %q does not exist!\n", c.directory)
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.zonefile == "" {
|
if c.zonefile == "" {
|
||||||
|
@ -289,7 +290,7 @@ func (c *bindProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*models.
|
||||||
&models.Correction{
|
&models.Correction{
|
||||||
Msg: msg,
|
Msg: msg,
|
||||||
F: func() error {
|
F: func() error {
|
||||||
fmt.Printf("WRITING ZONEFILE: %v\n", c.zonefile)
|
printer.Printf("WRITING ZONEFILE: %v\n", c.zonefile)
|
||||||
zf, err := os.Create(c.zonefile)
|
zf, err := os.Create(c.zonefile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not create zonefile: %w", err)
|
return fmt.Errorf("could not create zonefile: %w", err)
|
||||||
|
|
|
@ -177,9 +177,9 @@ func (c *cloudflareProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*m
|
||||||
|
|
||||||
if c.manageRedirects {
|
if c.manageRedirects {
|
||||||
prs, err := c.getPageRules(id, dc.Name)
|
prs, err := c.getPageRules(id, dc.Name)
|
||||||
//fmt.Printf("GET PAGE RULES:\n")
|
//printer.Printf("GET PAGE RULES:\n")
|
||||||
//for i, p := range prs {
|
//for i, p := range prs {
|
||||||
// fmt.Printf("%03d: %q\n", i, p.GetTargetField())
|
// printer.Printf("%03d: %q\n", i, p.GetTargetField())
|
||||||
//}
|
//}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -701,7 +701,7 @@ func (c *cloudflareProvider) EnsureDomainExists(domain string) error {
|
||||||
}
|
}
|
||||||
var id string
|
var id string
|
||||||
id, err := c.createZone(domain)
|
id, err := c.createZone(domain)
|
||||||
fmt.Printf("Added zone for %s to Cloudflare account: %s\n", domain, id)
|
printer.Printf("Added zone for %s to Cloudflare account: %s\n", domain, id)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
@ -316,9 +317,9 @@ func (client *providerClient) getDomains() ([]string, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
//fmt.Printf("------------------\n")
|
//printer.Printf("------------------\n")
|
||||||
//fmt.Printf("DEBUG: GETDOMAINS bodystring = %s\n", bodyString)
|
//printer.Printf("DEBUG: GETDOMAINS bodystring = %s\n", bodyString)
|
||||||
//fmt.Printf("------------------\n")
|
//printer.Printf("------------------\n")
|
||||||
|
|
||||||
var dr domainsResult
|
var dr domainsResult
|
||||||
json.Unmarshal(bodyString, &dr)
|
json.Unmarshal(bodyString, &dr)
|
||||||
|
@ -332,9 +333,9 @@ func (client *providerClient) getDomains() ([]string, error) {
|
||||||
r = append(r, d.QualifiedDomainName)
|
r = append(r, d.QualifiedDomainName)
|
||||||
}
|
}
|
||||||
|
|
||||||
//fmt.Printf("------------------\n")
|
//printer.Printf("------------------\n")
|
||||||
//fmt.Printf("DEBUG: GETDOMAINS dr = %+v\n", dr)
|
//printer.Printf("DEBUG: GETDOMAINS dr = %+v\n", dr)
|
||||||
//fmt.Printf("------------------\n")
|
//printer.Printf("------------------\n")
|
||||||
|
|
||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
@ -346,9 +347,9 @@ func (client *providerClient) getZoneRecordsAll(zone string) (*zoneResponse, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if cscDebug {
|
if cscDebug {
|
||||||
fmt.Printf("------------------\n")
|
printer.Printf("------------------\n")
|
||||||
fmt.Printf("DEBUG: ZONE RESPONSE = %s\n", bodyString)
|
printer.Printf("DEBUG: ZONE RESPONSE = %s\n", bodyString)
|
||||||
fmt.Printf("------------------\n")
|
printer.Printf("------------------\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
var dr zoneResponse
|
var dr zoneResponse
|
||||||
|
@ -369,7 +370,7 @@ func (client *providerClient) sendZoneEditRequest(domainname string, edits []zon
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if cscDebug {
|
if cscDebug {
|
||||||
fmt.Printf("DEBUG: edit request = %s\n", requestBody)
|
printer.Printf("DEBUG: edit request = %s\n", requestBody)
|
||||||
}
|
}
|
||||||
responseBody, err := client.post("/zones/edits", requestBody)
|
responseBody, err := client.post("/zones/edits", requestBody)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -399,13 +400,11 @@ func (client *providerClient) waitRequestURL(statusURL string) error {
|
||||||
for {
|
for {
|
||||||
statusBody, err := client.geturl(statusURL)
|
statusBody, err := client.geturl(statusURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println()
|
|
||||||
return fmt.Errorf("CSC Global API error: %s DATA: %q", err, statusBody)
|
return fmt.Errorf("CSC Global API error: %s DATA: %q", err, statusBody)
|
||||||
}
|
}
|
||||||
var statusResp zoneEditStatusResultZoneEditStatusResult
|
var statusResp zoneEditStatusResultZoneEditStatusResult
|
||||||
err = json.Unmarshal(statusBody, &statusResp)
|
err = json.Unmarshal(statusBody, &statusResp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println()
|
|
||||||
return fmt.Errorf("CSC Global API error: %s DATA: %q", err, statusBody)
|
return fmt.Errorf("CSC Global API error: %s DATA: %q", err, statusBody)
|
||||||
}
|
}
|
||||||
status, msg := statusResp.Content.Status, statusResp.Content.ErrorDescription
|
status, msg := statusResp.Content.Status, statusResp.Content.ErrorDescription
|
||||||
|
@ -413,19 +412,17 @@ func (client *providerClient) waitRequestURL(statusURL string) error {
|
||||||
if isatty.IsTerminal(os.Stdout.Fd()) {
|
if isatty.IsTerminal(os.Stdout.Fd()) {
|
||||||
dur := time.Since(t1).Round(time.Second)
|
dur := time.Since(t1).Round(time.Second)
|
||||||
if msg == "" {
|
if msg == "" {
|
||||||
fmt.Printf("WAITING: % 6s STATUS=%s \r", dur, status)
|
printer.Printf("WAITING: % 6s STATUS=%s \r", dur, status)
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("WAITING: % 6s STATUS=%s MSG=%q \r", dur, status, msg)
|
printer.Printf("WAITING: % 6s STATUS=%s MSG=%q \r", dur, status, msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if status == "FAILED" {
|
if status == "FAILED" {
|
||||||
fmt.Println()
|
|
||||||
parts := strings.Split(statusResp.Links.Cancel, "/")
|
parts := strings.Split(statusResp.Links.Cancel, "/")
|
||||||
client.cancelRequest(parts[len(parts)-1])
|
client.cancelRequest(parts[len(parts)-1])
|
||||||
return fmt.Errorf("update failed: %s %s", msg, statusURL)
|
return fmt.Errorf("update failed: %s %s", msg, statusURL)
|
||||||
}
|
}
|
||||||
if status == "COMPLETED" {
|
if status == "COMPLETED" {
|
||||||
fmt.Println()
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
|
@ -476,15 +473,15 @@ func (client *providerClient) clearRequests(domain string) error {
|
||||||
for i, ze := range dr.ZoneEdits {
|
for i, ze := range dr.ZoneEdits {
|
||||||
if cscDebug {
|
if cscDebug {
|
||||||
if ze.Status != "COMPLETED" && ze.Status != "CANCELED" {
|
if ze.Status != "COMPLETED" && ze.Status != "CANCELED" {
|
||||||
fmt.Printf("REQUEST %d: %s %s\n", i, ze.ID, ze.Status)
|
printer.Printf("REQUEST %d: %s %s\n", i, ze.ID, ze.Status)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch ze.Status {
|
switch ze.Status {
|
||||||
case "PROPAGATING":
|
case "PROPAGATING":
|
||||||
fmt.Printf("INFO: Waiting for id=%s status=%s\n", ze.ID, ze.Status)
|
printer.Printf("INFO: Waiting for id=%s status=%s\n", ze.ID, ze.Status)
|
||||||
client.waitRequest(ze.ID)
|
client.waitRequest(ze.ID)
|
||||||
case "FAILED":
|
case "FAILED":
|
||||||
fmt.Printf("INFO: Deleting request status=%s id=%s\n", ze.Status, ze.ID)
|
printer.Printf("INFO: Deleting request status=%s id=%s\n", ze.Status, ze.ID)
|
||||||
client.cancelRequest(ze.ID)
|
client.cancelRequest(ze.ID)
|
||||||
case "COMPLETED", "CANCELED":
|
case "COMPLETED", "CANCELED":
|
||||||
continue
|
continue
|
||||||
|
@ -538,7 +535,7 @@ func (client *providerClient) put(endpoint string, requestBody []byte) ([]byte,
|
||||||
|
|
||||||
func (client *providerClient) delete(endpoint string) ([]byte, error) {
|
func (client *providerClient) delete(endpoint string) ([]byte, error) {
|
||||||
hclient := &http.Client{}
|
hclient := &http.Client{}
|
||||||
fmt.Printf("DEBUG: delete endpoint: %q\n", apiBase+endpoint)
|
printer.Printf("DEBUG: delete endpoint: %q\n", apiBase+endpoint)
|
||||||
req, _ := http.NewRequest("DELETE", apiBase+endpoint, nil)
|
req, _ := http.NewRequest("DELETE", apiBase+endpoint, nil)
|
||||||
|
|
||||||
// Add headers
|
// Add headers
|
||||||
|
@ -554,10 +551,10 @@ func (client *providerClient) delete(endpoint string) ([]byte, error) {
|
||||||
|
|
||||||
bodyString, _ := ioutil.ReadAll(resp.Body)
|
bodyString, _ := ioutil.ReadAll(resp.Body)
|
||||||
if resp.StatusCode == 200 {
|
if resp.StatusCode == 200 {
|
||||||
fmt.Printf("DEBUG: Delete successful (200)\n")
|
printer.Printf("DEBUG: Delete successful (200)\n")
|
||||||
return bodyString, nil
|
return bodyString, nil
|
||||||
}
|
}
|
||||||
fmt.Printf("DEBUG: Delete failed (%d)\n", resp.StatusCode)
|
printer.Printf("DEBUG: Delete failed (%d)\n", resp.StatusCode)
|
||||||
|
|
||||||
// Got a error response from API, see if it's json format
|
// Got a error response from API, see if it's json format
|
||||||
var errResp errorResponse
|
var errResp errorResponse
|
||||||
|
@ -589,10 +586,10 @@ func (client *providerClient) post(endpoint string, requestBody []byte) ([]byte,
|
||||||
}
|
}
|
||||||
|
|
||||||
bodyString, _ := ioutil.ReadAll(resp.Body)
|
bodyString, _ := ioutil.ReadAll(resp.Body)
|
||||||
//fmt.Printf("------------------\n")
|
//printer.Printf("------------------\n")
|
||||||
//fmt.Printf("DEBUG: resp.StatusCode == %d\n", resp.StatusCode)
|
//printer.Printf("DEBUG: resp.StatusCode == %d\n", resp.StatusCode)
|
||||||
//fmt.Printf("POST RESPONSE = %s\n", bodyString)
|
//printer.Printf("POST RESPONSE = %s\n", bodyString)
|
||||||
//fmt.Printf("------------------\n")
|
//printer.Printf("------------------\n")
|
||||||
if resp.StatusCode == 201 {
|
if resp.StatusCode == 201 {
|
||||||
return bodyString, nil
|
return bodyString, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,7 +213,7 @@ func makePurge(domainname string, cor diff.Correlation) zoneResourceRecordEdit {
|
||||||
|
|
||||||
if cor.Existing.Type == "CAA" {
|
if cor.Existing.Type == "CAA" {
|
||||||
var tagValue = cor.Existing.CaaTag
|
var tagValue = cor.Existing.CaaTag
|
||||||
//fmt.Printf("DEBUG: CAA TAG = %q\n", tagValue)
|
//printer.Printf("DEBUG: CAA TAG = %q\n", tagValue)
|
||||||
zer.CurrentTag = &tagValue
|
zer.CurrentTag = &tagValue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ package desec
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/StackExchange/dnscontrol/v3/models"
|
"github.com/StackExchange/dnscontrol/v3/models"
|
||||||
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
)
|
)
|
||||||
|
|
|
@ -74,7 +74,7 @@ func (c *desecProvider) GetNameservers(domain string) ([]*models.Nameserver, err
|
||||||
|
|
||||||
func (c *desecProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Correction, error) {
|
func (c *desecProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Correction, error) {
|
||||||
if dc.AutoDNSSEC == "off" {
|
if dc.AutoDNSSEC == "off" {
|
||||||
fmt.Printf("Notice: DNSSEC signing was not requested, but cannot be turned off. (deSEC always signs all records.)\n")
|
printer.Printf("Notice: DNSSEC signing was not requested, but cannot be turned off. (deSEC always signs all records.)\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
existing, err := c.GetZoneRecords(dc.Name)
|
existing, err := c.GetZoneRecords(dc.Name)
|
||||||
|
|
|
@ -146,13 +146,13 @@ func (c *desecProvider) convertLinks(links string) map[string]string {
|
||||||
for _, link := range strings.Split(links, ", ") {
|
for _, link := range strings.Split(links, ", ") {
|
||||||
tmpurl := strings.Split(link, "; ")
|
tmpurl := strings.Split(link, "; ")
|
||||||
if len(tmpurl) != 2 {
|
if len(tmpurl) != 2 {
|
||||||
fmt.Printf("unexpected link header %s", link)
|
printer.Printf("unexpected link header %s", link)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
r := regexp.MustCompile(`rel="(.*)"`)
|
r := regexp.MustCompile(`rel="(.*)"`)
|
||||||
matches := r.FindStringSubmatch(tmpurl[1])
|
matches := r.FindStringSubmatch(tmpurl[1])
|
||||||
if len(matches) != 2 {
|
if len(matches) != 2 {
|
||||||
fmt.Printf("unexpected label %s", tmpurl[1])
|
printer.Printf("unexpected label %s", tmpurl[1])
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// mapping["$label"] = "$URL"
|
// mapping["$label"] = "$URL"
|
||||||
|
|
|
@ -2,7 +2,6 @@ package digitalocean
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/StackExchange/dnscontrol/v3/models"
|
"github.com/StackExchange/dnscontrol/v3/models"
|
||||||
"github.com/StackExchange/dnscontrol/v3/pkg/recordaudit"
|
"github.com/StackExchange/dnscontrol/v3/pkg/recordaudit"
|
||||||
)
|
)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -563,7 +564,7 @@ func removeOtherApexNS(dc *models.DomainConfig) {
|
||||||
// Child delegations are supported so we allow non-apex NS records.
|
// Child delegations are supported so we allow non-apex NS records.
|
||||||
if rec.GetLabelFQDN() == dc.Name {
|
if rec.GetLabelFQDN() == dc.Name {
|
||||||
if !strings.HasSuffix(rec.GetTargetField(), ".dnsimple.com.") {
|
if !strings.HasSuffix(rec.GetTargetField(), ".dnsimple.com.") {
|
||||||
fmt.Printf("Warning: dnsimple.com does not allow NS records to be modified. %s will not be added.\n", rec.GetTargetField())
|
printer.Printf("Warning: dnsimple.com does not allow NS records to be modified. %s will not be added.\n", rec.GetTargetField())
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package dnsmadeeasy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -17,7 +18,7 @@ func newProvider(apiKey string, secretKey string, sandbox bool, debug bool) *dns
|
||||||
baseURL = sandboxBaseURLV2_0
|
baseURL = sandboxBaseURLV2_0
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("Creating DNSMADEEASY provider for %q\n", baseURL)
|
printer.Printf("Creating DNSMADEEASY provider for %q\n", baseURL)
|
||||||
|
|
||||||
return &dnsMadeEasyProvider{
|
return &dnsMadeEasyProvider{
|
||||||
restAPI: &dnsMadeEasyRestAPI{
|
restAPI: &dnsMadeEasyRestAPI{
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httputil"
|
"net/http/httputil"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -221,7 +222,7 @@ retry:
|
||||||
|
|
||||||
if restApi.dumpHTTPRequest {
|
if restApi.dumpHTTPRequest {
|
||||||
dump, _ := httputil.DumpRequest(req, true)
|
dump, _ := httputil.DumpRequest(req, true)
|
||||||
fmt.Println(string(dump))
|
printer.Printf(string(dump))
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := restApi.httpClient.Do(req)
|
res, err := restApi.httpClient.Do(req)
|
||||||
|
@ -233,7 +234,7 @@ retry:
|
||||||
|
|
||||||
if restApi.dumpHTTPResponse {
|
if restApi.dumpHTTPResponse {
|
||||||
dump, _ := httputil.DumpResponse(res, true)
|
dump, _ := httputil.DumpResponse(res, true)
|
||||||
fmt.Println(string(dump))
|
printer.Printf(string(dump))
|
||||||
}
|
}
|
||||||
|
|
||||||
if res.StatusCode < http.StatusOK || res.StatusCode >= http.StatusBadRequest {
|
if res.StatusCode < http.StatusOK || res.StatusCode >= http.StatusBadRequest {
|
||||||
|
@ -244,7 +245,7 @@ retry:
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(apiErr.Error) == 1 && apiErr.Error[0] == "Rate limit exceeded" {
|
if len(apiErr.Error) == 1 && apiErr.Error[0] == "Rate limit exceeded" {
|
||||||
fmt.Printf("pausing DNSMADEEASY due to ratelimit: %v seconds\n", backoff)
|
printer.Printf("pausing DNSMADEEASY due to ratelimit: %v seconds\n", backoff)
|
||||||
|
|
||||||
time.Sleep(backoff)
|
time.Sleep(backoff)
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/exoscale/egoscale"
|
"github.com/exoscale/egoscale"
|
||||||
|
@ -257,7 +258,7 @@ func removeOtherNS(dc *models.DomainConfig) {
|
||||||
if rec.GetLabelFQDN() == dc.Name && defaultNSSUffix(rec.GetTargetField()) {
|
if rec.GetLabelFQDN() == dc.Name && defaultNSSUffix(rec.GetTargetField()) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
fmt.Printf("Warning: exoscale.com(.io, .ch, .net) does not allow NS records to be modified. %s will not be added.\n", rec.GetTargetField())
|
printer.Printf("Warning: exoscale.com(.io, .ch, .net) does not allow NS records to be modified. %s will not be added.\n", rec.GetTargetField())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
newList = append(newList, rec)
|
newList = append(newList, rec)
|
||||||
|
|
|
@ -4,7 +4,6 @@ package gandiv5
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/go-gandi/go-gandi/livedns"
|
"github.com/go-gandi/go-gandi/livedns"
|
||||||
|
|
||||||
"github.com/StackExchange/dnscontrol/v3/models"
|
"github.com/StackExchange/dnscontrol/v3/models"
|
||||||
|
|
|
@ -338,9 +338,9 @@ func (client *gandiv5Provider) GenerateDomainCorrections(dc *models.DomainConfig
|
||||||
|
|
||||||
// debugRecords prints a list of RecordConfig.
|
// debugRecords prints a list of RecordConfig.
|
||||||
func debugRecords(note string, recs []*models.RecordConfig) {
|
func debugRecords(note string, recs []*models.RecordConfig) {
|
||||||
fmt.Println("DEBUG:", note)
|
printer.Debugf(note)
|
||||||
for k, v := range recs {
|
for k, v := range recs {
|
||||||
fmt.Printf(" %v: %v %v %v %v\n", k, v.GetLabel(), v.Type, v.TTL, v.GetTargetCombined())
|
printer.Printf(" %v: %v %v %v %v\n", k, v.GetLabel(), v.Type, v.TTL, v.GetTargetCombined())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -86,7 +87,7 @@ func New(cfg map[string]string, metadata json.RawMessage) (providers.DNSServiceP
|
||||||
}
|
}
|
||||||
var nss *string
|
var nss *string
|
||||||
if val, ok := cfg["name_server_set"]; ok {
|
if val, ok := cfg["name_server_set"]; ok {
|
||||||
fmt.Printf("GCLOUD :name_server_set %s configured\n", val)
|
printer.Printf("GCLOUD :name_server_set %s configured\n", val)
|
||||||
nss = sPtr(val)
|
nss = sPtr(val)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,7 +321,7 @@ func (g *gcloudProvider) EnsureDomainExists(domain string) error {
|
||||||
}
|
}
|
||||||
var mz *gdns.ManagedZone
|
var mz *gdns.ManagedZone
|
||||||
if g.nameServerSet != nil {
|
if g.nameServerSet != nil {
|
||||||
fmt.Printf("Adding zone for %s to gcloud account with name_server_set %s\n", domain, *g.nameServerSet)
|
printer.Printf("Adding zone for %s to gcloud account with name_server_set %s\n", domain, *g.nameServerSet)
|
||||||
mz = &gdns.ManagedZone{
|
mz = &gdns.ManagedZone{
|
||||||
DnsName: domain + ".",
|
DnsName: domain + ".",
|
||||||
NameServerSet: *g.nameServerSet,
|
NameServerSet: *g.nameServerSet,
|
||||||
|
@ -328,7 +329,7 @@ func (g *gcloudProvider) EnsureDomainExists(domain string) error {
|
||||||
Description: "zone added by dnscontrol",
|
Description: "zone added by dnscontrol",
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("Adding zone for %s to gcloud account \n", domain)
|
printer.Printf("Adding zone for %s to gcloud account \n", domain)
|
||||||
mz = &gdns.ManagedZone{
|
mz = &gdns.ManagedZone{
|
||||||
DnsName: domain + ".",
|
DnsName: domain + ".",
|
||||||
Name: "zone-" + strings.Replace(domain, ".", "-", -1),
|
Name: "zone-" + strings.Replace(domain, ".", "-", -1),
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -236,7 +237,7 @@ func (api *hetznerProvider) request(endpoint string, method string, request inte
|
||||||
cleanupResponseBody := func() {
|
cleanupResponseBody := func() {
|
||||||
err := resp.Body.Close()
|
err := resp.Body.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("failed closing response body: %q\n", err)
|
printer.Printf("failed closing response body: %q\n", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,7 +252,7 @@ func (api *hetznerProvider) request(endpoint string, method string, request inte
|
||||||
defer cleanupResponseBody()
|
defer cleanupResponseBody()
|
||||||
if !statusOK(resp.StatusCode) {
|
if !statusOK(resp.StatusCode) {
|
||||||
data, _ := ioutil.ReadAll(resp.Body)
|
data, _ := ioutil.ReadAll(resp.Body)
|
||||||
fmt.Println(string(data))
|
printer.Printf(string(data))
|
||||||
return fmt.Errorf("bad status code from HETZNER: %d not 200", resp.StatusCode)
|
return fmt.Errorf("bad status code from HETZNER: %d not 200", resp.StatusCode)
|
||||||
}
|
}
|
||||||
if target == nil {
|
if target == nil {
|
||||||
|
@ -325,7 +326,7 @@ func (requestRateLimiter *requestRateLimiter) handleRateLimitedRequest() {
|
||||||
case "second":
|
case "second":
|
||||||
message = fmt.Sprintf(message, "Second", "Minute")
|
message = fmt.Sprintf(message, "Second", "Minute")
|
||||||
}
|
}
|
||||||
fmt.Println(message)
|
printer.Printf(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (requestRateLimiter *requestRateLimiter) handleResponse(resp http.Response) {
|
func (requestRateLimiter *requestRateLimiter) handleResponse(resp http.Response) {
|
||||||
|
|
|
@ -2,7 +2,6 @@ package hexonet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/hexonet/go-sdk/v3/response"
|
"github.com/hexonet/go-sdk/v3/response"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ package hexonet
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/StackExchange/dnscontrol/v3/pkg/version"
|
"github.com/StackExchange/dnscontrol/v3/pkg/version"
|
||||||
"github.com/StackExchange/dnscontrol/v3/providers"
|
"github.com/StackExchange/dnscontrol/v3/providers"
|
||||||
hxcl "github.com/hexonet/go-sdk/v3/apiclient"
|
hxcl "github.com/hexonet/go-sdk/v3/apiclient"
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -162,9 +163,9 @@ func toRecord(r *HXRecord, origin string) *models.RecordConfig {
|
||||||
func (n *HXClient) showCommand(cmd map[string]string) {
|
func (n *HXClient) showCommand(cmd map[string]string) {
|
||||||
b, err := json.MarshalIndent(cmd, "", " ")
|
b, err := json.MarshalIndent(cmd, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("error:", err)
|
fmt.Errorf("error: %w", err)
|
||||||
}
|
}
|
||||||
fmt.Print(string(b))
|
printer.Printf(string(b))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *HXClient) updateZoneBy(params map[string]interface{}, domain string) error {
|
func (n *HXClient) updateZoneBy(params map[string]interface{}, domain string) error {
|
||||||
|
|
|
@ -3,6 +3,7 @@ package inwx
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -100,7 +101,7 @@ func (api *inwxAPI) loginHelper(TOTPValue string, TOTPKey string) error {
|
||||||
switch TFA := resp.TFA; TFA {
|
switch TFA := resp.TFA; TFA {
|
||||||
case "0":
|
case "0":
|
||||||
if TOTPKey != "" || TOTPValue != "" {
|
if TOTPKey != "" || TOTPValue != "" {
|
||||||
fmt.Printf("INWX: Warning: no TOTP requested by INWX but totp/totp-key is present in `creds.json`\n")
|
printer.Printf("INWX: Warning: no TOTP requested by INWX but totp/totp-key is present in `creds.json`\n")
|
||||||
}
|
}
|
||||||
case "GOOGLE-AUTH":
|
case "GOOGLE-AUTH":
|
||||||
tan, err := getOTP(TOTPValue, TOTPKey)
|
tan, err := getOTP(TOTPValue, TOTPKey)
|
||||||
|
@ -417,6 +418,6 @@ func (api *inwxAPI) EnsureDomainExists(domain string) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Printf("Added zone for %s to INWX account with id %d\n", domain, id)
|
printer.Printf("Added zone for %s to INWX account with id %d\n", domain, id)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package msdns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/StackExchange/dnscontrol/v3/models"
|
"github.com/StackExchange/dnscontrol/v3/models"
|
||||||
"github.com/StackExchange/dnscontrol/v3/pkg/diff"
|
"github.com/StackExchange/dnscontrol/v3/pkg/diff"
|
||||||
"github.com/StackExchange/dnscontrol/v3/pkg/txtutil"
|
"github.com/StackExchange/dnscontrol/v3/pkg/txtutil"
|
||||||
|
|
|
@ -2,7 +2,7 @@ package msdns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"github.com/StackExchange/dnscontrol/v3/models"
|
"github.com/StackExchange/dnscontrol/v3/models"
|
||||||
|
@ -46,7 +46,7 @@ func init() {
|
||||||
func newDNS(config map[string]string, metadata json.RawMessage) (providers.DNSServiceProvider, error) {
|
func newDNS(config map[string]string, metadata json.RawMessage) (providers.DNSServiceProvider, error) {
|
||||||
|
|
||||||
if runtime.GOOS != "windows" {
|
if runtime.GOOS != "windows" {
|
||||||
fmt.Println("INFO: PowerShell not available. Disabling Active Directory provider.")
|
printer.Printf("INFO: PowerShell not available. Disabling Active Directory provider.")
|
||||||
return providers.None{}, nil
|
return providers.None{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"log"
|
"log"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
@ -77,7 +78,7 @@ func decodeRecordDataNaptr(s string) models.RecordConfig {
|
||||||
|
|
||||||
// At this point we should have consumed the entire string.
|
// At this point we should have consumed the entire string.
|
||||||
if s != "" {
|
if s != "" {
|
||||||
fmt.Printf("WARNING: REMAINDER:=%q\n", s)
|
printer.Printf("WARNING: REMAINDER:=%q\n", s)
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc
|
return rc
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
@ -30,7 +31,7 @@ func newPowerShell(config map[string]string) (*psHandle, error) {
|
||||||
|
|
||||||
pssession := config["pssession"]
|
pssession := config["pssession"]
|
||||||
if pssession != "" {
|
if pssession != "" {
|
||||||
fmt.Printf("INFO: PowerShell commands will run on %q\n", pssession)
|
printer.Printf("INFO: PowerShell commands will run on %q\n", pssession)
|
||||||
// create a remote shell by wrapping the existing one in the session middleware
|
// create a remote shell by wrapping the existing one in the session middleware
|
||||||
mconfig := middleware.NewSessionConfig()
|
mconfig := middleware.NewSessionConfig()
|
||||||
mconfig.ComputerName = pssession
|
mconfig.ComputerName = pssession
|
||||||
|
@ -68,7 +69,7 @@ func (psh *psHandle) GetDNSServerZoneAll(dnsserver string) ([]string, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if stderr != "" {
|
if stderr != "" {
|
||||||
fmt.Printf("STDERROR = %q\n", stderr)
|
printer.Printf("STDERROR = %q\n", stderr)
|
||||||
return nil, fmt.Errorf("unexpected stderr from Get-DnsServerZones: %q", stderr)
|
return nil, fmt.Errorf("unexpected stderr from Get-DnsServerZones: %q", stderr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,11 +114,11 @@ func (psh *psHandle) GetDNSZoneRecords(dnsserver, domain string) ([]nativeRecord
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if stderr != "" {
|
if stderr != "" {
|
||||||
fmt.Printf("STDERROR GetDNSZR = %q\n", stderr)
|
printer.Printf("STDERROR GetDNSZR = %q\n", stderr)
|
||||||
return nil, fmt.Errorf("unexpected stderr from PSZoneDump: %q", stderr)
|
return nil, fmt.Errorf("unexpected stderr from PSZoneDump: %q", stderr)
|
||||||
}
|
}
|
||||||
if stdout != "" {
|
if stdout != "" {
|
||||||
fmt.Printf("STDOUT GetDNSZR = %q\n", stdout)
|
printer.Printf("STDOUT GetDNSZR = %q\n", stdout)
|
||||||
}
|
}
|
||||||
|
|
||||||
contents, err := utfutil.ReadFile(filename, utfutil.UTF8)
|
contents, err := utfutil.ReadFile(filename, utfutil.UTF8)
|
||||||
|
@ -126,9 +127,9 @@ func (psh *psHandle) GetDNSZoneRecords(dnsserver, domain string) ([]nativeRecord
|
||||||
}
|
}
|
||||||
os.Remove(filename) // TODO(tlim): There should be a debug flag that leaves the tmp file around.
|
os.Remove(filename) // TODO(tlim): There should be a debug flag that leaves the tmp file around.
|
||||||
|
|
||||||
//fmt.Printf("CONTENTS = %s\n", contents)
|
//printer.Printf("CONTENTS = %s\n", contents)
|
||||||
//fmt.Printf("CONTENTS STR = %q\n", contents[:10])
|
//printer.Printf("CONTENTS STR = %q\n", contents[:10])
|
||||||
//fmt.Printf("CONTENTS HEX = %v\n", []byte(contents)[:10])
|
//printer.Printf("CONTENTS HEX = %v\n", []byte(contents)[:10])
|
||||||
//ioutil.WriteFile("/temp/list.json", contents, 0777)
|
//ioutil.WriteFile("/temp/list.json", contents, 0777)
|
||||||
var records []nativeRecord
|
var records []nativeRecord
|
||||||
err = json.Unmarshal(contents, &records)
|
err = json.Unmarshal(contents, &records)
|
||||||
|
@ -195,7 +196,7 @@ func (psh *psHandle) RecordDelete(dnsserver, domain string, rec *models.RecordCo
|
||||||
var c string
|
var c string
|
||||||
if rec.Type == "NAPTR" {
|
if rec.Type == "NAPTR" {
|
||||||
c = generatePSDeleteNaptr(dnsserver, domain, rec)
|
c = generatePSDeleteNaptr(dnsserver, domain, rec)
|
||||||
//fmt.Printf("DEBUG: deleteNAPTR: %s\n", c)
|
//printer.Printf("DEBUG: deleteNAPTR: %s\n", c)
|
||||||
} else {
|
} else {
|
||||||
c = generatePSDelete(dnsserver, domain, rec)
|
c = generatePSDelete(dnsserver, domain, rec)
|
||||||
}
|
}
|
||||||
|
@ -205,7 +206,7 @@ func (psh *psHandle) RecordDelete(dnsserver, domain string, rec *models.RecordCo
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if stderr != "" {
|
if stderr != "" {
|
||||||
fmt.Printf("STDERROR = %q\n", stderr)
|
printer.Printf("STDERROR = %q\n", stderr)
|
||||||
return fmt.Errorf("unexpected stderr from PSDelete: %q", stderr)
|
return fmt.Errorf("unexpected stderr from PSDelete: %q", stderr)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -219,7 +220,7 @@ func generatePSDelete(dnsserver, domain string, rec *models.RecordConfig) string
|
||||||
|
|
||||||
if rec.Type == "NAPTR" {
|
if rec.Type == "NAPTR" {
|
||||||
x := b.String() + generatePSDeleteNaptr(dnsserver, domain, rec)
|
x := b.String() + generatePSDeleteNaptr(dnsserver, domain, rec)
|
||||||
//fmt.Printf("NAPTR DELETE: %s\n", x)
|
//printer.Printf("NAPTR DELETE: %s\n", x)
|
||||||
return x
|
return x
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,7 +242,7 @@ func generatePSDelete(dnsserver, domain string, rec *models.RecordConfig) string
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprintf(&b, ` -RecordData "%s"`, rec.GetTargetField())
|
fmt.Fprintf(&b, ` -RecordData "%s"`, rec.GetTargetField())
|
||||||
}
|
}
|
||||||
//fmt.Printf("DEBUG PSDelete CMD = (\n%s\n)\n", b.String())
|
//printer.Printf("DEBUG PSDelete CMD = (\n%s\n)\n", b.String())
|
||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,10 +251,10 @@ func (psh *psHandle) RecordCreate(dnsserver, domain string, rec *models.RecordCo
|
||||||
var c string
|
var c string
|
||||||
if rec.Type == "NAPTR" {
|
if rec.Type == "NAPTR" {
|
||||||
c = generatePSCreateNaptr(dnsserver, domain, rec)
|
c = generatePSCreateNaptr(dnsserver, domain, rec)
|
||||||
//fmt.Printf("DEBUG: createNAPTR: %s\n", c)
|
//printer.Printf("DEBUG: createNAPTR: %s\n", c)
|
||||||
} else {
|
} else {
|
||||||
c = generatePSCreate(dnsserver, domain, rec)
|
c = generatePSCreate(dnsserver, domain, rec)
|
||||||
//fmt.Printf("DEBUG: PScreate\n")
|
//printer.Printf("DEBUG: PScreate\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
stdout, stderr, err := psh.shell.Execute(c)
|
stdout, stderr, err := psh.shell.Execute(c)
|
||||||
|
@ -261,8 +262,8 @@ func (psh *psHandle) RecordCreate(dnsserver, domain string, rec *models.RecordCo
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if stderr != "" {
|
if stderr != "" {
|
||||||
fmt.Printf("STDOUT RecordCreate = %s\n", stdout)
|
printer.Printf("STDOUT RecordCreate = %s\n", stdout)
|
||||||
fmt.Printf("STDERROR RecordCreate = %q\n", stderr)
|
printer.Printf("STDERROR RecordCreate = %q\n", stderr)
|
||||||
return fmt.Errorf("unexpected stderr from PSCreate: %q", stderr)
|
return fmt.Errorf("unexpected stderr from PSCreate: %q", stderr)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -302,8 +303,8 @@ func generatePSCreate(dnsserver, domain string, rec *models.RecordConfig) string
|
||||||
//case "WKS":
|
//case "WKS":
|
||||||
// fmt.Fprintf(&b, ` -Wks -InternetAddress <IPAddress> -InternetProtocol {UDP | TCP} -Service <String[]>`, rec.GetTargetField())
|
// fmt.Fprintf(&b, ` -Wks -InternetAddress <IPAddress> -InternetProtocol {UDP | TCP} -Service <String[]>`, rec.GetTargetField())
|
||||||
case "TXT":
|
case "TXT":
|
||||||
//fmt.Printf("DEBUG TXT len = %v\n", rec.TxtStrings)
|
//printer.Printf("DEBUG TXT len = %v\n", rec.TxtStrings)
|
||||||
//fmt.Printf("DEBUG TXT target = %q\n", rec.GetTargetField())
|
//printer.Printf("DEBUG TXT target = %q\n", rec.GetTargetField())
|
||||||
fmt.Fprintf(&b, ` -Txt -DescriptiveText %s`, rec.GetTargetField())
|
fmt.Fprintf(&b, ` -Txt -DescriptiveText %s`, rec.GetTargetField())
|
||||||
//case "RT":
|
//case "RT":
|
||||||
// fmt.Fprintf(&b, ` -RT -IntermediateHost <String> -Preference <UInt16>`, rec.GetTargetField())
|
// fmt.Fprintf(&b, ` -RT -IntermediateHost <String> -Preference <UInt16>`, rec.GetTargetField())
|
||||||
|
@ -331,7 +332,7 @@ func generatePSCreate(dnsserver, domain string, rec *models.RecordConfig) string
|
||||||
// We panic so that we quickly find any switch statements
|
// We panic so that we quickly find any switch statements
|
||||||
// that have not been updated for a new RR type.
|
// that have not been updated for a new RR type.
|
||||||
}
|
}
|
||||||
//fmt.Printf("DEBUG PSCreate CMD = (\n%s\n)\n", b.String())
|
//printer.Printf("DEBUG PSCreate CMD = (\n%s\n)\n", b.String())
|
||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,7 +342,7 @@ func (psh *psHandle) RecordModify(dnsserver, domain string, old, rec *models.Rec
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if stderr != "" {
|
if stderr != "" {
|
||||||
fmt.Printf("STDERROR = %q\n", stderr)
|
printer.Printf("STDERROR = %q\n", stderr)
|
||||||
return fmt.Errorf("unexpected stderr from PSModify: %q", stderr)
|
return fmt.Errorf("unexpected stderr from PSModify: %q", stderr)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -494,11 +495,11 @@ func generatePSModify(dnsserver, domain string, old, rec *models.RecordConfig) s
|
||||||
// // that have not been updated for a new RR type.
|
// // that have not been updated for a new RR type.
|
||||||
// }
|
// }
|
||||||
// fmt.Fprintf(&b, " ; ")
|
// fmt.Fprintf(&b, " ; ")
|
||||||
// //fmt.Printf("DEBUG CCMD: %s\n", b.String())
|
// //printer.Printf("DEBUG CCMD: %s\n", b.String())
|
||||||
//
|
//
|
||||||
// fmt.Fprintf(&b, "Set-DnsServerResourceRecord")
|
// fmt.Fprintf(&b, "Set-DnsServerResourceRecord")
|
||||||
// fmt.Fprintf(&b, ` -ZoneName "%s"`, domain)
|
// fmt.Fprintf(&b, ` -ZoneName "%s"`, domain)
|
||||||
// fmt.Fprintf(&b, ` -NewInputObject $NewObj -OldInputObject $OldObj`)
|
// fmt.Fprintf(&b, ` -NewInputObject $NewObj -OldInputObject $OldObj`)
|
||||||
//
|
//
|
||||||
// fmt.Printf("DEBUG MCMD: %s", b.String())
|
// printer.Printf("DEBUG MCMD: %s", b.String())
|
||||||
// return b.String()
|
// return b.String()
|
||||||
|
|
|
@ -146,7 +146,7 @@ func (n *namecheapProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mo
|
||||||
dc.Filter(func(r *models.RecordConfig) bool {
|
dc.Filter(func(r *models.RecordConfig) bool {
|
||||||
if r.Type == "NS" && r.GetLabel() == "@" {
|
if r.Type == "NS" && r.GetLabel() == "@" {
|
||||||
if !strings.HasSuffix(r.GetTargetField(), "registrar-servers.com.") {
|
if !strings.HasSuffix(r.GetTargetField(), "registrar-servers.com.") {
|
||||||
fmt.Println("\n", r.GetTargetField(), "Namecheap does not support changing apex NS records. Skipping.")
|
printer.Println("\n", r.GetTargetField(), "Namecheap does not support changing apex NS records. Skipping.")
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package namedotcom
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/StackExchange/dnscontrol/v3/models"
|
"github.com/StackExchange/dnscontrol/v3/models"
|
||||||
"github.com/StackExchange/dnscontrol/v3/pkg/recordaudit"
|
"github.com/StackExchange/dnscontrol/v3/pkg/recordaudit"
|
||||||
)
|
)
|
||||||
|
|
|
@ -3,7 +3,6 @@ package netcup
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/StackExchange/dnscontrol/v3/models"
|
"github.com/StackExchange/dnscontrol/v3/models"
|
||||||
"github.com/StackExchange/dnscontrol/v3/pkg/diff"
|
"github.com/StackExchange/dnscontrol/v3/pkg/diff"
|
||||||
// no need for txtutil.SplitSingleLongTxt in function GetDomainCorrections
|
// no need for txtutil.SplitSingleLongTxt in function GetDomainCorrections
|
||||||
|
|
|
@ -22,6 +22,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -162,7 +163,7 @@ func (c *octodnsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mode
|
||||||
&models.Correction{
|
&models.Correction{
|
||||||
Msg: msg,
|
Msg: msg,
|
||||||
F: func() error {
|
F: func() error {
|
||||||
fmt.Printf("CREATING CONFIGFILE: %v\n", zoneFileName)
|
printer.Printf("CREATING CONFIGFILE: %v\n", zoneFileName)
|
||||||
zf, err := os.Create(zoneFileName)
|
zf, err := os.Create(zoneFileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Could not create zonefile: %v", err)
|
log.Fatalf("Could not create zonefile: %v", err)
|
||||||
|
|
|
@ -2,7 +2,7 @@ package octoyaml
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
|
||||||
"github.com/StackExchange/dnscontrol/v3/models"
|
"github.com/StackExchange/dnscontrol/v3/models"
|
||||||
|
@ -62,7 +62,7 @@ func require(call otto.FunctionCall) otto.Value {
|
||||||
throw(call.Otto, "require takes exactly one argument")
|
throw(call.Otto, "require takes exactly one argument")
|
||||||
}
|
}
|
||||||
file := call.Argument(0).String()
|
file := call.Argument(0).String()
|
||||||
fmt.Printf("requiring: %s\n", file)
|
printer.Printf("requiring: %s\n", file)
|
||||||
data, err := ioutil.ReadFile(file)
|
data, err := ioutil.ReadFile(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
throw(call.Otto, err.Error())
|
throw(call.Otto, err.Error())
|
||||||
|
|
|
@ -36,15 +36,15 @@ func ReadYaml(r io.Reader, origin string) (models.Records, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not unmarshal yaml: %w", err)
|
return nil, fmt.Errorf("could not unmarshal yaml: %w", err)
|
||||||
}
|
}
|
||||||
//fmt.Printf("ReadYaml: mysterydata == %v\n", mysterydata)
|
//printer.Printf("ReadYaml: mysterydata == %v\n", mysterydata)
|
||||||
|
|
||||||
// Traverse every key/value pair.
|
// Traverse every key/value pair.
|
||||||
for k, v := range mysterydata { // Each label
|
for k, v := range mysterydata { // Each label
|
||||||
// k, v: k is the label, v is everything we know about the label.
|
// k, v: k is the label, v is everything we know about the label.
|
||||||
// In other code, k1, v2 refers to one level deeper, k3, k3 refers to
|
// In other code, k1, v2 refers to one level deeper, k3, k3 refers to
|
||||||
// one more level deeper, and so on.
|
// one more level deeper, and so on.
|
||||||
//fmt.Printf("ReadYaml: NEXT KEY\n")
|
//printer.Printf("ReadYaml: NEXT KEY\n")
|
||||||
//fmt.Printf("ReadYaml: KEY=%s v.(type)=%s\n", k, reflect.TypeOf(v).String())
|
//printer.Printf("ReadYaml: KEY=%s v.(type)=%s\n", k, reflect.TypeOf(v).String())
|
||||||
switch v.(type) {
|
switch v.(type) {
|
||||||
case map[interface{}]interface{}:
|
case map[interface{}]interface{}:
|
||||||
// The value is itself a map. This means we have a label with
|
// The value is itself a map. This means we have a label with
|
||||||
|
@ -82,10 +82,10 @@ func ReadYaml(r io.Reader, origin string) (models.Records, error) {
|
||||||
// value: mx2.example.com.
|
// value: mx2.example.com.
|
||||||
for i, v3 := range v.([]interface{}) { // All the label's list
|
for i, v3 := range v.([]interface{}) { // All the label's list
|
||||||
_ = i
|
_ = i
|
||||||
//fmt.Printf("ReadYaml: list key=%s i=%d v3.(type)=%s\n", k, i, typeof(v3))
|
//printer.Printf("ReadYaml: list key=%s i=%d v3.(type)=%s\n", k, i, typeof(v3))
|
||||||
switch v3.(type) {
|
switch v3.(type) {
|
||||||
case map[interface{}]interface{}:
|
case map[interface{}]interface{}:
|
||||||
//fmt.Printf("ReadYaml: v3=%v\n", v3)
|
//printer.Printf("ReadYaml: v3=%v\n", v3)
|
||||||
results, err = parseLeaf(results, k, v3, origin)
|
results, err = parseLeaf(results, k, v3, origin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return results, fmt.Errorf("leaf v3=%v: %w", v3, err)
|
return results, fmt.Errorf("leaf v3=%v: %w", v3, err)
|
||||||
|
@ -101,7 +101,7 @@ func ReadYaml(r io.Reader, origin string) (models.Records, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
sortRecs(results, origin)
|
sortRecs(results, origin)
|
||||||
//fmt.Printf("ReadYaml: RESULTS=%v\n", results)
|
//printer.Printf("ReadYaml: RESULTS=%v\n", results)
|
||||||
return results, nil
|
return results, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,14 +111,14 @@ func parseLeaf(results models.Records, k string, v interface{}, origin string) (
|
||||||
rTargets := []string{}
|
rTargets := []string{}
|
||||||
var someresults models.Records
|
var someresults models.Records
|
||||||
for k2, v2 := range v.(map[interface{}]interface{}) { // All the label's items
|
for k2, v2 := range v.(map[interface{}]interface{}) { // All the label's items
|
||||||
// fmt.Printf("ReadYaml: ifs tk2=%s tv2=%s len(rTargets)=%d\n", typeof(k2), typeof(v2), len(rTargets))
|
// printer.Printf("ReadYaml: ifs tk2=%s tv2=%s len(rTargets)=%d\n", typeof(k2), typeof(v2), len(rTargets))
|
||||||
if typeof(k2) == "string" && (typeof(v2) == "string" || typeof(v2) == "int") {
|
if typeof(k2) == "string" && (typeof(v2) == "string" || typeof(v2) == "int") {
|
||||||
// The 2nd level key is a string, and the 2nd level value is a string or int.
|
// The 2nd level key is a string, and the 2nd level value is a string or int.
|
||||||
// Here are 3 examples:
|
// Here are 3 examples:
|
||||||
// type: CNAME
|
// type: CNAME
|
||||||
// value: foo.example.com.
|
// value: foo.example.com.
|
||||||
// ttl: 3
|
// ttl: 3
|
||||||
//fmt.Printf("parseLeaf: k2=%s v2=%v\n", k2, v2)
|
//printer.Printf("parseLeaf: k2=%s v2=%v\n", k2, v2)
|
||||||
switch k2.(string) {
|
switch k2.(string) {
|
||||||
case "type":
|
case "type":
|
||||||
rType = v2.(string)
|
rType = v2.(string)
|
||||||
|
@ -153,7 +153,7 @@ func parseLeaf(results models.Records, k string, v interface{}, origin string) (
|
||||||
// - 1.2.3.3
|
// - 1.2.3.3
|
||||||
// We collect all the values for later, when we'll need to generate
|
// We collect all the values for later, when we'll need to generate
|
||||||
// one RecordConfig for each value.
|
// one RecordConfig for each value.
|
||||||
//fmt.Printf("parseLeaf: s-append %s\n", v3.(string))
|
//printer.Printf("parseLeaf: s-append %s\n", v3.(string))
|
||||||
rTargets = append(rTargets, v3.(string))
|
rTargets = append(rTargets, v3.(string))
|
||||||
case map[interface{}]interface{}:
|
case map[interface{}]interface{}:
|
||||||
// Example:
|
// Example:
|
||||||
|
@ -166,7 +166,7 @@ func parseLeaf(results models.Records, k string, v interface{}, origin string) (
|
||||||
// we should have enough to generate a single RecordConfig.
|
// we should have enough to generate a single RecordConfig.
|
||||||
newRc := newRecordConfig(k, rType, "", rTTL, origin)
|
newRc := newRecordConfig(k, rType, "", rTTL, origin)
|
||||||
for k4, v4 := range v3.(map[interface{}]interface{}) {
|
for k4, v4 := range v3.(map[interface{}]interface{}) {
|
||||||
//fmt.Printf("parseLeaf: k4=%s v4=%s\n", k4, v4)
|
//printer.Printf("parseLeaf: k4=%s v4=%s\n", k4, v4)
|
||||||
switch k4.(string) {
|
switch k4.(string) {
|
||||||
case "priority": // MX,SRV
|
case "priority": // MX,SRV
|
||||||
priority := uint16(v4.(int))
|
priority := uint16(v4.(int))
|
||||||
|
@ -181,7 +181,7 @@ func parseLeaf(results models.Records, k string, v interface{}, origin string) (
|
||||||
newRc.SetTarget(v4.(string))
|
newRc.SetTarget(v4.(string))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//fmt.Printf("parseLeaf: append %v\n", newRc)
|
//printer.Printf("parseLeaf: append %v\n", newRc)
|
||||||
someresults = append(someresults, newRc)
|
someresults = append(someresults, newRc)
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("parseLeaf: unknown type in map: rtype=%s k=%s v3.(type)=%T v3=%v", rType, k, v3, v3)
|
return nil, fmt.Errorf("parseLeaf: unknown type in map: rtype=%s k=%s v3.(type)=%T v3=%v", rType, k, v3, v3)
|
||||||
|
@ -191,9 +191,9 @@ func parseLeaf(results models.Records, k string, v interface{}, origin string) (
|
||||||
return nil, fmt.Errorf("parseLeaf: unknown type in level 2: k=%s k2=%s v.2(type)=%T v2=%v", k, k2, v2, v2)
|
return nil, fmt.Errorf("parseLeaf: unknown type in level 2: k=%s k2=%s v.2(type)=%T v2=%v", k, k2, v2, v2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// fmt.Printf("parseLeaf: Target=(%v)\n", rTarget)
|
// printer.Printf("parseLeaf: Target=(%v)\n", rTarget)
|
||||||
// fmt.Printf("parseLeaf: len(rTargets)=%d\n", len(rTargets))
|
// printer.Printf("parseLeaf: len(rTargets)=%d\n", len(rTargets))
|
||||||
// fmt.Printf("parseLeaf: len(someresults)=%d\n", len(someresults))
|
// printer.Printf("parseLeaf: len(someresults)=%d\n", len(someresults))
|
||||||
|
|
||||||
// We've now looped through everything about one label. Make the RecordConfig(s).
|
// We've now looped through everything about one label. Make the RecordConfig(s).
|
||||||
|
|
||||||
|
@ -216,12 +216,12 @@ func parseLeaf(results models.Records, k string, v interface{}, origin string) (
|
||||||
}
|
}
|
||||||
} else if rTarget != "" && len(rTargets) == 0 {
|
} else if rTarget != "" && len(rTargets) == 0 {
|
||||||
// The file used "value". Generate a single RecordConfig
|
// The file used "value". Generate a single RecordConfig
|
||||||
//fmt.Printf("parseLeaf: 1-newRecordConfig(%v, %v, %v, %v, %v)\n", k, rType, rTarget, rTTL, origin)
|
//printer.Printf("parseLeaf: 1-newRecordConfig(%v, %v, %v, %v, %v)\n", k, rType, rTarget, rTTL, origin)
|
||||||
results = append(results, newRecordConfig(k, rType, rTarget, rTTL, origin))
|
results = append(results, newRecordConfig(k, rType, rTarget, rTTL, origin))
|
||||||
} else {
|
} else {
|
||||||
// The file used "values" so now we must generate a RecordConfig for each value.
|
// The file used "values" so now we must generate a RecordConfig for each value.
|
||||||
for _, target := range rTargets {
|
for _, target := range rTargets {
|
||||||
//fmt.Printf("parseLeaf: 3-newRecordConfig(%v, %v, %v, %v, %v)\n", k, rType, target, rTTL, origin)
|
//printer.Printf("parseLeaf: 3-newRecordConfig(%v, %v, %v, %v, %v)\n", k, rType, target, rTTL, origin)
|
||||||
results = append(results, newRecordConfig(k, rType, target, rTTL, origin))
|
results = append(results, newRecordConfig(k, rType, target, rTTL, origin))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,9 +168,9 @@ func oneLabel(records models.Records) yaml.MapItem {
|
||||||
if v.Type == "TXT" {
|
if v.Type == "TXT" {
|
||||||
v.Value = strings.Replace(models.StripQuotes(v.Value), `;`, `\;`, -1)
|
v.Value = strings.Replace(models.StripQuotes(v.Value), `;`, `\;`, -1)
|
||||||
}
|
}
|
||||||
//fmt.Printf("yamlwrite:oneLabel: simple ttl=%d\n", v.TTL)
|
//printer.Printf("yamlwrite:oneLabel: simple ttl=%d\n", v.TTL)
|
||||||
item.Value = v
|
item.Value = v
|
||||||
//fmt.Printf("yamlwrite:oneLabel: SIMPLE=%v\n", item)
|
//printer.Printf("yamlwrite:oneLabel: SIMPLE=%v\n", item)
|
||||||
return item
|
return item
|
||||||
case "MX", "SRV":
|
case "MX", "SRV":
|
||||||
// Always processed as a complex{}
|
// Always processed as a complex{}
|
||||||
|
@ -191,7 +191,7 @@ func oneLabel(records models.Records) yaml.MapItem {
|
||||||
v.Values = append(v.Values, rec.GetTargetField())
|
v.Values = append(v.Values, rec.GetTargetField())
|
||||||
}
|
}
|
||||||
item.Value = v
|
item.Value = v
|
||||||
//fmt.Printf("SIMPLE=%v\n", item)
|
//printer.Printf("SIMPLE=%v\n", item)
|
||||||
return item
|
return item
|
||||||
case "MX", "SRV":
|
case "MX", "SRV":
|
||||||
// Always processed as a complex{}
|
// Always processed as a complex{}
|
||||||
|
@ -207,14 +207,14 @@ func oneLabel(records models.Records) yaml.MapItem {
|
||||||
var last = records[0].Type
|
var last = records[0].Type
|
||||||
for i := range records {
|
for i := range records {
|
||||||
if records[i].Type != last {
|
if records[i].Type != last {
|
||||||
//fmt.Printf("yamlwrite:oneLabel: Calling oneType( [%d:%d] ) last=%s type=%s\n", low, i, last, records[0].Type)
|
//printer.Printf("yamlwrite:oneLabel: Calling oneType( [%d:%d] ) last=%s type=%s\n", low, i, last, records[0].Type)
|
||||||
lst = append(lst, oneType(records[low:i]))
|
lst = append(lst, oneType(records[low:i]))
|
||||||
low = i // Current is the first of a run.
|
low = i // Current is the first of a run.
|
||||||
last = records[i].Type
|
last = records[i].Type
|
||||||
}
|
}
|
||||||
if i == (len(records) - 1) {
|
if i == (len(records) - 1) {
|
||||||
// we are on the last element.
|
// we are on the last element.
|
||||||
//fmt.Printf("yamlwrite:oneLabel: Calling oneType( [%d:%d] ) last=%s type=%s\n", low, i+1, last, records[0].Type)
|
//printer.Printf("yamlwrite:oneLabel: Calling oneType( [%d:%d] ) last=%s type=%s\n", low, i+1, last, records[0].Type)
|
||||||
lst = append(lst, oneType(records[low:i+1]))
|
lst = append(lst, oneType(records[low:i+1]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -226,7 +226,7 @@ func oneLabel(records models.Records) yaml.MapItem {
|
||||||
// oneType returns interfaces that will MarshalYAML properly for a label with
|
// oneType returns interfaces that will MarshalYAML properly for a label with
|
||||||
// one or more records, all the same rtype.
|
// one or more records, all the same rtype.
|
||||||
func oneType(records models.Records) interface{} {
|
func oneType(records models.Records) interface{} {
|
||||||
//fmt.Printf("yamlwrite:oneType len=%d type=%s\n", len(records), records[0].Type)
|
//printer.Printf("yamlwrite:oneType len=%d type=%s\n", len(records), records[0].Type)
|
||||||
rtype := records[0].Type
|
rtype := records[0].Type
|
||||||
switch rtype {
|
switch rtype {
|
||||||
case "A", "AAAA", "NS":
|
case "A", "AAAA", "NS":
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"log"
|
"log"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -63,7 +64,7 @@ func newRoute53(m map[string]string, metadata json.RawMessage) (*route53Provider
|
||||||
|
|
||||||
var dls *string
|
var dls *string
|
||||||
if val, ok := m["DelegationSet"]; ok {
|
if val, ok := m["DelegationSet"]; ok {
|
||||||
fmt.Printf("ROUTE53 DelegationSet %s configured\n", val)
|
printer.Printf("ROUTE53 DelegationSet %s configured\n", val)
|
||||||
dls = aws.String(val)
|
dls = aws.String(val)
|
||||||
}
|
}
|
||||||
api := &route53Provider{client: r53.NewFromConfig(config), registrar: r53d.NewFromConfig(config), delegationSet: dls}
|
api := &route53Provider{client: r53.NewFromConfig(config), registrar: r53d.NewFromConfig(config), delegationSet: dls}
|
||||||
|
@ -111,7 +112,7 @@ func withRetry(f func() error) {
|
||||||
if currentRetry >= maxRetries {
|
if currentRetry >= maxRetries {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Printf("============ Route53 rate limit exceeded. Waiting %s to retry.\n", sleepTime)
|
printer.Printf("============ Route53 rate limit exceeded. Waiting %s to retry.\n", sleepTime)
|
||||||
time.Sleep(sleepTime)
|
time.Sleep(sleepTime)
|
||||||
} else {
|
} else {
|
||||||
return
|
return
|
||||||
|
@ -673,9 +674,9 @@ func (r *route53Provider) EnsureDomainExists(domain string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if r.delegationSet != nil {
|
if r.delegationSet != nil {
|
||||||
fmt.Printf("Adding zone for %s to route 53 account with delegationSet %s\n", domain, *r.delegationSet)
|
printer.Printf("Adding zone for %s to route 53 account with delegationSet %s\n", domain, *r.delegationSet)
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("Adding zone for %s to route 53 account\n", domain)
|
printer.Printf("Adding zone for %s to route 53 account\n", domain)
|
||||||
}
|
}
|
||||||
in := &r53.CreateHostedZoneInput{
|
in := &r53.CreateHostedZoneInput{
|
||||||
Name: &domain,
|
Name: &domain,
|
||||||
|
|
|
@ -3,6 +3,7 @@ package softlayer
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/StackExchange/dnscontrol/v3/pkg/printer"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newReg(conf map[string]string, _ json.RawMessage) (providers.DNSServiceProvider, error) {
|
func newReg(conf map[string]string, _ json.RawMessage) (providers.DNSServiceProvider, error) {
|
||||||
fmt.Println("WARNING: THe SOFTLAYER provider is unmaintained: https://github.com/StackExchange/dnscontrol/issues/1079")
|
printer.Warnf("The SOFTLAYER provider is unmaintained: https://github.com/StackExchange/dnscontrol/issues/1079")
|
||||||
s := session.New(conf["username"], conf["api_key"], conf["endpoint_url"], conf["timeout"])
|
s := session.New(conf["username"], conf["api_key"], conf["endpoint_url"], conf["timeout"])
|
||||||
|
|
||||||
if len(s.UserName) == 0 || len(s.APIKey) == 0 {
|
if len(s.UserName) == 0 || len(s.APIKey) == 0 {
|
||||||
|
@ -380,7 +381,7 @@ func (s *softlayerProvider) updateRecordFunc(existing *datatypes.Dns_Domain_Reso
|
||||||
func verifyMinTTL(ttl int) int {
|
func verifyMinTTL(ttl int) int {
|
||||||
const minTTL = 60
|
const minTTL = 60
|
||||||
if ttl < minTTL {
|
if ttl < minTTL {
|
||||||
fmt.Printf("\nMODIFY TTL to Min supported TTL value: (ttl=%d) -> (ttl=%d)\n", ttl, minTTL)
|
printer.Printf("\nMODIFY TTL to Min supported TTL value: (ttl=%d) -> (ttl=%d)\n", ttl, minTTL)
|
||||||
return minTTL
|
return minTTL
|
||||||
}
|
}
|
||||||
return ttl
|
return ttl
|
||||||
|
|
Loading…
Reference in a new issue