Skip to content

Commit 92cee49

Browse files
committed
Query the NS servers of the domain until insync for cert gen DNS check
1 parent 498fa2c commit 92cee49

File tree

1 file changed

+74
-6
lines changed

1 file changed

+74
-6
lines changed

src/pkg/cli/cert.go

Lines changed: 74 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,11 @@ func generateCert(ctx context.Context, domain, albDns string) {
6262
term.Infof("Waiting for TLS cert to be online for %v", domain)
6363
if err := waitForTLS(ctx, domain); err != nil {
6464
term.Errorf("Error waiting for TLS to be online: %v", err)
65-
// FIXME: The message below is only valid for BYOC, need to update when playground ACME cert support is added
66-
term.Errorf("Please check for error messages from `/aws/lambda/acme-lambda` log group in cloudwatch for more details")
65+
// FIXME: Add more info on how to debug, possibly provided by the server side to avoid client type detection here
6766
return
6867
}
6968

70-
term.Infof("TLS cert for %v is ready", domain)
69+
fmt.Printf("TLS cert for %v is ready\n", domain)
7170
}
7271

7372
func triggerCertGeneration(ctx context.Context, domain string) {
@@ -141,12 +140,13 @@ func waitForCNAME(ctx context.Context, domain, albDns string) error {
141140
case <-ctx.Done():
142141
return ctx.Err()
143142
case <-ticker.C:
144-
cname, err := resolver.LookupCNAME(ctx, domain)
143+
cname, err := waitForCNAMEInSync(ctx, domain)
145144
cname = strings.TrimSuffix(cname, ".")
146145
if err != nil || strings.ToLower(cname) != strings.ToLower(albDns) {
147146
if !msgShown {
148-
term.Infof("Please setup CNAME record for %v to point to ALB %v, waiting for CNAME record setup and DNS propagation", domain, strings.ToLower(albDns))
149-
term.Infof("Note: DNS propagation may take a while, we will proceed as soon as the CNAME record is ready, checking...")
147+
term.Infof("Please setup CNAME record for %v", domain)
148+
fmt.Printf(" %v CNAME %v\n", domain, strings.ToLower(albDns))
149+
term.Infof("Waiting for CNAME record setup and DNS propagation...")
150150
msgShown = true
151151
}
152152
if doSpinner {
@@ -185,3 +185,71 @@ func getWithRetries(ctx context.Context, url string, tries int) error {
185185
}
186186
return errors.Join(errs...)
187187
}
188+
189+
func waitForCNAMEInSync(ctx context.Context, domain string) (string, error) {
190+
ns, err := getNSServers(ctx, domain)
191+
if err != nil {
192+
return "", err
193+
}
194+
195+
ticker := time.NewTicker(1 * time.Second)
196+
defer ticker.Stop()
197+
for {
198+
select {
199+
case <-ticker.C:
200+
fmt.Printf("Checking CNAME for %v\n", domain)
201+
cnames := make(map[string]bool)
202+
var cname string
203+
var err error
204+
for _, n := range ns {
205+
cname, err = resolverAt(n).LookupCNAME(context.Background(), domain)
206+
if err != nil {
207+
cnames[""] = true
208+
}
209+
cnames[cname] = true
210+
}
211+
if len(cnames) > 1 {
212+
fmt.Printf("CNAME mismatch for %v: %v\n", domain, cnames)
213+
continue
214+
}
215+
return cname, err
216+
case <-ctx.Done():
217+
return "", ctx.Err()
218+
}
219+
}
220+
}
221+
222+
func getNSServers(ctx context.Context, domain string) ([]string, error) {
223+
d := domain
224+
var ns []*net.NS
225+
for {
226+
var err error
227+
ns, err = resolver.LookupNS(ctx, d)
228+
var ne *net.DNSError
229+
if errors.As(err, &ne) {
230+
if strings.Count(d, ".") <= 1 {
231+
return nil, fmt.Errorf("No DNS server found")
232+
}
233+
d = d[strings.Index(domain, ".")+1:]
234+
continue
235+
} else if err != nil {
236+
fmt.Printf("Failed to find NS server for %v at %v: %v", domain, d, err)
237+
}
238+
break
239+
}
240+
servers := make([]string, len(ns))
241+
for i, n := range ns {
242+
servers[i] = n.Host
243+
}
244+
return servers, nil
245+
}
246+
247+
func resolverAt(nsServer string) *net.Resolver {
248+
return &net.Resolver{
249+
PreferGo: true,
250+
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
251+
d := net.Dialer{}
252+
return d.DialContext(ctx, network, nsServer+":53")
253+
},
254+
}
255+
}

0 commit comments

Comments
 (0)