diff options
Diffstat (limited to 'middleware/hosts/hostsfile.go')
-rw-r--r-- | middleware/hosts/hostsfile.go | 193 |
1 files changed, 0 insertions, 193 deletions
diff --git a/middleware/hosts/hostsfile.go b/middleware/hosts/hostsfile.go deleted file mode 100644 index a4f4a017d..000000000 --- a/middleware/hosts/hostsfile.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file is a modified version of net/hosts.go from the golang repo - -package hosts - -import ( - "bufio" - "bytes" - "io" - "net" - "os" - "strings" - "sync" - "time" - - "github.com/coredns/coredns/middleware" -) - -const cacheMaxAge = 5 * time.Second - -func parseLiteralIP(addr string) net.IP { - if i := strings.Index(addr, "%"); i >= 0 { - // discard ipv6 zone - addr = addr[0:i] - } - - return net.ParseIP(addr) -} - -func absDomainName(b string) string { - return middleware.Name(b).Normalize() -} - -// Hostsfile contains known host entries. -type Hostsfile struct { - sync.Mutex - - // list of zones we are authoritive for - Origins []string - - // Key for the list of literal IP addresses must be a host - // name. It would be part of DNS labels, a FQDN or an absolute - // FQDN. - // For now the key is converted to lower case for convenience. - byNameV4 map[string][]net.IP - byNameV6 map[string][]net.IP - - // Key for the list of host names must be a literal IP address - // including IPv6 address with zone identifier. - // We don't support old-classful IP address notation. - byAddr map[string][]string - - expire time.Time - path string - mtime time.Time - size int64 -} - -// ReadHosts determines if the cached data needs to be updated based on the size and modification time of the hostsfile. -func (h *Hostsfile) ReadHosts() { - now := time.Now() - - if now.Before(h.expire) && len(h.byAddr) > 0 { - return - } - stat, err := os.Stat(h.path) - if err == nil && h.mtime.Equal(stat.ModTime()) && h.size == stat.Size() { - h.expire = now.Add(cacheMaxAge) - return - } - - var file *os.File - if file, _ = os.Open(h.path); file == nil { - return - } - defer file.Close() - - h.Parse(file) - - // Update the data cache. - h.expire = now.Add(cacheMaxAge) - h.mtime = stat.ModTime() - h.size = stat.Size() -} - -// Parse reads the hostsfile and populates the byName and byAddr maps. -func (h *Hostsfile) Parse(file io.Reader) { - hsv4 := make(map[string][]net.IP) - hsv6 := make(map[string][]net.IP) - is := make(map[string][]string) - - scanner := bufio.NewScanner(file) - for scanner.Scan() { - line := scanner.Bytes() - if i := bytes.Index(line, []byte{'#'}); i >= 0 { - // Discard comments. - line = line[0:i] - } - f := bytes.Fields(line) - if len(f) < 2 { - continue - } - addr := parseLiteralIP(string(f[0])) - if addr == nil { - continue - } - ver := ipVersion(string(f[0])) - for i := 1; i < len(f); i++ { - name := absDomainName(string(f[i])) - if middleware.Zones(h.Origins).Matches(name) == "" { - // name is not in Origins - continue - } - switch ver { - case 4: - hsv4[name] = append(hsv4[name], addr) - case 6: - hsv6[name] = append(hsv6[name], addr) - default: - continue - } - is[addr.String()] = append(is[addr.String()], name) - } - } - h.byNameV4 = hsv4 - h.byNameV6 = hsv6 - h.byAddr = is -} - -// ipVersion returns what IP version was used textually -func ipVersion(s string) int { - for i := 0; i < len(s); i++ { - switch s[i] { - case '.': - return 4 - case ':': - return 6 - } - } - return 0 -} - -// LookupStaticHostV4 looks up the IPv4 addresses for the given host from the hosts file. -func (h *Hostsfile) LookupStaticHostV4(host string) []net.IP { - h.Lock() - defer h.Unlock() - h.ReadHosts() - if len(h.byNameV4) != 0 { - if ips, ok := h.byNameV4[absDomainName(host)]; ok { - ipsCp := make([]net.IP, len(ips)) - copy(ipsCp, ips) - return ipsCp - } - } - return nil -} - -// LookupStaticHostV6 looks up the IPv6 addresses for the given host from the hosts file. -func (h *Hostsfile) LookupStaticHostV6(host string) []net.IP { - h.Lock() - defer h.Unlock() - h.ReadHosts() - if len(h.byNameV6) != 0 { - if ips, ok := h.byNameV6[absDomainName(host)]; ok { - ipsCp := make([]net.IP, len(ips)) - copy(ipsCp, ips) - return ipsCp - } - } - return nil -} - -// LookupStaticAddr looks up the hosts for the given address from the hosts file. -func (h *Hostsfile) LookupStaticAddr(addr string) []string { - h.Lock() - defer h.Unlock() - h.ReadHosts() - addr = parseLiteralIP(addr).String() - if addr == "" { - return nil - } - if len(h.byAddr) != 0 { - if hosts, ok := h.byAddr[addr]; ok { - hostsCp := make([]string, len(hosts)) - copy(hostsCp, hosts) - return hostsCp - } - } - return nil -} |