aboutsummaryrefslogtreecommitdiff
path: root/plugin/hosts/setup.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/hosts/setup.go')
-rw-r--r--plugin/hosts/setup.go88
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
+}