| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | package setup
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							|  |  |  | 	"os"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/miekg/coredns/middleware"
 | 
					
						
							|  |  |  | 	"github.com/miekg/coredns/middleware/file"
 | 
					
						
							|  |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 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) {
 | 
					
						
							| 
									
										
										
										
											2016-03-27 07:37:23 +01:00
										 |  |  | 	z := make(map[string]*file.Zone)
 | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 	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() {
 | 
					
						
							|  |  |  | 				origin = c.Val()
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							|  |  |  | 			// normalize this origin
 | 
					
						
							|  |  |  | 			origin = middleware.Host(origin).StandardHost()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-27 07:37:23 +01:00
										 |  |  | 			reader, err := os.Open(fileName)
 | 
					
						
							|  |  |  | 			if err != nil {
 | 
					
						
							|  |  |  | 				return file.Zones{}, err
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							|  |  |  | 			zone, err := file.Parse(reader, origin, fileName)
 | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 			if err == nil {
 | 
					
						
							|  |  |  | 				z[origin] = zone
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							|  |  |  | 			names = append(names, origin)
 | 
					
						
							| 
									
										
										
										
											2016-03-28 12:08:05 +01:00
										 |  |  | 			if c.NextBlock() {
 | 
					
						
							|  |  |  | 				what := c.Val()
 | 
					
						
							|  |  |  | 				if !c.NextArg() {
 | 
					
						
							|  |  |  | 					return file.Zones{}, c.ArgErr()
 | 
					
						
							|  |  |  | 				}
 | 
					
						
							|  |  |  | 				value := c.Val()
 | 
					
						
							|  |  |  | 				var err error
 | 
					
						
							|  |  |  | 				switch what {
 | 
					
						
							|  |  |  | 				case "transfer":
 | 
					
						
							|  |  |  | 					if value == "out" {
 | 
					
						
							|  |  |  | 						z[origin].Transfer.Out = true
 | 
					
						
							|  |  |  | 					}
 | 
					
						
							|  |  |  | 					if value == "in" {
 | 
					
						
							|  |  |  | 						z[origin].Transfer.In = true
 | 
					
						
							|  |  |  | 					}
 | 
					
						
							|  |  |  | 				}
 | 
					
						
							|  |  |  | 				if err != nil {
 | 
					
						
							|  |  |  | 					return file.Zones{}, err
 | 
					
						
							|  |  |  | 				}
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	return file.Zones{Z: z, Names: names}, nil
 | 
					
						
							|  |  |  | }
 |