sort order in a more prominent place
Now we have a %ORDER global variable in the package DNS::Vi
--- 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 {