1
0
Fork 0

line ending fix

This commit is contained in:
Henrik Hautakoski 2025-10-12 23:52:30 +02:00
parent a0e4de3d19
commit 0c347312bd
26 changed files with 1053 additions and 1046 deletions

View file

@ -1,105 +1,105 @@
package digitalocean
import (
"context"
"errors"
"testing"
"github.com/digitalocean/godo"
"github.com/stretchr/testify/assert"
)
type mock struct {
t *testing.T
records_by_type map[string][]godo.DomainRecord
edit_record_request *godo.DomainRecordEditRequest
edit_record_error error
}
func (m mock) List(context.Context, *godo.ListOptions) ([]godo.Domain, *godo.Response, error) {
m.t.Error("List called when it should not have been")
return nil, nil, nil
}
func (m mock) Get(context.Context, string) (*godo.Domain, *godo.Response, error) {
m.t.Error("Get called when it should not have been")
return nil, nil, nil
}
func (m mock) Create(context.Context, *godo.DomainCreateRequest) (*godo.Domain, *godo.Response, error) {
m.t.Error("Create called when it should not have been")
return nil, nil, nil
}
func (m mock) Delete(context.Context, string) (*godo.Response, error) {
m.t.Error("Delete called when it should not have been")
return nil, nil
}
func (m mock) Records(context.Context, string, *godo.ListOptions) ([]godo.DomainRecord, *godo.Response, error) {
m.t.Error("Records called when it should not have been")
return nil, nil, nil
}
func (m mock) RecordsByType(_ context.Context, name string, t string, opt *godo.ListOptions) ([]godo.DomainRecord, *godo.Response, error) {
var err error
// Only care about "A" records
assert.Equal(m.t, "A", t)
r, ok := m.records_by_type[name]
if !ok {
err = errors.New("Record not found")
}
return r, nil, err
}
func (m mock) RecordsByName(context.Context, string, string, *godo.ListOptions) ([]godo.DomainRecord, *godo.Response, error) {
m.t.Error("RecordsByName called when it should not have been")
return nil, nil, nil
}
func (m mock) RecordsByTypeAndName(context.Context, string, string, string, *godo.ListOptions) ([]godo.DomainRecord, *godo.Response, error) {
m.t.Error("RecordsByTypeAndName called when it should not have been")
return nil, nil, nil
}
func (m mock) Record(context.Context, string, int) (*godo.DomainRecord, *godo.Response, error) {
m.t.Error("Record called when it should not have been")
return nil, nil, nil
}
func (m mock) DeleteRecord(context.Context, string, int) (*godo.Response, error) {
m.t.Error("DeleteRecord called when it should not have been")
return nil, nil
}
func (m mock) EditRecord(_ context.Context, domain string, id int, req *godo.DomainRecordEditRequest) (*godo.DomainRecord, *godo.Response, error) {
if m.edit_record_request == nil {
m.t.Error("EditRecord called with empty request")
}
assert.Equal(m.t, m.edit_record_request, req)
record := godo.DomainRecord{
ID: id,
Type: req.Type,
Name: req.Name,
Data: req.Data,
Priority: req.Priority,
Port: req.Port,
TTL: req.TTL,
Weight: req.Weight,
Flags: req.Flags,
Tag: req.Tag,
}
return &record, nil, m.edit_record_error
}
func (m mock) CreateRecord(context.Context, string, *godo.DomainRecordEditRequest) (*godo.DomainRecord, *godo.Response, error) {
m.t.Error("CreateRecord called when it should not have been")
return nil, nil, nil
}
package digitalocean
import (
"context"
"errors"
"testing"
"github.com/digitalocean/godo"
"github.com/stretchr/testify/assert"
)
type mock struct {
t *testing.T
records_by_type map[string][]godo.DomainRecord
edit_record_request *godo.DomainRecordEditRequest
edit_record_error error
}
func (m mock) List(context.Context, *godo.ListOptions) ([]godo.Domain, *godo.Response, error) {
m.t.Error("List called when it should not have been")
return nil, nil, nil
}
func (m mock) Get(context.Context, string) (*godo.Domain, *godo.Response, error) {
m.t.Error("Get called when it should not have been")
return nil, nil, nil
}
func (m mock) Create(context.Context, *godo.DomainCreateRequest) (*godo.Domain, *godo.Response, error) {
m.t.Error("Create called when it should not have been")
return nil, nil, nil
}
func (m mock) Delete(context.Context, string) (*godo.Response, error) {
m.t.Error("Delete called when it should not have been")
return nil, nil
}
func (m mock) Records(context.Context, string, *godo.ListOptions) ([]godo.DomainRecord, *godo.Response, error) {
m.t.Error("Records called when it should not have been")
return nil, nil, nil
}
func (m mock) RecordsByType(_ context.Context, name string, t string, opt *godo.ListOptions) ([]godo.DomainRecord, *godo.Response, error) {
var err error
// Only care about "A" records
assert.Equal(m.t, "A", t)
r, ok := m.records_by_type[name]
if !ok {
err = errors.New("Record not found")
}
return r, nil, err
}
func (m mock) RecordsByName(context.Context, string, string, *godo.ListOptions) ([]godo.DomainRecord, *godo.Response, error) {
m.t.Error("RecordsByName called when it should not have been")
return nil, nil, nil
}
func (m mock) RecordsByTypeAndName(context.Context, string, string, string, *godo.ListOptions) ([]godo.DomainRecord, *godo.Response, error) {
m.t.Error("RecordsByTypeAndName called when it should not have been")
return nil, nil, nil
}
func (m mock) Record(context.Context, string, int) (*godo.DomainRecord, *godo.Response, error) {
m.t.Error("Record called when it should not have been")
return nil, nil, nil
}
func (m mock) DeleteRecord(context.Context, string, int) (*godo.Response, error) {
m.t.Error("DeleteRecord called when it should not have been")
return nil, nil
}
func (m mock) EditRecord(_ context.Context, domain string, id int, req *godo.DomainRecordEditRequest) (*godo.DomainRecord, *godo.Response, error) {
if m.edit_record_request == nil {
m.t.Error("EditRecord called with empty request")
}
assert.Equal(m.t, m.edit_record_request, req)
record := godo.DomainRecord{
ID: id,
Type: req.Type,
Name: req.Name,
Data: req.Data,
Priority: req.Priority,
Port: req.Port,
TTL: req.TTL,
Weight: req.Weight,
Flags: req.Flags,
Tag: req.Tag,
}
return &record, nil, m.edit_record_error
}
func (m mock) CreateRecord(context.Context, string, *godo.DomainRecordEditRequest) (*godo.DomainRecord, *godo.Response, error) {
m.t.Error("CreateRecord called when it should not have been")
return nil, nil, nil
}

View file

@ -1,98 +1,98 @@
package digitalocean
import (
"context"
"errors"
"fmt"
"net"
"dnsupdater/provider"
"github.com/digitalocean/godo"
)
type Provider struct {
service godo.DomainsService
cache map[string][]godo.DomainRecord
}
func New(token string) Provider {
return Provider{
service: godo.NewFromToken(token).Domains,
cache: make(map[string][]godo.DomainRecord),
}
}
func Factory(args map[string]interface{}) (provider.Provider, error) {
t, ok := args["token"]
if !ok {
return nil, errors.New("did not find token")
}
token, ok := t.(string)
if !ok {
return nil, errors.New("token must be a string")
}
return New(token), nil
}
func (d *Provider) fetch(domain string) ([]godo.DomainRecord, error) {
domains, ok := d.cache[domain]
if !ok {
var err error
options := &godo.ListOptions{
PerPage: 50,
}
domains, _, err = d.service.RecordsByType(context.Background(), domain, "A", options)
if err != nil {
return nil, err
}
d.cache[domain] = domains
}
return domains, nil
}
func (d *Provider) find(domain string, record string) (*godo.DomainRecord, error) {
records, err := d.fetch(domain)
if err != nil {
return nil, err
}
for _, r := range records {
if r.Name == record {
return &r, nil
}
}
return nil, fmt.Errorf("could not find record %s", record)
}
func (d Provider) Update(domain string, record string, ip net.IP) error {
r, err := d.find(domain, record)
if err != nil {
return err
}
if r.Data != ip.String() {
// Update
req := godo.DomainRecordEditRequest{
// Type: r.Type,
// Name: r.Name,
Data: ip.String(),
// Priority: r.Priority,
// Port: r.Port,
// TTL: r.TTL,
// Weight: r.Weight,
// Flags: r.Flags,
// Tag: r.Tag,
}
_, _, err := d.service.EditRecord(context.Background(), domain, r.ID, &req)
if err != nil {
return err
}
}
return nil
}
package digitalocean
import (
"context"
"errors"
"fmt"
"net"
"dnsupdater/provider"
"github.com/digitalocean/godo"
)
type Provider struct {
service godo.DomainsService
cache map[string][]godo.DomainRecord
}
func New(token string) Provider {
return Provider{
service: godo.NewFromToken(token).Domains,
cache: make(map[string][]godo.DomainRecord),
}
}
func Factory(args map[string]interface{}) (provider.Provider, error) {
t, ok := args["token"]
if !ok {
return nil, errors.New("did not find token")
}
token, ok := t.(string)
if !ok {
return nil, errors.New("token must be a string")
}
return New(token), nil
}
func (d *Provider) fetch(domain string) ([]godo.DomainRecord, error) {
domains, ok := d.cache[domain]
if !ok {
var err error
options := &godo.ListOptions{
PerPage: 50,
}
domains, _, err = d.service.RecordsByType(context.Background(), domain, "A", options)
if err != nil {
return nil, err
}
d.cache[domain] = domains
}
return domains, nil
}
func (d *Provider) find(domain string, record string) (*godo.DomainRecord, error) {
records, err := d.fetch(domain)
if err != nil {
return nil, err
}
for _, r := range records {
if r.Name == record {
return &r, nil
}
}
return nil, fmt.Errorf("could not find record %s", record)
}
func (d Provider) Update(domain string, record string, ip net.IP) error {
r, err := d.find(domain, record)
if err != nil {
return err
}
if r.Data != ip.String() {
// Update
req := godo.DomainRecordEditRequest{
// Type: r.Type,
// Name: r.Name,
Data: ip.String(),
// Priority: r.Priority,
// Port: r.Port,
// TTL: r.TTL,
// Weight: r.Weight,
// Flags: r.Flags,
// Tag: r.Tag,
}
_, _, err := d.service.EditRecord(context.Background(), domain, r.ID, &req)
if err != nil {
return err
}
}
return nil
}

View file

@ -1,11 +1,11 @@
package provider
import (
"net"
)
type Provider interface {
Update(domain string, record string, ip net.IP) error
}
type ProviderFactory func(map[string]interface{}) (Provider, error)
package provider
import (
"net"
)
type Provider interface {
Update(domain string, record string, ip net.IP) error
}
type ProviderFactory func(map[string]interface{}) (Provider, error)

View file

@ -1,48 +1,48 @@
package manager
import (
"fmt"
"dnsupdater/provider"
"dnsupdater/provider/digitalocean"
)
var factories = map[string]provider.ProviderFactory{
"digitalocean": digitalocean.Factory,
}
type Manager struct {
services map[string]provider.Provider
}
func New() *Manager {
return &Manager{
services: make(map[string]provider.Provider),
}
}
func (m Manager) Get(name string) provider.Provider {
if service, ok := m.services[name]; ok {
return service
}
return nil
}
func (m Manager) RegisterFromConfig(providers map[string]map[string]interface{}) error {
for name, args := range providers {
if factory, ok := factories[name]; ok {
provider, err := factory(args)
if err != nil {
return fmt.Errorf("could not create provider '%s': %v", name, err)
}
m.Register(name, provider)
}
}
return nil
}
func (m Manager) Register(name string, provider provider.Provider) {
m.services[name] = provider
}
package manager
import (
"fmt"
"dnsupdater/provider"
"dnsupdater/provider/digitalocean"
)
var factories = map[string]provider.ProviderFactory{
"digitalocean": digitalocean.Factory,
}
type Manager struct {
services map[string]provider.Provider
}
func New() *Manager {
return &Manager{
services: make(map[string]provider.Provider),
}
}
func (m Manager) Get(name string) provider.Provider {
if service, ok := m.services[name]; ok {
return service
}
return nil
}
func (m Manager) RegisterFromConfig(providers map[string]map[string]interface{}) error {
for name, args := range providers {
if factory, ok := factories[name]; ok {
provider, err := factory(args)
if err != nil {
return fmt.Errorf("could not create provider '%s': %v", name, err)
}
m.Register(name, provider)
}
}
return nil
}
func (m Manager) Register(name string, provider provider.Provider) {
m.services[name] = provider
}