WIP Do diff and apply through dnscontrol

This commit is contained in:
nemunaire 2021-05-21 16:23:26 +02:00
parent 4a431565df
commit b32c50b5bd
3 changed files with 53 additions and 53 deletions

View File

@ -40,14 +40,13 @@ import (
"strings"
"time"
"github.com/StackExchange/dnscontrol/v3/models"
"github.com/gin-gonic/gin"
"github.com/miekg/dns"
"git.happydns.org/happydns/config"
"git.happydns.org/happydns/model"
"git.happydns.org/happydns/services"
"git.happydns.org/happydns/services/abstract"
"git.happydns.org/happydns/sources"
"git.happydns.org/happydns/storage"
)
@ -249,58 +248,42 @@ func importZone(c *gin.Context) {
c.JSON(http.StatusOK, &myZone.ZoneMeta)
}
func loadRecordsFromZoneId(user *happydns.User, domain *happydns.Domain, id string) ([]dns.RR, int, error) {
if id == "@" {
source, err := storage.MainStore.GetSource(user, domain.IdProvider)
if err != nil {
return nil, http.StatusNotFound, fmt.Errorf("Unable to find the given source: %q for %q", domain.IdProvider, domain.DomainName)
}
rrs, err := source.ImportZone(domain)
// statuscode should not be significant if err is nil
return rrs, http.StatusBadRequest, err
} else {
zone, statuscode, err := loadZoneFromId(domain, id)
if err != nil {
return nil, statuscode, err
}
return zone.GenerateRRs(domain.DomainName), http.StatusOK, err
}
}
func diffZones(c *gin.Context) {
user := c.MustGet("LoggedUser").(*happydns.User)
domain := c.MustGet("domain").(*happydns.Domain)
zone1, statuscode, err := loadRecordsFromZoneId(user, domain, c.Param("zoneid1"))
if c.Param("zoneid1") != "@" {
c.AbortWithStatusJSON(http.StatusNotImplemented, gin.H{"errmsg": "Diff between two zone is not implemented."})
return
}
provider, err := storage.MainStore.GetProvider(user, domain.IdProvider)
if err != nil {
c.AbortWithStatusJSON(http.StatusNotFound, fmt.Errorf("Unable to find the given source: %q for %q", domain.IdProvider, domain.DomainName))
return
}
zone, statuscode, err := loadZoneFromId(domain, c.Param("zoneid2"))
if err != nil {
c.AbortWithStatusJSON(statuscode, gin.H{"errmsg": err.Error()})
return
}
zone2, statuscode, err := loadRecordsFromZoneId(user, domain, c.Param("zoneid2"))
if err != nil {
c.AbortWithStatusJSON(statuscode, gin.H{"errmsg": err.Error()})
return
dc := &models.DomainConfig{
Name: strings.TrimSuffix(domain.DomainName, "."),
Records: models.RRstoRCs(zone.GenerateRRs(domain.DomainName), strings.TrimSuffix(domain.DomainName, ".")),
}
toAdd, toDel := sources.DiffZones(zone1, zone2, true)
corrections, err := provider.GetDomainCorrections(dc)
var rrAdd []string
for _, rr := range toAdd {
rrAdd = append(rrAdd, rr.String())
}
var rrDel []string
for _, rr := range toDel {
rrDel = append(rrDel, rr.String())
var rrCorected []string
for _, c := range corrections {
rrCorected = append(rrCorected, c.Msg)
}
c.JSON(http.StatusOK, gin.H{
"toAdd": rrAdd,
"toDel": rrDel,
"toAdd": rrCorected,
"toDel": nil,
})
}
@ -309,26 +292,22 @@ func applyZone(c *gin.Context) {
domain := c.MustGet("domain").(*happydns.Domain)
zone := c.MustGet("zone").(*happydns.Zone)
source, err := storage.MainStore.GetSource(user, domain.IdProvider)
provider, err := storage.MainStore.GetProvider(user, domain.IdProvider)
if err != nil {
c.AbortWithStatusJSON(http.StatusNotFound, gin.H{"errmsg": fmt.Sprintf("Unable to find your provider: %w", err)})
c.AbortWithStatusJSON(http.StatusNotFound, fmt.Errorf("Unable to find the given provider: %q for %q", domain.IdProvider, domain.DomainName))
return
}
newSOA, err := sources.ApplyZone(source, domain, zone.GenerateRRs(domain.DomainName), true)
if err != nil {
log.Printf("%s: unable to ApplyZone in applyZone", c.ClientIP(), err)
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "Unable to create the diff. Please retry later or contact an administrator."})
return
dc := &models.DomainConfig{
Name: strings.TrimSuffix(domain.DomainName, "."),
Records: models.RRstoRCs(zone.GenerateRRs(domain.DomainName), strings.TrimSuffix(domain.DomainName, ".")),
}
// Update serial
if newSOA != nil {
for _, svc := range zone.Services[""] {
if origin, ok := svc.Service.(*abstract.Origin); ok {
origin.Serial = newSOA.Serial
break
}
corrections, err := provider.GetDomainCorrections(dc)
for _, cr := range corrections {
err := cr.F()
if err != nil {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": fmt.Sprintf("Unable to update the zone: %s", err.Error())})
}
}

4
go.sum
View File

@ -218,6 +218,7 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/jquery v0.0.0-20191017083323-73f4c7416038/go.mod h1:xKR3tvLne+vYYPH9d4DM8X9MKlNV2yXDEomxulcK218=
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
@ -266,6 +267,7 @@ github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMW
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/juju/ansiterm v0.0.0-20160907234532-b99631de12cf/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU=
github.com/juju/clock v0.0.0-20190205081909-9c5c9712527c/go.mod h1:nD0vlnrUjcjJhqN5WuCWZyzfd5AHZAC9/ajvbSx69xA=
@ -387,7 +389,9 @@ github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIH
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8=
github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/softlayer/softlayer-go v0.0.0-20170804160555-5e1c8cccc730/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=

View File

@ -35,6 +35,7 @@ import (
"fmt"
"strings"
"github.com/StackExchange/dnscontrol/v3/models"
"github.com/StackExchange/dnscontrol/v3/providers"
"github.com/miekg/dns"
)
@ -115,3 +116,19 @@ func (p *ProviderCombined) ImportZone(dn *Domain) (rrs []dns.RR, err error) {
return
}
func (p *ProviderCombined) GetDomainCorrections(dc *models.DomainConfig) (rrs []*models.Correction, err error) {
var s providers.DNSServiceProvider
s, err = p.NewDNSServiceProvider()
if err != nil {
return
}
defer func() {
if a := recover(); a != nil {
err = fmt.Errorf("%s", a)
}
}()
return s.GetDomainCorrections(dc)
}