mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-04 03:03:14 -05:00 
			
		
		
		
	
		
			
	
	
		
			76 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			76 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package ready
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"net"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/coredns/coredns/core/dnsserver"
							 | 
						||
| 
								 | 
							
									"github.com/coredns/coredns/plugin"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/mholt/caddy"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func init() {
							 | 
						||
| 
								 | 
							
									caddy.RegisterPlugin("ready", caddy.Plugin{
							 | 
						||
| 
								 | 
							
										ServerType: "dns",
							 | 
						||
| 
								 | 
							
										Action:     setup,
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func setup(c *caddy.Controller) error {
							 | 
						||
| 
								 | 
							
									addr, err := parse(c)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return plugin.Error("ready", err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									rd := &ready{Addr: addr}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									uniqAddr.Set(addr, rd.onStartup, rd)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									c.OncePerServerBlock(func() error {
							 | 
						||
| 
								 | 
							
										c.OnStartup(func() error {
							 | 
						||
| 
								 | 
							
											return uniqAddr.ForEach()
							 | 
						||
| 
								 | 
							
										})
							 | 
						||
| 
								 | 
							
										return nil
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									c.OnStartup(func() error {
							 | 
						||
| 
								 | 
							
										// Each plugin in this server block will (if they support it) report readiness.
							 | 
						||
| 
								 | 
							
										plugs := dnsserver.GetConfig(c).Handlers()
							 | 
						||
| 
								 | 
							
										for _, p := range plugs {
							 | 
						||
| 
								 | 
							
											if r, ok := p.(Readiness); ok {
							 | 
						||
| 
								 | 
							
												plugins.Append(r, p.Name())
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return nil
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									c.OnRestart(rd.onRestart)
							 | 
						||
| 
								 | 
							
									c.OnFinalShutdown(rd.onFinalShutdown)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func parse(c *caddy.Controller) (string, error) {
							 | 
						||
| 
								 | 
							
									addr := ""
							 | 
						||
| 
								 | 
							
									i := 0
							 | 
						||
| 
								 | 
							
									for c.Next() {
							 | 
						||
| 
								 | 
							
										if i > 0 {
							 | 
						||
| 
								 | 
							
											return "", plugin.ErrOnce
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										i++
							 | 
						||
| 
								 | 
							
										args := c.RemainingArgs()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										switch len(args) {
							 | 
						||
| 
								 | 
							
										case 0:
							 | 
						||
| 
								 | 
							
										case 1:
							 | 
						||
| 
								 | 
							
											addr = args[0]
							 | 
						||
| 
								 | 
							
											if _, _, e := net.SplitHostPort(addr); e != nil {
							 | 
						||
| 
								 | 
							
												return "", e
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										default:
							 | 
						||
| 
								 | 
							
											return "", c.ArgErr()
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return addr, nil
							 | 
						||
| 
								 | 
							
								}
							 |