mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-03 18:53:13 -05:00 
			
		
		
		
	* Stop importing testing in the main binary Stop importing "testing" into the main binary: * test/helpers.go imported it; remote that and change function signature * update all tests that use this Signed-off-by: Miek Gieben <miek@miek.nl> * Drop import testing from metrics plugin Signed-off-by: Miek Gieben <miek@miek.nl> * more fiddling Signed-off-by: Miek Gieben <miek@miek.nl>
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package reload
 | 
						|
 | 
						|
import (
 | 
						|
	"crypto/md5"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/mholt/caddy"
 | 
						|
)
 | 
						|
 | 
						|
// reload periodically checks if the Corefile has changed, and reloads if so
 | 
						|
const (
 | 
						|
	unused    = 0
 | 
						|
	maybeUsed = 1
 | 
						|
	used      = 2
 | 
						|
)
 | 
						|
 | 
						|
type reload struct {
 | 
						|
	interval time.Duration
 | 
						|
	usage    int
 | 
						|
	quit     chan bool
 | 
						|
}
 | 
						|
 | 
						|
func hook(event caddy.EventName, info interface{}) error {
 | 
						|
	if event != caddy.InstanceStartupEvent {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
 | 
						|
	// if reload is removed from the Corefile, then the hook
 | 
						|
	// is still registered but setup is never called again
 | 
						|
	// so we need a flag to tell us not to reload
 | 
						|
	if r.usage == unused {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
 | 
						|
	// this should be an instance. ok to panic if not
 | 
						|
	instance := info.(*caddy.Instance)
 | 
						|
	md5sum := md5.Sum(instance.Caddyfile().Body())
 | 
						|
	log.Infof("Running configuration MD5 = %x\n", md5sum)
 | 
						|
 | 
						|
	go func() {
 | 
						|
		tick := time.NewTicker(r.interval)
 | 
						|
 | 
						|
		for {
 | 
						|
			select {
 | 
						|
			case <-tick.C:
 | 
						|
				corefile, err := caddy.LoadCaddyfile(instance.Caddyfile().ServerType())
 | 
						|
				if err != nil {
 | 
						|
					continue
 | 
						|
				}
 | 
						|
				s := md5.Sum(corefile.Body())
 | 
						|
				if s != md5sum {
 | 
						|
					// Let not try to restart with the same file, even though it is wrong.
 | 
						|
					md5sum = s
 | 
						|
					// now lets consider that plugin will not be reload, unless appear in next config file
 | 
						|
					// change status iof usage will be reset in setup if the plugin appears in config file
 | 
						|
					r.usage = maybeUsed
 | 
						|
					_, err := instance.Restart(corefile)
 | 
						|
					if err != nil {
 | 
						|
						log.Errorf("Corefile changed but reload failed: %s", err)
 | 
						|
						continue
 | 
						|
					}
 | 
						|
					// we are done, if the plugin was not set used, then it is not.
 | 
						|
					if r.usage == maybeUsed {
 | 
						|
						r.usage = unused
 | 
						|
					}
 | 
						|
					return
 | 
						|
				}
 | 
						|
			case <-r.quit:
 | 
						|
				return
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}()
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 |