From 4df60c69555238e63a10d8df5c364b7eabb57b84 Mon Sep 17 00:00:00 2001 From: UUBulb <35923940+uubulb@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:19:58 +0800 Subject: [PATCH] ddns: improve performance (#385) --- pkg/ddns/cloudflare.go | 14 +++++++------- pkg/ddns/dummy.go | 2 +- pkg/ddns/tencentcloud.go | 20 ++++++++++---------- pkg/ddns/webhook.go | 2 +- service/singleton/ddns.go | 28 ++++++++++++++-------------- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/pkg/ddns/cloudflare.go b/pkg/ddns/cloudflare.go index 8d14c10..3651211 100644 --- a/pkg/ddns/cloudflare.go +++ b/pkg/ddns/cloudflare.go @@ -13,7 +13,7 @@ type ProviderCloudflare struct { Secret string } -func (provider ProviderCloudflare) UpdateDomain(domainConfig *DomainConfig) bool { +func (provider *ProviderCloudflare) UpdateDomain(domainConfig *DomainConfig) bool { if domainConfig == nil { return false } @@ -42,7 +42,7 @@ func (provider ProviderCloudflare) UpdateDomain(domainConfig *DomainConfig) bool return resultV4 && resultV6 } -func (provider ProviderCloudflare) addDomainRecord(zoneID string, domainConfig *DomainConfig, isIpv4 bool) bool { +func (provider *ProviderCloudflare) addDomainRecord(zoneID string, domainConfig *DomainConfig, isIpv4 bool) bool { record, err := provider.findDNSRecord(zoneID, domainConfig.FullDomain, isIpv4) if err != nil { log.Printf("查找 DNS 记录时出错: %s\n", err) @@ -58,7 +58,7 @@ func (provider ProviderCloudflare) addDomainRecord(zoneID string, domainConfig * } } -func (provider ProviderCloudflare) getZoneID(domain string) (string, error) { +func (provider *ProviderCloudflare) getZoneID(domain string) (string, error) { _, realDomain := SplitDomain(domain) url := fmt.Sprintf("https://api.cloudflare.com/client/v4/zones?name=%s", realDomain) body, err := provider.sendRequest("GET", url, nil) @@ -81,7 +81,7 @@ func (provider ProviderCloudflare) getZoneID(domain string) (string, error) { return "", fmt.Errorf("找不到 Zone ID") } -func (provider ProviderCloudflare) findDNSRecord(zoneID string, domain string, isIPv4 bool) (map[string]interface{}, error) { +func (provider *ProviderCloudflare) findDNSRecord(zoneID string, domain string, isIPv4 bool) (map[string]interface{}, error) { var ipType = "A" if !isIPv4 { ipType = "AAAA" @@ -106,7 +106,7 @@ func (provider ProviderCloudflare) findDNSRecord(zoneID string, domain string, i return nil, nil // 没有找到 DNS 记录 } -func (provider ProviderCloudflare) createDNSRecord(zoneID string, domainConfig *DomainConfig, isIPv4 bool) bool { +func (provider *ProviderCloudflare) createDNSRecord(zoneID string, domainConfig *DomainConfig, isIPv4 bool) bool { var ipType = "A" var ipAddr = domainConfig.Ipv4Addr if !isIPv4 { @@ -126,7 +126,7 @@ func (provider ProviderCloudflare) createDNSRecord(zoneID string, domainConfig * return err == nil } -func (provider ProviderCloudflare) updateDNSRecord(zoneID string, recordID string, domainConfig *DomainConfig, isIPv4 bool) bool { +func (provider *ProviderCloudflare) updateDNSRecord(zoneID string, recordID string, domainConfig *DomainConfig, isIPv4 bool) bool { var ipType = "A" var ipAddr = domainConfig.Ipv4Addr if !isIPv4 { @@ -147,7 +147,7 @@ func (provider ProviderCloudflare) updateDNSRecord(zoneID string, recordID strin } // 以下为辅助方法,如发送 HTTP 请求等 -func (provider ProviderCloudflare) sendRequest(method string, url string, data []byte) ([]byte, error) { +func (provider *ProviderCloudflare) sendRequest(method string, url string, data []byte) ([]byte, error) { client := &http.Client{} req, err := http.NewRequest(method, url, bytes.NewBuffer(data)) if err != nil { diff --git a/pkg/ddns/dummy.go b/pkg/ddns/dummy.go index 5843e72..3dd83e2 100644 --- a/pkg/ddns/dummy.go +++ b/pkg/ddns/dummy.go @@ -2,6 +2,6 @@ package ddns type ProviderDummy struct{} -func (provider ProviderDummy) UpdateDomain(domainConfig *DomainConfig) bool { +func (provider *ProviderDummy) UpdateDomain(domainConfig *DomainConfig) bool { return false } diff --git a/pkg/ddns/tencentcloud.go b/pkg/ddns/tencentcloud.go index 7371ccd..9c9e56d 100644 --- a/pkg/ddns/tencentcloud.go +++ b/pkg/ddns/tencentcloud.go @@ -23,7 +23,7 @@ type ProviderTencentCloud struct { SecretKey string } -func (provider ProviderTencentCloud) UpdateDomain(domainConfig *DomainConfig) bool { +func (provider *ProviderTencentCloud) UpdateDomain(domainConfig *DomainConfig) bool { if domainConfig == nil { return false } @@ -46,7 +46,7 @@ func (provider ProviderTencentCloud) UpdateDomain(domainConfig *DomainConfig) bo return resultV4 && resultV6 } -func (provider ProviderTencentCloud) addDomainRecord(domainConfig *DomainConfig, isIpv4 bool) bool { +func (provider *ProviderTencentCloud) addDomainRecord(domainConfig *DomainConfig, isIpv4 bool) bool { record, err := provider.findDNSRecord(domainConfig.FullDomain, isIpv4) if err != nil { log.Printf("查找 DNS 记录时出错: %s\n", err) @@ -66,7 +66,7 @@ func (provider ProviderTencentCloud) addDomainRecord(domainConfig *DomainConfig, return provider.updateDNSRecord(domainConfig.FullDomain, record["RecordList"].([]interface{})[0].(map[string]interface{})["RecordId"].(float64), domainConfig, isIpv4) } -func (provider ProviderTencentCloud) findDNSRecord(domain string, isIPv4 bool) (map[string]interface{}, error) { +func (provider *ProviderTencentCloud) findDNSRecord(domain string, isIPv4 bool) (map[string]interface{}, error) { var ipType = "A" if !isIPv4 { ipType = "AAAA" @@ -95,7 +95,7 @@ func (provider ProviderTencentCloud) findDNSRecord(domain string, isIPv4 bool) ( return result, nil } -func (provider ProviderTencentCloud) createDNSRecord(domain string, domainConfig *DomainConfig, isIPv4 bool) bool { +func (provider *ProviderTencentCloud) createDNSRecord(domain string, domainConfig *DomainConfig, isIPv4 bool) bool { var ipType = "A" var ipAddr = domainConfig.Ipv4Addr if !isIPv4 { @@ -117,7 +117,7 @@ func (provider ProviderTencentCloud) createDNSRecord(domain string, domainConfig return err == nil } -func (provider ProviderTencentCloud) updateDNSRecord(domain string, recordID float64, domainConfig *DomainConfig, isIPv4 bool) bool { +func (provider *ProviderTencentCloud) updateDNSRecord(domain string, recordID float64, domainConfig *DomainConfig, isIPv4 bool) bool { var ipType = "A" var ipAddr = domainConfig.Ipv4Addr if !isIPv4 { @@ -141,7 +141,7 @@ func (provider ProviderTencentCloud) updateDNSRecord(domain string, recordID flo } // 以下为辅助方法,如发送 HTTP 请求等 -func (provider ProviderTencentCloud) sendRequest(action string, data []byte) ([]byte, error) { +func (provider *ProviderTencentCloud) sendRequest(action string, data []byte) ([]byte, error) { client := &http.Client{} req, err := http.NewRequest("POST", url, bytes.NewBuffer(data)) if err != nil { @@ -173,18 +173,18 @@ func (provider ProviderTencentCloud) sendRequest(action string, data []byte) ([] // https://github.com/jeessy2/ddns-go/blob/master/util/tencent_cloud_signer.go -func (provider ProviderTencentCloud) sha256hex(s string) string { +func (provider *ProviderTencentCloud) sha256hex(s string) string { b := sha256.Sum256([]byte(s)) return hex.EncodeToString(b[:]) } -func (provider ProviderTencentCloud) hmacsha256(s, key string) string { +func (provider *ProviderTencentCloud) hmacsha256(s, key string) string { hashed := hmac.New(sha256.New, []byte(key)) hashed.Write([]byte(s)) return string(hashed.Sum(nil)) } -func (provider ProviderTencentCloud) WriteString(strs ...string) string { +func (provider *ProviderTencentCloud) WriteString(strs ...string) string { var b strings.Builder for _, str := range strs { b.WriteString(str) @@ -193,7 +193,7 @@ func (provider ProviderTencentCloud) WriteString(strs ...string) string { return b.String() } -func (provider ProviderTencentCloud) signRequest(secretId string, secretKey string, r *http.Request, action string, payload string) { +func (provider *ProviderTencentCloud) signRequest(secretId string, secretKey string, r *http.Request, action string, payload string) { algorithm := "TC3-HMAC-SHA256" service := "dnspod" host := provider.WriteString(service, ".tencentcloudapi.com") diff --git a/pkg/ddns/webhook.go b/pkg/ddns/webhook.go index e290c78..488bbb3 100644 --- a/pkg/ddns/webhook.go +++ b/pkg/ddns/webhook.go @@ -14,7 +14,7 @@ type ProviderWebHook struct { RequestHeader string } -func (provider ProviderWebHook) UpdateDomain(domainConfig *DomainConfig) bool { +func (provider *ProviderWebHook) UpdateDomain(domainConfig *DomainConfig) bool { if domainConfig == nil { return false } diff --git a/service/singleton/ddns.go b/service/singleton/ddns.go index a0772af..d456890 100644 --- a/service/singleton/ddns.go +++ b/service/singleton/ddns.go @@ -1,10 +1,10 @@ package singleton import ( - "errors" "fmt" - ddns2 "github.com/naiba/nezha/pkg/ddns" "log" + + ddns2 "github.com/naiba/nezha/pkg/ddns" ) func RetryableUpdateDomain(provider ddns2.Provider, config *ddns2.DomainConfig, maxRetries int) bool { @@ -25,54 +25,54 @@ func RetryableUpdateDomain(provider ddns2.Provider, config *ddns2.DomainConfig, func GetDDNSProviderFromString(provider string) (ddns2.Provider, error) { switch provider { case "webhook": - return ddns2.ProviderWebHook{ + return &ddns2.ProviderWebHook{ URL: Conf.DDNS.WebhookURL, RequestMethod: Conf.DDNS.WebhookMethod, RequestBody: Conf.DDNS.WebhookRequestBody, RequestHeader: Conf.DDNS.WebhookHeaders, }, nil case "dummy": - return ddns2.ProviderDummy{}, nil + return &ddns2.ProviderDummy{}, nil case "cloudflare": - return ddns2.ProviderCloudflare{ + return &ddns2.ProviderCloudflare{ Secret: Conf.DDNS.AccessSecret, }, nil case "tencentcloud": - return ddns2.ProviderTencentCloud{ + return &ddns2.ProviderTencentCloud{ SecretID: Conf.DDNS.AccessID, SecretKey: Conf.DDNS.AccessSecret, }, nil } - return ddns2.ProviderDummy{}, errors.New(fmt.Sprintf("无法找到配置的DDNS提供者%s", Conf.DDNS.Provider)) + return &ddns2.ProviderDummy{}, fmt.Errorf("无法找到配置的DDNS提供者%s", Conf.DDNS.Provider) } func GetDDNSProviderFromProfile(profileName string) (ddns2.Provider, error) { profile, ok := Conf.DDNS.Profiles[profileName] if !ok { - return ddns2.ProviderDummy{}, errors.New(fmt.Sprintf("未找到配置项 %s", profileName)) + return &ddns2.ProviderDummy{}, fmt.Errorf("未找到配置项 %s", profileName) } switch profile.Provider { case "webhook": - return ddns2.ProviderWebHook{ + return &ddns2.ProviderWebHook{ URL: profile.WebhookURL, RequestMethod: profile.WebhookMethod, RequestBody: profile.WebhookRequestBody, RequestHeader: profile.WebhookHeaders, }, nil case "dummy": - return ddns2.ProviderDummy{}, nil + return &ddns2.ProviderDummy{}, nil case "cloudflare": - return ddns2.ProviderCloudflare{ + return &ddns2.ProviderCloudflare{ Secret: profile.AccessSecret, }, nil case "tencentcloud": - return ddns2.ProviderTencentCloud{ + return &ddns2.ProviderTencentCloud{ SecretID: profile.AccessID, SecretKey: profile.AccessSecret, }, nil } - return ddns2.ProviderDummy{}, errors.New(fmt.Sprintf("无法找到配置的DDNS提供者%s", profile.Provider)) + return &ddns2.ProviderDummy{}, fmt.Errorf("无法找到配置的DDNS提供者%s", profile.Provider) } func ValidateDDNSProvidersFromProfiles() error { @@ -80,7 +80,7 @@ func ValidateDDNSProvidersFromProfiles() error { providers := make(map[string]string) for profileName, profile := range Conf.DDNS.Profiles { if _, ok := validProviders[profile.Provider]; !ok { - return errors.New(fmt.Sprintf("无法找到配置的DDNS提供者%s", profile.Provider)) + return fmt.Errorf("无法找到配置的DDNS提供者%s", profile.Provider) } providers[profileName] = profile.Provider }