| 
									
										
										
										
											2018-02-23 15:02:05 +00:00
										 |  |  | // Package parse contains functions that can be used in the setup code for plugins. | 
					
						
							| 
									
										
										
										
											2017-12-13 10:18:08 -06:00
										 |  |  | package parse | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/plugin/pkg/dnsutil" | 
					
						
							|  |  |  | 	"github.com/mholt/caddy" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Transfer parses transfer statements: 'transfer [to|from] [address...]'. | 
					
						
							|  |  |  | func Transfer(c *caddy.Controller, secondary bool) (tos, froms []string, err error) { | 
					
						
							|  |  |  | 	if !c.NextArg() { | 
					
						
							|  |  |  | 		return nil, nil, c.ArgErr() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	value := c.Val() | 
					
						
							|  |  |  | 	switch value { | 
					
						
							|  |  |  | 	case "to": | 
					
						
							|  |  |  | 		tos = c.RemainingArgs() | 
					
						
							|  |  |  | 		for i := range tos { | 
					
						
							|  |  |  | 			if tos[i] != "*" { | 
					
						
							|  |  |  | 				normalized, err := dnsutil.ParseHostPort(tos[i], "53") | 
					
						
							|  |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					return nil, nil, err | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				tos[i] = normalized | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	case "from": | 
					
						
							|  |  |  | 		if !secondary { | 
					
						
							|  |  |  | 			return nil, nil, fmt.Errorf("can't use `transfer from` when not being a secondary") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		froms = c.RemainingArgs() | 
					
						
							|  |  |  | 		for i := range froms { | 
					
						
							|  |  |  | 			if froms[i] != "*" { | 
					
						
							|  |  |  | 				normalized, err := dnsutil.ParseHostPort(froms[i], "53") | 
					
						
							|  |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					return nil, nil, err | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				froms[i] = normalized | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				return nil, nil, fmt.Errorf("can't use '*' in transfer from") | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | } |