diff --git a/.golangci.yml b/.golangci.yml index 77a7ec8c..f24bcd0d 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -51,6 +51,7 @@ linters: - nolintlint - prealloc - predeclared + - revive - rowserrcheck - exportloopref - sqlclosecheck diff --git a/internal/data/data.go b/internal/data/data.go index 91c8651a..b5eff641 100644 --- a/internal/data/data.go +++ b/internal/data/data.go @@ -6,15 +6,15 @@ import ( "github.com/qdm12/ddns-updater/internal/records" ) -type database struct { +type Database struct { data []records.Record sync.RWMutex persistentDB PersistentDatabase } // NewDatabase creates a new in memory database. -func NewDatabase(data []records.Record, persistentDB PersistentDatabase) *database { - return &database{ +func NewDatabase(data []records.Record, persistentDB PersistentDatabase) *Database { + return &Database{ data: data, persistentDB: persistentDB, } diff --git a/internal/data/memory.go b/internal/data/memory.go index 177ad19c..4ffa9dbc 100644 --- a/internal/data/memory.go +++ b/internal/data/memory.go @@ -6,7 +6,7 @@ import ( "github.com/qdm12/ddns-updater/internal/records" ) -func (db *database) Select(id int) (record records.Record, err error) { +func (db *Database) Select(id int) (record records.Record, err error) { db.RLock() defer db.RUnlock() if id < 0 { @@ -18,7 +18,7 @@ func (db *database) Select(id int) (record records.Record, err error) { return db.data[id], nil } -func (db *database) SelectAll() (records []records.Record) { +func (db *Database) SelectAll() (records []records.Record) { db.RLock() defer db.RUnlock() return db.data diff --git a/internal/data/persistence.go b/internal/data/persistence.go index 8ff62fff..0f847c61 100644 --- a/internal/data/persistence.go +++ b/internal/data/persistence.go @@ -7,11 +7,11 @@ import ( "github.com/qdm12/ddns-updater/internal/records" ) -func (db *database) GetEvents(domain, host string) (events []models.HistoryEvent, err error) { +func (db *Database) GetEvents(domain, host string) (events []models.HistoryEvent, err error) { return db.persistentDB.GetEvents(domain, host) } -func (db *database) Update(id int, record records.Record) (err error) { +func (db *Database) Update(id int, record records.Record) (err error) { db.Lock() defer db.Unlock() if id < 0 { @@ -37,7 +37,7 @@ func (db *database) Update(id int, record records.Record) (err error) { return nil } -func (db *database) Close() (err error) { +func (db *Database) Close() (err error) { db.Lock() // ensure write operation finishes defer db.Unlock() return db.persistentDB.Close() diff --git a/internal/health/client.go b/internal/health/client.go index 55020f5c..4bdaef96 100644 --- a/internal/health/client.go +++ b/internal/health/client.go @@ -14,13 +14,13 @@ func IsClientMode(args []string) bool { return len(args) > 1 && args[1] == "healthcheck" } -type client struct { +type Client struct { *http.Client } -func NewClient() *client { +func NewClient() *Client { const timeout = 5 * time.Second - return &client{ + return &Client{ Client: &http.Client{Timeout: timeout}, } } @@ -29,7 +29,7 @@ var ErrParseHealthServerAddress = errors.New("cannot parse health server address // Query sends an HTTP request to the other instance of // the program, and to its internal healthcheck server. -func (c *client) Query(ctx context.Context, port uint16) error { +func (c *Client) Query(ctx context.Context, port uint16) error { req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://127.0.0.1:"+strconv.Itoa(int(port)), nil) if err != nil { return err diff --git a/internal/health/server.go b/internal/health/server.go index 096a4ace..37d34bf9 100644 --- a/internal/health/server.go +++ b/internal/health/server.go @@ -8,22 +8,22 @@ import ( "github.com/qdm12/golibs/logging" ) -type server struct { +type Server struct { address string logger logging.Logger handler http.Handler } -func NewServer(address string, logger logging.Logger, healthcheck func() error) *server { +func NewServer(address string, logger logging.Logger, healthcheck func() error) *Server { handler := newHandler(logger, healthcheck) - return &server{ + return &Server{ address: address, logger: logger, handler: handler, } } -func (s *server) Run(ctx context.Context, done chan<- struct{}) { +func (s *Server) Run(ctx context.Context, done chan<- struct{}) { defer close(done) server := http.Server{ Addr: s.address, diff --git a/internal/params/json.go b/internal/params/json.go index faa625d4..a75091c5 100644 --- a/internal/params/json.go +++ b/internal/params/json.go @@ -29,7 +29,7 @@ type commonSettings struct { // JSONSettings obtain the update settings from the JSON content, first trying from the environment variable CONFIG // and then from the file config.json. -func (r *reader) JSONSettings(filePath string) ( +func (r *Reader) JSONSettings(filePath string) ( allSettings []settings.Settings, warnings []string, err error) { allSettings, warnings, err = r.getSettingsFromEnv(filePath) if allSettings != nil || warnings != nil || err != nil { @@ -41,7 +41,7 @@ func (r *reader) JSONSettings(filePath string) ( var errWriteConfigToFile = errors.New("cannot write configuration to file") // getSettingsFromFile obtain the update settings from config.json. -func (r *reader) getSettingsFromFile(filePath string) ( +func (r *Reader) getSettingsFromFile(filePath string) ( allSettings []settings.Settings, warnings []string, err error) { r.logger.Info("reading JSON config from file " + filePath) bytes, err := r.readFile(filePath) @@ -67,7 +67,7 @@ func (r *reader) getSettingsFromFile(filePath string) ( // getSettingsFromEnv obtain the update settings from the environment variable CONFIG. // If the settings are valid, they are written to the filePath. -func (r *reader) getSettingsFromEnv(filePath string) ( +func (r *Reader) getSettingsFromEnv(filePath string) ( allSettings []settings.Settings, warnings []string, err error) { s, err := r.env.Get("CONFIG", params.CaseSensitiveValue()) if err != nil { @@ -132,7 +132,7 @@ func extractAllSettings(jsonBytes []byte) ( } func makeSettingsFromObject(common commonSettings, rawSettings json.RawMessage, - matcher regex.Matcher) ( + matcher *regex.Matcher) ( settingsSlice []settings.Settings, warnings []string, err error) { provider := models.Provider(common.Provider) if provider == constants.DuckDNS { // only hosts, no domain diff --git a/internal/params/reader.go b/internal/params/reader.go index 91f456a5..13fd1a02 100644 --- a/internal/params/reader.go +++ b/internal/params/reader.go @@ -8,15 +8,15 @@ import ( "github.com/qdm12/golibs/params" ) -type reader struct { +type Reader struct { logger logging.Logger env envInterface readFile func(filename string) ([]byte, error) writeFile func(filename string, data []byte, perm fs.FileMode) (err error) } -func NewReader(logger logging.Logger) *reader { - return &reader{ +func NewReader(logger logging.Logger) *Reader { + return &Reader{ logger: logger, env: params.New(), readFile: os.ReadFile, diff --git a/internal/regex/regex.go b/internal/regex/regex.go index 0858d9d2..f94c17a1 100644 --- a/internal/regex/regex.go +++ b/internal/regex/regex.go @@ -2,19 +2,7 @@ package regex import "regexp" -type Matcher interface { - GandiKey(s string) bool - GodaddyKey(s string) bool - DuckDNSToken(s string) bool - NamecheapPassword(s string) bool - DreamhostKey(s string) bool - CloudflareKey(s string) bool - CloudflareUserServiceKey(s string) bool - DNSOMaticUsername(s string) bool - DNSOMaticPassword(s string) bool -} - -type matcher struct { +type Matcher struct { goDaddyKey, duckDNSToken, namecheapPassword, dreamhostKey, cloudflareKey, cloudflareUserServiceKey, dnsOMaticUsername, dnsOMaticPassword, gandiKey *regexp.Regexp } @@ -31,8 +19,8 @@ var ( dnsOMaticPassword = regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9._-]{5,19}$`) ) -func NewMatcher() *matcher { - return &matcher{ +func NewMatcher() *Matcher { + return &Matcher{ gandiKey: gandiKey, goDaddyKey: goDaddyKey, duckDNSToken: duckDNSToken, @@ -45,14 +33,14 @@ func NewMatcher() *matcher { } } -func (m *matcher) GandiKey(s string) bool { return m.gandiKey.MatchString(s) } -func (m *matcher) GodaddyKey(s string) bool { return m.goDaddyKey.MatchString(s) } -func (m *matcher) DuckDNSToken(s string) bool { return m.duckDNSToken.MatchString(s) } -func (m *matcher) NamecheapPassword(s string) bool { return m.namecheapPassword.MatchString(s) } -func (m *matcher) DreamhostKey(s string) bool { return m.dreamhostKey.MatchString(s) } -func (m *matcher) CloudflareKey(s string) bool { return m.cloudflareKey.MatchString(s) } -func (m *matcher) CloudflareUserServiceKey(s string) bool { +func (m *Matcher) GandiKey(s string) bool { return m.gandiKey.MatchString(s) } +func (m *Matcher) GodaddyKey(s string) bool { return m.goDaddyKey.MatchString(s) } +func (m *Matcher) DuckDNSToken(s string) bool { return m.duckDNSToken.MatchString(s) } +func (m *Matcher) NamecheapPassword(s string) bool { return m.namecheapPassword.MatchString(s) } +func (m *Matcher) DreamhostKey(s string) bool { return m.dreamhostKey.MatchString(s) } +func (m *Matcher) CloudflareKey(s string) bool { return m.cloudflareKey.MatchString(s) } +func (m *Matcher) CloudflareUserServiceKey(s string) bool { return m.cloudflareUserServiceKey.MatchString(s) } -func (m *matcher) DNSOMaticUsername(s string) bool { return m.dnsOMaticUsername.MatchString(s) } -func (m *matcher) DNSOMaticPassword(s string) bool { return m.dnsOMaticPassword.MatchString(s) } +func (m *Matcher) DNSOMaticUsername(s string) bool { return m.dnsOMaticUsername.MatchString(s) } +func (m *Matcher) DNSOMaticPassword(s string) bool { return m.dnsOMaticPassword.MatchString(s) } diff --git a/internal/server/server.go b/internal/server/server.go index 90fe52da..f7baa5eb 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -8,23 +8,23 @@ import ( "github.com/qdm12/golibs/logging" ) -type server struct { +type Server struct { address string logger logging.Logger handler http.Handler } func New(ctx context.Context, address, rootURL string, db Database, - logger logging.Logger, runner UpdateForcer) *server { + logger logging.Logger, runner UpdateForcer) *Server { handler := newHandler(ctx, rootURL, db, runner) - return &server{ + return &Server{ address: address, logger: logger, handler: handler, } } -func (s *server) Run(ctx context.Context, done chan<- struct{}) { +func (s *Server) Run(ctx context.Context, done chan<- struct{}) { defer close(done) server := http.Server{ Addr: s.address, diff --git a/internal/settings/common/interfaces.go b/internal/settings/common/interfaces.go new file mode 100644 index 00000000..44b73b83 --- /dev/null +++ b/internal/settings/common/interfaces.go @@ -0,0 +1,13 @@ +package common + +type Matcher interface { + GandiKey(s string) bool + GodaddyKey(s string) bool + DuckDNSToken(s string) bool + NamecheapPassword(s string) bool + DreamhostKey(s string) bool + CloudflareKey(s string) bool + CloudflareUserServiceKey(s string) bool + DNSOMaticUsername(s string) bool + DNSOMaticPassword(s string) bool +} diff --git a/internal/settings/constants/providers.go b/internal/settings/constants/providers.go index c7c322a2..0cc82dbe 100644 --- a/internal/settings/constants/providers.go +++ b/internal/settings/constants/providers.go @@ -10,7 +10,7 @@ const ( Dd24 models.Provider = "dd24" DdnssDe models.Provider = "ddnss" DigitalOcean models.Provider = "digitalocean" - DnsOMatic models.Provider = "dnsomatic" + DNSOMatic models.Provider = "dnsomatic" DNSPod models.Provider = "dnspod" DonDominio models.Provider = "dondominio" Dreamhost models.Provider = "dreamhost" @@ -47,7 +47,7 @@ func ProviderChoices() []models.Provider { Dd24, DdnssDe, DigitalOcean, - DnsOMatic, + DNSOMatic, DNSPod, DonDominio, Dreamhost, diff --git a/internal/settings/errors/validation.go b/internal/settings/errors/validation.go index e142314f..f3e841ab 100644 --- a/internal/settings/errors/validation.go +++ b/internal/settings/errors/validation.go @@ -3,17 +3,17 @@ package errors import "errors" var ( - ErrEmptyApiKey = errors.New("empty API key") + ErrEmptyAPIKey = errors.New("empty API key") ErrEmptyAppKey = errors.New("empty app key") ErrEmptyConsumerKey = errors.New("empty consumer key") ErrEmptyEmail = errors.New("empty email") ErrEmptyKey = errors.New("empty key") ErrEmptyName = errors.New("empty name") ErrEmptyPassword = errors.New("empty password") - ErrEmptyApiSecret = errors.New("empty API secret") + ErrEmptyAPISecret = errors.New("empty API secret") ErrEmptySecret = errors.New("empty secret") ErrEmptyToken = errors.New("empty token") - ErrEmptyAccessKeyId = errors.New("empty access key id") + ErrEmptyAccessKeyID = errors.New("empty access key id") ErrEmptyAccessKeySecret = errors.New("empty key secret") ErrEmptyTTL = errors.New("TTL is not set") ErrEmptyUsername = errors.New("empty username") diff --git a/internal/settings/providers/aliyun/provider.go b/internal/settings/providers/aliyun/provider.go index bcf91b83..96257015 100644 --- a/internal/settings/providers/aliyun/provider.go +++ b/internal/settings/providers/aliyun/provider.go @@ -16,30 +16,30 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion - accessKeyId string + accessKeyID string accessSecret string region string } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { - AccessKeyId string `json:"access_key_id"` + AccessKeyID string `json:"access_key_id"` AccessSecret string `json:"access_secret"` Region string `json:"region"` }{} if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, - accessKeyId: extraSettings.AccessKeyId, + accessKeyID: extraSettings.AccessKeyID, accessSecret: extraSettings.AccessSecret, region: "cn-hangzhou", } @@ -52,41 +52,41 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { - case p.accessKeyId == "": - return errors.ErrEmptyAccessKeyId + case p.accessKeyID == "": + return errors.ErrEmptyAccessKeyID case p.accessSecret == "": return errors.ErrEmptyAccessKeySecret } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.Aliyun, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -95,13 +95,13 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, _ *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, _ *http.Client, ip net.IP) (newIP net.IP, err error) { recordType := constants.A if ip.To4() == nil { recordType = constants.AAAA } - client, err := alidns.NewClientWithAccessKey(p.region, p.accessKeyId, p.accessSecret) + client, err := alidns.NewClientWithAccessKey(p.region, p.accessKeyID, p.accessSecret) if err != nil { return nil, err } diff --git a/internal/settings/providers/allinkl/provider.go b/internal/settings/providers/allinkl/provider.go index d5df7563..6065399c 100644 --- a/internal/settings/providers/allinkl/provider.go +++ b/internal/settings/providers/allinkl/provider.go @@ -19,7 +19,7 @@ import ( "github.com/qdm12/golibs/verification" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -29,7 +29,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -38,7 +38,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -52,7 +52,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case p.username == "": return errors.ErrEmptyUsername @@ -64,31 +64,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.AllInkl, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -97,7 +97,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", Host: "dyndns.kasserver.com", diff --git a/internal/settings/providers/cloudflare/provider.go b/internal/settings/providers/cloudflare/provider.go index d327dcbd..a8d5786e 100644 --- a/internal/settings/providers/cloudflare/provider.go +++ b/internal/settings/providers/cloudflare/provider.go @@ -11,7 +11,7 @@ import ( "strings" "github.com/qdm12/ddns-updater/internal/models" - "github.com/qdm12/ddns-updater/internal/regex" + "github.com/qdm12/ddns-updater/internal/settings/common" "github.com/qdm12/ddns-updater/internal/settings/constants" "github.com/qdm12/ddns-updater/internal/settings/errors" "github.com/qdm12/ddns-updater/internal/settings/headers" @@ -20,7 +20,7 @@ import ( "github.com/qdm12/golibs/verification" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -31,11 +31,11 @@ type provider struct { zoneIdentifier string proxied bool ttl uint - matcher regex.Matcher + matcher common.Matcher } func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersion, - matcher regex.Matcher) (p *provider, err error) { + matcher common.Matcher) (p *Provider, err error) { extraSettings := struct { Key string `json:"key"` Token string `json:"token"` @@ -48,7 +48,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -67,7 +67,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case len(p.key) > 0: // email and key must be provided switch { @@ -91,31 +91,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.Cloudflare, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return p.proxied } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -124,7 +124,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) setHeaders(request *http.Request) { +func (p *Provider) setHeaders(request *http.Request) { headers.SetUserAgent(request) headers.SetContentType(request, "application/json") headers.SetAccept(request, "application/json") @@ -141,7 +141,7 @@ func (p *provider) setHeaders(request *http.Request) { // Obtain domain ID. // See https://api.cloudflare.com/#dns-records-for-a-zone-list-dns-records. -func (p *provider) getRecordID(ctx context.Context, client *http.Client, newIP net.IP) ( +func (p *Provider) getRecordID(ctx context.Context, client *http.Client, newIP net.IP) ( identifier string, upToDate bool, err error) { recordType := constants.A if newIP.To4() == nil { @@ -207,7 +207,7 @@ func (p *provider) getRecordID(ctx context.Context, client *http.Client, newIP n return listRecordsResponse.Result[0].ID, false, nil } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { recordType := constants.A if ip.To4() == nil { recordType = constants.AAAA diff --git a/internal/settings/providers/dd24/provider.go b/internal/settings/providers/dd24/provider.go index 3d349684..f6649c89 100644 --- a/internal/settings/providers/dd24/provider.go +++ b/internal/settings/providers/dd24/provider.go @@ -18,7 +18,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -28,7 +28,7 @@ type provider struct { func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersion) ( - p *provider, err error) { + p *Provider, err error) { extraSettings := struct { Password string `json:"password"` UseProviderIP bool `json:"provider_ip"` @@ -36,7 +36,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -49,38 +49,38 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if len(p.password) == 0 { return errors.ErrEmptyPassword } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.Dd24, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -89,7 +89,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { // see https://www.domaindiscount24.com/faq/en/dynamic-dns u := url.URL{ Scheme: "https", diff --git a/internal/settings/providers/ddnss/provider.go b/internal/settings/providers/ddnss/provider.go index b2671a33..a09f5752 100644 --- a/internal/settings/providers/ddnss/provider.go +++ b/internal/settings/providers/ddnss/provider.go @@ -18,7 +18,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -28,7 +28,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -37,7 +37,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -51,7 +51,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case len(p.username) == 0: return errors.ErrEmptyUsername @@ -63,31 +63,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.DdnssDe, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -96,7 +96,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", Host: "www.ddnss.de", diff --git a/internal/settings/providers/digitalocean/provider.go b/internal/settings/providers/digitalocean/provider.go index ce7e7d4d..64e0ccba 100644 --- a/internal/settings/providers/digitalocean/provider.go +++ b/internal/settings/providers/digitalocean/provider.go @@ -17,7 +17,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -25,14 +25,14 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Token string `json:"token"` }{} if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -44,38 +44,38 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if len(p.token) == 0 { return errors.ErrEmptyToken } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.DigitalOcean, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -84,14 +84,14 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) setHeaders(request *http.Request) { +func (p *Provider) setHeaders(request *http.Request) { headers.SetUserAgent(request) headers.SetContentType(request, "application/json") headers.SetAccept(request, "application/json") headers.SetAuthBearer(request, p.token) } -func (p *provider) getRecordID(ctx context.Context, recordType string, client *http.Client) ( +func (p *Provider) getRecordID(ctx context.Context, recordType string, client *http.Client) ( recordID int, err error) { values := url.Values{} values.Set("name", utils.BuildURLQueryHostname(p.host, p.domain)) @@ -139,7 +139,7 @@ func (p *provider) getRecordID(ctx context.Context, recordType string, client *h return result.DomainRecords[0].ID, nil } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { recordType := constants.A if ip.To4() == nil { // IPv6 recordType = constants.AAAA diff --git a/internal/settings/providers/dnsomatic/provider.go b/internal/settings/providers/dnsomatic/provider.go index a359cb58..e227906a 100644 --- a/internal/settings/providers/dnsomatic/provider.go +++ b/internal/settings/providers/dnsomatic/provider.go @@ -11,7 +11,7 @@ import ( "strings" "github.com/qdm12/ddns-updater/internal/models" - "github.com/qdm12/ddns-updater/internal/regex" + "github.com/qdm12/ddns-updater/internal/settings/common" "github.com/qdm12/ddns-updater/internal/settings/constants" "github.com/qdm12/ddns-updater/internal/settings/errors" "github.com/qdm12/ddns-updater/internal/settings/headers" @@ -20,18 +20,18 @@ import ( "github.com/qdm12/golibs/verification" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion username string password string useProviderIP bool - matcher regex.Matcher + matcher common.Matcher } func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersion, - matcher regex.Matcher) (p *provider, err error) { + matcher common.Matcher) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -40,7 +40,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -55,7 +55,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case !p.matcher.DNSOMaticUsername(p.username): return fmt.Errorf("%w: %s", errors.ErrMalformedUsername, p.username) @@ -69,31 +69,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { - return utils.ToString(p.domain, p.host, constants.DnsOMatic, p.ipVersion) +func (p *Provider) String() string { + return utils.ToString(p.domain, p.host, constants.DNSOMatic, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -102,7 +102,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { // Multiple hosts can be updated in one query, see https://www.dnsomatic.com/docs/api u := url.URL{ Scheme: "https", diff --git a/internal/settings/providers/dnspod/provider.go b/internal/settings/providers/dnspod/provider.go index f4bb89d0..02659aec 100644 --- a/internal/settings/providers/dnspod/provider.go +++ b/internal/settings/providers/dnspod/provider.go @@ -17,7 +17,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -25,14 +25,14 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Token string `json:"token"` }{} if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -44,38 +44,38 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if len(p.token) == 0 { return errors.ErrEmptyToken } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.DNSPod, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -84,13 +84,13 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) setHeaders(request *http.Request) { +func (p *Provider) setHeaders(request *http.Request) { headers.SetContentType(request, "application/x-www-form-urlencoded") headers.SetAccept(request, "application/json") headers.SetUserAgent(request) } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { recordType := constants.A if ip.To4() == nil { recordType = constants.AAAA diff --git a/internal/settings/providers/dondominio/provider.go b/internal/settings/providers/dondominio/provider.go index 78b85ae9..37c24cea 100644 --- a/internal/settings/providers/dondominio/provider.go +++ b/internal/settings/providers/dondominio/provider.go @@ -17,7 +17,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -27,7 +27,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -39,7 +39,7 @@ func New(data json.RawMessage, domain, host string, if len(host) == 0 { host = "@" // default } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -53,7 +53,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case len(p.username) == 0: return errors.ErrEmptyUsername @@ -67,31 +67,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.DonDominio, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -100,13 +100,13 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) setHeaders(request *http.Request) { +func (p *Provider) setHeaders(request *http.Request) { headers.SetUserAgent(request) headers.SetContentType(request, "application/x-www-form-urlencoded") headers.SetAccept(request, "application/json") } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", Host: "simple-api.dondominio.net", diff --git a/internal/settings/providers/dreamhost/provider.go b/internal/settings/providers/dreamhost/provider.go index c8f219d6..8a5767ea 100644 --- a/internal/settings/providers/dreamhost/provider.go +++ b/internal/settings/providers/dreamhost/provider.go @@ -11,7 +11,7 @@ import ( "net/url" "github.com/qdm12/ddns-updater/internal/models" - "github.com/qdm12/ddns-updater/internal/regex" + "github.com/qdm12/ddns-updater/internal/settings/common" "github.com/qdm12/ddns-updater/internal/settings/constants" "github.com/qdm12/ddns-updater/internal/settings/errors" "github.com/qdm12/ddns-updater/internal/settings/headers" @@ -19,16 +19,16 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion key string - matcher regex.Matcher + matcher common.Matcher } func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersion, - matcher regex.Matcher) (p *provider, err error) { + matcher common.Matcher) (p *Provider, err error) { extraSettings := struct { Key string `json:"key"` }{} @@ -38,7 +38,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio if host == "" { // TODO-v2 remove default host = "@" // default } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -51,38 +51,38 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if !p.matcher.DreamhostKey(p.key) { return fmt.Errorf("invalid key format") } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.Dreamhost, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -91,7 +91,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { recordType := constants.A if ip.To4() == nil { recordType = constants.AAAA @@ -146,7 +146,7 @@ type ( } ) -func (p *provider) defaultURLValues() (values url.Values) { +func (p *Provider) defaultURLValues() (values url.Values) { uuid := make([]byte, 16) //nolint:gomnd _, _ = io.ReadFull(rand.Reader, uuid) //nolint:gomnd @@ -160,7 +160,7 @@ func (p *provider) defaultURLValues() (values url.Values) { return values } -func (p *provider) getRecords(ctx context.Context, client *http.Client) ( +func (p *Provider) getRecords(ctx context.Context, client *http.Client) ( records dreamHostRecords, err error) { u := url.URL{ Scheme: "https", @@ -198,7 +198,7 @@ func (p *provider) getRecords(ctx context.Context, client *http.Client) ( return records, nil } -func (p *provider) removeRecord(ctx context.Context, client *http.Client, ip net.IP) error { //nolint:dupl +func (p *Provider) removeRecord(ctx context.Context, client *http.Client, ip net.IP) error { //nolint:dupl recordType := constants.A if ip.To4() == nil { recordType = constants.AAAA @@ -245,7 +245,7 @@ func (p *provider) removeRecord(ctx context.Context, client *http.Client, ip net return nil } -func (p *provider) createRecord(ctx context.Context, client *http.Client, ip net.IP) error { //nolint:dupl +func (p *Provider) createRecord(ctx context.Context, client *http.Client, ip net.IP) error { //nolint:dupl recordType := constants.A if ip.To4() == nil { recordType = constants.AAAA diff --git a/internal/settings/providers/duckdns/provider.go b/internal/settings/providers/duckdns/provider.go index e3956a65..7ce22077 100644 --- a/internal/settings/providers/duckdns/provider.go +++ b/internal/settings/providers/duckdns/provider.go @@ -10,7 +10,7 @@ import ( "net/url" "github.com/qdm12/ddns-updater/internal/models" - "github.com/qdm12/ddns-updater/internal/regex" + "github.com/qdm12/ddns-updater/internal/settings/common" "github.com/qdm12/ddns-updater/internal/settings/constants" "github.com/qdm12/ddns-updater/internal/settings/errors" "github.com/qdm12/ddns-updater/internal/settings/headers" @@ -19,16 +19,16 @@ import ( "github.com/qdm12/golibs/verification" ) -type provider struct { +type Provider struct { host string ipVersion ipversion.IPVersion token string useProviderIP bool - matcher regex.Matcher + matcher common.Matcher } func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersion, - matcher regex.Matcher) (p *provider, err error) { + matcher common.Matcher) (p *Provider, err error) { extraSettings := struct { Token string `json:"token"` UseProviderIP bool `json:"provider_ip"` @@ -36,7 +36,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ host: host, ipVersion: ipVersion, token: extraSettings.Token, @@ -49,7 +49,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if !p.matcher.DuckDNSToken(p.token) { return errors.ErrMalformedToken } @@ -60,31 +60,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString("duckdns.org", p.host, constants.DuckDNS, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return "duckdns.org" } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, "duckdns.org") } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -93,7 +93,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", Host: "www.duckdns.org", diff --git a/internal/settings/providers/dyn/provider.go b/internal/settings/providers/dyn/provider.go index 1d922de2..46fdf00d 100644 --- a/internal/settings/providers/dyn/provider.go +++ b/internal/settings/providers/dyn/provider.go @@ -18,7 +18,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -28,7 +28,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -37,7 +37,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -51,7 +51,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case len(p.username) == 0: return errors.ErrEmptyUsername @@ -63,31 +63,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return fmt.Sprintf("[domain: %s | host: %s | provider: Dyn]", p.domain, p.host) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -96,7 +96,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", User: url.UserPassword(p.username, p.password), diff --git a/internal/settings/providers/dynu/provider.go b/internal/settings/providers/dynu/provider.go index 9638361f..62fdf148 100644 --- a/internal/settings/providers/dynu/provider.go +++ b/internal/settings/providers/dynu/provider.go @@ -18,7 +18,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string group string @@ -29,7 +29,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -44,7 +44,7 @@ func New(data json.RawMessage, domain, host string, host = "@" // default } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -59,7 +59,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case p.username == "": return errors.ErrEmptyUsername @@ -71,31 +71,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.Dynu, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -104,7 +104,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", Host: "api.dynu.com", diff --git a/internal/settings/providers/dynv6/provider.go b/internal/settings/providers/dynv6/provider.go index 87a32080..e0fa7408 100644 --- a/internal/settings/providers/dynv6/provider.go +++ b/internal/settings/providers/dynv6/provider.go @@ -15,7 +15,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -24,7 +24,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Token string `json:"token"` UseProviderIP bool `json:"provider_ip"` @@ -32,7 +32,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -45,7 +45,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case len(p.token) == 0: return errors.ErrEmptyToken @@ -55,31 +55,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return fmt.Sprintf("[domain: %s | host: %s | provider: DynV6]", p.domain, p.host) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -88,7 +88,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { isIPv4 := ip.To4() != nil host := "dynv6.com" if isIPv4 { diff --git a/internal/settings/providers/freedns/provider.go b/internal/settings/providers/freedns/provider.go index bdbf99fb..c9170747 100644 --- a/internal/settings/providers/freedns/provider.go +++ b/internal/settings/providers/freedns/provider.go @@ -18,7 +18,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -26,14 +26,14 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Token string `json:"token"` }{} if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -45,38 +45,38 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if len(p.token) == 0 { return errors.ErrEmptyToken } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.FreeDNS, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -85,7 +85,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { var hostPrefix string if ip.To4() == nil { hostPrefix = "v6." diff --git a/internal/settings/providers/gandi/provider.go b/internal/settings/providers/gandi/provider.go index a0a611d8..1dd63c36 100644 --- a/internal/settings/providers/gandi/provider.go +++ b/internal/settings/providers/gandi/provider.go @@ -17,7 +17,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ttl int @@ -26,7 +26,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Key string `json:"key"` TTL int `json:"ttl"` @@ -34,7 +34,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -47,38 +47,38 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if len(p.key) == 0 { return errors.ErrEmptyKey } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.Gandi, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -87,14 +87,14 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) setHeaders(request *http.Request) { +func (p *Provider) setHeaders(request *http.Request) { headers.SetUserAgent(request) headers.SetContentType(request, "application/json") headers.SetAccept(request, "application/json") request.Header.Set("X-Api-Key", p.key) } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { recordType := constants.A var ipStr string if ip.To4() == nil { // IPv6 diff --git a/internal/settings/providers/godaddy/provider.go b/internal/settings/providers/godaddy/provider.go index 84bf4422..22e74f57 100644 --- a/internal/settings/providers/godaddy/provider.go +++ b/internal/settings/providers/godaddy/provider.go @@ -11,7 +11,7 @@ import ( "net/url" "github.com/qdm12/ddns-updater/internal/models" - "github.com/qdm12/ddns-updater/internal/regex" + "github.com/qdm12/ddns-updater/internal/settings/common" "github.com/qdm12/ddns-updater/internal/settings/constants" "github.com/qdm12/ddns-updater/internal/settings/errors" "github.com/qdm12/ddns-updater/internal/settings/headers" @@ -19,17 +19,17 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion key string secret string - matcher regex.Matcher + matcher common.Matcher } func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersion, - matcher regex.Matcher) (p *provider, err error) { + matcher common.Matcher) (p *Provider, err error) { extraSettings := struct { Key string `json:"key"` Secret string `json:"secret"` @@ -37,7 +37,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -51,7 +51,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case !p.matcher.GodaddyKey(p.key): return errors.ErrMalformedKey @@ -61,31 +61,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.GoDaddy, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -94,14 +94,14 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) setHeaders(request *http.Request) { +func (p *Provider) setHeaders(request *http.Request) { headers.SetUserAgent(request) headers.SetAuthSSOKey(request, p.key, p.secret) headers.SetContentType(request, "application/json") headers.SetAccept(request, "application/json") } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { recordType := constants.A if ip.To4() == nil { recordType = constants.AAAA diff --git a/internal/settings/providers/google/provider.go b/internal/settings/providers/google/provider.go index 89880234..ebb567d8 100644 --- a/internal/settings/providers/google/provider.go +++ b/internal/settings/providers/google/provider.go @@ -19,7 +19,7 @@ import ( "github.com/qdm12/golibs/verification" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -29,7 +29,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -38,7 +38,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -52,7 +52,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case len(p.username) == 0: return errors.ErrEmptyUsername @@ -62,31 +62,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.Google, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -95,7 +95,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", Host: "domains.google.com", diff --git a/internal/settings/providers/he/provider.go b/internal/settings/providers/he/provider.go index c2259cc6..bdc61950 100644 --- a/internal/settings/providers/he/provider.go +++ b/internal/settings/providers/he/provider.go @@ -19,7 +19,7 @@ import ( "github.com/qdm12/golibs/verification" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -28,7 +28,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Password string `json:"password"` UseProviderIP bool `json:"provider_ip"` @@ -36,7 +36,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -49,38 +49,38 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if len(p.password) == 0 { return errors.ErrEmptyPassword } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.HE, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -89,7 +89,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { fqdn := p.BuildDomainName() u := url.URL{ Scheme: "https", diff --git a/internal/settings/providers/infomaniak/provider.go b/internal/settings/providers/infomaniak/provider.go index b907b407..4a5f9a9b 100644 --- a/internal/settings/providers/infomaniak/provider.go +++ b/internal/settings/providers/infomaniak/provider.go @@ -18,7 +18,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -28,7 +28,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -37,7 +37,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -51,7 +51,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case len(p.username) == 0: return errors.ErrEmptyUsername @@ -63,31 +63,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.Infomaniak, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -96,7 +96,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", Host: "infomaniak.com", diff --git a/internal/settings/providers/linode/provider.go b/internal/settings/providers/linode/provider.go index 7095bca2..0fedd18b 100644 --- a/internal/settings/providers/linode/provider.go +++ b/internal/settings/providers/linode/provider.go @@ -20,7 +20,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -28,14 +28,14 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Token string `json:"token"` }{} if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -47,38 +47,38 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if len(p.token) == 0 { return errors.ErrEmptyToken } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.Linode, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -88,7 +88,7 @@ func (p *provider) HTML() models.HTMLRow { } // Using https://www.linode.com/docs/api/domains/ -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { domainID, err := p.getDomainID(ctx, client) if err != nil { return nil, fmt.Errorf("%w: %s", errors.ErrGetDomainID, err) @@ -124,13 +124,13 @@ type linodeErrors struct { } `json:"errors"` } -func (p *provider) setHeaders(request *http.Request) { +func (p *Provider) setHeaders(request *http.Request) { headers.SetUserAgent(request) headers.SetContentType(request, "application/json") headers.SetAuthBearer(request, p.token) } -func (p *provider) getDomainID(ctx context.Context, client *http.Client) (domainID int, err error) { +func (p *Provider) getDomainID(ctx context.Context, client *http.Client) (domainID int, err error) { u := url.URL{ Scheme: "https", Host: "api.linode.com", @@ -189,7 +189,7 @@ func (p *provider) getDomainID(ctx context.Context, client *http.Client) (domain return *domains[0].ID, nil } -func (p *provider) getRecordID(ctx context.Context, client *http.Client, +func (p *Provider) getRecordID(ctx context.Context, client *http.Client, domainID int, recordType string) (recordID int, err error) { u := url.URL{ Scheme: "https", @@ -236,7 +236,7 @@ func (p *provider) getRecordID(ctx context.Context, client *http.Client, return 0, errors.ErrNotFound } -func (p *provider) createRecord(ctx context.Context, client *http.Client, +func (p *Provider) createRecord(ctx context.Context, client *http.Client, domainID int, recordType string, ip net.IP) (err error) { u := url.URL{ Scheme: "https", @@ -295,7 +295,7 @@ func (p *provider) createRecord(ctx context.Context, client *http.Client, return nil } -func (p *provider) updateRecord(ctx context.Context, client *http.Client, +func (p *Provider) updateRecord(ctx context.Context, client *http.Client, domainID, recordID int, ip net.IP) (err error) { u := url.URL{ Scheme: "https", @@ -348,7 +348,7 @@ func (p *provider) updateRecord(ctx context.Context, client *http.Client, return nil } -func (p *provider) getError(body io.Reader) (err error) { +func (p *Provider) getError(body io.Reader) (err error) { var errorObj linodeErrors b, err := io.ReadAll(body) if err != nil { diff --git a/internal/settings/providers/luadns/provider.go b/internal/settings/providers/luadns/provider.go index b2b0f1f4..ca2bb8ec 100644 --- a/internal/settings/providers/luadns/provider.go +++ b/internal/settings/providers/luadns/provider.go @@ -19,7 +19,7 @@ import ( "github.com/qdm12/golibs/verification" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -28,7 +28,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Email string `json:"email"` Token string `json:"token"` @@ -36,7 +36,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -49,7 +49,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case !verification.NewRegex().MatchEmail(p.email): return errors.ErrMalformedEmail @@ -59,31 +59,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.LuaDNS, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -92,13 +92,13 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) setHeaders(request *http.Request) { +func (p *Provider) setHeaders(request *http.Request) { headers.SetUserAgent(request) headers.SetAccept(request, "application/json") } // Using https://www.luadns.com/api.html -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { zoneID, err := p.getZoneID(ctx, client) if err != nil { return nil, fmt.Errorf("%w: %s", errors.ErrGetZoneID, err) @@ -130,7 +130,7 @@ type luaDNSError struct { Message string `json:"message"` } -func (p *provider) getZoneID(ctx context.Context, client *http.Client) (zoneID int, err error) { +func (p *Provider) getZoneID(ctx context.Context, client *http.Client) (zoneID int, err error) { u := url.URL{ Scheme: "https", Host: "api.luadns.com", @@ -181,7 +181,7 @@ func (p *provider) getZoneID(ctx context.Context, client *http.Client) (zoneID i return 0, errors.ErrZoneNotFound } -func (p *provider) getRecord(ctx context.Context, client *http.Client, zoneID int, ip net.IP) ( +func (p *Provider) getRecord(ctx context.Context, client *http.Client, zoneID int, ip net.IP) ( record luaDNSRecord, err error) { u := url.URL{ Scheme: "https", @@ -235,7 +235,7 @@ func (p *provider) getRecord(ctx context.Context, client *http.Client, zoneID in errors.ErrRecordNotFound, recordType, zoneID) } -func (p *provider) updateRecord(ctx context.Context, client *http.Client, +func (p *Provider) updateRecord(ctx context.Context, client *http.Client, zoneID int, newRecord luaDNSRecord) (err error) { u := url.URL{ Scheme: "https", diff --git a/internal/settings/providers/namecheap/provider.go b/internal/settings/providers/namecheap/provider.go index 8caa14e3..6b1a9096 100644 --- a/internal/settings/providers/namecheap/provider.go +++ b/internal/settings/providers/namecheap/provider.go @@ -11,7 +11,7 @@ import ( "net/url" "github.com/qdm12/ddns-updater/internal/models" - "github.com/qdm12/ddns-updater/internal/regex" + "github.com/qdm12/ddns-updater/internal/settings/common" "github.com/qdm12/ddns-updater/internal/settings/constants" "github.com/qdm12/ddns-updater/internal/settings/errors" "github.com/qdm12/ddns-updater/internal/settings/headers" @@ -19,17 +19,17 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion password string useProviderIP bool - matcher regex.Matcher + matcher common.Matcher } func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersion, - matcher regex.Matcher) (p *provider, err error) { + matcher common.Matcher) (p *Provider, err error) { if ipVersion == ipversion.IP6 { return p, errors.ErrIPv6NotSupported } @@ -40,7 +40,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -54,38 +54,38 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if !p.matcher.NamecheapPassword(p.password) { return errors.ErrMalformedPassword } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.Namecheap, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -94,12 +94,12 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) setHeaders(request *http.Request) { +func (p *Provider) setHeaders(request *http.Request) { headers.SetUserAgent(request) headers.SetAccept(request, "application/xml") } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", Host: "dynamicdns.park-your-domain.com", diff --git a/internal/settings/providers/njalla/provider.go b/internal/settings/providers/njalla/provider.go index d5e44671..1d4bbe1b 100644 --- a/internal/settings/providers/njalla/provider.go +++ b/internal/settings/providers/njalla/provider.go @@ -16,7 +16,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -25,7 +25,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Key string `json:"key"` UseProviderIP bool `json:"provider_ip"` @@ -33,7 +33,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -46,38 +46,38 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if len(p.key) == 0 { return errors.ErrEmptyKey } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.Njalla, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -86,7 +86,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", Host: "njal.la", diff --git a/internal/settings/providers/noip/provider.go b/internal/settings/providers/noip/provider.go index 2ad486f7..26bc9c11 100644 --- a/internal/settings/providers/noip/provider.go +++ b/internal/settings/providers/noip/provider.go @@ -19,7 +19,7 @@ import ( "github.com/qdm12/golibs/verification" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -29,7 +29,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -38,7 +38,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -52,7 +52,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { const maxUsernameLength = 50 switch { case len(p.username) == 0: @@ -67,31 +67,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString(p.domain, p.host, constants.NoIP, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -100,7 +100,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", Host: "dynupdate.no-ip.com", diff --git a/internal/settings/providers/opendns/provider.go b/internal/settings/providers/opendns/provider.go index c2b2e030..47684ecd 100644 --- a/internal/settings/providers/opendns/provider.go +++ b/internal/settings/providers/opendns/provider.go @@ -17,7 +17,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -27,7 +27,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -36,7 +36,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -50,7 +50,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case len(p.username) == 0: return errors.ErrEmptyUsername @@ -62,31 +62,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return fmt.Sprintf("[domain: %s | host: %s | provider: Opendns]", p.domain, p.host) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -95,7 +95,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", User: url.UserPassword(p.username, p.password), diff --git a/internal/settings/providers/ovh/createrecord.go b/internal/settings/providers/ovh/createrecord.go index 20b308c3..08d4c7d6 100644 --- a/internal/settings/providers/ovh/createrecord.go +++ b/internal/settings/providers/ovh/createrecord.go @@ -11,7 +11,7 @@ import ( "github.com/qdm12/ddns-updater/internal/settings/errors" ) -func (p *provider) createRecord(ctx context.Context, client *http.Client, +func (p *Provider) createRecord(ctx context.Context, client *http.Client, recordType, subdomain, ipStr string, timestamp int64) (err error) { u := url.URL{ Scheme: p.apiURL.Scheme, diff --git a/internal/settings/providers/ovh/getrecords.go b/internal/settings/providers/ovh/getrecords.go index f107c482..c8afb4b0 100644 --- a/internal/settings/providers/ovh/getrecords.go +++ b/internal/settings/providers/ovh/getrecords.go @@ -10,7 +10,7 @@ import ( "github.com/qdm12/ddns-updater/internal/settings/errors" ) -func (p *provider) getRecords(ctx context.Context, client *http.Client, +func (p *Provider) getRecords(ctx context.Context, client *http.Client, recordType, subdomain string, timestamp int64) (recordIDs []uint64, err error) { values := url.Values{} values.Set("fieldType", recordType) diff --git a/internal/settings/providers/ovh/headers.go b/internal/settings/providers/ovh/headers.go index 8e7a292d..2ba37cfa 100644 --- a/internal/settings/providers/ovh/headers.go +++ b/internal/settings/providers/ovh/headers.go @@ -9,12 +9,12 @@ import ( "strconv" ) -func (p *provider) setHeaderCommon(header http.Header) { +func (p *Provider) setHeaderCommon(header http.Header) { header.Add("Accept", "application/json;charset=utf-8") header.Add("X-Ovh-Application", p.appKey) } -func (p *provider) setHeaderAuth(header http.Header, timestamp int64, +func (p *Provider) setHeaderAuth(header http.Header, timestamp int64, httpMethod string, url *url.URL, body []byte) { header.Add("X-Ovh-Timestamp", strconv.Itoa(int(timestamp))) header.Add("X-Ovh-Consumer", p.consumerKey) diff --git a/internal/settings/providers/ovh/provider.go b/internal/settings/providers/ovh/provider.go index 233a1d95..c1e6f68e 100644 --- a/internal/settings/providers/ovh/provider.go +++ b/internal/settings/providers/ovh/provider.go @@ -20,7 +20,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -37,7 +37,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -57,7 +57,7 @@ func New(data json.RawMessage, domain, host string, return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -77,7 +77,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if p.mode == "api" { switch { case len(p.appKey) == 0: @@ -100,31 +100,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return fmt.Sprintf("[domain: %s | host: %s | provider: OVH]", p.domain, p.host) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -133,7 +133,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) updateWithDynHost(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) updateWithDynHost(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", User: url.UserPassword(p.username, p.password), @@ -187,7 +187,7 @@ var ( ErrRefresh = stderrors.New("cannot refresh records") ) -func (p *provider) updateWithZoneDNS(ctx context.Context, client *http.Client, ip net.IP) ( +func (p *Provider) updateWithZoneDNS(ctx context.Context, client *http.Client, ip net.IP) ( newIP net.IP, err error) { recordType := constants.A var ipStr string @@ -232,7 +232,7 @@ func (p *provider) updateWithZoneDNS(ctx context.Context, client *http.Client, i return ip, nil } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { if p.mode != "api" { return p.updateWithDynHost(ctx, client, ip) } diff --git a/internal/settings/providers/ovh/refresh.go b/internal/settings/providers/ovh/refresh.go index 6d32d5a8..171d25d9 100644 --- a/internal/settings/providers/ovh/refresh.go +++ b/internal/settings/providers/ovh/refresh.go @@ -9,7 +9,7 @@ import ( "github.com/qdm12/ddns-updater/internal/settings/errors" ) -func (p *provider) refresh(ctx context.Context, client *http.Client, timestamp int64) (err error) { +func (p *Provider) refresh(ctx context.Context, client *http.Client, timestamp int64) (err error) { u := url.URL{ Scheme: p.apiURL.Scheme, Host: p.apiURL.Host, diff --git a/internal/settings/providers/ovh/time.go b/internal/settings/providers/ovh/time.go index 9fd6f4b7..61bc8d50 100644 --- a/internal/settings/providers/ovh/time.go +++ b/internal/settings/providers/ovh/time.go @@ -11,7 +11,7 @@ import ( "github.com/qdm12/ddns-updater/internal/settings/errors" ) -func (p *provider) getAdjustedUnixTimestamp(ctx context.Context, client *http.Client) ( +func (p *Provider) getAdjustedUnixTimestamp(ctx context.Context, client *http.Client) ( unix int64, err error) { delta, err := p.getTimeDelta(ctx, client) if err != nil { @@ -26,7 +26,7 @@ func (p *provider) getAdjustedUnixTimestamp(ctx context.Context, client *http.Cl // getTimeDelta obtains the delta between the OVH server time and this machine time. // If it is the first time executing, it fetches the time from OVH servers to calculate the // delta. Otherwise, it uses the delta calculated previously. -func (p *provider) getTimeDelta(ctx context.Context, client *http.Client) (delta time.Duration, err error) { +func (p *Provider) getTimeDelta(ctx context.Context, client *http.Client) (delta time.Duration, err error) { if p.serverDelta > 0 { return p.serverDelta, nil } @@ -41,7 +41,7 @@ func (p *provider) getTimeDelta(ctx context.Context, client *http.Client) (delta return p.serverDelta, nil } -func (p *provider) getOVHTime(ctx context.Context, client *http.Client) (ovhTime time.Time, err error) { +func (p *Provider) getOVHTime(ctx context.Context, client *http.Client) (ovhTime time.Time, err error) { u := url.URL{ Scheme: p.apiURL.Scheme, Host: p.apiURL.Host, diff --git a/internal/settings/providers/ovh/updaterecord.go b/internal/settings/providers/ovh/updaterecord.go index e1211e32..600cb8a7 100644 --- a/internal/settings/providers/ovh/updaterecord.go +++ b/internal/settings/providers/ovh/updaterecord.go @@ -12,7 +12,7 @@ import ( "github.com/qdm12/ddns-updater/internal/settings/errors" ) -func (p *provider) updateRecord(ctx context.Context, client *http.Client, +func (p *Provider) updateRecord(ctx context.Context, client *http.Client, recordID uint64, ipStr string, timestamp int64) (err error) { u := url.URL{ Scheme: p.apiURL.Scheme, diff --git a/internal/settings/providers/porkbun/provider.go b/internal/settings/providers/porkbun/provider.go index 4d2e7673..9ff622b9 100644 --- a/internal/settings/providers/porkbun/provider.go +++ b/internal/settings/providers/porkbun/provider.go @@ -17,31 +17,31 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ttl uint ipVersion ipversion.IPVersion apiKey string - secretApiKey string + secretAPIKey string } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { - SecretApiKey string `json:"secret_api_key"` - ApiKey string `json:"api_key"` + SecretAPIKey string `json:"secret_api_key"` + APIKey string `json:"api_key"` TTL uint `json:"ttl"` }{} if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, - secretApiKey: extraSettings.SecretApiKey, - apiKey: extraSettings.ApiKey, + secretAPIKey: extraSettings.SecretAPIKey, + apiKey: extraSettings.APIKey, ttl: extraSettings.TTL, } if err := p.isValid(); err != nil { @@ -50,41 +50,41 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case p.apiKey == "": - return errors.ErrEmptyApiKey - case p.secretApiKey == "": - return errors.ErrEmptyApiSecret + return errors.ErrEmptyAPIKey + case p.secretAPIKey == "": + return errors.ErrEmptyAPISecret } return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return fmt.Sprintf("[domain: %s | host: %s | provider: Porkbun]", p.domain, p.host) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -93,13 +93,13 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) setHeaders(request *http.Request) { +func (p *Provider) setHeaders(request *http.Request) { headers.SetUserAgent(request) headers.SetContentType(request, "application/json") headers.SetAccept(request, "application/json") } -func (p *provider) getRecordIDs(ctx context.Context, client *http.Client, recordType string) ( +func (p *Provider) getRecordIDs(ctx context.Context, client *http.Client, recordType string) ( recordIDs []string, err error) { u := url.URL{ Scheme: "https", @@ -111,11 +111,11 @@ func (p *provider) getRecordIDs(ctx context.Context, client *http.Client, record } postRecordsParams := struct { - SecretApiKey string `json:"secretapikey"` - ApiKey string `json:"apikey"` + SecretAPIKey string `json:"secretapikey"` + APIKey string `json:"apikey"` }{ - SecretApiKey: p.secretApiKey, - ApiKey: p.apiKey, + SecretAPIKey: p.secretAPIKey, + APIKey: p.apiKey, } buffer := bytes.NewBuffer(nil) encoder := json.NewEncoder(buffer) @@ -142,7 +142,7 @@ func (p *provider) getRecordIDs(ctx context.Context, client *http.Client, record var responseData struct { Records []struct { - Id string `json:"id"` + ID string `json:"id"` } `json:"records"` } decoder := json.NewDecoder(response.Body) @@ -151,13 +151,13 @@ func (p *provider) getRecordIDs(ctx context.Context, client *http.Client, record } for _, record := range responseData.Records { - recordIDs = append(recordIDs, record.Id) + recordIDs = append(recordIDs, record.ID) } return recordIDs, nil } -func (p *provider) createRecord(ctx context.Context, client *http.Client, +func (p *Provider) createRecord(ctx context.Context, client *http.Client, recordType string, ipStr string) (err error) { u := url.URL{ Scheme: "https", @@ -165,15 +165,15 @@ func (p *provider) createRecord(ctx context.Context, client *http.Client, Path: "/api/json/v3/dns/create/" + p.domain, } postRecordsParams := struct { - SecretApiKey string `json:"secretapikey"` - ApiKey string `json:"apikey"` + SecretAPIKey string `json:"secretapikey"` + APIKey string `json:"apikey"` Content string `json:"content"` Name string `json:"name,omitempty"` Type string `json:"type"` TTL string `json:"ttl"` }{ - SecretApiKey: p.secretApiKey, - ApiKey: p.apiKey, + SecretAPIKey: p.secretAPIKey, + APIKey: p.apiKey, Content: ipStr, Type: recordType, Name: p.host, @@ -204,7 +204,7 @@ func (p *provider) createRecord(ctx context.Context, client *http.Client, return nil } -func (p *provider) updateRecord(ctx context.Context, client *http.Client, +func (p *Provider) updateRecord(ctx context.Context, client *http.Client, recordType string, ipStr string, recordID string) (err error) { u := url.URL{ Scheme: "https", @@ -212,15 +212,15 @@ func (p *provider) updateRecord(ctx context.Context, client *http.Client, Path: "/api/json/v3/dns/edit/" + p.domain + "/" + recordID, } postRecordsParams := struct { - SecretApiKey string `json:"secretapikey"` - ApiKey string `json:"apikey"` + SecretAPIKey string `json:"secretapikey"` + APIKey string `json:"apikey"` Content string `json:"content"` Type string `json:"type"` TTL string `json:"ttl"` Name string `json:"name,omitempty"` }{ - SecretApiKey: p.secretApiKey, - ApiKey: p.apiKey, + SecretAPIKey: p.secretAPIKey, + APIKey: p.apiKey, Content: ipStr, Type: recordType, TTL: fmt.Sprint(p.ttl), @@ -251,7 +251,7 @@ func (p *provider) updateRecord(ctx context.Context, client *http.Client, return nil } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { recordType := constants.A if ip.To4() == nil { // IPv6 recordType = constants.AAAA diff --git a/internal/settings/providers/selfhostde/provider.go b/internal/settings/providers/selfhostde/provider.go index 90852ec0..b6da18ef 100644 --- a/internal/settings/providers/selfhostde/provider.go +++ b/internal/settings/providers/selfhostde/provider.go @@ -18,7 +18,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -28,7 +28,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -37,7 +37,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -51,7 +51,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case len(p.username) == 0: return errors.ErrEmptyUsername @@ -63,31 +63,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return fmt.Sprintf("[domain: %s | host: %s | provider: Selfhost.de]", p.domain, p.host) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -96,7 +96,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", User: url.UserPassword(p.username, p.password), diff --git a/internal/settings/providers/servercow/provider.go b/internal/settings/providers/servercow/provider.go index 5cddb5bc..0f9a5436 100644 --- a/internal/settings/providers/servercow/provider.go +++ b/internal/settings/providers/servercow/provider.go @@ -18,7 +18,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { username string host string domain string @@ -29,7 +29,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersion) ( - p *provider, err error) { + p *Provider, err error) { extraSettings := struct { Username string `json:"username"` Password string `json:"password"` @@ -41,7 +41,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio return nil, err } - p = &provider{ + p = &Provider{ host: host, ipVersion: ipVersion, username: extraSettings.Username, @@ -56,7 +56,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case p.username == "": return errors.ErrEmptyUsername @@ -69,31 +69,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return utils.ToString("servercow.de", p.host, constants.Servercow, p.ipVersion) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -102,7 +102,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { recordType := constants.A if ip.To4() == nil { recordType = constants.AAAA diff --git a/internal/settings/providers/spdyn/provider.go b/internal/settings/providers/spdyn/provider.go index 9cba9c5c..d3db1566 100644 --- a/internal/settings/providers/spdyn/provider.go +++ b/internal/settings/providers/spdyn/provider.go @@ -18,7 +18,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -29,7 +29,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { User string `json:"user"` Password string `json:"password"` @@ -39,7 +39,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -54,7 +54,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { if len(p.token) > 0 { return nil } @@ -69,31 +69,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return fmt.Sprintf("[domain: %s | host: %s | provider: Spdyn]", p.domain, p.host) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -102,7 +102,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { // see https://wiki.securepoint.de/SPDyn/Variablen u := url.URL{ Scheme: "https", diff --git a/internal/settings/providers/strato/provider.go b/internal/settings/providers/strato/provider.go index a8cbde17..ebd3e786 100644 --- a/internal/settings/providers/strato/provider.go +++ b/internal/settings/providers/strato/provider.go @@ -18,7 +18,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -27,7 +27,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, - ipVersion ipversion.IPVersion) (p *provider, err error) { + ipVersion ipversion.IPVersion) (p *Provider, err error) { extraSettings := struct { Password string `json:"password"` UseProviderIP bool `json:"provider_ip"` @@ -35,7 +35,7 @@ func New(data json.RawMessage, domain, host string, if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -48,7 +48,7 @@ func New(data json.RawMessage, domain, host string, return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case len(p.password) == 0: return errors.ErrEmptyPassword @@ -58,31 +58,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return fmt.Sprintf("[domain: %s | host: %s | provider: Strato]", p.domain, p.host) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -91,7 +91,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { u := url.URL{ Scheme: "https", User: url.UserPassword(p.domain, p.password), diff --git a/internal/settings/providers/variomedia/provider.go b/internal/settings/providers/variomedia/provider.go index bd5a8f27..bde90b7c 100644 --- a/internal/settings/providers/variomedia/provider.go +++ b/internal/settings/providers/variomedia/provider.go @@ -11,7 +11,7 @@ import ( "strings" "github.com/qdm12/ddns-updater/internal/models" - "github.com/qdm12/ddns-updater/internal/regex" + "github.com/qdm12/ddns-updater/internal/settings/common" "github.com/qdm12/ddns-updater/internal/settings/constants" "github.com/qdm12/ddns-updater/internal/settings/errors" "github.com/qdm12/ddns-updater/internal/settings/headers" @@ -19,7 +19,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type provider struct { +type Provider struct { domain string host string ipVersion ipversion.IPVersion @@ -29,7 +29,7 @@ type provider struct { } func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersion, - matcher regex.Matcher) (p *provider, err error) { + matcher common.Matcher) (p *Provider, err error) { extraSettings := struct { Email string `json:"email"` Password string `json:"password"` @@ -38,7 +38,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio if err := json.Unmarshal(data, &extraSettings); err != nil { return nil, err } - p = &provider{ + p = &Provider{ domain: domain, host: host, ipVersion: ipVersion, @@ -52,7 +52,7 @@ func New(data json.RawMessage, domain, host string, ipVersion ipversion.IPVersio return p, nil } -func (p *provider) isValid() error { +func (p *Provider) isValid() error { switch { case len(p.email) == 0: return errors.ErrEmptyEmail @@ -64,31 +64,31 @@ func (p *provider) isValid() error { return nil } -func (p *provider) String() string { +func (p *Provider) String() string { return fmt.Sprintf("[domain: %s | host: %s | provider: Variomedia]", p.domain, p.host) } -func (p *provider) Domain() string { +func (p *Provider) Domain() string { return p.domain } -func (p *provider) Host() string { +func (p *Provider) Host() string { return p.host } -func (p *provider) IPVersion() ipversion.IPVersion { +func (p *Provider) IPVersion() ipversion.IPVersion { return p.ipVersion } -func (p *provider) Proxied() bool { +func (p *Provider) Proxied() bool { return false } -func (p *provider) BuildDomainName() string { +func (p *Provider) BuildDomainName() string { return utils.BuildDomainName(p.host, p.domain) } -func (p *provider) HTML() models.HTMLRow { +func (p *Provider) HTML() models.HTMLRow { return models.HTMLRow{ Domain: models.HTML(fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName())), Host: models.HTML(p.Host()), @@ -97,7 +97,7 @@ func (p *provider) HTML() models.HTMLRow { } } -func (p *provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { +func (p *Provider) Update(ctx context.Context, client *http.Client, ip net.IP) (newIP net.IP, err error) { host := "dyndns.variomedia.de" if p.useProviderIP { if ip.To4() == nil { diff --git a/internal/settings/settings.go b/internal/settings/settings.go index 5f65944d..8d33c815 100644 --- a/internal/settings/settings.go +++ b/internal/settings/settings.go @@ -9,7 +9,7 @@ import ( "net/http" "github.com/qdm12/ddns-updater/internal/models" - "github.com/qdm12/ddns-updater/internal/regex" + "github.com/qdm12/ddns-updater/internal/settings/common" "github.com/qdm12/ddns-updater/internal/settings/constants" "github.com/qdm12/ddns-updater/internal/settings/providers/aliyun" "github.com/qdm12/ddns-updater/internal/settings/providers/allinkl" @@ -62,7 +62,7 @@ var ErrProviderUnknown = errors.New("unknown provider") //nolint:gocyclo func New(provider models.Provider, data json.RawMessage, domain, host string, //nolint:ireturn - ipVersion ipversion.IPVersion, matcher regex.Matcher) ( + ipVersion ipversion.IPVersion, matcher common.Matcher) ( settings Settings, err error) { switch provider { case constants.Aliyun: @@ -77,7 +77,7 @@ func New(provider models.Provider, data json.RawMessage, domain, host string, // return ddnss.New(data, domain, host, ipVersion) case constants.DigitalOcean: return digitalocean.New(data, domain, host, ipVersion) - case constants.DnsOMatic: + case constants.DNSOMatic: return dnsomatic.New(data, domain, host, ipVersion, matcher) case constants.DNSPod: return dnspod.New(data, domain, host, ipVersion) diff --git a/internal/update/interfaces.go b/internal/update/interfaces.go index 98c9bed6..82446da3 100644 --- a/internal/update/interfaces.go +++ b/internal/update/interfaces.go @@ -14,7 +14,7 @@ type PublicIPFetcher interface { IP6(ctx context.Context) (net.IP, error) } -type Updater interface { +type UpdaterInterface interface { Update(ctx context.Context, recordID int, ip net.IP, now time.Time) (err error) } diff --git a/internal/update/run.go b/internal/update/run.go index 5a4a0ae6..e1408a54 100644 --- a/internal/update/run.go +++ b/internal/update/run.go @@ -13,10 +13,10 @@ import ( "github.com/qdm12/golibs/logging" ) -type runner struct { +type Runner struct { period time.Duration db Database - updater Updater + updater UpdaterInterface force chan struct{} forceResult chan []error ipv6Mask net.IPMask @@ -27,10 +27,10 @@ type runner struct { timeNow func() time.Time } -func NewRunner(db Database, updater Updater, ipGetter PublicIPFetcher, +func NewRunner(db Database, updater UpdaterInterface, ipGetter PublicIPFetcher, period time.Duration, ipv6Mask net.IPMask, cooldown time.Duration, - logger logging.Logger, timeNow func() time.Time) *runner { - return &runner{ + logger logging.Logger, timeNow func() time.Time) *Runner { + return &Runner{ period: period, db: db, updater: updater, @@ -45,7 +45,7 @@ func NewRunner(db Database, updater Updater, ipGetter PublicIPFetcher, } } -func (r *runner) lookupIPsResilient(ctx context.Context, hostname string, tries int) ( +func (r *Runner) lookupIPsResilient(ctx context.Context, hostname string, tries int) ( ipv4 net.IP, ipv6 net.IP, err error) { for i := 0; i < tries; i++ { ipv4, ipv6, err = r.lookupIPs(ctx, hostname) @@ -56,7 +56,7 @@ func (r *runner) lookupIPsResilient(ctx context.Context, hostname string, tries return nil, nil, err } -func (r *runner) lookupIPs(ctx context.Context, hostname string) (ipv4 net.IP, ipv6 net.IP, err error) { +func (r *Runner) lookupIPs(ctx context.Context, hostname string) (ipv4 net.IP, ipv6 net.IP, err error) { ips, err := r.resolver.LookupIP(ctx, "ip", hostname) if err != nil { return nil, nil, err @@ -88,7 +88,7 @@ func doIPVersion(records []librecords.Record) (doIP, doIPv4, doIPv6 bool) { return doIP, doIPv4, doIPv6 } -func (r *runner) getNewIPs(ctx context.Context, doIP, doIPv4, doIPv6 bool, ipv6Mask net.IPMask) ( +func (r *Runner) getNewIPs(ctx context.Context, doIP, doIPv4, doIPv6 bool, ipv6Mask net.IPMask) ( ip, ipv4, ipv6 net.IP, errors []error) { var err error if doIP { @@ -116,7 +116,7 @@ func (r *runner) getNewIPs(ctx context.Context, doIP, doIPv4, doIPv6 bool, ipv6M return ip, ipv4, ipv6, errors } -func (r *runner) getRecordIDsToUpdate(ctx context.Context, records []librecords.Record, +func (r *Runner) getRecordIDsToUpdate(ctx context.Context, records []librecords.Record, ip, ipv4, ipv6 net.IP, now time.Time, ipv6Mask net.IPMask) (recordIDs map[int]struct{}) { recordIDs = make(map[int]struct{}) for id, record := range records { @@ -127,7 +127,7 @@ func (r *runner) getRecordIDsToUpdate(ctx context.Context, records []librecords. return recordIDs } -func (r *runner) shouldUpdateRecord(ctx context.Context, record librecords.Record, +func (r *Runner) shouldUpdateRecord(ctx context.Context, record librecords.Record, ip, ipv4, ipv6 net.IP, now time.Time, ipv6Mask net.IPMask) (update bool) { isWithinBanPeriod := record.LastBan != nil && now.Sub(*record.LastBan) < time.Hour isWithinCooldown := now.Sub(record.History.GetSuccessTime()) < r.cooldown @@ -146,7 +146,7 @@ func (r *runner) shouldUpdateRecord(ctx context.Context, record librecords.Recor return r.shouldUpdateRecordWithLookup(ctx, hostname, ipVersion, ip, ipv4, ipv6, ipv6Mask) } -func (r *runner) shouldUpdateRecordNoLookup(hostname string, ipVersion ipversion.IPVersion, +func (r *Runner) shouldUpdateRecordNoLookup(hostname string, ipVersion ipversion.IPVersion, lastIP, ip, ipv4, ipv6 net.IP) (update bool) { switch ipVersion { case ipversion.IP4or6: @@ -177,7 +177,7 @@ func (r *runner) shouldUpdateRecordNoLookup(hostname string, ipVersion ipversion return false } -func (r *runner) shouldUpdateRecordWithLookup(ctx context.Context, hostname string, ipVersion ipversion.IPVersion, +func (r *Runner) shouldUpdateRecordWithLookup(ctx context.Context, hostname string, ipVersion ipversion.IPVersion, ip, ipv4, ipv6 net.IP, ipv6Mask net.IPMask) (update bool) { const tries = 5 recordIPv4, recordIPv6, err := r.lookupIPsResilient(ctx, hostname, tries) @@ -255,7 +255,7 @@ func setInitialUpToDateStatus(db Database, id int, updateIP net.IP, now time.Tim return db.Update(id, record) } -func (r *runner) updateNecessary(ctx context.Context, ipv6Mask net.IPMask) (errors []error) { +func (r *Runner) updateNecessary(ctx context.Context, ipv6Mask net.IPMask) (errors []error) { records := r.db.SelectAll() doIP, doIPv4, doIPv6 := doIPVersion(records) r.logger.Debug(fmt.Sprintf("configured to fetch IP: v4 or v6: %t, v4: %t, v6: %t", doIP, doIPv4, doIPv6)) @@ -292,7 +292,7 @@ func (r *runner) updateNecessary(ctx context.Context, ipv6Mask net.IPMask) (erro return errors } -func (r *runner) Run(ctx context.Context, done chan<- struct{}) { +func (r *Runner) Run(ctx context.Context, done chan<- struct{}) { defer close(done) ticker := time.NewTicker(r.period) for { @@ -308,7 +308,7 @@ func (r *runner) Run(ctx context.Context, done chan<- struct{}) { } } -func (r *runner) ForceUpdate(ctx context.Context) (errs []error) { +func (r *Runner) ForceUpdate(ctx context.Context) (errs []error) { r.force <- struct{}{} select { diff --git a/internal/update/update.go b/internal/update/update.go index 984e32e6..755e5fd6 100644 --- a/internal/update/update.go +++ b/internal/update/update.go @@ -14,7 +14,7 @@ import ( "github.com/qdm12/golibs/logging" ) -type updater struct { +type Updater struct { db Database client *http.Client notify notifyFunc @@ -23,9 +23,9 @@ type updater struct { type notifyFunc func(message string) -func NewUpdater(db Database, client *http.Client, notify notifyFunc, logger logging.Logger) *updater { +func NewUpdater(db Database, client *http.Client, notify notifyFunc, logger logging.Logger) *Updater { client = makeLogClient(client, logger) - return &updater{ + return &Updater{ db: db, client: client, notify: notify, @@ -33,7 +33,7 @@ func NewUpdater(db Database, client *http.Client, notify notifyFunc, logger logg } } -func (u *updater) Update(ctx context.Context, id int, ip net.IP, now time.Time) (err error) { +func (u *Updater) Update(ctx context.Context, id int, ip net.IP, now time.Time) (err error) { record, err := u.db.Select(id) if err != nil { return err diff --git a/pkg/publicip/dns/dns.go b/pkg/publicip/dns/dns.go index e4830a7d..48b996aa 100644 --- a/pkg/publicip/dns/dns.go +++ b/pkg/publicip/dns/dns.go @@ -6,7 +6,7 @@ import ( "github.com/miekg/dns" ) -type fetcher struct { +type Fetcher struct { ring ring client Client client4 Client @@ -19,7 +19,7 @@ type ring struct { providers []Provider } -func New(options ...Option) (f *fetcher, err error) { +func New(options ...Option) (f *Fetcher, err error) { settings := newDefaultSettings() for _, option := range options { if err := option(&settings); err != nil { @@ -31,7 +31,7 @@ func New(options ...Option) (f *fetcher, err error) { Timeout: settings.timeout, } - return &fetcher{ + return &Fetcher{ ring: ring{ counter: new(uint32), providers: settings.providers, diff --git a/pkg/publicip/dns/ip.go b/pkg/publicip/dns/ip.go index fcd54482..5ff5cb36 100644 --- a/pkg/publicip/dns/ip.go +++ b/pkg/publicip/dns/ip.go @@ -6,19 +6,19 @@ import ( "sync/atomic" ) -func (f *fetcher) IP(ctx context.Context) (publicIP net.IP, err error) { +func (f *Fetcher) IP(ctx context.Context) (publicIP net.IP, err error) { return f.ip(ctx, f.client) } -func (f *fetcher) IP4(ctx context.Context) (publicIP net.IP, err error) { +func (f *Fetcher) IP4(ctx context.Context) (publicIP net.IP, err error) { return f.ip(ctx, f.client4) } -func (f *fetcher) IP6(ctx context.Context) (publicIP net.IP, err error) { +func (f *Fetcher) IP6(ctx context.Context) (publicIP net.IP, err error) { return f.ip(ctx, f.client6) } -func (f *fetcher) ip(ctx context.Context, client Client) ( +func (f *Fetcher) ip(ctx context.Context, client Client) ( publicIP net.IP, err error) { index := int(atomic.AddUint32(f.ring.counter, 1)) % len(f.ring.providers) provider := f.ring.providers[index] diff --git a/pkg/publicip/http/http.go b/pkg/publicip/http/http.go index d865c2b2..b4e77963 100644 --- a/pkg/publicip/http/http.go +++ b/pkg/publicip/http/http.go @@ -7,7 +7,7 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -type fetcher struct { +type Fetcher struct { client *http.Client timeout time.Duration ip4or6 urlsRing // URLs to get ipv4 or ipv6 @@ -20,7 +20,7 @@ type urlsRing struct { urls []string } -func New(client *http.Client, options ...Option) (f *fetcher, err error) { +func New(client *http.Client, options ...Option) (f *Fetcher, err error) { settings := newDefaultSettings() for _, option := range options { if err := option(&settings); err != nil { @@ -28,7 +28,7 @@ func New(client *http.Client, options ...Option) (f *fetcher, err error) { } } - fetcher := &fetcher{ + fetcher := &Fetcher{ client: client, timeout: settings.timeout, } diff --git a/pkg/publicip/http/http_test.go b/pkg/publicip/http/http_test.go index 1b378072..c5630039 100644 --- a/pkg/publicip/http/http_test.go +++ b/pkg/publicip/http/http_test.go @@ -17,11 +17,11 @@ func Test_New(t *testing.T) { testCases := map[string]struct { options []Option - fetcher *fetcher + fetcher *Fetcher err error }{ "no options": { - fetcher: &fetcher{ + fetcher: &Fetcher{ client: client, timeout: 5 * time.Second, ip4or6: urlsRing{ @@ -45,7 +45,7 @@ func Test_New(t *testing.T) { SetProvidersIP6(Ipify), SetTimeout(time.Second), }, - fetcher: &fetcher{ + fetcher: &Fetcher{ client: client, timeout: time.Second, ip4or6: urlsRing{ diff --git a/pkg/publicip/http/ip.go b/pkg/publicip/http/ip.go index c2913952..088ce1dc 100644 --- a/pkg/publicip/http/ip.go +++ b/pkg/publicip/http/ip.go @@ -8,19 +8,19 @@ import ( "github.com/qdm12/ddns-updater/pkg/publicip/ipversion" ) -func (f *fetcher) IP(ctx context.Context) (publicIP net.IP, err error) { +func (f *Fetcher) IP(ctx context.Context) (publicIP net.IP, err error) { return f.ip(ctx, f.ip4or6, ipversion.IP4or6) } -func (f *fetcher) IP4(ctx context.Context) (publicIP net.IP, err error) { +func (f *Fetcher) IP4(ctx context.Context) (publicIP net.IP, err error) { return f.ip(ctx, f.ip4, ipversion.IP4) } -func (f *fetcher) IP6(ctx context.Context) (publicIP net.IP, err error) { +func (f *Fetcher) IP6(ctx context.Context) (publicIP net.IP, err error) { return f.ip(ctx, f.ip6, ipversion.IP6) } -func (f *fetcher) ip(ctx context.Context, ring urlsRing, version ipversion.IPVersion) ( +func (f *Fetcher) ip(ctx context.Context, ring urlsRing, version ipversion.IPVersion) ( publicIP net.IP, err error) { index := int(atomic.AddUint32(ring.counter, 1)) % len(ring.urls) url := ring.urls[index] diff --git a/pkg/publicip/http/ip_test.go b/pkg/publicip/http/ip_test.go index b9b2413b..4b40ba6c 100644 --- a/pkg/publicip/http/ip_test.go +++ b/pkg/publicip/http/ip_test.go @@ -35,7 +35,7 @@ func Test_fetcher_IP(t *testing.T) { }), } - initialFetcher := &fetcher{ + initialFetcher := &Fetcher{ client: client, timeout: time.Hour, ip4or6: urlsRing{ @@ -43,7 +43,7 @@ func Test_fetcher_IP(t *testing.T) { urls: []string{"a", "b", "c"}, }, } - expectedFetcher := &fetcher{ + expectedFetcher := &Fetcher{ client: client, timeout: time.Hour, ip4or6: urlsRing{ @@ -79,7 +79,7 @@ func Test_fetcher_IP4(t *testing.T) { }), } - initialFetcher := &fetcher{ + initialFetcher := &Fetcher{ client: client, timeout: time.Hour, ip4: urlsRing{ @@ -87,7 +87,7 @@ func Test_fetcher_IP4(t *testing.T) { urls: []string{"a", "b", "c"}, }, } - expectedFetcher := &fetcher{ + expectedFetcher := &Fetcher{ client: client, timeout: time.Hour, ip4: urlsRing{ @@ -126,7 +126,7 @@ func Test_fetcher_IP6(t *testing.T) { }), } - initialFetcher := &fetcher{ + initialFetcher := &Fetcher{ client: client, timeout: time.Hour, ip6: urlsRing{ @@ -134,7 +134,7 @@ func Test_fetcher_IP6(t *testing.T) { urls: []string{"a", "b", "c"}, }, } - expectedFetcher := &fetcher{ + expectedFetcher := &Fetcher{ client: client, timeout: time.Hour, ip6: urlsRing{ @@ -177,15 +177,15 @@ func Test_fetcher_ip(t *testing.T) { } testCases := map[string]struct { - initialFetcher *fetcher + initialFetcher *Fetcher ctx context.Context publicIP net.IP err error - finalFetcher *fetcher // client is ignored when comparing the two + finalFetcher *Fetcher // client is ignored when comparing the two }{ "first run": { ctx: context.Background(), - initialFetcher: &fetcher{ + initialFetcher: &Fetcher{ timeout: time.Hour, client: newTestClient("b", []byte(`55.55.55.55`), nil), ip4or6: urlsRing{ @@ -194,7 +194,7 @@ func Test_fetcher_ip(t *testing.T) { }, }, publicIP: net.IP{55, 55, 55, 55}, - finalFetcher: &fetcher{ + finalFetcher: &Fetcher{ timeout: time.Hour, ip4or6: urlsRing{ counter: uint32Ptr(1), @@ -204,7 +204,7 @@ func Test_fetcher_ip(t *testing.T) { }, "second run": { ctx: context.Background(), - initialFetcher: &fetcher{ + initialFetcher: &Fetcher{ timeout: time.Hour, client: newTestClient("a", []byte(`55.55.55.55`), nil), ip4or6: urlsRing{ @@ -213,7 +213,7 @@ func Test_fetcher_ip(t *testing.T) { }, }, publicIP: net.IP{55, 55, 55, 55}, - finalFetcher: &fetcher{ + finalFetcher: &Fetcher{ timeout: time.Hour, ip4or6: urlsRing{ counter: uint32Ptr(2), @@ -223,7 +223,7 @@ func Test_fetcher_ip(t *testing.T) { }, "max uint32": { ctx: context.Background(), - initialFetcher: &fetcher{ + initialFetcher: &Fetcher{ timeout: time.Hour, client: newTestClient("a", []byte(`55.55.55.55`), nil), ip4or6: urlsRing{ @@ -232,7 +232,7 @@ func Test_fetcher_ip(t *testing.T) { }, }, publicIP: net.IP{55, 55, 55, 55}, - finalFetcher: &fetcher{ + finalFetcher: &Fetcher{ timeout: time.Hour, ip4or6: urlsRing{ counter: uint32Ptr(0), @@ -242,14 +242,14 @@ func Test_fetcher_ip(t *testing.T) { }, "zero timeout": { ctx: context.Background(), - initialFetcher: &fetcher{ + initialFetcher: &Fetcher{ client: newTestClient("a", nil, nil), ip4or6: urlsRing{ counter: uint32Ptr(1), urls: []string{"a", "b"}, }, }, - finalFetcher: &fetcher{ + finalFetcher: &Fetcher{ ip4or6: urlsRing{ counter: uint32Ptr(2), urls: []string{"a", "b"}, @@ -259,7 +259,7 @@ func Test_fetcher_ip(t *testing.T) { }, "canceled context": { ctx: canceledCtx, - initialFetcher: &fetcher{ + initialFetcher: &Fetcher{ timeout: time.Hour, client: newTestClient("a", nil, nil), ip4or6: urlsRing{ @@ -267,7 +267,7 @@ func Test_fetcher_ip(t *testing.T) { urls: []string{"a", "b"}, }, }, - finalFetcher: &fetcher{ + finalFetcher: &Fetcher{ timeout: time.Hour, ip4or6: urlsRing{ counter: uint32Ptr(2), diff --git a/pkg/publicip/publicip.go b/pkg/publicip/publicip.go index 360a6c04..8cb6728e 100644 --- a/pkg/publicip/publicip.go +++ b/pkg/publicip/publicip.go @@ -15,7 +15,7 @@ type ipFetcher interface { IP6(ctx context.Context) (ipv6 net.IP, err error) } -type fetcher struct { +type Fetcher struct { settings settings fetchers []ipFetcher // Cycling effect if both are enabled @@ -24,13 +24,13 @@ type fetcher struct { var ErrNoFetchTypeSpecified = errors.New("at least one fetcher type must be specified") -func NewFetcher(dnsSettings DNSSettings, httpSettings HTTPSettings) (f *fetcher, err error) { +func NewFetcher(dnsSettings DNSSettings, httpSettings HTTPSettings) (f *Fetcher, err error) { settings := settings{ dns: dnsSettings, http: httpSettings, } - fetcher := &fetcher{ + fetcher := &Fetcher{ settings: settings, counter: new(uint32), } @@ -58,14 +58,14 @@ func NewFetcher(dnsSettings DNSSettings, httpSettings HTTPSettings) (f *fetcher, return fetcher, nil } -func (f *fetcher) IP(ctx context.Context) (ip net.IP, err error) { +func (f *Fetcher) IP(ctx context.Context) (ip net.IP, err error) { return f.getSubFetcher().IP(ctx) } -func (f *fetcher) IP4(ctx context.Context) (ipv4 net.IP, err error) { +func (f *Fetcher) IP4(ctx context.Context) (ipv4 net.IP, err error) { return f.getSubFetcher().IP4(ctx) } -func (f *fetcher) IP6(ctx context.Context) (ipv6 net.IP, err error) { +func (f *Fetcher) IP6(ctx context.Context) (ipv6 net.IP, err error) { return f.getSubFetcher().IP6(ctx) } diff --git a/pkg/publicip/subfetcher.go b/pkg/publicip/subfetcher.go index 896e2c52..43ae82b0 100644 --- a/pkg/publicip/subfetcher.go +++ b/pkg/publicip/subfetcher.go @@ -4,7 +4,7 @@ import ( "sync/atomic" ) -func (f *fetcher) getSubFetcher() ipFetcher { //nolint:ireturn +func (f *Fetcher) getSubFetcher() ipFetcher { //nolint:ireturn fetcher := f.fetchers[0] if len(f.fetchers) > 1 { // cycling effect index := int(atomic.AddUint32(f.counter, 1)) % len(f.fetchers)