From ecd2776a5085b517fff5e4fbde9c65146f718c3d Mon Sep 17 00:00:00 2001 From: mkelcik Date: Sat, 9 Dec 2023 16:12:58 +0100 Subject: [PATCH] done --- internal/config.go | 3 ++ internal/helpers.go | 4 +- internal/ignore_list.go | 26 +++++++++++++ internal/ignore_list_test.go | 75 ++++++++++++++++++++++++++++++++++++ main.go | 6 +++ 5 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 internal/ignore_list.go create mode 100644 internal/ignore_list_test.go diff --git a/internal/config.go b/internal/config.go index 3ca1cb8..11769f9 100644 --- a/internal/config.go +++ b/internal/config.go @@ -18,6 +18,7 @@ const ( envKeyOnChangeComment = "ON_CHANGE_COMMENT" envKeyCheckIntervalSeconds = "CHECK_INTERVAL_SECONDS" envKeyNotifiers = "NOTIFIERS" + envKeyIgnoredIpChange = "IGNORED_IP_CHANGE" ) type Config struct { @@ -28,6 +29,7 @@ type Config struct { OnChangeComment string Notifiers []string CheckInterval time.Duration + IgnoredIpChange []string } func (c Config) Validate() error { @@ -61,5 +63,6 @@ func NewConfig() Config { OnChangeComment: os.Getenv(envKeyOnChangeComment), Notifiers: parseCommaDelimited(os.Getenv(envKeyNotifiers)), CheckInterval: time.Duration(checkInterval) * time.Second, + IgnoredIpChange: parseCommaDelimited(os.Getenv(envKeyIgnoredIpChange)), } } diff --git a/internal/helpers.go b/internal/helpers.go index 770fefe..2f9d8b9 100644 --- a/internal/helpers.go +++ b/internal/helpers.go @@ -1,6 +1,8 @@ package internal -import "strings" +import ( + "strings" +) func parseCommaDelimited(data string) []string { out := make([]string, 0, strings.Count(data, ",")+1) diff --git a/internal/ignore_list.go b/internal/ignore_list.go new file mode 100644 index 0000000..4f29270 --- /dev/null +++ b/internal/ignore_list.go @@ -0,0 +1,26 @@ +package internal + +import ( + "net" + "regexp" +) + +func checkAddress(address, pattern string) bool { + pattern = "^" + pattern + "$" + re := regexp.MustCompile(pattern) + return re.MatchString(address) +} + +func IgnoredIpChange(ip net.IP, ignored []string) bool { + if len(ignored) == 0 { + return false + } + + for _, i := range ignored { + if checkAddress(ip.String(), i) { + return true + } + } + + return false +} diff --git a/internal/ignore_list_test.go b/internal/ignore_list_test.go new file mode 100644 index 0000000..26d4d9d --- /dev/null +++ b/internal/ignore_list_test.go @@ -0,0 +1,75 @@ +package internal + +import "testing" + +func Test_checkAddress(t *testing.T) { + type args struct { + address string + pattern string + } + tests := []struct { + name string + args args + want bool + }{ + { + name: "empty", + args: args{ + address: "192.168.0.1", + pattern: "", + }, + want: false, + }, { + name: "true match 192.*", + args: args{ + address: "192.168.0.1", + pattern: "192.*", + }, + want: true, + }, { + name: "false match 193.*", + args: args{ + address: "192.168.0.1", + pattern: "193.*", + }, + want: false, + }, + { + name: "true match 192.168.0.1", + args: args{ + address: "192.168.0.1", + pattern: "192.168.0.1", + }, + want: true, + }, + { + name: "false not match 192.168.0.2", + args: args{ + address: "192.168.0.1", + pattern: "192.168.0.2", + }, + want: false, + }, { + name: "true match 192.168.0.*", + args: args{ + address: "192.168.0.10", + pattern: "192.168.0.*", + }, + want: true, + }, { + name: "false match 192.168.0.*", + args: args{ + address: "192.168.1.10", + pattern: "192.168.0.*", + }, + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := checkAddress(tt.args.address, tt.args.pattern); got != tt.want { + t.Errorf("checkAddress() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/main.go b/main.go index 027c408..d0999f5 100644 --- a/main.go +++ b/main.go @@ -64,6 +64,12 @@ func main() { } log.Printf("Current public ip `%s` (resolver: %s)", currentPublicIP, resolverTag) + // check if ip is not in ignore list + if internal.IgnoredIpChange(currentPublicIP, config.IgnoredIpChange) { + log.Printf("Ignored ip change `%s`, skipping.", currentPublicIP) + return + } + dns, err := allDNSRecords(ctx, api, cloudflare.ZoneIdentifier(zoneID)) if err != nil { log.Fatal(err)