#!/usr/bin/perl use strict; use lib '/home/dcat/perlmods/share/perl/5.8.4/'; use Net::CIDR; use Net::CIDR ':all'; use CGI::Minimal; my $cgi = CGI::Minimal->new; sub map2mask { my $cidr = $_; if ($cidr =~ m|(.*)/(\d+)|) { return $1 . "/" . cvt_bits_mask($2); } return $cidr; } sub print_nets { my($r1, $r2) = @_; $r1 = $cgi->htmlize($r1); $r2 = $cgi->htmlize($r2); print '
', "\n"; print "

$r1 - $r2

\n"; print "

Result:
\n"; print join("
\n", Net::CIDR::range2cidr("$r1-$r2")); print "

\n"; print "

\n"; my @cidrs = Net::CIDR::range2cidr("$r1-$r2"); my @masks = map(map2mask, @cidrs); print join("
\n", @masks); print "

\n"; print "
\n"; } print < range2cidr
HTML my $range1 = $cgi->param('s') || '192.168.0.0'; my $range2 = $cgi->param('e') || '192.168.5.253'; my $range3 = $cgi->param('r') || ''; if ( $range3 ne '' ) { ($range1, $range2) = split(/-/, $range3); } if ( $range1 ne '' and $range2 ne '' and length($range1) <= 15 and length($range2) <= 15 and Net::CIDR::cidrvalidate($range1) and Net::CIDR::cidrvalidate($range2) ) { print_nets($range1, $range2); } my $hRange1 = $cgi->htmlize($range1); my $hRange2 = $cgi->htmlize($range2); my $hRange3 = $cgi->htmlize($range3); print <

Submit the start and end address as a range or as individual addresses.

Range: (IP - IP)
or

Start IP:
End IP:

This is a simple web interface for Net::CIDR's range2cidr function.

Source code for this page: range2cidr.pl.

HTML sub cvt_bits_mask { my ($bits) = @_; my ($a, $b, $c, $d); if ($bits > 24) { $d = bits_to_dec($bits-24); return "255.255.255." . $d; } if ($bits > 16) { $c = bits_to_dec($bits-16); return "255.255." . $c . ".0"; } if ($bits > 8) { $b = bits_to_dec($bits-8); return "255." . $b . ".0.0"; } $a = bits_to_dec($bits); return $a . ".0.0.0"; } sub bits_to_dec( ) { my ($bits) = @_; my @bitTable = qw(0 128 192 224 240 248 252 254 255); return $bitTable[$bits]; }