mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-30 17:53:21 -04:00 
			
		
		
		
	
							
								
								
									
										87
									
								
								middleware/autopath/setup.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								middleware/autopath/setup.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| package autopath | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/coredns/coredns/core/dnsserver" | ||||
| 	"github.com/coredns/coredns/middleware" | ||||
|  | ||||
| 	"github.com/mholt/caddy" | ||||
| 	"github.com/miekg/dns" | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	caddy.RegisterPlugin("autopath", caddy.Plugin{ | ||||
| 		ServerType: "dns", | ||||
| 		Action:     setup, | ||||
| 	}) | ||||
|  | ||||
| } | ||||
|  | ||||
| func setup(c *caddy.Controller) error { | ||||
| 	ap, mw, err := autoPathParse(c) | ||||
| 	if err != nil { | ||||
| 		return middleware.Error("autopath", err) | ||||
| 	} | ||||
|  | ||||
| 	c.OnStartup(func() error { | ||||
| 		// So we know for sure the mw is initialized. | ||||
| 		m := dnsserver.GetMiddleware(c, mw) | ||||
| 		switch mw { | ||||
| 		case "kubernetes": | ||||
| 			m = m | ||||
| 			//if k, ok := m.(kubernetes.Kubernetes); ok { | ||||
| 			//&ap.searchFunc = k.AutoPath | ||||
| 			//} | ||||
| 		} | ||||
| 		return nil | ||||
| 	}) | ||||
|  | ||||
| 	dnsserver.GetConfig(c).AddMiddleware(func(next middleware.Handler) middleware.Handler { | ||||
| 		ap.Next = next | ||||
| 		return ap | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var allowedMiddleware = map[string]bool{ | ||||
| 	"@kubernetes": true, | ||||
| } | ||||
|  | ||||
| func autoPathParse(c *caddy.Controller) (*AutoPath, string, error) { | ||||
| 	ap := new(AutoPath) | ||||
| 	mw := "" | ||||
|  | ||||
| 	for c.Next() { | ||||
| 		zoneAndresolv := c.RemainingArgs() | ||||
| 		if len(zoneAndresolv) < 1 { | ||||
| 			return nil, "", fmt.Errorf("no resolv-conf specified") | ||||
| 		} | ||||
| 		resolv := zoneAndresolv[len(zoneAndresolv)-1] | ||||
| 		if resolv[0] == '@' { | ||||
| 			_, ok := allowedMiddleware[resolv] | ||||
| 			if ok { | ||||
| 				mw = resolv[1:] | ||||
| 			} | ||||
| 		} else { | ||||
| 			// assume file on disk | ||||
| 			rc, err := dns.ClientConfigFromFile(resolv) | ||||
| 			if err != nil { | ||||
| 				return nil, "", fmt.Errorf("failed to parse %q: %v", resolv, err) | ||||
| 			} | ||||
| 			ap.search = rc.Search | ||||
| 			middleware.Zones(ap.search).Normalize() | ||||
| 			ap.search = append(ap.search, "") // sentinal value as demanded. | ||||
| 		} | ||||
| 		ap.Zones = zoneAndresolv[:len(zoneAndresolv)-1] | ||||
| 		if len(ap.Zones) == 0 { | ||||
| 			ap.Zones = make([]string, len(c.ServerBlockKeys)) | ||||
| 			copy(ap.Zones, c.ServerBlockKeys) | ||||
| 		} | ||||
| 		for i, str := range ap.Zones { | ||||
| 			ap.Zones[i] = middleware.Host(str).Normalize() | ||||
| 		} | ||||
| 	} | ||||
| 	return ap, mw, nil | ||||
| } | ||||
		Reference in New Issue
	
	Block a user