mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-30 17:53:21 -04:00 
			
		
		
		
	There is no good reason to be different than Caddy and allows us to piggyback on it's documentation.
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package dnsserver
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| // RegisterDevDirective splices name into the list of directives
 | |
| // immediately before another directive. This function is ONLY
 | |
| // for plugin development purposes! NEVER use it for a plugin
 | |
| // that you are not currently building. If before is empty,
 | |
| // the directive will be appended to the end of the list.
 | |
| //
 | |
| // It is imperative that directives execute in the proper
 | |
| // order, and hard-coding the list of directives guarantees
 | |
| // a correct, absolute order every time. This function is
 | |
| // convenient when developing a plugin, but it does not
 | |
| // guarantee absolute ordering. Multiple plugins registering
 | |
| // directives with this function will lead to non-
 | |
| // deterministic builds and buggy software.
 | |
| //
 | |
| // Directive names must be lower-cased and unique. Any errors
 | |
| // here are fatal, and even successful calls print a message
 | |
| // to stdout as a reminder to use it only in development.
 | |
| func RegisterDevDirective(name, before string) {
 | |
| 	if name == "" {
 | |
| 		fmt.Println("[FATAL] Cannot register empty directive name")
 | |
| 		os.Exit(1)
 | |
| 	}
 | |
| 	if strings.ToLower(name) != name {
 | |
| 		fmt.Printf("[FATAL] %s: directive name must be lowercase\n", name)
 | |
| 		os.Exit(1)
 | |
| 	}
 | |
| 	for _, dir := range directives {
 | |
| 		if dir == name {
 | |
| 			fmt.Printf("[FATAL] %s: directive name already exists\n", name)
 | |
| 			os.Exit(1)
 | |
| 		}
 | |
| 	}
 | |
| 	if before == "" {
 | |
| 		directives = append(directives, name)
 | |
| 	} else {
 | |
| 		var found bool
 | |
| 		for i, dir := range directives {
 | |
| 			if dir == before {
 | |
| 				directives = append(directives[:i], append([]string{name}, directives[i:]...)...)
 | |
| 				found = true
 | |
| 				break
 | |
| 			}
 | |
| 		}
 | |
| 		if !found {
 | |
| 			fmt.Printf("[FATAL] %s: directive not found\n", before)
 | |
| 			os.Exit(1)
 | |
| 		}
 | |
| 	}
 | |
| 	msg := fmt.Sprintf("Registered directive '%s' ", name)
 | |
| 	if before == "" {
 | |
| 		msg += "at end of list"
 | |
| 	} else {
 | |
| 		msg += fmt.Sprintf("before '%s'", before)
 | |
| 	}
 | |
| 	fmt.Printf("[INFO] %s\n", msg)
 | |
| }
 | |
| 
 | |
| // Add here, and in core/coredns.go to use them.
 | |
| 
 | |
| // Directives are registered in the order they should be
 | |
| // executed.
 | |
| //
 | |
| // Ordering is VERY important. Every middleware will
 | |
| // feel the effects of all other middleware below
 | |
| // (after) them during a request, but they must not
 | |
| // care what middleware above them are doing.
 | |
| var directives = []string{
 | |
| 	"bind",
 | |
| 	"health",
 | |
| 	"pprof",
 | |
| 
 | |
| 	"prometheus",
 | |
| 	"errors",
 | |
| 	"log",
 | |
| 	"chaos",
 | |
| 	"cache",
 | |
| 
 | |
| 	"rewrite",
 | |
| 	"loadbalance",
 | |
| 
 | |
| 	"dnssec",
 | |
| 	"file",
 | |
| 	"secondary",
 | |
| 	"etcd",
 | |
| 	"kubernetes",
 | |
| 	"proxy",
 | |
| }
 |