mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 02:03:20 -04:00 
			
		
		
		
	
		
			
	
	
		
			74 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package setup
 | ||
|  | 
 | ||
|  | import (
 | ||
|  | 	"log"
 | ||
|  | 	"os"
 | ||
|  | 
 | ||
|  | 	"github.com/miekg/coredns/middleware"
 | ||
|  | 	"github.com/miekg/coredns/middleware/file"
 | ||
|  | 	"github.com/miekg/dns"
 | ||
|  | )
 | ||
|  | 
 | ||
|  | // File sets up the file middleware.
 | ||
|  | func File(c *Controller) (middleware.Middleware, error) {
 | ||
|  | 	zones, err := fileParse(c)
 | ||
|  | 	if err != nil {
 | ||
|  | 		return nil, err
 | ||
|  | 	}
 | ||
|  | 	return func(next middleware.Handler) middleware.Handler {
 | ||
|  | 		return file.File{Next: next, Zones: zones}
 | ||
|  | 	}, nil
 | ||
|  | 
 | ||
|  | }
 | ||
|  | 
 | ||
|  | func fileParse(c *Controller) (file.Zones, error) {
 | ||
|  | 	// Maybe multiple, each for each zone.
 | ||
|  | 	z := make(map[string]file.Zone)
 | ||
|  | 	names := []string{}
 | ||
|  | 	for c.Next() {
 | ||
|  | 		if c.Val() == "file" {
 | ||
|  | 			// file db.file [origin]
 | ||
|  | 			if !c.NextArg() {
 | ||
|  | 				return file.Zones{}, c.ArgErr()
 | ||
|  | 			}
 | ||
|  | 			fileName := c.Val()
 | ||
|  | 
 | ||
|  | 			origin := c.ServerBlockHosts[c.ServerBlockHostIndex]
 | ||
|  | 			if c.NextArg() {
 | ||
|  | 				c.Next()
 | ||
|  | 				origin = c.Val()
 | ||
|  | 			}
 | ||
|  | 			// normalize this origin
 | ||
|  | 			origin = middleware.Host(origin).StandardHost()
 | ||
|  | 
 | ||
|  | 			zone, err := parseZone(origin, fileName)
 | ||
|  | 			if err == nil {
 | ||
|  | 				z[origin] = zone
 | ||
|  | 			}
 | ||
|  | 			names = append(names, origin)
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
|  | 	return file.Zones{Z: z, Names: names}, nil
 | ||
|  | }
 | ||
|  | 
 | ||
|  | //
 | ||
|  | // parsrZone parses the zone in filename and returns a []RR or an error.
 | ||
|  | func parseZone(origin, fileName string) (file.Zone, error) {
 | ||
|  | 	f, err := os.Open(fileName)
 | ||
|  | 	if err != nil {
 | ||
|  | 		return nil, err
 | ||
|  | 	}
 | ||
|  | 	tokens := dns.ParseZone(f, origin, fileName)
 | ||
|  | 	zone := make([]dns.RR, 0, defaultZoneSize)
 | ||
|  | 	for x := range tokens {
 | ||
|  | 		if x.Error != nil {
 | ||
|  | 			log.Printf("[ERROR] failed to parse %s: %v", origin, x.Error)
 | ||
|  | 			return nil, x.Error
 | ||
|  | 		}
 | ||
|  | 		zone = append(zone, x.RR)
 | ||
|  | 	}
 | ||
|  | 	return file.Zone(zone), nil
 | ||
|  | }
 | ||
|  | 
 | ||
|  | const defaultZoneSize = 20 // A made up number.
 |