Skip to content

Commit

Permalink
Upgrade Cloudflare SDK to latest version
Browse files Browse the repository at this point in the history
  • Loading branch information
elct9620 authored and tjjh89017 committed Sep 19, 2024
1 parent 53bd12b commit 2bc9ffb
Show file tree
Hide file tree
Showing 9 changed files with 99 additions and 94 deletions.
25 changes: 11 additions & 14 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,21 @@ module github.com/tjjh89017/stunmesh-go
go 1.22

require (
github.com/cloudflare/cloudflare-go v0.17.0
github.com/cloudflare/cloudflare-go v0.104.0
github.com/google/wire v0.6.0
github.com/pion/stun v0.3.5
github.com/rs/zerolog v1.33.0
github.com/spf13/viper v1.19.0
golang.org/x/crypto v0.21.0
golang.org/x/net v0.23.0
golang.org/x/crypto v0.27.0
golang.org/x/net v0.29.0
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6
)

require (
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/subcommands v1.2.0 // indirect
github.com/google/wire v0.6.0 // indirect
github.com/goccy/go-json v0.10.3 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/josharian/native v1.1.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
Expand All @@ -26,9 +28,6 @@ require (
github.com/mdlayher/socket v0.4.1 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/rs/zerolog v1.33.0 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
Expand All @@ -39,12 +38,10 @@ require (
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.9.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/mod v0.14.0 // indirect
golang.org/x/sync v0.6.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.25.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.5.0 // indirect
golang.org/x/tools v0.17.0 // indirect
golang.org/x/text v0.18.0 // indirect
golang.org/x/time v0.6.0 // indirect
golang.zx2c4.com/wireguard v0.0.0-20230325221338-052af4a8072b // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
Expand Down
60 changes: 22 additions & 38 deletions go.sum

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ var envs = map[string][]string{
"wg": {"WG", "WIREGUARD"},
"cloudflare.api_key": {"CF_API_KEY", "CLOUDFLARE_API_KEY"},
"cloudflare.api_email": {"CF_API_EMAIL", "CLOUDFLARE_API_EMAIL"},
"cloudflare.api_token": {"CF_API_TOKEN", "CLOUDFLARE_API_TOKEN"},
"cloudflare.zone_name": {"CF_ZONE_NAME", "CLOUDFLARE_ZONE_NAME"},
}

Expand All @@ -40,6 +41,7 @@ type Config struct {
Cloudflare struct {
ApiKey string `mapstructure:"api_key"`
ApiEmail string `mapstructure:"api_email"`
ApiToken string `mapstructure:"api_token"`
ZoneName string `mapstructure:"zone_name"`
} `mapstructure:"cloudflare"`
}
Expand Down
1 change: 1 addition & 0 deletions internal/ctrl/publish.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ func (c *PublishController) Execute(ctx context.Context) {
continue
}

logger.Info().Msg("store endpoint")
storeCtx := logger.WithContext(ctx)
err = c.store.Set(storeCtx, peer.LocalId(), res.Data)
if err != nil {
Expand Down
58 changes: 34 additions & 24 deletions internal/store/cloudflare.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ var (
)

type CloudflareApi interface {
DNSRecords(ctx context.Context, zoneId string, rr cloudflare.DNSRecord) ([]cloudflare.DNSRecord, error)
CreateDNSRecord(ctx context.Context, zoneId string, rr cloudflare.DNSRecord) (*cloudflare.DNSRecordResponse, error)
UpdateDNSRecord(ctx context.Context, zoneId, recordId string, rr cloudflare.DNSRecord) error
DeleteDNSRecord(ctx context.Context, zoneId, recordId string) error
ListDNSRecords(ctx context.Context, rc *cloudflare.ResourceContainer, params cloudflare.ListDNSRecordsParams) ([]cloudflare.DNSRecord, *cloudflare.ResultInfo, error)
CreateDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, params cloudflare.CreateDNSRecordParams) (cloudflare.DNSRecord, error)
UpdateDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, params cloudflare.UpdateDNSRecordParams) (cloudflare.DNSRecord, error)
DeleteDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, recordId string) error
ZoneIDByName(zoneName string) (string, error)
}

Expand All @@ -27,7 +27,7 @@ var _ plugin.Store = &CloudflareStore{}
type CloudflareStore struct {
mutex sync.RWMutex
api CloudflareApi
zoneId string
zoneId *cloudflare.ResourceContainer
zoneName string
}

Expand All @@ -39,12 +39,12 @@ func (s *CloudflareStore) Get(ctx context.Context, key string) (string, error) {
logger := zerolog.Ctx(ctx)

logger.Info().Str("key", key).Msg("get IP info from Cloudflare")
records, err := s.associatedRecords(ctx, key)
records, info, err := s.associatedRecords(ctx, key)
if err != nil {
return "", err
}

isFound := len(records) > 0
isFound := info.Count > 0
if !isFound {
return "", ErrEndpointDataNotFound
}
Expand All @@ -56,7 +56,7 @@ func (s *CloudflareStore) Set(ctx context.Context, key string, value string) err
logger := zerolog.Ctx(ctx)

logger.Info().Str("key", key).Str("value", value).Msg("store IP info to Cloudflare")
records, err := s.associatedRecords(ctx, key)
records, info, err := s.associatedRecords(ctx, key)
if err != nil {
return err
}
Expand All @@ -66,19 +66,21 @@ func (s *CloudflareStore) Set(ctx context.Context, key string, value string) err
return err
}

record := cloudflare.DNSRecord{
Type: "TXT",
Name: key + "." + s.zoneName,
Content: value,
}
name := key + "." + s.zoneName

isFound := len(records) > 0
isFound := info.Count > 0
if !isFound {
_, err := s.api.CreateDNSRecord(ctx, zoneId, record)
_, err := s.api.CreateDNSRecord(ctx, zoneId, cloudflare.CreateDNSRecordParams{
Type: "TXT",
Name: name,
Content: value,
Comment: "Created by Stunmesh",
})

return err
}

isDuplicate := len(records) > 1
isDuplicate := info.Count > 1
if isDuplicate {
for _, x := range records[1:] {
if err := s.api.DeleteDNSRecord(ctx, zoneId, x.ID); err != nil {
Expand All @@ -87,30 +89,38 @@ func (s *CloudflareStore) Set(ctx context.Context, key string, value string) err
}
}

return s.api.UpdateDNSRecord(ctx, zoneId, records[0].ID, record)
_, err = s.api.UpdateDNSRecord(ctx, zoneId, cloudflare.UpdateDNSRecordParams{
ID: records[0].ID,
Content: value,
})

return err
}

func (s *CloudflareStore) ZoneId() (string, error) {
func (s *CloudflareStore) ZoneId() (*cloudflare.ResourceContainer, error) {
s.mutex.Lock()
defer s.mutex.Unlock()

if s.zoneId == "" {
if s.zoneId == nil {
zone, err := s.api.ZoneIDByName(s.zoneName)
if err != nil {
return "", err
return nil, err
}

s.zoneId = zone
s.zoneId = cloudflare.ZoneIdentifier(zone)
}

return s.zoneId, nil
}

func (s *CloudflareStore) associatedRecords(ctx context.Context, key string) ([]cloudflare.DNSRecord, error) {
func (s *CloudflareStore) associatedRecords(ctx context.Context, key string) ([]cloudflare.DNSRecord, *cloudflare.ResultInfo, error) {
zoneId, err := s.ZoneId()
if err != nil {
return nil, err
return nil, nil, err
}

return s.api.DNSRecords(ctx, zoneId, cloudflare.DNSRecord{Type: "TXT", Name: key + "." + s.zoneName})
return s.api.ListDNSRecords(ctx, zoneId, cloudflare.ListDNSRecordsParams{
Name: key + "." + s.zoneName,
Type: "TXT",
})
}
35 changes: 20 additions & 15 deletions internal/store/cloudflare_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,50 +24,55 @@ func newMockCloudflareApi() *mockCloudflareApi {
}
}

func (m *mockCloudflareApi) DNSRecords(ctx context.Context, zoneId string, rr cloudflare.DNSRecord) ([]cloudflare.DNSRecord, error) {
func (m *mockCloudflareApi) ListDNSRecords(ctx context.Context, rc *cloudflare.ResourceContainer, params cloudflare.ListDNSRecordsParams) ([]cloudflare.DNSRecord, *cloudflare.ResultInfo, error) {
m.mutex.RLock()
defer m.mutex.RUnlock()

matchedRecords := []cloudflare.DNSRecord{}

for _, record := range m.records {
isNameMatched := record.Name == rr.Name
isTypeMatched := record.Type == rr.Type
isNameMatched := record.Name == params.Name
isTypeMatched := record.Type == params.Type

if isNameMatched && isTypeMatched {
matchedRecords = append(matchedRecords, record)
}
}

return matchedRecords, nil
return matchedRecords, &cloudflare.ResultInfo{Count: len(matchedRecords)}, nil
}

func (m *mockCloudflareApi) CreateDNSRecord(ctx context.Context, zoneId string, rr cloudflare.DNSRecord) (*cloudflare.DNSRecordResponse, error) {
func (m *mockCloudflareApi) CreateDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, params cloudflare.CreateDNSRecordParams) (cloudflare.DNSRecord, error) {
m.mutex.Lock()
defer m.mutex.Unlock()

m.lastId++
rr.ID = fmt.Sprintf("mock-record-id-%d", m.lastId)
record := cloudflare.DNSRecord{
ID: fmt.Sprintf("mock-record-id-%d", m.lastId),
Type: params.Type,
Content: params.Content,
Name: params.Name,
}

m.records = append(m.records, rr)
return &cloudflare.DNSRecordResponse{}, nil
m.records = append(m.records, record)
return record, nil
}

func (m *mockCloudflareApi) UpdateDNSRecord(ctx context.Context, zoneId, recordId string, rr cloudflare.DNSRecord) error {
func (m *mockCloudflareApi) UpdateDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, params cloudflare.UpdateDNSRecordParams) (cloudflare.DNSRecord, error) {
m.mutex.Lock()
defer m.mutex.Unlock()

for i, record := range m.records {
if record.ID == recordId {
m.records[i].Content = rr.Content
return nil
if record.ID == params.ID {
m.records[i].Content = params.Content
return m.records[i], nil
}
}

return fmt.Errorf("record with id %s not found", recordId)
return cloudflare.DNSRecord{}, fmt.Errorf("record with id %s not found", params.ID)
}

func (m *mockCloudflareApi) DeleteDNSRecord(ctx context.Context, zoneId, recordId string) error {
func (m *mockCloudflareApi) DeleteDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, recordId string) error {
m.mutex.Lock()
defer m.mutex.Unlock()

Expand Down Expand Up @@ -116,7 +121,7 @@ func Test_CloudflareStore_ExistsDuplicate(t *testing.T) {
ctx := context.Background()

for i := 0; i < 3; i++ {
_, err := mockApi.CreateDNSRecord(ctx, "mock-zone-id", cloudflare.DNSRecord{
_, err := mockApi.CreateDNSRecord(ctx, cloudflare.ZoneIdentifier("mock-zone-id"), cloudflare.CreateDNSRecordParams{
Type: "TXT",
Content: fmt.Sprintf("value-%d", i),
Name: "key.example.com",
Expand Down
4 changes: 1 addition & 3 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,14 @@ package main

import (
"context"

"github.com/rs/zerolog"
)

func main() {
ctx := context.Background()

daemon, err := setup()
if err != nil {
zerolog.DefaultContextLogger.Panic().Err(err).Msg("failed to setup daemon")
panic(err)
}

daemon.Run(ctx)
Expand Down
4 changes: 4 additions & 0 deletions wire.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ func setup() (*daemon.Daemon, error) {
}

func provideCloudflareApi(config *config.Config) (*cloudflare.API, error) {
if config.Cloudflare.ApiToken != "" {
return cloudflare.NewWithAPIToken(config.Cloudflare.ApiToken)
}

return cloudflare.New(config.Cloudflare.ApiKey, config.Cloudflare.ApiEmail)
}

Expand Down
4 changes: 4 additions & 0 deletions wire_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 2bc9ffb

Please sign in to comment.