mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-12-09 13:46:07 +08:00
POWERDNS: Zone creation now abides by variant tags (#3830)
This commit is contained in:
parent
8f13dd1030
commit
a1e74eb11f
36 changed files with 47 additions and 45 deletions
|
|
@ -56,7 +56,7 @@ func CreateDomains(args CreateDomainsArgs) error {
|
|||
for _, provider := range domain.DNSProviderInstances {
|
||||
if creator, ok := provider.Driver.(providers.ZoneCreator); ok {
|
||||
fmt.Println(" -", provider.Name)
|
||||
err := creator.EnsureZoneExists(domain.Name)
|
||||
err := creator.EnsureZoneExists(domain.Name, domain.Metadata)
|
||||
if err != nil {
|
||||
fmt.Printf("Error creating domain: %s\n", err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -493,7 +493,7 @@ func oneZonePopulate(zone *models.DomainConfig, zc *cmdZoneCache) error {
|
|||
var errs []error
|
||||
// Loop over all the providers configured for that zone:
|
||||
for _, provider := range zone.DNSProviderInstances {
|
||||
populateCorrections, err := generatePopulateCorrections(provider, zone.Name, zc)
|
||||
populateCorrections, err := generatePopulateCorrections(provider, zone, zc)
|
||||
if err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
|
|
@ -645,7 +645,7 @@ func writeReport(report string, reportItems []*ReportItem) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func generatePopulateCorrections(provider *models.DNSProviderInstance, zoneName string, zcache *cmdZoneCache) ([]*models.Correction, error) {
|
||||
func generatePopulateCorrections(provider *models.DNSProviderInstance, zone *models.DomainConfig, zcache *cmdZoneCache) ([]*models.Correction, error) {
|
||||
lister, ok := provider.Driver.(providers.ZoneLister)
|
||||
if !ok {
|
||||
return nil, nil // We can't generate a list. No corrections are possible.
|
||||
|
|
@ -658,7 +658,7 @@ func generatePopulateCorrections(provider *models.DNSProviderInstance, zoneName
|
|||
}
|
||||
zones := *z
|
||||
|
||||
aceZoneName, _ := idna.ToASCII(zoneName)
|
||||
aceZoneName, _ := idna.ToASCII(zone.Name)
|
||||
if slices.Contains(zones, aceZoneName) {
|
||||
return nil, nil // zone exists. Nothing to do.
|
||||
}
|
||||
|
|
@ -671,7 +671,7 @@ func generatePopulateCorrections(provider *models.DNSProviderInstance, zoneName
|
|||
|
||||
return []*models.Correction{{
|
||||
Msg: fmt.Sprintf("Ensuring zone %q exists in %q", aceZoneName, provider.Name),
|
||||
F: func() error { return creator.EnsureZoneExists(aceZoneName) },
|
||||
F: func() error { return creator.EnsureZoneExists(aceZoneName, zone.Metadata) },
|
||||
}}, nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ func newEdgeDNSDSP(config map[string]string, metadata json.RawMessage) (provider
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (a *edgeDNSProvider) EnsureZoneExists(domain string) error {
|
||||
func (a *edgeDNSProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
if zoneDoesExist(domain) {
|
||||
printer.Debugf("Zone %s already exists\n", domain)
|
||||
return nil
|
||||
|
|
|
|||
|
|
@ -250,7 +250,7 @@ func (api *autoDNSProvider) GetZoneRecords(domain string, meta map[string]string
|
|||
return existingRecords, nil
|
||||
}
|
||||
|
||||
func (api *autoDNSProvider) EnsureZoneExists(domain string) error {
|
||||
func (api *autoDNSProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
// try to get zone
|
||||
_, err := api.getZone(domain)
|
||||
|
||||
|
|
|
|||
|
|
@ -691,7 +691,7 @@ func (a *azurednsProvider) fetchRecordSets(zoneName string) ([]*adns.RecordSet,
|
|||
return records, nil
|
||||
}
|
||||
|
||||
func (a *azurednsProvider) EnsureZoneExists(domain string) error {
|
||||
func (a *azurednsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
if _, ok := a.zones[domain]; ok {
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -523,7 +523,7 @@ func (a *azurednsProvider) fetchRecordSets(zoneName string) ([]*adns.RecordSet,
|
|||
return records, nil
|
||||
}
|
||||
|
||||
func (a *azurednsProvider) EnsureZoneExists(domain string) error {
|
||||
func (a *azurednsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
if _, ok := a.zones[domain]; ok {
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ func (b *bunnydnsProvider) ListZones() ([]string, error) {
|
|||
return zoneNames, nil
|
||||
}
|
||||
|
||||
func (b *bunnydnsProvider) EnsureZoneExists(domain string) error {
|
||||
func (b *bunnydnsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
_, err := b.findZoneByDomain(domain)
|
||||
if err == nil {
|
||||
return nil
|
||||
|
|
|
|||
|
|
@ -898,7 +898,7 @@ func getProxyMetadata(r *models.RecordConfig) map[string]string {
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (c *cloudflareProvider) EnsureZoneExists(domain string) error {
|
||||
func (c *cloudflareProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
if ok, err := c.zoneCache.HasZone(domain); err != nil || ok {
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -284,7 +284,7 @@ func (c *cloudnsProvider) GetZoneRecords(domain string, meta map[string]string)
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (c *cloudnsProvider) EnsureZoneExists(domain string) error {
|
||||
func (c *cloudnsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
if _, ok, err := c.fetchDomainIndex(domain); err != nil {
|
||||
return err
|
||||
} else if ok { // zone already exists
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package cnr
|
|||
// EnsureZoneExists returns an error
|
||||
// * if access to dnszone is not allowed (not authorized) or
|
||||
// * if it doesn't exist and creating it fails
|
||||
func (n *Client) EnsureZoneExists(domain string) error {
|
||||
func (n *Client) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
command := map[string]interface{}{
|
||||
"COMMAND": "AddDNSZone",
|
||||
"DNSZONE": domain,
|
||||
|
|
|
|||
|
|
@ -196,7 +196,7 @@ func (n *Client) getRecords(domain string) ([]*Record, error) {
|
|||
if r.GetCode() == 545 {
|
||||
// If dns zone does not exist create a new one automatically
|
||||
if !isNoPopulate() {
|
||||
err := n.EnsureZoneExists(domain)
|
||||
err := n.EnsureZoneExists(domain, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ func (c *desecProvider) GetZoneRecords(domain string, meta map[string]string) (m
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (c *desecProvider) EnsureZoneExists(domain string) error {
|
||||
func (c *desecProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
_, ok, err := c.searchDomainIndex(domain)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ func init() {
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (api *digitaloceanProvider) EnsureZoneExists(domain string) error {
|
||||
func (api *digitaloceanProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
retry:
|
||||
ctx := context.Background()
|
||||
_, resp, err := api.client.Domains.Get(ctx, domain)
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@ func (api *dnsMadeEasyProvider) GetZoneRecordsCorrections(dc *models.DomainConfi
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (api *dnsMadeEasyProvider) EnsureZoneExists(domain string) error {
|
||||
func (api *dnsMadeEasyProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
exists, err := api.domainExists(domain)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ func init() {
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (c *exoscaleProvider) EnsureZoneExists(domain string) error {
|
||||
func (c *exoscaleProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
_, err := c.findDomainByName(domain)
|
||||
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ func (p *fortigateProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, e
|
|||
Msg: msg,
|
||||
F: func() error {
|
||||
|
||||
if err := p.EnsureZoneExists(dc.Name); err != nil {
|
||||
if err := p.EnsureZoneExists(dc.Name, dc.Metadata); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -170,7 +170,7 @@ func (p *fortigateProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, e
|
|||
}
|
||||
|
||||
// Zone Existence Check & Creation
|
||||
func (p *fortigateProvider) EnsureZoneExists(domain string) error {
|
||||
func (p *fortigateProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
var probe struct{ Results []any }
|
||||
|
||||
err := p.client.do("GET", "system/dns-database/"+domain, nil, nil, &probe)
|
||||
|
|
|
|||
|
|
@ -446,7 +446,7 @@ func (g *gcloudProvider) getRecords(domain string) ([]*gdns.ResourceRecordSet, e
|
|||
return sets, nil
|
||||
}
|
||||
|
||||
func (g *gcloudProvider) EnsureZoneExists(domain string) error {
|
||||
func (g *gcloudProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
z, err := g.getZone(domain)
|
||||
if err != nil {
|
||||
if _, ok := err.(errNoExist); !ok {
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ func (c *gcoreProvider) GetZoneRecords(domain string, meta map[string]string) (m
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (c *gcoreProvider) EnsureZoneExists(domain string) error {
|
||||
func (c *gcoreProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
zones, err := c.provider.Zones(c.ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ func (c *hednsProvider) ListZones() ([]string, error) {
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (c *hednsProvider) EnsureZoneExists(domain string) error {
|
||||
func (c *hednsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
domains, err := c.ListZones()
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ func New(settings map[string]string, _ json.RawMessage) (providers.DNSServicePro
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (api *hetznerProvider) EnsureZoneExists(domain string) error {
|
||||
func (api *hetznerProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
if ok, err := api.zoneCache.HasZone(domain); err != nil || ok {
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package hexonet
|
|||
// EnsureZoneExists returns an error
|
||||
// * if access to dnszone is not allowed (not authorized) or
|
||||
// * if it doesn't exist and creating it fails
|
||||
func (n *HXClient) EnsureZoneExists(domain string) error {
|
||||
func (n *HXClient) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
r := n.client.Request(map[string]interface{}{
|
||||
"COMMAND": "StatusDNSZone",
|
||||
"DNSZONE": domain + ".",
|
||||
|
|
|
|||
|
|
@ -357,7 +357,7 @@ func (hp *hostingdeProvider) GetRegistrarCorrections(dc *models.DomainConfig) ([
|
|||
return nil, nil
|
||||
}
|
||||
|
||||
func (hp *hostingdeProvider) EnsureZoneExists(domain string) error {
|
||||
func (hp *hostingdeProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
_, err := hp.getZoneConfig(domain)
|
||||
if errors.Is(err, errZoneNotFound) {
|
||||
if err := hp.createZone(domain); err != nil {
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import (
|
|||
)
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (c *huaweicloudProvider) EnsureZoneExists(domain string) error {
|
||||
func (c *huaweicloudProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
if err := c.getZones(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -519,7 +519,7 @@ func (api *inwxAPI) fetchRegistrationNSSet(domain string) []string {
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (api *inwxAPI) EnsureZoneExists(domain string) error {
|
||||
func (api *inwxAPI) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
if api.domainIndex == nil { // only pull the data once.
|
||||
if err := api.fetchNameserverDomains(); err != nil {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import (
|
|||
)
|
||||
|
||||
// EnsureZoneExists creates a zone if it doesn't exist.
|
||||
func (api *jokerProvider) EnsureZoneExists(domain string) error {
|
||||
func (api *jokerProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
// For Joker, all domains you manage automatically have DNS zones available
|
||||
// We just need to verify we can access the zone
|
||||
_, body, err := api.makeRequest("dns-zone-get", url.Values{"domain": {domain}})
|
||||
|
|
|
|||
|
|
@ -210,7 +210,7 @@ func (l *luadnsProvider) makeDeleteCorrection(deleterec *models.RecordConfig, zo
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (l *luadnsProvider) EnsureZoneExists(domain string) error {
|
||||
func (l *luadnsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
if l.zones == nil {
|
||||
if err := l.fetchDomainList(); err != nil {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ func (n *nsone) GetZone(domain string) (*dns.Zone, error) {
|
|||
}
|
||||
}
|
||||
|
||||
func (n *nsone) EnsureZoneExists(domain string) error {
|
||||
func (n *nsone) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
// This enables the create-domains subcommand
|
||||
zone := dns.NewZone(domain)
|
||||
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ func (o *oracleProvider) ListZones() ([]string, error) {
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (o *oracleProvider) EnsureZoneExists(domain string) error {
|
||||
func (o *oracleProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
|
||||
defer cancel()
|
||||
|
||||
|
|
|
|||
|
|
@ -64,8 +64,9 @@ func (dsp *powerdnsProvider) GetZoneRecordsCorrections(dc *models.DomainConfig,
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (dsp *powerdnsProvider) EnsureZoneExists(domain string) error {
|
||||
if _, err := dsp.client.Zones().GetZone(context.Background(), dsp.ServerName, canonical(domain)); err != nil {
|
||||
func (dsp *powerdnsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
domainVariant := dsp.zoneName(domain, metadata[models.DomainTag])
|
||||
if _, err := dsp.client.Zones().GetZone(context.Background(), dsp.ServerName, domainVariant); err != nil {
|
||||
if e, ok := err.(pdnshttp.ErrUnexpectedStatus); ok {
|
||||
if e.StatusCode != http.StatusNotFound {
|
||||
return err
|
||||
|
|
@ -76,7 +77,7 @@ func (dsp *powerdnsProvider) EnsureZoneExists(domain string) error {
|
|||
}
|
||||
|
||||
_, err := dsp.client.Zones().CreateZone(context.Background(), dsp.ServerName, zones.Zone{
|
||||
Name: canonical(domain),
|
||||
Name: domainVariant,
|
||||
Type: zones.ZoneTypeZone,
|
||||
DNSSec: dsp.DNSSecOnCreate,
|
||||
Nameservers: dsp.DefaultNS,
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ func (dsp *powerdnsProvider) getDNSSECCorrections(dc *models.DomainConfig) ([]*m
|
|||
{
|
||||
Msg: "Disable DNSSEC",
|
||||
F: func() error {
|
||||
return dsp.client.Cryptokeys().DeleteCryptokey(context.Background(), dsp.ServerName, dc.Name, keyID)
|
||||
return dsp.client.Cryptokeys().DeleteCryptokey(context.Background(), dsp.ServerName, domainVariant, keyID)
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
|
|
@ -52,7 +52,7 @@ func (dsp *powerdnsProvider) getDNSSECCorrections(dc *models.DomainConfig) ([]*m
|
|||
{
|
||||
Msg: "Enable DNSSEC",
|
||||
F: func() (err error) {
|
||||
_, err = dsp.client.Cryptokeys().CreateCryptokey(context.Background(), dsp.ServerName, dc.Name, cryptokeys.Cryptokey{
|
||||
_, err = dsp.client.Cryptokeys().CreateCryptokey(context.Background(), dsp.ServerName, domainVariant, cryptokeys.Cryptokey{
|
||||
KeyType: "csk",
|
||||
Active: true,
|
||||
Published: true,
|
||||
|
|
|
|||
|
|
@ -68,10 +68,11 @@ type powerdnsProvider struct {
|
|||
// so dnscontrol "example.com!internal" becomes powerdns "example.com..internal"
|
||||
// See https://doc.powerdns.com/authoritative/views.html
|
||||
func (dsp *powerdnsProvider) zoneName(domain string, tag string) string {
|
||||
if dsp.UseViews && tag == "" {
|
||||
return canonical(domain) + "." + tag
|
||||
base := canonical(domain)
|
||||
if dsp.UseViews && tag != "" {
|
||||
return base + "." + tag
|
||||
}
|
||||
return canonical(domain)
|
||||
return base
|
||||
}
|
||||
|
||||
// newDSP initializes a PowerDNS DNSServiceProvider.
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ type DNSServiceProvider interface {
|
|||
// ZoneCreator should be implemented by providers that have the ability to create zones
|
||||
// (used for automatically creating zones if they don't exist)
|
||||
type ZoneCreator interface {
|
||||
EnsureZoneExists(domain string) error
|
||||
EnsureZoneExists(domain string, metadata map[string]string) error
|
||||
}
|
||||
|
||||
// ZoneLister should be implemented by providers that have the
|
||||
|
|
|
|||
|
|
@ -314,7 +314,7 @@ func parsePriority(priority int) int {
|
|||
return priority
|
||||
}
|
||||
|
||||
func (api *realtimeregisterAPI) EnsureZoneExists(domain string) error {
|
||||
func (api *realtimeregisterAPI) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
exists, err := api.zoneExists(domain)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -646,7 +646,7 @@ func unescape(s *string) string {
|
|||
return name
|
||||
}
|
||||
|
||||
func (r *route53Provider) EnsureZoneExists(domain string) error {
|
||||
func (r *route53Provider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
if err := r.getZones(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ func (s *sakuracloudProvider) ListZones() ([]string, error) {
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (s *sakuracloudProvider) EnsureZoneExists(domain string) error {
|
||||
func (s *sakuracloudProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
itemMap, err := s.api.GetCommonServiceItemMap()
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ func (api *vultrProvider) GetNameservers(domain string) ([]*models.Nameserver, e
|
|||
}
|
||||
|
||||
// EnsureZoneExists creates a zone if it does not exist
|
||||
func (api *vultrProvider) EnsureZoneExists(domain string) error {
|
||||
func (api *vultrProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
|
||||
if ok, err := api.isDomainInAccount(domain); err != nil {
|
||||
return err
|
||||
} else if ok {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue