From d58d8074f48b8c8eb1920b8dd1b72e7fc51b7c5e Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 24 Aug 2023 11:13:59 +0000 Subject: [PATCH] internal/clientinfo: use jaytaylor/go-hostsfile for parsing hosts file txn2/txeh lower the hostname, which is not suitable for ctrld use case. --- go.mod | 4 ++-- go.sum | 4 ++-- internal/clientinfo/hostsfile.go | 38 ++++++++++++++++++++------------ 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index cd5a22f..14415c8 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/hashicorp/golang-lru/v2 v2.0.1 github.com/illarion/gonotify v1.0.1 github.com/insomniacslk/dhcp v0.0.0-20230407062729-974c6f05fe16 + github.com/jaytaylor/go-hostsfile v0.0.0-20220426042432-61485ac1fa6c github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 github.com/kardianos/service v1.2.1 github.com/miekg/dns v1.1.55 @@ -23,9 +24,7 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.16.0 github.com/stretchr/testify v1.8.3 - github.com/txn2/txeh v1.5.3 github.com/vishvananda/netlink v1.2.1-beta.2 - go4.org/mem v0.0.0-20220726221520-4f986261bf13 golang.org/x/net v0.10.0 golang.org/x/sync v0.2.0 golang.org/x/sys v0.8.1-0.20230609144347-5059a07aa46a @@ -70,6 +69,7 @@ require ( github.com/subosito/gotenv v1.4.2 // indirect github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 // indirect github.com/vishvananda/netns v0.0.4 // indirect + go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect golang.org/x/crypto v0.9.0 // indirect golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53 // indirect golang.org/x/mod v0.10.0 // indirect diff --git a/go.sum b/go.sum index 2556497..c4772f1 100644 --- a/go.sum +++ b/go.sum @@ -163,6 +163,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/insomniacslk/dhcp v0.0.0-20230407062729-974c6f05fe16 h1:+aAGyK41KRn8jbF2Q7PLL0Sxwg6dShGcQSeCC7nZQ8E= github.com/insomniacslk/dhcp v0.0.0-20230407062729-974c6f05fe16/go.mod h1:IKrnDWs3/Mqq5n0lI+RxA2sB7MvN/vbMBP3ehXg65UI= +github.com/jaytaylor/go-hostsfile v0.0.0-20220426042432-61485ac1fa6c h1:kbTQ8oGf+BVFvt/fM+ECI+NbZDCqoi0vtZTfB2p2hrI= +github.com/jaytaylor/go-hostsfile v0.0.0-20220426042432-61485ac1fa6c/go.mod h1:k6+89xKz7BSMJ+DzIerBdtpEUeTlBMugO/hcVSzahog= github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 h1:elKwZS1OcdQ0WwEDBeqxKwb7WB62QX8bvZ/FJnVXIfk= github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86/go.mod h1:aFAMtuldEgx/4q7iSGazk22+IcgvtiC+HIimFO9XlS8= @@ -270,8 +272,6 @@ github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gt github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/txn2/txeh v1.5.3 h1:ZMgc3r+5/AFtE/ayCoICpvxj7xl/CYsZjnIGhozV/Kc= -github.com/txn2/txeh v1.5.3/go.mod h1:qYzGG9kCzeVEI12geK4IlanHWY8X4uy/I3NcW7mk8g4= github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 h1:YcojQL98T/OO+rybuzn2+5KrD5dBwXIvYBvQ2cD3Avg= github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= diff --git a/internal/clientinfo/hostsfile.go b/internal/clientinfo/hostsfile.go index eafbe69..71ed090 100644 --- a/internal/clientinfo/hostsfile.go +++ b/internal/clientinfo/hostsfile.go @@ -2,40 +2,51 @@ package clientinfo import ( "os" + "sync" "github.com/fsnotify/fsnotify" - "github.com/txn2/txeh" + "github.com/jaytaylor/go-hostsfile" "github.com/Control-D-Inc/ctrld" ) // hostsFile provides client discovery functionality using system hosts file. type hostsFile struct { - h *txeh.Hosts watcher *fsnotify.Watcher + mu sync.Mutex + m map[string][]string } // init performs initialization works, which is necessary before hostsFile can be fully operated. func (hf *hostsFile) init() error { - h, err := txeh.NewHostsDefault() - if err != nil { - return err - } - hf.h = h watcher, err := fsnotify.NewWatcher() if err != nil { return err } hf.watcher = watcher - if err := hf.watcher.Add(hf.h.ReadFilePath); err != nil { + if err := hf.watcher.Add(hostsfile.HostsPath); err != nil { return err } + m, err := hostsfile.ParseHosts(hostsfile.ReadHostsFile()) + if err != nil { + return err + } + hf.mu.Lock() + hf.m = m + hf.mu.Unlock() return nil } // refresh reloads hosts file entries. func (hf *hostsFile) refresh() error { - return hf.h.Reload() + m, err := hostsfile.ParseHosts(hostsfile.ReadHostsFile()) + if err != nil { + return err + } + hf.mu.Lock() + hf.m = m + hf.mu.Unlock() + return nil } // watchChanges watches and updates hosts file data if any changes happens. @@ -66,11 +77,10 @@ func (hf *hostsFile) watchChanges() { // LookupHostnameByIP returns hostname for given IP from current hosts file entries. func (hf *hostsFile) LookupHostnameByIP(ip string) string { - hf.h.Lock() - defer hf.h.Unlock() - - if names := hf.h.ListHostsByIP(ip); len(names) > 0 { - return names[0] + hf.mu.Lock() + defer hf.mu.Unlock() + if names := hf.m[ip]; len(names) > 0 { + return normalizeHostname(names[0]) } return "" }