Looking for DNS/Operational experience

Bjørn Mork bjorn at mork.no
Fri May 8 18:58:08 CEST 2009


Mike Leber <mleber at he.net> writes:
> Bjørn Mork wrote:
>> Mike Leber <mleber at he.net> writes:
>>
>>> Since you mentioned Perl, here is a way to do it with Perl:
>>>
>>> $ perl -e 'use Net::IP;$ip=new Net::IP("2a02:c0:100::2/128");print
>>> ($ip->reverse_ip()."\n");'
>>>
>>> 2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.c.0.0.2.0.a.2.ip6.arpa.
>>>
>>> You'll probably find Net::IP very useful.  You can use it to write
>>> code that is nearly address family agnostic.
>>
>> No, you can't.  You can use it for IPv6, but it fails for IPv4 (CIDR):
>
> To date, I'd bet Net::IP has been used in more IPv4 code than IPv6.

Sure.  You just can't use the reverse_ip function.  The rest of Net::IP
is quite nice, and I certainly use it for IPv6.

> The documentation for the reverse_ip function is:
>
> QUOTE
> Return the reverse IP for a given IP address (in.addr. format).
> ENDQUOTE
>
> It says IP address (not prefix)

Oh, but it doesn't work any better with an IP address:

bjorn at nemi:/tmp$ perl -e 'use Net::IP;$ip=new Net::IP("192.168.4.0");print $ip->reverse_ip()."\n"'
4.168.192.in-addr.arpa.

> plus they probably didn't test for somebody using .0 of a prefix.

No, the probably didn't.  Which probably is why it doesn't work :-)

> This function is just one of 27.
>
> If you find a behavior in a package you don't agree with:
>
> 1) Find out how other people made it work correctly.  Read the
> documentation and use Google.  Look at what how the module writer
> actually wrote the function you are using.

I did.   I sent this patch to the author in february 2008:

diff -urN a/Net/IP.pm b/Net/IP.pm
--- a/Net/IP.pm	2008-02-06 11:47:39.870067846 +0100
+++ b/Net/IP.pm	2008-02-06 11:54:26.622068489 +0100
@@ -1769,15 +1769,12 @@
 
     if ($ip_version == 4) {
         my @quads    = split /\./, $ip;
-        my $no_quads = ($len / 8);
+        my $first_quad_index = $len ? 4 - (int($len / 8)) : 0;
 
         my @reverse_quads = reverse @quads;
 
-        while (@reverse_quads and $reverse_quads[0] == 0) {
-            shift(@reverse_quads);
-        }
-
-        return join '.', @reverse_quads, 'in-addr', 'arpa.';
+        return join '.', @reverse_quads[ $first_quad_index .. $#reverse_quads ],
+          'in-addr', 'arpa.';
     }
     elsif ($ip_version == 6) {
         my @rev_groups = reverse split /:/, $ip;


> 2) Write your own perl code to handle it.

I did.  It's not like it's a big problem.

> 3) Find another package that does what you want.

It's not that important to me. 

>
> 4) Fix the module, or write a fixed version of the function, and mail
> the module writer.  Other people will probably run into the same
> thing.

Oh, they already did.  See

http://rt.cpan.org/Public/Bug/Display.html?id=42793
http://rt.cpan.org/Public/Bug/Display.html?id=25169


Bjørn



More information about the ipv6-ops mailing list