#!/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.
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];
}