From c7c75b0cca25ecacad0ba2dfe7c41db836a0b17a Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Thu, 19 Apr 2018 15:54:22 +0300 Subject: Resolve CNAMES recursively This complements b2e15909. --- acmeman | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/acmeman b/acmeman index e6fee16..37ed4dd 100755 --- a/acmeman +++ b/acmeman @@ -1,4 +1,7 @@ -#!/usr/bin/perl +#!/bin/sh +#!-*-perl-*- +eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' + if 0; # not running under some shell # Copyright (C) 2017, 2018 Sergey Poznyakoff # # This program is free software; you can redistribute it and/or modify @@ -893,7 +896,7 @@ sub resolve { unless ($res) { $res = new Net::DNS::Resolver(); } - my $q = $res->query($host, 'A'); + my $q = $res->query($host,'ANY'); unless ($q) { if ($res->errorstring eq 'NXDOMAIN') { debug(1, "$host: no such host"); @@ -905,7 +908,22 @@ sub resolve { } return (); } - return map { $_->rdatastr } grep { $_->type eq 'A' } $q->answer; + my %res; + my %cnames; + my @answer = $q->answer(); + while (my $ans = shift @answer) { + if ($ans->type eq 'A') { + $res{$ans->rdatastr} = 1; + } elsif ($ans->type eq 'CNAME') { + unless ($cnames{$ans->owner}) { # Avoid eventual loops + $cnames{$ans->owner} = 1; + if (my $q = $res->query($ans->cname, 'A')) { + push @answer, ($q->answer()); + } + } + } + } + keys %res; } sub myip { -- cgit v1.2.1