| 
									
										
										
										
											2018-06-27 21:12:27 +01:00
										 |  |  | package dnsutil
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							|  |  |  | 	"time"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/plugin/pkg/response"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/miekg/dns"
 | 
					
						
							|  |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // MinimalTTL scans the message returns the lowest TTL found taking into the response.Type of the message.
 | 
					
						
							|  |  |  | func MinimalTTL(m *dns.Msg, mt response.Type) time.Duration {
 | 
					
						
							|  |  |  | 	if mt != response.NoError && mt != response.NameError && mt != response.NoData {
 | 
					
						
							|  |  |  | 		return MinimalDefaultTTL
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-19 21:10:08 +03:00
										 |  |  | 	// No records or OPT is the only record, return a short ttl as a fail safe.
 | 
					
						
							|  |  |  | 	if len(m.Answer)+len(m.Ns) == 0 &&
 | 
					
						
							|  |  |  | 		(len(m.Extra) == 0 || (len(m.Extra) == 1 && m.Extra[0].Header().Rrtype == dns.TypeOPT)) {
 | 
					
						
							| 
									
										
										
										
											2018-06-27 21:12:27 +01:00
										 |  |  | 		return MinimalDefaultTTL
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	minTTL := MaximumDefaulTTL
 | 
					
						
							|  |  |  | 	for _, r := range m.Answer {
 | 
					
						
							| 
									
										
										
										
											2018-10-19 21:10:08 +03:00
										 |  |  | 		if r.Header().Ttl < uint32(minTTL.Seconds()) {
 | 
					
						
							|  |  |  | 			minTTL = time.Duration(r.Header().Ttl) * time.Second
 | 
					
						
							| 
									
										
										
										
											2018-06-27 21:12:27 +01:00
										 |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	for _, r := range m.Ns {
 | 
					
						
							| 
									
										
										
										
											2018-10-19 21:10:08 +03:00
										 |  |  | 		if r.Header().Ttl < uint32(minTTL.Seconds()) {
 | 
					
						
							|  |  |  | 			minTTL = time.Duration(r.Header().Ttl) * time.Second
 | 
					
						
							| 
									
										
										
										
											2018-06-27 21:12:27 +01:00
										 |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, r := range m.Extra {
 | 
					
						
							|  |  |  | 		if r.Header().Rrtype == dns.TypeOPT {
 | 
					
						
							|  |  |  | 			// OPT records use TTL field for extended rcode and flags
 | 
					
						
							|  |  |  | 			continue
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2018-10-19 21:10:08 +03:00
										 |  |  | 		if r.Header().Ttl < uint32(minTTL.Seconds()) {
 | 
					
						
							|  |  |  | 			minTTL = time.Duration(r.Header().Ttl) * time.Second
 | 
					
						
							| 
									
										
										
										
											2018-06-27 21:12:27 +01:00
										 |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	return minTTL
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const (
 | 
					
						
							|  |  |  | 	// MinimalDefaultTTL is the absolute lowest TTL we use in CoreDNS.
 | 
					
						
							|  |  |  | 	MinimalDefaultTTL = 5 * time.Second
 | 
					
						
							|  |  |  | 	// MaximumDefaulTTL is the maximum TTL was use on RRsets in CoreDNS.
 | 
					
						
							| 
									
										
										
										
											2023-08-10 23:06:48 +08:00
										 |  |  | 	// TODO: rename as MaximumDefaultTTL
 | 
					
						
							| 
									
										
										
										
											2018-06-27 21:12:27 +01:00
										 |  |  | 	MaximumDefaulTTL = 1 * time.Hour
 | 
					
						
							|  |  |  | )
 |