vidns
changeset 1 5f07e5c283c1
parent 0 69882b806c3c
child 2 1e26b0942c13
equal deleted inserted replaced
0:69882b806c3c 1:5f07e5c283c1
    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     }