Improve sorting of entries in delete list master/improve-sorting-of-entries-in-
authorErik Rossen <rossen@rossen.ch>
Fri, 10 Jul 2009 01:39:19 +0000 (21:39 -0400)
committerJeff Layton <jlayton@redhat.com>
Fri, 10 Jul 2009 01:39:19 +0000 (21:39 -0400)
...sort them in order of most significant domain to least. That is,
sort on TLD first and hostname last. This is particularly helpful
when sorting in-addr.arpa domains.

Signed-off-by: Erik Rossen <rossen@rossen.ch>
Signed-off-by: Jeff Layton <jlayton@redhat.com>
dnsdusty

index ba071b2e854533d60e3c2b2f46d9cee57f400f00..ce947dbcdcc47ede181a6d7360a4b6785291b25f 100755 (executable)
--- a/dnsdusty
+++ b/dnsdusty
@@ -73,16 +73,30 @@ sub get_resolver_object {
     return \$res;
 }
 
+# returns a sort value which is an upper case, big-endian (i.e. TLD first),
+# zero-padded string of each domain name
+sub canonicalize_name {
+    # set number of zeros used to pad sequences of decimal digits
+    # NOTE: this is a lazy hack
+    my $nzeros = 10;
+    my $mname = uc($1);  # shift everything to uppercase
+    $mname = join ".", reverse split /\./, $mname;  # make domain big-endian
+    $mname =~ s/\d+/sprintf("%0${nzeros}d",$&)/eg;  # zero-pad all decimal sequences
+    return $mname;
+}
 
 sub zone_transfer {
     my ($res,$zone,$class) = @_;
+    my %mn = (); # hash for munged names of RRs
     my @rr = ();
     my @zonerecs = ${$res}->axfr($zone,$class);
     foreach my $record (@zonerecs) {
        next if ($record->type eq 'SOA');
+       $record->string =~ /(\S+)/; # assume domain name occupies first non-whitespace chars of each record
+       $mn{$record->string} = canonicalize_name($1);
        push (@rr,$record->string);
     }
-    my @sortedrr = sort {uc($a) cmp uc($b)} @rr;
+    my @sortedrr = sort { $mn{$a} cmp $mn{$b} } @rr;
     return \@sortedrr;
 }