# HG changeset patch # User Heiko Schlittermann (JUMPER) # Date 1421223515 -3600 # Node ID 34d98030d4c03faea3cdd72c515f257b23b72c1c # Parent 9a90748c11739d873458c4df65b64c41d7e4697b sort order in a more prominent place Now we have a %ORDER global variable in the package DNS::Vi diff -r 9a90748c1173 -r 34d98030d4c0 lib/DNS/Vi.pm --- a/lib/DNS/Vi.pm Wed Jan 14 09:14:25 2015 +0100 +++ b/lib/DNS/Vi.pm Wed Jan 14 09:18:35 2015 +0100 @@ -13,6 +13,10 @@ our @EXPORT = qw(ttl2h h2ttl parse delta nice edit update show); our @EXPORT_OK = (); + +# the sort order for the records of the same label +my %ORDER = map { state $n = 0; $_ => ++$n } qw(SOA NS TXT MX A AAAA SSHFP); + sub parse { my %arg = %{ pop @_ } if ref $_[-1] eq 'HASH'; my $data = shift; @@ -123,55 +127,51 @@ return $out // $ttl; } -{ - my %order = map { state $n = 0; $_ => ++$n } qw(SOA NS TXT MX A AAAA SSHFP); - - sub nice { +sub nice { - # get a list of { id => $id, rrset => \%rrset } - # we do a schwartz transformation here - # [ reverse LABEL, RRSET ] - my @zone = map { $_->[1] } - sort { - $a->[0] cmp $b->[0] - or length $a->[1]{label} <=> length $b->[1]{label} - or ($order{ $a->[1]{rrtype} } // 99) <=> ($order{ $b->[1]{rrtype} } // 99) - } - map { [scalar reverse($_->{label}), $_] } map { $_->{rrset} } @_; + # get a list of { id => $id, rrset => \%rrset } + # we do a schwartz transformation here + # [ reverse LABEL, RRSET ] + my @zone = map { $_->[1] } + sort { + $a->[0] cmp $b->[0] + or length $a->[1]{label} <=> length $b->[1]{label} + or ($ORDER{ $a->[1]{rrtype} } // 99) <=> ($ORDER{ $b->[1]{rrtype} } // 99) + } + map { [scalar reverse($_->{label}), $_] } map { $_->{rrset} } @_; - my @out; - my $origin = (grep { $_->{rrtype} eq 'SOA' } @zone)[0]->{label}; - my $ttl = (grep { $_->{rrtype} eq 'SOA' } @zone)[0]->{ttl}; - my $len1 = - (sort { $a <=> $b } map { index $_->{label}, '.' } @zone)[-1]; - my $len2 = (sort { $a <=> $b } map { length $_->{rrtype} } @zone)[-1]; - push @out, "\$ORIGIN $origin", "\$TTL " . ttl2h($ttl); + my @out; + my $origin = (grep { $_->{rrtype} eq 'SOA' } @zone)[0]->{label}; + my $ttl = (grep { $_->{rrtype} eq 'SOA' } @zone)[0]->{ttl}; + my $len1 = + (sort { $a <=> $b } map { index $_->{label}, '.' } @zone)[-1]; + my $len2 = (sort { $a <=> $b } map { length $_->{rrtype} } @zone)[-1]; + push @out, "\$ORIGIN $origin", "\$TTL " . ttl2h($ttl); - my $print = sub { - my %r = %{ +shift }; - state $last_label; + my $print = sub { + my %r = %{ +shift }; + state $last_label; - $r{label} = '@' if $r{label} eq $origin; - $r{label} =~ s{\.\Q$origin\E$}{}; - $r{data} =~ s{\.\Q$origin\E$}{} - if $r{rrtype} ~~ [qw(CNAME MX SOA PTR)]; - $r{data} =~ s{\Q$origin\E$}{\@} if $r{rrtype} ~~ [qw(CNAME MX)]; - $r{ttl} = $r{ttl} == $ttl ? '' : ttl2h($r{ttl}); - $r{label} = do { - if (defined $last_label and $r{label} eq $last_label) { '' } - else { $last_label = $r{label} } - }; + $r{label} = '@' if $r{label} eq $origin; + $r{label} =~ s{\.\Q$origin\E$}{}; + $r{data} =~ s{\.\Q$origin\E$}{} + if $r{rrtype} ~~ [qw(CNAME MX SOA PTR)]; + $r{data} =~ s{\Q$origin\E$}{\@} if $r{rrtype} ~~ [qw(CNAME MX)]; + $r{ttl} = $r{ttl} == $ttl ? '' : ttl2h($r{ttl}); + $r{label} = do { + if (defined $last_label and $r{label} eq $last_label) { '' } + else { $last_label = $r{label} } + }; - return sprintf '%-*s %6s %-*s %s', - $len1 => $r{label}, - $r{ttl}, - $len2 => $r{rrtype}, - $r{data}; - }; - push @out, '; do NOT EDIT the SOA records SERIAL number!'; - push @out, $print->($_) foreach @zone; - return join "\n", @out, ''; - } + return sprintf '%-*s %6s %-*s %s', + $len1 => $r{label}, + $r{ttl}, + $len2 => $r{rrtype}, + $r{data}; + }; + push @out, '; do NOT EDIT the SOA records SERIAL number!'; + push @out, $print->($_) foreach @zone; + return join "\n", @out, ''; } sub delta {