#! /usr/bin/perl -w $^W = 1; # same as -w above # (C) Copyright 2003 Rahul Dhesi, All rights reserved. # # "As is" -- No warranty. # # Copying, use, and modification are permitted, governed by # the GNU General Public License, by only those who agree # to use this program at their own risk. use strict; # unbuffered output is usually desired $| = 1; # $Source: /mi/maincvs/mail/cidr2access,v $ # $Id: cidr2access,v 1.5 2003/04/03 02:23:32 dhesi Exp $ # $::myname = $0; $::myname =~ s|.*/||; $::RCSHEADER = '$Source: /mi/maincvs/mail/cidr2access,v $' . "\n" . '$Id: cidr2access,v 1.5 2003/04/03 02:23:32 dhesi Exp $'; # suppresss perl warnings $::debug = $::opt_x = undef; $::ddebug = $::opt_X = undef; $::verbose = $::opt_v = undef; $::trace = $::opt_t = undef; $::opt_h = undef; $::opt_y = undef; $::usage = "usage: $::myname [-vtx] -y [ file ... ] (or -h for help)"; if (@ARGV && $ARGV[0] =~ "^-.+" ) { local($^W) = 0; # suppress annoying undef warnings require "getopts.pl"; &Getopts("vtxXhyZ"); # Z will suppress perl warning } $::ddebug = $::opt_X; # debug $::debug = $::opt_x || $::ddebug; # extended debug $::trace = $::opt_t; $::verbose = $::debug || $::trace || $::opt_v; if ($::opt_h) { &givehelp(); exit(0); } ## (@ARGV < 1) && &usage_error; defined($::opt_y) || &usage_error; eval q(use Net::CIDR ':all'); $@ && die <) { chomp; my $addr; my $rhs; my $line; if (m|^(0\.0\.0\.0\-255\.255\.255\.255)\s+(.*)$| ) { # Net::CIDR module does not handle 0.0.0.0-255.255.255.255 $addr = $1; $rhs = $2; $::debug && print "##DEBUG range $_\n"; print "# IP range $addr {{{\n"; for $line (0 .. 255) { print &align($tabs, $line), $rhs, "\n"; } print "# }}} IP range $addr\n"; } elsif (m|^(0\.0\.0\.0\/0)\s+(.*)$| ) { # Net::CIDR module does not handle 0.0.0.0/0 $addr = $1; $rhs = $2; $::debug && print "##DEBUG CIDR $_\n"; print "# CIDR $addr {{{\n"; for $line (0 .. 255) { print &align($tabs, $line), $rhs, "\n"; } print "# }}} CIDR $addr\n"; } elsif (m|^(\d+\.\d+\.\d+\.\d+\-\d+\.\d+\.\d+\.\d+)\s+(.*)$|) { $addr = $1; $rhs = $2; $::debug && print "##DEBUG range $_\n"; print "# IP range $addr {{{\n"; for $line (cidr2octets(range2cidr($addr))) { print &align($tabs, $line), $rhs, "\n"; } print "# }}} IP range $addr\n"; } elsif (m|^(\d+\.\d+\.\d+\.\d+/\d+)\s+(.*)$|) { $addr = $1; $rhs = $2; $::debug && print "##DEBUG CIDR $_\n"; print "# CIDR $addr {{{\n"; for $line (cidr2octets($addr)) { print &align($tabs, $line), $rhs, "\n"; } print "# }}} CIDR $addr\n"; } else { $::ddebug && print "##DEBUG copy $_\n"; print $_, "\n"; } } sub usage_error { my($msg) = @_; if ($msg) { die "$msg\n"; } else { die "$::usage\n"; } } sub givehelp { ## require 'local/page.pl'; ## &page(< access.tmp.\$\$\$\$ && \\ mv access.tmp.\$\$\$\$ access && \\ rm -f access.tmp.* -y Required. -v Be verbose. -t Trace only -- show what would be done but don't do it. -x Enable debugging -- for program maintainers. -X Enable more debugging -- for program maintainers. $::RCSHEADER EOF } # pad a string with tabs to a constant width # .. $count is how many tabs of width we need, total. sub align { my($count, $str) = @_; my $nexttab = int((length($str) - 0) / 8) + 1; if ($nexttab >= $count) { return $str; } else { return $str . "\t" x ($count - $nexttab); } }