freebsd_amp_hwpstate/contrib/cidrexpand

139 lines
2.9 KiB
Plaintext
Raw Normal View History

2004-08-01 01:04:57 +00:00
#!/usr/bin/perl -w
2007-04-09 01:38:51 +00:00
# $Id: cidrexpand,v 8.8 2006/08/07 17:18:37 ca Exp $
#
2004-08-01 01:04:57 +00:00
# v 0.4
#
2004-08-01 01:04:57 +00:00
# 17 July 2000 Derek J. Balling (dredd@megacity.org)
2007-04-09 01:38:51 +00:00
#
# Acts as a preparser on /etc/mail/access_db to allow you to use address/bit
2007-04-09 01:38:51 +00:00
# notation.
#
2003-02-08 20:31:29 +00:00
# If you have two overlapping CIDR blocks with conflicting actions
# e.g. 10.2.3.128/25 REJECT and 10.2.3.143 ACCEPT
# make sure that the exceptions to the more general block are specified
# later in the access_db.
#
2003-02-08 20:31:29 +00:00
# the -r flag to makemap will make it "do the right thing"
#
# Modifications
# -------------
2004-08-01 01:04:57 +00:00
# 26 Jul 2001 Derek Balling (dredd@megacity.org)
# Now uses Net::CIDR because it makes life a lot easier.
#
# 5 Nov 2002 Richard Rognlie (richard@sendmail.com)
2003-02-08 20:31:29 +00:00
# Added code to deal with the prefix tags that may now be included in
# the access_db
#
2007-04-09 01:38:51 +00:00
# Added clarification in the notes for what to do if you have
2003-02-08 20:31:29 +00:00
# exceptions to a larger CIDR block.
#
2007-04-09 01:38:51 +00:00
# 26 Jul 2006 Richard Rognlie (richard@sendmail.com>
# Added code to strip "comments" (anything after a non-escaped #)
# # characters after a \ or within quotes (single and double) are
# left intact.
#
# e.g.
# From:1.2.3.4 550 Die spammer # spammed us 2006.07.26
# becomes
# From:1.2.3.4 550 Die spammer
#
2006-08-17 05:10:43 +00:00
# 3 August 2006
#
# Corrected a bug to have it handle the special case of "0.0.0.0/0"
# since Net::CIDR doesn't handle it properly.
#
2007-04-09 01:38:51 +00:00
# usage:
2003-02-08 20:31:29 +00:00
# cidrexpand < /etc/mail/access | makemap -r hash /etc/mail/access
#
#
2004-08-01 01:04:57 +00:00
# Report bugs to: <dredd@megacity.org>
#
use strict;
use Net::CIDR;
2007-04-09 01:38:51 +00:00
use Getopt::Std;
2007-04-09 01:38:51 +00:00
our ($opt_c,$opt_t);
getopts('ct:');
2007-04-09 01:38:51 +00:00
my $spaceregex = '\s+';
if ($opt_t)
{
2007-04-09 01:38:51 +00:00
$spaceregex = $opt_t;
}
while (<>)
{
2007-04-09 01:38:51 +00:00
chomp;
2004-08-01 01:04:57 +00:00
my ($prefix,$left,$right,$space);
2007-04-09 01:38:51 +00:00
if ( (/\#/) && $opt_c )
{
# print "checking...\n";
my $i;
my $qtype='';
for ($i=0 ; $i<length($_) ; $i++)
{
my $ch = substr($_,$i,1);
if ($ch eq '\\')
{
$i++;
next;
}
elsif ($qtype eq '' && $ch eq '#')
{
substr($_,$i) = '';
last;
}
elsif ($qtype ne '' && $ch eq $qtype)
{
$qtype = '';
}
elsif ($qtype eq '' && $ch =~ /[\'\"]/)
{
$qtype = $ch;
}
}
}
2004-08-01 01:04:57 +00:00
if (! /^(|\S\S*:)(\d+\.){3}\d+\/\d\d?$spaceregex.*/ )
{
2007-04-09 01:38:51 +00:00
print "$_\n";
2004-08-01 01:04:57 +00:00
}
else
{
2007-04-09 01:38:51 +00:00
($prefix,$left,$space,$right) =
/^(|\S\S*:)((?:\d+\.){3}\d+\/\d\d?)($spaceregex)(.*)$/;
2004-08-01 01:04:57 +00:00
my @new_lefts = expand_network($left);
foreach my $nl (@new_lefts)
{
2003-02-08 20:31:29 +00:00
print "$prefix$nl$space$right\n";
}
2004-08-01 01:04:57 +00:00
}
}
2007-04-09 01:38:51 +00:00
sub expand_network
{
2004-08-01 01:04:57 +00:00
my $left_input = shift;
my @rc = ($left_input);
my ($network,$mask) = split /\//, $left_input;
if (defined $mask)
{
2006-08-17 05:10:43 +00:00
return (0..255) if $mask == 0;
2004-08-01 01:04:57 +00:00
my @parts = split /\./, $network;
while ($#parts < 3)
{
2004-08-01 01:04:57 +00:00
push @parts, "0";
}
2004-08-01 01:04:57 +00:00
my $clean_input = join '.', @parts;
$clean_input .= "/$mask";
my @octets = Net::CIDR::cidr2octets($clean_input);
@rc = @octets;
}
return @rc;
}