Almost certainly of no interest to anyone.. well, maybe DNS experts who have occasional need of perl. Net::DNS::RR::CNAME->set_rrsort_func is pretty incredibly obscure, though.
#!/usr/bin/perl -w -T -W
#
# DNS zone transfer and output CNAMEs sorted by target host
# Charlie Brooks 2014-01-08
use Net::DNS;
use Net::DNS qw(rrsort); # why don't I get this automatically?
my @domains=qw/typinganimal.net egbt.org hell.com/;
# Use system defaults from resolv.conf to find nameservers
my $res = Net::DNS::Resolver->new;
foreach my $namespace (@domains) {
# do a zone transfer, loading resource records into array
# axfr is standard (BIND style) not djbdns style
my @zone = $res->axfr($namespace);
# Red Hat's perl-Net-DNS-0.59-3.el5 package doesn't seem
# to have a useable rrsort for CNAMES (it tries to do a
# "<=>" flying saucer instead of "cmp") and the examples
# in the doco for custom sort methods flat out don't work
# but I flailed around until I found a way to do it. It's
# weirdly simple if you stumble upon the magic incantation.
# dumping the CNAMEs sorted by target requires custom sort function
Net::DNS::RR::CNAME->set_rrsort_func ('cnamet',
sub {($a,$b)=($Net::DNS::a,$Net::DNS::b);
$a->{'cname'} cmp $b->{'cname'}});
foreach my $cname (rrsort("CNAME","cnamet",@zone)) {
$cname->print;
}
}
exit;