From 7bf231643bd8c98aa64869887b28d3fec825249e Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 27 Apr 2023 00:05:12 +0700 Subject: [PATCH] internal/router: normalize ip address from dnsmasq lease file dnsmasq may put an ip address with the interface index in lease file, causing bad data sent to the Control-D backend. --- internal/router/client_info.go | 12 +++++++++++- internal/router/client_info_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 internal/router/client_info_test.go diff --git a/internal/router/client_info.go b/internal/router/client_info.go index 05fafa2..4718a35 100644 --- a/internal/router/client_info.go +++ b/internal/router/client_info.go @@ -4,6 +4,7 @@ import ( "bytes" "log" "os" + "strings" "time" "github.com/fsnotify/fsnotify" @@ -80,9 +81,18 @@ func readClientInfoFile(name string) error { return lineread.File(name, func(line []byte) error { fields := bytes.Fields(line) mac := string(fields[1]) - ip := string(fields[2]) + ip := normalizeIP(string(fields[2])) hostname := string(fields[3]) r.mac.Store(mac, &ctrld.ClientInfo{Mac: mac, IP: ip, Hostname: hostname}) return nil }) } + +func normalizeIP(in string) string { + // dnsmasq may put ip with interface index in lease file, strip it here. + ip, _, found := strings.Cut(in, "%") + if found { + return ip + } + return in +} diff --git a/internal/router/client_info_test.go b/internal/router/client_info_test.go new file mode 100644 index 0000000..13b0648 --- /dev/null +++ b/internal/router/client_info_test.go @@ -0,0 +1,25 @@ +package router + +import "testing" + +func Test_normalizeIP(t *testing.T) { + tests := []struct { + name string + in string + want string + }{ + {"v4", "127.0.0.1", "127.0.0.1"}, + {"v4 with index", "127.0.0.1%lo", "127.0.0.1"}, + {"v6", "fe80::1", "fe80::1"}, + {"v6 with index", "fe80::1%22002", "fe80::1"}, + } + for _, tc := range tests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + if got := normalizeIP(tc.in); got != tc.want { + t.Errorf("normalizeIP() = %v, want %v", got, tc.want) + } + }) + } +}