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