diff options
Diffstat (limited to 'plugin/hosts/setup.go')
-rw-r--r-- | plugin/hosts/setup.go | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/plugin/hosts/setup.go b/plugin/hosts/setup.go new file mode 100644 index 000000000..c7c0c728a --- /dev/null +++ b/plugin/hosts/setup.go @@ -0,0 +1,88 @@ +package hosts + +import ( + "log" + "os" + "path" + + "github.com/coredns/coredns/core/dnsserver" + "github.com/coredns/coredns/plugin" + + "github.com/mholt/caddy" +) + +func init() { + caddy.RegisterPlugin("hosts", caddy.Plugin{ + ServerType: "dns", + Action: setup, + }) +} + +func setup(c *caddy.Controller) error { + h, err := hostsParse(c) + if err != nil { + return plugin.Error("hosts", err) + } + + dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler { + h.Next = next + return h + }) + + return nil +} + +func hostsParse(c *caddy.Controller) (Hosts, error) { + var h = Hosts{ + Hostsfile: &Hostsfile{path: "/etc/hosts"}, + } + defer h.ReadHosts() + + config := dnsserver.GetConfig(c) + + for c.Next() { + args := c.RemainingArgs() + if len(args) >= 1 { + h.path = args[0] + args = args[1:] + + if !path.IsAbs(h.path) && config.Root != "" { + h.path = path.Join(config.Root, h.path) + } + _, err := os.Stat(h.path) + if err != nil { + if os.IsNotExist(err) { + log.Printf("[WARNING] File does not exist: %s", h.path) + } else { + return h, c.Errf("unable to access hosts file '%s': %v", h.path, err) + } + } + } + + origins := make([]string, len(c.ServerBlockKeys)) + copy(origins, c.ServerBlockKeys) + if len(args) > 0 { + origins = args + } + + for i := range origins { + origins[i] = plugin.Host(origins[i]).Normalize() + } + h.Origins = origins + + for c.NextBlock() { + switch c.Val() { + case "fallthrough": + args := c.RemainingArgs() + if len(args) == 0 { + h.Fallthrough = true + continue + } + return h, c.ArgErr() + default: + return h, c.Errf("unknown property '%s'", c.Val()) + } + } + } + return h, nil +} |