diff --git a/internal/dnsclients/provider_alidns.go b/internal/dnsclients/provider_alidns.go index 6f37b8fd..a85916be 100644 --- a/internal/dnsclients/provider_alidns.go +++ b/internal/dnsclients/provider_alidns.go @@ -150,13 +150,13 @@ func (this *AliDNSProvider) AddRecord(domain string, newRecord *dnstypes.Record) resp := alidns.CreateAddDomainRecordResponse() err := this.doAPI(req, resp) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } if resp.IsSuccess() { return nil } - return errors.New(resp.GetHttpContentString()) + return this.WrapError(errors.New(resp.GetHttpContentString()), domain, newRecord) } // UpdateRecord 修改记录 @@ -174,7 +174,7 @@ func (this *AliDNSProvider) UpdateRecord(domain string, record *dnstypes.Record, resp := alidns.CreateUpdateDomainRecordResponse() err := this.doAPI(req, resp) - return err + return this.WrapError(err, domain, newRecord) } // DeleteRecord 删除记录 @@ -184,7 +184,7 @@ func (this *AliDNSProvider) DeleteRecord(domain string, record *dnstypes.Record) resp := alidns.CreateDeleteDomainRecordResponse() err := this.doAPI(req, resp) - return err + return this.WrapError(err, domain, record) } // DefaultRoute 默认线路 diff --git a/internal/dnsclients/provider_base.go b/internal/dnsclients/provider_base.go index ae2cc40b..3506ecd3 100644 --- a/internal/dnsclients/provider_base.go +++ b/internal/dnsclients/provider_base.go @@ -1,4 +1,29 @@ package dnsclients +import ( + "errors" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" + "github.com/iwind/TeaGo/types" +) + type BaseProvider struct { } + +// WrapError 封装解析相关错误 +func (this *BaseProvider) WrapError(err error, domain string, record *dnstypes.Record) error { + if err == nil { + return nil + } + + if record == nil { + return err + } + + var fullname = "" + if len(record.Name) == 0 { + fullname = domain + } else { + fullname = record.Name + "." + domain + } + return errors.New("record operation failed: '" + fullname + " " + record.Type + " " + record.Value + " " + types.String(record.TTL) + "': " + err.Error()) +} diff --git a/internal/dnsclients/provider_base_test.go b/internal/dnsclients/provider_base_test.go new file mode 100644 index 00000000..38ecc0cf --- /dev/null +++ b/internal/dnsclients/provider_base_test.go @@ -0,0 +1,38 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package dnsclients_test + +import ( + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" + "github.com/TeaOSLab/EdgeAPI/internal/errors" + "testing" +) + +func TestBaseProvider_WrapError(t *testing.T) { + var provider = &dnsclients.BaseProvider{} + t.Log(provider.WrapError(nil, "example.com", &dnstypes.Record{ + Id: "", + Name: "a", + Type: "A", + Value: "192.168.1.100", + Route: "", + TTL: 3600, + })) + t.Log(provider.WrapError(errors.New("fake error"), "example.com", &dnstypes.Record{ + Id: "", + Name: "a", + Type: "A", + Value: "192.168.1.100", + Route: "", + TTL: 3600, + })) + t.Log(provider.WrapError(errors.New("fake error"), "example.com", &dnstypes.Record{ + Id: "", + Name: "", + Type: "A", + Value: "192.168.1.100", + Route: "", + TTL: 3600, + })) +} diff --git a/internal/dnsclients/provider_cloud_flare.go b/internal/dnsclients/provider_cloud_flare.go index 2e889583..ab643f67 100644 --- a/internal/dnsclients/provider_cloud_flare.go +++ b/internal/dnsclients/provider_cloud_flare.go @@ -169,7 +169,7 @@ func (this *CloudFlareProvider) QueryRecord(domain string, name string, recordTy func (this *CloudFlareProvider) AddRecord(domain string, newRecord *dnstypes.Record) error { zoneId, err := this.findZoneIdWithDomain(domain) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } resp := new(cloudflare.CreateDNSRecordResponse) @@ -186,7 +186,7 @@ func (this *CloudFlareProvider) AddRecord(domain string, newRecord *dnstypes.Rec "ttl": ttl, }, resp) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } return nil } @@ -195,7 +195,7 @@ func (this *CloudFlareProvider) AddRecord(domain string, newRecord *dnstypes.Rec func (this *CloudFlareProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error { zoneId, err := this.findZoneIdWithDomain(domain) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } var ttl = newRecord.TTL @@ -216,13 +216,13 @@ func (this *CloudFlareProvider) UpdateRecord(domain string, record *dnstypes.Rec func (this *CloudFlareProvider) DeleteRecord(domain string, record *dnstypes.Record) error { zoneId, err := this.findZoneIdWithDomain(domain) if err != nil { - return err + return this.WrapError(err, domain, record) } resp := new(cloudflare.DeleteDNSRecordResponse) err = this.doAPI(http.MethodDelete, "zones/"+zoneId+"/dns_records/"+record.Id, map[string]string{}, nil, resp) if err != nil { - return err + return this.WrapError(err, domain, record) } return nil } diff --git a/internal/dnsclients/provider_custom_http.go b/internal/dnsclients/provider_custom_http.go index ab666fca..ed9d6a90 100644 --- a/internal/dnsclients/provider_custom_http.go +++ b/internal/dnsclients/provider_custom_http.go @@ -29,6 +29,8 @@ var customHTTPClient = &http.Client{ type CustomHTTPProvider struct { url string secret string + + BaseProvider } // Auth 认证 @@ -117,7 +119,7 @@ func (this *CustomHTTPProvider) AddRecord(domain string, newRecord *dnstypes.Rec "domain": domain, "newRecord": newRecord, }) - return err + return this.WrapError(err, domain, newRecord) } // UpdateRecord 修改记录 @@ -128,7 +130,7 @@ func (this *CustomHTTPProvider) UpdateRecord(domain string, record *dnstypes.Rec "record": record, "newRecord": newRecord, }) - return err + return this.WrapError(err, domain, newRecord) } // DeleteRecord 删除记录 @@ -138,7 +140,7 @@ func (this *CustomHTTPProvider) DeleteRecord(domain string, record *dnstypes.Rec "domain": domain, "record": record, }) - return err + return this.WrapError(err, domain, record) } // DefaultRoute 默认线路 diff --git a/internal/dnsclients/provider_dnspod.go b/internal/dnsclients/provider_dnspod.go index 0daa43d7..afdb9b29 100644 --- a/internal/dnsclients/provider_dnspod.go +++ b/internal/dnsclients/provider_dnspod.go @@ -182,7 +182,7 @@ func (this *DNSPodProvider) AddRecord(domain string, newRecord *dnstypes.Record) args["ttl"] = types.String(newRecord.TTL) } _, err := this.post("/Record.Create", args) - return err + return this.WrapError(err, domain, newRecord) } // UpdateRecord 修改记录 @@ -211,7 +211,7 @@ func (this *DNSPodProvider) UpdateRecord(domain string, record *dnstypes.Record, args["ttl"] = types.String(newRecord.TTL) } _, err := this.post("/Record.Modify", args) - return err + return this.WrapError(err, domain, newRecord) } // DeleteRecord 删除记录 @@ -225,7 +225,7 @@ func (this *DNSPodProvider) DeleteRecord(domain string, record *dnstypes.Record) "record_id": record.Id, }) - return err + return this.WrapError(err, domain, record) } // 发送请求 diff --git a/internal/dnsclients/provider_huawei_dns.go b/internal/dnsclients/provider_huawei_dns.go index dc80af10..c641d0d1 100644 --- a/internal/dnsclients/provider_huawei_dns.go +++ b/internal/dnsclients/provider_huawei_dns.go @@ -1331,7 +1331,7 @@ func (this *HuaweiDNSProvider) QueryRecord(domain string, name string, recordTyp func (this *HuaweiDNSProvider) AddRecord(domain string, newRecord *dnstypes.Record) error { zoneId, err := this.findZoneIdWithDomain(domain) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } var resp = new(huaweidns.ZonesCreateRecordSetResponse) @@ -1354,7 +1354,7 @@ func (this *HuaweiDNSProvider) AddRecord(domain string, newRecord *dnstypes.Reco "ttl": ttl, }, resp) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } newRecord.Id = resp.Id + "@" + newRecord.Value @@ -1366,7 +1366,7 @@ func (this *HuaweiDNSProvider) AddRecord(domain string, newRecord *dnstypes.Reco func (this *HuaweiDNSProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error { zoneId, err := this.findZoneIdWithDomain(domain) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } var recordId string @@ -1397,7 +1397,7 @@ func (this *HuaweiDNSProvider) UpdateRecord(domain string, record *dnstypes.Reco "ttl": ttl, }, resp) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } return nil @@ -1407,7 +1407,7 @@ func (this *HuaweiDNSProvider) UpdateRecord(domain string, record *dnstypes.Reco func (this *HuaweiDNSProvider) DeleteRecord(domain string, record *dnstypes.Record) error { zoneId, err := this.findZoneIdWithDomain(domain) if err != nil { - return err + return this.WrapError(err, domain, record) } var recordId string @@ -1421,7 +1421,7 @@ func (this *HuaweiDNSProvider) DeleteRecord(domain string, record *dnstypes.Reco var resp = new(huaweidns.ZonesDeleteRecordSetResponse) err = this.doAPI(http.MethodDelete, "/v2.1/zones/"+zoneId+"/recordsets/"+recordId, map[string]string{}, maps.Map{}, resp) if err != nil { - return err + return this.WrapError(err, domain, record) } return nil diff --git a/internal/dnsclients/provider_local_edge_dns.go b/internal/dnsclients/provider_local_edge_dns.go index fef4277e..c296fe4f 100644 --- a/internal/dnsclients/provider_local_edge_dns.go +++ b/internal/dnsclients/provider_local_edge_dns.go @@ -17,6 +17,8 @@ import ( type LocalEdgeDNSProvider struct { clusterId int64 // 集群ID ttl int32 // TTL + + BaseProvider } // Auth 认证 @@ -193,10 +195,10 @@ func (this *LocalEdgeDNSProvider) AddRecord(domain string, newRecord *dnstypes.R var tx *dbs.Tx domainId, err := nameservers.SharedNSDomainDAO.FindDomainIdWithName(tx, this.clusterId, domain) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } if domainId == 0 { - return errors.New("can not find domain '" + domain + "'") + return this.WrapError(errors.New("can not find domain '"+domain+"'"), domain, newRecord) } var routeIds = []string{} @@ -209,7 +211,7 @@ func (this *LocalEdgeDNSProvider) AddRecord(domain string, newRecord *dnstypes.R } _, err = nameservers.SharedNSRecordDAO.CreateRecord(tx, domainId, "", newRecord.Name, newRecord.Type, newRecord.Value, newRecord.TTL, routeIds) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } return nil @@ -220,7 +222,7 @@ func (this *LocalEdgeDNSProvider) UpdateRecord(domain string, record *dnstypes.R var tx *dbs.Tx domainId, err := nameservers.SharedNSDomainDAO.FindDomainIdWithName(tx, this.clusterId, domain) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } if domainId == 0 { return errors.New("can not find domain '" + domain + "'") @@ -238,17 +240,17 @@ func (this *LocalEdgeDNSProvider) UpdateRecord(domain string, record *dnstypes.R if len(record.Id) > 0 { err = nameservers.SharedNSRecordDAO.UpdateRecord(tx, types.Int64(record.Id), "", newRecord.Name, newRecord.Type, newRecord.Value, newRecord.TTL, routeIds, true) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } } else { realRecord, err := nameservers.SharedNSRecordDAO.FindEnabledRecordWithName(tx, domainId, record.Name, record.Type) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } if realRecord != nil { err = nameservers.SharedNSRecordDAO.UpdateRecord(tx, types.Int64(realRecord.Id), "", newRecord.Name, newRecord.Type, newRecord.Value, newRecord.TTL, routeIds, true) if err != nil { - return err + return this.WrapError(err, domain, newRecord) } } } @@ -261,7 +263,7 @@ func (this *LocalEdgeDNSProvider) DeleteRecord(domain string, record *dnstypes.R var tx *dbs.Tx domainId, err := nameservers.SharedNSDomainDAO.FindDomainIdWithName(tx, this.clusterId, domain) if err != nil { - return err + return this.WrapError(err, domain, record) } if domainId == 0 { return errors.New("can not find domain '" + domain + "'") @@ -270,17 +272,17 @@ func (this *LocalEdgeDNSProvider) DeleteRecord(domain string, record *dnstypes.R if len(record.Id) > 0 { err = nameservers.SharedNSRecordDAO.DisableNSRecord(tx, types.Int64(record.Id)) if err != nil { - return err + return this.WrapError(err, domain, record) } } else { realRecord, err := nameservers.SharedNSRecordDAO.FindEnabledRecordWithName(tx, domainId, record.Name, record.Type) if err != nil { - return err + return this.WrapError(err, domain, record) } if realRecord != nil { err = nameservers.SharedNSRecordDAO.DisableNSRecord(tx, types.Int64(realRecord.Id)) if err != nil { - return err + return this.WrapError(err, domain, record) } } }