WIP Do diff and apply through dnscontrol
This commit is contained in:
parent
4a431565df
commit
b32c50b5bd
85
api/zones.go
85
api/zones.go
|
@ -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
4
go.sum
|
@ -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=
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue