1
0
mirror of https://github.com/StackExchange/dnscontrol.git synced 2024-05-11 05:55:12 +00:00
This commit is contained in:
Tom Limoncelli
2023-03-06 23:50:32 -05:00
parent 5c04ec60e3
commit 5c6e4ac0f4
15 changed files with 122 additions and 46 deletions

View File

@@ -227,7 +227,7 @@ func (c *cloudflareProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*m
return c.GetZoneRecordsCorrections(dc, records)
}
func (c *cloudflareProvider) GetZoneRecordsCorrections(dc *models.DomainConfig) ([]*models.Correction, error) {
func (c *cloudflareProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, records models.Records) ([]*models.Correction, error) {
if err := c.preprocessConfig(dc); err != nil {
return nil, err
@@ -241,6 +241,11 @@ func (c *cloudflareProvider) GetZoneRecordsCorrections(dc *models.DomainConfig)
}
}
domainID, err := c.getDomainID(dc.Name)
if err != nil {
return nil, err
}
if c.manageRedirects {
prs, err := c.getPageRules(domainID, dc.Name)
//printer.Printf("GET PAGE RULES:\n")

View File

@@ -84,7 +84,7 @@ func (c *cloudnsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mode
return nil, err
}
}
domainID, ok := c.domainIndex[dc.Name]
_, ok := c.domainIndex[dc.Name]
if !ok {
return nil, fmt.Errorf("'%s' not a zone in ClouDNS account", dc.Name)
}
@@ -104,6 +104,15 @@ func (c *cloudnsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mode
record.TTL = fixTTL(record.TTL)
}
return c.GetZoneRecordsCorrections(dc, existingRecords)
}
func (c *cloudnsProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, existingRecords models.Records) ([]*models.Correction, error) {
domainID, ok := c.domainIndex[dc.Name]
if !ok {
return nil, fmt.Errorf("'%s' not a zone in ClouDNS account", dc.Name)
}
var corrections []*models.Correction
var differ diff.Differ
if !diff2.EnableDiff2 {

View File

@@ -89,7 +89,12 @@ func (client *providerClient) GetDomainCorrections(dc *models.DomainConfig) ([]*
clean := PrepFoundRecords(existing)
PrepDesiredRecords(dc)
return client.GenerateDomainCorrections(dc, clean)
// Normalize
models.PostProcessRecords(clean)
//txtutil.SplitSingleLongTxt(dc.Records) // Autosplit long TXT records
return client.GetZoneRecordsCorrections(dc, clean)
}
// PrepFoundRecords munges any records to make them compatible with
@@ -111,11 +116,7 @@ func PrepDesiredRecords(dc *models.DomainConfig) {
}
// GetDomainCorrections gets existing records, diffs them against existing, and returns corrections.
func (client *providerClient) GenerateDomainCorrections(dc *models.DomainConfig, foundRecords models.Records) ([]*models.Correction, error) {
// Normalize
models.PostProcessRecords(foundRecords)
//txtutil.SplitSingleLongTxt(dc.Records) // Autosplit long TXT records
func (client *providerClient) GetZoneRecordsCorrections(dc *models.DomainConfig, foundRecords models.Records) ([]*models.Correction, error) {
var corrections []*models.Correction
var err error

View File

@@ -93,7 +93,7 @@ func (c *desecProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*models
}
c.mutex.Unlock()
PrepDesiredRecords(dc, minTTL)
return c.GenerateDomainCorrections(dc, clean)
return c.GetZoneRecordsCorrections(dc, clean)
}
// GetZoneRecords gets the records of a zone and returns them in RecordConfig format.
@@ -162,7 +162,7 @@ func PrepDesiredRecords(dc *models.DomainConfig, minTTL uint32) {
// a list of functions to call to actually make the desired
// correction, and a message to output to the user when the change is
// made.
func (c *desecProvider) GenerateDomainCorrections(dc *models.DomainConfig, existing models.Records) ([]*models.Correction, error) {
func (c *desecProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, existing models.Records) ([]*models.Correction, error) {
var corrections []*models.Correction
var err error

View File

@@ -134,7 +134,6 @@ func (api *digitaloceanProvider) GetZoneRecords(domain string) (models.Records,
// GetDomainCorrections returns a list of corretions for the domain.
func (api *digitaloceanProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Correction, error) {
ctx := context.Background()
dc.Punycode()
existingRecords, err := api.GetZoneRecords(dc.Name)
@@ -146,6 +145,12 @@ func (api *digitaloceanProvider) GetDomainCorrections(dc *models.DomainConfig) (
models.PostProcessRecords(existingRecords)
txtutil.SplitSingleLongTxt(dc.Records) // Autosplit long TXT records
return api.GetZoneRecordsCorrections(dc, existingRecords)
}
func (api *digitaloceanProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, existingRecords models.Records) ([]*models.Correction, error) {
ctx := context.Background()
var corrections []*models.Correction
var differ diff.Differ
if !diff2.EnableDiff2 {

View File

@@ -141,19 +141,11 @@ func (c *dnsimpleProvider) GetZoneRecords(domain string) (models.Records, error)
// GetDomainCorrections returns corrections that update a domain.
func (c *dnsimpleProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Correction, error) {
var corrections []*models.Correction
err := dc.Punycode()
if err != nil {
return nil, err
}
dnssecFixes, err := c.getDNSSECCorrections(dc)
if err != nil {
return nil, err
}
corrections = append(corrections, dnssecFixes...)
records, err := c.GetZoneRecords(dc.Name)
if err != nil {
return nil, err
@@ -164,6 +156,17 @@ func (c *dnsimpleProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mod
// Normalize
models.PostProcessRecords(actual)
return c.GetZoneRecordsCorrections(dc, actual)
}
func (c *dnsimpleProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, actual models.Records) ([]*models.Correction, error) {
var corrections []*models.Correction
dnssecFixes, err := c.getDNSSECCorrections(dc)
if err != nil {
return nil, err
}
corrections = append(corrections, dnssecFixes...)
var create, del, modify diff.Changeset
if !diff2.EnableDiff2 {

View File

@@ -86,11 +86,6 @@ func (api *dnsMadeEasyProvider) GetDomainCorrections(dc *models.DomainConfig) ([
domainName := dc.Name
domain, err := api.findDomain(domainName)
if err != nil {
return nil, err
}
// Get existing records
existingRecords, err := api.GetZoneRecords(domainName)
if err != nil {
@@ -101,6 +96,17 @@ func (api *dnsMadeEasyProvider) GetDomainCorrections(dc *models.DomainConfig) ([
models.PostProcessRecords(existingRecords)
txtutil.SplitSingleLongTxt(dc.Records) // Autosplit long TXT records
return api.GetZoneRecordsCorrections(dc, existingRecords)
}
func (api *dnsMadeEasyProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, existingRecords models.Records) ([]*models.Correction, error) {
domainName := dc.Name
domain, err := api.findDomain(domainName)
if err != nil {
return nil, err
}
var corrections []*models.Correction
var create, del, modify diff.Changeset
if !diff2.EnableDiff2 {

View File

@@ -47,8 +47,14 @@ func (api *domainNameShopProvider) GetDomainCorrections(dc *models.DomainConfig)
record.TTL = fixTTL(record.TTL)
}
return api.GetZoneRecordsCorrections(dc, existingRecords)
}
func (api *domainNameShopProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, existingRecords models.Records) ([]*models.Correction, error) {
var corrections []*models.Correction
var create, delete, modify diff.Changeset
var err error
if !diff2.EnableDiff2 {
differ := diff.New(dc)
_, create, delete, modify, err = differ.IncrementalDiff(existingRecords)

View File

@@ -87,22 +87,13 @@ func (c *exoscaleProvider) GetNameservers(domain string) ([]*models.Nameserver,
}
// GetZoneRecords gets the records of a zone and returns them in RecordConfig format.
func (c *exoscaleProvider) GetZoneRecords(domain string) (models.Records, error) {
return nil, fmt.Errorf("not implemented")
// This enables the get-zones subcommand.
// Implement this by extracting the code from GetDomainCorrections into
// a single function. For most providers this should be relatively easy.
}
func (c *exoscaleProvider) GetZoneRecords(domainName string) (models.Records, error) {
//dc.Punycode()
// GetDomainCorrections returns a list of corretions for the domain.
func (c *exoscaleProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Correction, error) {
dc.Punycode()
domain, err := c.findDomainByName(dc.Name)
domain, err := c.findDomainByName(domainName)
if err != nil {
return nil, err
}
domainID := *domain.ID
ctx := context.Background()
@@ -164,7 +155,7 @@ func (c *exoscaleProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mod
if record.TTL != nil {
rc.TTL = uint32(*record.TTL)
}
rc.SetLabel(rname, dc.Name)
rc.SetLabel(rname, domainName)
switch rtype {
case "ALIAS", "URL":
@@ -177,7 +168,7 @@ func (c *exoscaleProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mod
}
err = rc.SetTargetMX(prio, rcontent)
default:
err = rc.PopulateFromString(rtype, rcontent, dc.Name)
err = rc.PopulateFromString(rtype, rcontent, domainName)
}
if err != nil {
return nil, fmt.Errorf("unparsable record received from exoscale: %w", err)
@@ -185,11 +176,32 @@ func (c *exoscaleProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mod
existingRecords = append(existingRecords, rc)
}
removeOtherNS(dc)
// Normalize
models.PostProcessRecords(existingRecords)
return existingRecords, nil
}
// GetDomainCorrections returns a list of corretions for the domain.
func (c *exoscaleProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Correction, error) {
existingRecords, err := c.GetZoneRecords(dc.Name)
if err != nil {
return nil, err
}
removeOtherNS(dc)
return c.GetZoneRecordsCorrections(dc, existingRecords)
}
func (c *exoscaleProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, existingRecords models.Records) ([]*models.Correction, error) {
domain, err := c.findDomainByName(dc.Name)
if err != nil {
return nil, err
}
domainID := *domain.ID
var corrections []*models.Correction
var create, delete, modify diff.Changeset
if !diff2.EnableDiff2 {

View File

@@ -146,7 +146,7 @@ func (client *gandiv5Provider) GetDomainCorrections(dc *models.DomainConfig) ([]
models.PostProcessRecords(existing)
clean := PrepFoundRecords(existing)
PrepDesiredRecords(dc)
return client.GenerateDomainCorrections(dc, clean)
return client.GetZoneRecordsCorrections(dc, clean)
}
// GetZoneRecords gathers the DNS records and converts them to
@@ -228,7 +228,7 @@ func PrepDesiredRecords(dc *models.DomainConfig) {
// a list of functions to call to actually make the desired
// correction, and a message to output to the user when the change is
// made.
func (client *gandiv5Provider) GenerateDomainCorrections(dc *models.DomainConfig, existing models.Records) ([]*models.Correction, error) {
func (client *gandiv5Provider) GetZoneRecordsCorrections(dc *models.DomainConfig, existing models.Records) ([]*models.Correction, error) {
if client.debug {
debugRecords("GenDC input", existing)
}

View File

@@ -51,6 +51,9 @@ type gcloudProvider struct {
project string
nameServerSet *string
zones map[string]*gdns.ManagedZone
// diff1
oldRRsMap map[string]map[key]*gdns.ResourceRecordSet
zoneNameMap map[string]string
}
type errNoExist struct {
@@ -200,18 +203,26 @@ func (g *gcloudProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*model
if err != nil {
return nil, fmt.Errorf("getzonesets error: %w", err)
}
g.oldRRsMap[dc.Name] = oldRRs
g.zoneNameMap[dc.Name] = zoneName
// Normalize
models.PostProcessRecords(existingRecords)
txtutil.SplitSingleLongTxt(dc.Records) // Autosplit long TXT records
return GetZoneRecordsCorrections(dc, existingRecords)
return g.GetZoneRecordsCorrections(dc, existingRecords)
}
func (g *gcloudProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, existingRecords models.Records) ([]*models.Correction, error) {
// oldRRs :=
// zoneName :=
oldRRs, ok := g.oldRRsMap[dc.Name]
if !ok {
return nil, fmt.Errorf("oldRRsMap: no zone named %q", dc.Name)
}
zoneName, ok := g.zoneNameMap[dc.Name]
if !ok {
return nil, fmt.Errorf("zoneNameMap: no zone named %q", dc.Name)
}
// first collect keys that have changed
var differ diff.Differ

View File

@@ -83,7 +83,7 @@ func (c *gcoreProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*models
models.PostProcessRecords(existing)
clean := PrepFoundRecords(existing)
PrepDesiredRecords(dc)
return c.GenerateDomainCorrections(dc, clean)
return c.GetZoneRecordsCorrections(dc, clean)
}
// GetZoneRecords gets the records of a zone and returns them in RecordConfig format.
@@ -153,7 +153,7 @@ func generateChangeMsg(updates []string) string {
// a list of functions to call to actually make the desired
// correction, and a message to output to the user when the change is
// made.
func (c *gcoreProvider) GenerateDomainCorrections(dc *models.DomainConfig, existing models.Records) ([]*models.Correction, error) {
func (c *gcoreProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, existing models.Records) ([]*models.Correction, error) {
// Make delete happen earlier than creates & updates.
var corrections []*models.Correction

View File

@@ -190,6 +190,11 @@ func (c *hednsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*models
return nil, err
}
return c.GetZoneRecordsCorrections(dc, records)
}
func (c *hednsProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, records models.Records) ([]*models.Correction, error) {
// Get the SOA record to get the ZoneID, then remove it from the list.
zoneID := uint64(0)
var prunedRecords models.Records

View File

@@ -102,8 +102,15 @@ func (api *hetznerProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mo
models.PostProcessRecords(existingRecords)
txtutil.SplitSingleLongTxt(dc.Records) // Autosplit long TXT records
return api.GetZoneRecordsCorrections(dc, existingRecords)
}
func (api *hetznerProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, existingRecords models.Records) ([]*models.Correction, error) {
domain := dc.Name
var corrections []*models.Correction
var create, del, modify diff.Changeset
var err error
if !diff2.EnableDiff2 {
differ := diff.New(dc)
_, create, del, modify, err = differ.IncrementalDiff(existingRecords)

View File

@@ -74,8 +74,14 @@ func (n *HXClient) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Corr
models.PostProcessRecords(actual)
txtutil.SplitSingleLongTxt(dc.Records)
return n.GetZoneRecordsCorrections(dc, actual)
}
func (n *HXClient) GetZoneRecordsCorrections(dc *models.DomainConfig, actual models.Records) ([]*models.Correction, error) {
var corrections []*models.Correction
var create, del, mod diff.Changeset
var err error
if !diff2.EnableDiff2 {
differ := diff.New(dc)
_, create, del, mod, err = differ.IncrementalDiff(actual)