[SCM] Debian packaging of AllKnowingDNS CPAN distribution branch, master, updated. 71a54a6e11ef5324e7aceb027ac73b7fc1030484
Michael Stapelberg
michael at stapelberg.de
Mon Mar 12 09:23:33 UTC 2012
The following commit has been merged in the master branch:
commit 805748959858e95afea118df9b3bb2e0ccf763da
Author: Michael Stapelberg <michael at stapelberg.de>
Date: Mon Mar 12 09:50:10 2012 +0100
Imported Upstream version 1.2
diff --git a/Changes b/Changes
new file mode 100644
index 0000000..8e2abf1
--- /dev/null
+++ b/Changes
@@ -0,0 +1,16 @@
+History file for AllKnowingDNS
+
+1.2 2012-03-12
+
+- Fix documentation (provide proper NAME sections)
+- Provide a Changes file
+
+1.1 2012-03-11
+
+- Fix compatibility with Perl < 5.14 by dereferencing an arrayref explicitly
+- Add documentation for all-knowing-dns(1)
+- Remove .upstream suffix when relaying DNS answers
+
+1.0 2012-03-08
+
+- Initial release
diff --git a/MANIFEST b/MANIFEST
index 6247cef..286b6d5 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,4 +1,5 @@
all-knowing-dns.conf
+Changes
inc/Module/Install.pm
inc/Module/Install/Base.pm
inc/Module/Install/Can.pm
diff --git a/META.yml b/META.yml
index c41ea96..d2a616d 100644
--- a/META.yml
+++ b/META.yml
@@ -1,13 +1,14 @@
---
-abstract: 'Tiny DNS server for IPv6 Reverse DNS'
+abstract: ~
author:
- 'Michael Stapelberg, C<< <michael at stapelberg.de> >>'
build_requires:
- ExtUtils::MakeMaker: 6.42
+ ExtUtils::MakeMaker: 6.62
configure_requires:
- ExtUtils::MakeMaker: 6.42
+ ExtUtils::MakeMaker: 6.62
distribution_type: module
-generated_by: 'Module::Install version 1.01'
+dynamic_config: 1
+generated_by: 'Module::Install version 1.04'
license: bsd
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -26,4 +27,4 @@ requires:
perl: 5.10.0
resources:
license: http://opensource.org/licenses/bsd-license.php
-version: 1.0
+version: 1.2
diff --git a/Makefile.PL b/Makefile.PL
index c2bcd72..0d2adc7 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -5,7 +5,7 @@ use warnings;
use inc::Module::Install;
name 'AllKnowingDNS';
-all_from 'lib/App/AllKnowingDNS/Handler.pm';
+all_from 'script/all-knowing-dns';
requires 'Net::DNS';
requires 'Privileges::Drop';
diff --git a/all-knowing-dns.conf b/all-knowing-dns.conf
index 8871e18..2d0e819 100644
--- a/all-knowing-dns.conf
+++ b/all-knowing-dns.conf
@@ -1,4 +1,4 @@
-# Configuration file for AllKnowingDNS v1.0
+# Configuration file for AllKnowingDNS v1.2
# RaumZeitLabor
network 2001:4d88:100e:ccc0::/64
diff --git a/inc/Module/Install.pm b/inc/Module/Install.pm
index 74caf9c..c685ca4 100644
--- a/inc/Module/Install.pm
+++ b/inc/Module/Install.pm
@@ -31,7 +31,7 @@ BEGIN {
# This is not enforced yet, but will be some time in the next few
# releases once we can make sure it won't clash with custom
# Module::Install extensions.
- $VERSION = '1.01';
+ $VERSION = '1.04';
# Storage for the pseudo-singleton
$MAIN = undef;
@@ -451,7 +451,7 @@ sub _version ($) {
}
sub _cmp ($$) {
- _version($_[0]) <=> _version($_[1]);
+ _version($_[1]) <=> _version($_[2]);
}
# Cloned from Params::Util::_CLASS
diff --git a/inc/Module/Install/Base.pm b/inc/Module/Install/Base.pm
index d3662c9..b520616 100644
--- a/inc/Module/Install/Base.pm
+++ b/inc/Module/Install/Base.pm
@@ -4,7 +4,7 @@ package Module::Install::Base;
use strict 'vars';
use vars qw{$VERSION};
BEGIN {
- $VERSION = '1.01';
+ $VERSION = '1.04';
}
# Suspend handler for "redefined" warnings
diff --git a/inc/Module/Install/Can.pm b/inc/Module/Install/Can.pm
index 276409a..a162ad4 100644
--- a/inc/Module/Install/Can.pm
+++ b/inc/Module/Install/Can.pm
@@ -9,7 +9,7 @@ use Module::Install::Base ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.01';
+ $VERSION = '1.04';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
diff --git a/inc/Module/Install/Fetch.pm b/inc/Module/Install/Fetch.pm
index 093cb7a..a412576 100644
--- a/inc/Module/Install/Fetch.pm
+++ b/inc/Module/Install/Fetch.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.01';
+ $VERSION = '1.04';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
diff --git a/inc/Module/Install/Makefile.pm b/inc/Module/Install/Makefile.pm
index 4c71003..035cef2 100644
--- a/inc/Module/Install/Makefile.pm
+++ b/inc/Module/Install/Makefile.pm
@@ -8,7 +8,7 @@ use Fcntl qw/:flock :seek/;
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.01';
+ $VERSION = '1.04';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
@@ -219,14 +219,14 @@ sub write {
# an underscore, even though its own version may contain one!
# Hence the funny regexp to get rid of it. See RT #35800
# for details.
- my $v = $ExtUtils::MakeMaker::VERSION =~ /^(\d+\.\d+)/;
+ my ($v) = $ExtUtils::MakeMaker::VERSION =~ /^(\d+\.\d+)/;
$self->build_requires( 'ExtUtils::MakeMaker' => $v );
$self->configure_requires( 'ExtUtils::MakeMaker' => $v );
} else {
# Allow legacy-compatibility with 5.005 by depending on the
# most recent EU:MM that supported 5.005.
- $self->build_requires( 'ExtUtils::MakeMaker' => 6.42 );
- $self->configure_requires( 'ExtUtils::MakeMaker' => 6.42 );
+ $self->build_requires( 'ExtUtils::MakeMaker' => 6.36 );
+ $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 );
}
# Generate the MakeMaker params
@@ -241,7 +241,6 @@ in a module, and provide its file path via 'version_from' (or
'all_from' if you prefer) in Makefile.PL.
EOT
- $DB::single = 1;
if ( $self->tests ) {
my @tests = split ' ', $self->tests;
my %seen;
@@ -412,4 +411,4 @@ sub postamble {
__END__
-#line 541
+#line 540
diff --git a/inc/Module/Install/Metadata.pm b/inc/Module/Install/Metadata.pm
index 3b01e09..31c953e 100644
--- a/inc/Module/Install/Metadata.pm
+++ b/inc/Module/Install/Metadata.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.01';
+ $VERSION = '1.04';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
@@ -151,15 +151,21 @@ sub install_as_site { $_[0]->installdirs('site') }
sub install_as_vendor { $_[0]->installdirs('vendor') }
sub dynamic_config {
- my $self = shift;
- unless ( @_ ) {
- warn "You MUST provide an explicit true/false value to dynamic_config\n";
- return $self;
+ my $self = shift;
+ my $value = @_ ? shift : 1;
+ if ( $self->{values}->{dynamic_config} ) {
+ # Once dynamic we never change to static, for safety
+ return 0;
}
- $self->{values}->{dynamic_config} = $_[0] ? 1 : 0;
+ $self->{values}->{dynamic_config} = $value ? 1 : 0;
return 1;
}
+# Convenience command
+sub static_config {
+ shift->dynamic_config(0);
+}
+
sub perl_version {
my $self = shift;
return $self->{values}->{perl_version} unless @_;
@@ -170,7 +176,7 @@ sub perl_version {
# Normalize the version
$version = $self->_perl_version($version);
- # We don't support the reall old versions
+ # We don't support the really old versions
unless ( $version >= 5.005 ) {
die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n";
}
@@ -582,7 +588,7 @@ sub bugtracker_from {
sub requires_from {
my $self = shift;
my $content = Module::Install::_readperl($_[0]);
- my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg;
+ my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+(v?[\d\.]+)/mg;
while ( @requires ) {
my $module = shift @requires;
my $version = shift @requires;
diff --git a/inc/Module/Install/Scripts.pm b/inc/Module/Install/Scripts.pm
index e9510f8..12f5a1b 100644
--- a/inc/Module/Install/Scripts.pm
+++ b/inc/Module/Install/Scripts.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.01';
+ $VERSION = '1.04';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
diff --git a/inc/Module/Install/Win32.pm b/inc/Module/Install/Win32.pm
index 3139a63..99d9631 100644
--- a/inc/Module/Install/Win32.pm
+++ b/inc/Module/Install/Win32.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.01';
+ $VERSION = '1.04';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
diff --git a/inc/Module/Install/WriteAll.pm b/inc/Module/Install/WriteAll.pm
index 1f724a7..86bb25e 100644
--- a/inc/Module/Install/WriteAll.pm
+++ b/inc/Module/Install/WriteAll.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.01';
+ $VERSION = '1.04';
@ISA = qw{Module::Install::Base};
$ISCORE = 1;
}
diff --git a/lib/App/AllKnowingDNS/Config.pm b/lib/App/AllKnowingDNS/Config.pm
index fba3375..1b14d32 100644
--- a/lib/App/AllKnowingDNS/Config.pm
+++ b/lib/App/AllKnowingDNS/Config.pm
@@ -6,6 +6,21 @@ use App::AllKnowingDNS::Zone;
use App::AllKnowingDNS::Util;
use Data::Dumper;
+=head1 NAME
+
+App::AllKnowingDNS::Config - configuration object
+
+=head1 DESCRIPTION
+
+Note: User documentation is in L<all-knowing-dns>(1).
+
+This module defines an object which holds the parsed version of the
+AllKnowingDNS configuration file.
+
+=head1 FUNCTIONS
+
+=cut
+
has 'listen_addresses' => (
traits => [ 'Array' ],
is => 'ro',
@@ -39,7 +54,7 @@ sub add_zone {
$zone->ptrzone(App::AllKnowingDNS::Util::netmask_to_ptrzone($zone->network));
- push $self->zones, $zone;
+ push @{$self->zones}, $zone;
}
=head2 zone_for_ptr($zone)
@@ -48,6 +63,7 @@ Returns the appropriate zone for the given PTR query or undef if there is no
appropriate zone.
Example:
+
my $query = '7.c.e.2.3.4.e.f.f.f.b.d.9.1.2.0.' .
'0.c.c.c.e.0.0.1.8.8.d.4.1.0.0.2.ip6.arpa';
my $zone = $config->zone_for_ptr($query);
@@ -55,6 +71,7 @@ Example:
...
=cut
+
sub zone_for_ptr {
my ($self, $query) = @_;
@@ -72,12 +89,14 @@ Returns the appropriate zone for the given AAAA query or undef if there is no
appropriate zone.
Example:
+
my $query = 'ipv6-foo.nutzer.raumzeitlabor.de';
my $zone = $config->zone_for_aaaa($query);
return 'NXDOMAIN' unless defined($zone);
...
=cut
+
sub zone_for_aaaa {
my ($self, $query) = @_;
@@ -92,3 +111,22 @@ sub zone_for_aaaa {
__PACKAGE__->meta->make_immutable();
1
+
+__END__
+
+=head1 VERSION
+
+Version 1.2
+
+=head1 AUTHOR
+
+Michael Stapelberg, C<< <michael at stapelberg.de> >>
+
+=head1 LICENSE AND COPYRIGHT
+
+Copyright 2012 Michael Stapelberg.
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the BSD license.
+
+=cut
diff --git a/lib/App/AllKnowingDNS/Handler.pm b/lib/App/AllKnowingDNS/Handler.pm
index 0844c57..f4aca4e 100644
--- a/lib/App/AllKnowingDNS/Handler.pm
+++ b/lib/App/AllKnowingDNS/Handler.pm
@@ -11,9 +11,21 @@ use App::AllKnowingDNS::Zone;
use POSIX qw(strftime);
use v5.10;
-our @EXPORT = qw(reply_handler);
+=head1 NAME
+
+App::AllKnowingDNS::Handler - main code of AllKnowingDNS
+
+=head1 DESCRIPTION
+
+Note: User documentation is in L<all-knowing-dns>(1).
-our $VERSION = '1.0';
+This module contains the C<Net::DNS::Nameserver> handler function.
+
+=head1 FUNCTIONS
+
+=cut
+
+our @EXPORT = qw(reply_handler);
sub handle_ptr_query {
my ($querylog, $zone, $qname, $qclass, $qtype) = @_;
@@ -33,6 +45,12 @@ sub handle_ptr_query {
if ($querylog) {
say strftime('%x %X %z', localtime) . " - Relaying upstream answer for $qname";
}
+ my @answer = $result->answer;
+ for my $answer (@answer) {
+ my $name = $answer->name;
+ $name =~ s/\.upstream$//;
+ $answer->name($name);
+ }
return ('NOERROR', [ $result->answer ], [], [], { aa => 1 });
}
}
@@ -83,6 +101,7 @@ Returns DNS RRs for PTR and AAAA queries of zones which are configured in
C<$config>.
=cut
+
sub reply_handler {
my ($config, $querylog, $qname, $qclass, $qtype, $peerhost) = @_;
@@ -107,29 +126,9 @@ sub reply_handler {
__END__
-=head1 NAME
-
-AllKnowingDNS - Tiny DNS server for IPv6 Reverse DNS
-
-=head1 DESCRIPTION
-
-AllKnowingDNS provides reverse DNS for IPv6 networks which use SLAAC
-(autoconf), e.g. for a /64 network.
-
-The problem with IPv6 reverse DNS and traditional nameservers is that the
-nameserver requires you to provide a zone file. Assuming you want to provide
-RDNS for a /64 network, you have 2**64 = 18446744073709551616 different usable
-IP addresses (a little less if you are using SLAAC). Providing a zone file for
-that, even in a very terse notation, would consume a huge amount of disk space
-and could not possibly be held in the memory of the computers we have nowadays.
-
-AllKnowingDNS instead generates PTR and AAAA records on the fly. You only
-configure which network you want to serve and what your entries should look
-like.
-
=head1 VERSION
-Version 1.0
+Version 1.2
=head1 AUTHOR
diff --git a/lib/App/AllKnowingDNS/Util.pm b/lib/App/AllKnowingDNS/Util.pm
index 7cb49e9..cb7af5b 100644
--- a/lib/App/AllKnowingDNS/Util.pm
+++ b/lib/App/AllKnowingDNS/Util.pm
@@ -9,6 +9,18 @@ use App::AllKnowingDNS::Zone;
use NetAddr::IP::Util qw(ipv6_aton);
use v5.10;
+=head1 NAME
+
+App::AllKnowingDNS::Util - utility functions
+
+=head1 DESCRIPTION
+
+Note: User documentation is in L<all-knowing-dns>(1).
+
+=head1 FUNCTIONS
+
+=cut
+
our @EXPORT = qw(parse_config netmask_to_ptrzone);
=head2 parse_config($lines)
@@ -18,6 +30,7 @@ Parses a block of text as configfile.
Returns a corresponding App::AllKnowingDNS::Config object.
=cut
+
sub parse_config {
my ($input) = @_;
my $config = App::AllKnowingDNS::Config->new;
@@ -79,10 +92,12 @@ sub parse_config {
Converts the given netmask to a PTR zone.
Example:
+
my $ptrzone = netmask_to_ptrzone('2001:4d88:100e:ccc0::/64');
say $ptrzone; # 0.c.c.c.e.0.0.1.8.8.d.4.1.0.0.2.ip6.arpa
=cut
+
sub netmask_to_ptrzone {
my ($netmask) = @_;
diff --git a/script/all-knowing-dns b/script/all-knowing-dns
index 04e8b12..7e6e124 100755
--- a/script/all-knowing-dns
+++ b/script/all-knowing-dns
@@ -15,6 +15,8 @@ use Net::DNS::Nameserver;
use Privileges::Drop;
use v5.10;
+our $VERSION = '1.2';
+
my $configfile = '/etc/all-knowing-dns.conf';
my $querylog = 0;
@@ -22,7 +24,7 @@ GetOptions(
'configfile=s' => \$configfile,
'querylog!' => \$querylog,
'version' => sub {
- say "AllKnowingDNS v$App::AllKnowingDNS::Handler::VERSION " .
+ say "AllKnowingDNS v$VERSION " .
"© 2012 Michael Stapelberg and contributors";
exit 0;
},
@@ -38,7 +40,7 @@ GetOptions(
);
openlog('all-knowing-dns', 'pid', 'daemon');
-syslog('info', "AllKnowingDNS v$App::AllKnowingDNS::Handler::VERSION starting");
+syslog('info', "AllKnowingDNS v$VERSION starting");
my $input;
my $fh;
@@ -71,3 +73,177 @@ my $ns = Net::DNS::Nameserver->new(
drop_privileges('nobody');
$ns->main_loop;
+
+__END__
+
+=head1 NAME
+
+all-knowing-dns - Tiny DNS server for IPv6 Reverse DNS
+
+=head1 SYNOPSIS
+
+ all-knowing-dns [--configfile <path>] [--querylog]
+
+=head1 DESCRIPTION
+
+AllKnowingDNS provides reverse DNS for IPv6 networks which use SLAAC
+(autoconf), e.g. for a /64 network.
+
+The problem with IPv6 reverse DNS and traditional nameservers is that the
+nameserver requires you to provide a zone file. Assuming you want to provide
+RDNS for a /64 network, you have 2**64 = 18446744073709551616 different usable
+IP addresses (a little less if you are using SLAAC). Providing a zone file for
+that, even in a very terse notation, would consume a huge amount of disk space
+and could not possibly be held in the memory of the computers we have nowadays.
+
+AllKnowingDNS instead generates PTR and AAAA records on the fly. You only
+configure which network you want to serve and what your entries should look
+like.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--configfile=I<path>>
+
+Use I<path> instead of /etc/all-knowing-dns.conf as configuration file.
+
+=item B<--querylog>
+
+Enable logging every query to stdout (for debugging).
+
+=back
+
+=head1 CONFIGURATION FILE (/etc/all-knowing-dns.conf)
+
+The configuration file is wonderfully simple:
+
+ # Configuration file for AllKnowingDNS v1.2
+
+ listen 79.140.39.197
+ listen 2001:4d88:100e:1::3
+
+ # RaumZeitLabor
+ network 2001:4d88:100e:ccc0::/64
+ resolves to ipv6-%DIGITS%.nutzer.raumzeitlabor.de
+ with upstream 2001:4d88:100e:1::2
+
+ # Chaostreff
+ network 2001:4d88:100e:cd1::/64
+ resolves to ipv6-%DIGITS%.treff.noname-ev.de
+
+This example contains all configuration directives. Let's go over them one by
+one:
+
+=over 4
+
+=item B<listen I<address>>
+
+Listens on the given I<address> (IPv4 and IPv6 is supported) on port 53.
+
+=item B<network I<network>>
+
+Specifies that queries for PTR records within the given network should be
+answered (any query for an unconfigured network will be answered with
+NXDOMAIN). You need to specify at least the B<resolves to> directive
+afterwards.
+
+=item B<resolves to I<address>>
+
+Specifies the address to which PTR records should resolve. The address needs to
+contain %DIGITS% exactly once. When answering AAAA queries, %DIGITS% will be
+parsed and converted back to an IPv6 address.
+
+Example:
+
+ network 2001:4d88:100e:ccc0::/64
+ resolves to ipv6-%DIGITS%.nutzer.raumzeitlabor.de
+
+Example query:
+
+ The PTR query 2001:4d88:100e:ccc0:216:eaff:fecb:826 will resolve to
+ ipv6-0216eafffecb0826.nutzer.raumzeitlabor.de
+
+=item B<with upstream I<address>>
+
+Before answering a PTR query for this network, AllKnowingDNS will ask the DNS
+server at I<address> first, appending .upstream to the query.
+
+Example:
+
+ network 2001:4d88:100e:ccc0::/64
+ resolves to ipv6-%DIGITS%.nutzer.raumzeitlabor.de
+ with upstream 2001:4d88:100e:1::2
+
+Example query:
+
+ The PTR query 2001:4d88:100e:ccc0:219:dbff:fe43:2ec5 will make
+ AllKnowingDNS ask for
+ 5.c.e.2.3.4.e.f.f.f.b.d.9.1.2.0.0.c.c.c.e.0.0.1. \
+ 8.8.d.4.1.0.0.2.ip6.arpa.upstream. at 2001:4d88:100e:1::2
+ and relay the answer, if any.
+
+=back
+
+=head1 DELEGATING ZONES
+
+This section shows you how to delegate a zone in BIND9 or any DNS server with a
+compatible zone file syntax. To use AllKnowingDNS, you need to delegate the
+appropriate .ip6.arpa zone for your network and one regular domain.
+
+=head2 REVERSE DELEGATION (.ip6.arpa)
+
+
+ $ORIGIN .
+ $TTL 604800 ; 1 week
+ e.0.0.1.8.8.d.4.1.0.0.2.ip6.arpa IN SOA infra.in.zekjur.net. \
+ hostmaster.zekjur.net. (
+ 20 ; serial
+ 604800 ; refresh (1 week)
+ 86400 ; retry (1 day)
+ 2419200 ; expire (4 weeks)
+ 604800 ; minimum (1 week)
+ )
+ NS libri.sur5r.net.
+ NS infra.in.zekjur.net.
+
+ ; net for RaumZeitLabor
+ 0.c.c.c.e.0.0.1.8.8.d.4.1.0.0.2.ip6.arpa. IN NS ipv6-rdns.zekjur.net.
+
+=head2 FORWARD DELEGATION (.nutzer.raumzeitlabor.de)
+
+
+ $TTL 6h
+ raumzeitlabor.de IN SOA ns1.jpru.de. hostmaster.jpru.de. (
+ 2012030701
+ 3h
+ 30m
+ 7d
+ 1d )
+ IN NS ns1.jpru.de.
+ IN NS ns2.jpru.de.
+ IN A 195.49.138.121
+ IN MX 10 rzl.uugrn.org.
+ IN MX 20 up.uugrn.org.
+ IN MX 50 mail.uugrn.org.
+ IN MX 100 rzl.uugrn.org.
+
+ nutzer.raumzeitlabor.de. IN NS ipv6-rdns.zekjur.net.
+
+
+=head1 VERSION
+
+Version 1.2
+
+=head1 AUTHOR
+
+Michael Stapelberg, C<< <michael at stapelberg.de> >>
+
+=head1 LICENSE AND COPYRIGHT
+
+Copyright 2012 Michael Stapelberg.
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the BSD license.
+
+=cut
--
Debian packaging of AllKnowingDNS CPAN distribution
More information about the Pkg-perl-cvs-commits
mailing list