45 sort { length $a->{label} <=> length $b->{label} or $a->{label} cmp $b->{label}} |
45 sort { length $a->{label} <=> length $b->{label} or $a->{label} cmp $b->{label}} |
46 grep { !($_->{rr} ~~ [qw(RRSIG NSEC3 NSEC3PARAM NSEC DNSKEY TSIG)]) } @_; |
46 grep { !($_->{rr} ~~ [qw(RRSIG NSEC3 NSEC3PARAM NSEC DNSKEY TSIG)]) } @_; |
47 |
47 |
48 my $origin = (grep { $_->{rr} eq 'SOA' } @zone)[0]->{label}; |
48 my $origin = (grep { $_->{rr} eq 'SOA' } @zone)[0]->{label}; |
49 my $ttl = (grep { $_->{rr} eq 'SOA' } @zone)[0]->{ttl}; |
49 my $ttl = (grep { $_->{rr} eq 'SOA' } @zone)[0]->{ttl}; |
|
50 my $l1 = (sort map { index $_->{label}, '.' } @zone)[-1]; |
|
51 my $l2 = (sort map { length $_->{rr} } @zone)[-1]; |
50 print "\$ORIGIN $origin\n"; |
52 print "\$ORIGIN $origin\n"; |
51 print "\$TTL $ttl\n"; |
53 print "\$TTL $ttl\n"; |
52 |
54 |
53 my $print = sub { |
55 my $print = sub { |
54 my $r = shift; |
56 my %r = %{+shift}; |
55 state $l1 = (sort map { length $_->{label} } @zone)[-1]; |
57 state $last_label;; |
56 state $l2 = (sort map { length $_->{rr} } @zone)[-1]; |
|
57 state $last_label; |
|
58 |
58 |
59 my $label = $r->{label} eq $origin ? '@' : $r->{label}; |
59 $r{label} = '@' if $r{label} eq $origin; |
60 $label =~ s{\.\Q$origin\E$}{}; |
60 $r{label} =~ s{\.\Q$origin\E$}{}; |
61 |
61 $r{data} =~ s{\.\Q$origin\E$}{} if $r{rr} ~~ [qw(MX SOA PTR)]; |
62 my $data = $r->{data}; |
62 $r{ttl} = '' if ${ttl} == $ttl; |
63 if ($r->{rr} ~~ [qw(MX SOA PTR)]) { |
63 $r{label} = do { |
64 $data =~ s{\.\Q$origin\E$}{}; |
64 if (defined $last_label and $r{label} eq $last_label) { '' } |
65 } |
65 else { $last_label = $r{label} } |
66 |
66 }; |
67 my $ttl = $r->{ttl} == $ttl ? '' : $r->{ttl}; |
|
68 |
67 |
69 my $rc = sprintf "%-*s %6s %-*s %s\n", |
68 my $rc = sprintf "%-*s %6s %-*s %s\n", |
70 $l1 => defined $last_label && $label eq $last_label ? '' : $label, |
69 $l1 => $r{label}, $ttl, $l2 => $r{rr}, $r{data}; |
71 $ttl, $l2 => $r->{rr}, $data; |
70 |
72 $last_label = $label; |
|
73 return $rc; |
71 return $rc; |
74 }; |
72 }; |
75 foreach (@zone) { |
73 foreach (@zone) { |
76 print $print->($_); |
74 print $print->($_); |
77 } |
75 } |