source: trunk/cgi-bin/snCalc.cgi@ 4

Last change on this file since 4 was 4, checked in by Kris Deugau, 20 years ago

Import "new" IPDB development:

March 2004 through end of August 2004

Changes include:

-> Entirely new method of allocating IP space; which should

hopefully reduce the amount of messiness in allocations.

-> IP address processing provided by NetAddr::IP rather than

homebrew code

-> Change DB to PostgreSQL to eliminate some of the problems

caused by using MySQL, and to gain native RDBMS support for
IP addresses.

-> Using NetAddr::IP and Postgres allows (eventually, with

PG >= 7.4) IPV6 without any code changes. In theory.

-> Logging so that if someone makes a change that turns out

to have been wrong for some reason, Blame Can Be Assigned.

-> General code cleanups (split IPDB.pm from CommonWeb.pm,

for instance)

  • Property svn:executable set to *
File size: 3.9 KB
RevLine 
[4]1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6#file snCalc.cgi little subnet calculator app
7
8my %webvar = parse_post();
9my $input;
10
11print "Content-Type: text/html\n\n";
12
13open(HTML, "../startsn.html")|| die "Could not open starsn.html :$!";
14my $start = join('', <HTML>);
15close(HTML);
16print $start;
17
18if($webvar{input} =~ m/(\/\d\d)/)
19{
20 $input = $1;
21}
22else
23{
24 $input = '/29';
25}
26
27if(substr($input, 1, 2) > 32 || substr($input, 1, 2) < 24)
28{
29 printAndExit("'$input' is an invalid netmask.");
30}
31else
32{ $input = substr($input, 1, 2);
33 my $ltinput = $input -1;
34 my $gtinput = $input +1;
35
36 print qq( <div class="center">
37 <table align="center" cellspacing="3" cellpadding="3"><tr>
38 <td class="heading" align="center"> Results for /$ltinput</td><td class="heading" align="center"> Results for /$input</td><td class="heading" align="center"> Results for /$gtinput</td></tr>
39 );
40
41 if( $input =~ m|.*24.*|){
42 $input = 256;
43 $ltinput =128;
44 undef($gtinput);
45 }
46 elsif( $input =~ m|.*25.*|){
47 $input = 128;
48 $ltinput = 64;
49 $gtinput = 256;
50 }
51 elsif( $input =~ m|.*26.*|){
52 $input = 64;
53 $ltinput = 32;
54 $gtinput = 128;
55 }
56 elsif( $input =~ m|.*27.*|){
57 $input = 32;
58 $ltinput = 16;
59 $gtinput = 64;
60 }
61 elsif( $input =~ m|.*28.*|){
62 $input = 16;
63 $ltinput = 8;
64 $gtinput = 32;
65 }
66 elsif( $input =~ m|.*29.*|){
67 $input = 8;
68 $ltinput = 4;
69 $gtinput = 16;
70 }
71 elsif( $input =~ m|.*30.*|){
72 $input = 4;
73 $ltinput = 2;
74 $gtinput = 8;
75 }
76 elsif( $input =~ m|.*31.*|){
77 $input = 2;
78 $ltinput = 1;
79 $gtinput = 4;
80 }
81 elsif( $input =~ m|.*32.*|){
82 $input = 1;
83 $gtinput = 2;
84 undef($ltinput);
85 }
86
87 my ($center, $left, $right) = ('','','');
88 my $subnet;
89
90 #add the subnet masks
91
92 if($input)
93 {
94 $subnet = 256 - $input;
95 $center = qq(<div style="background-color: #00ff00">255.255.255.$subnet </div>);
96 }
97
98 if($ltinput)
99 {
100 $subnet = 256 - $ltinput;
101 $right = qq(<div style="background-color: #00ff00">255.255.255.$subnet</div>);
102 }
103 if($gtinput)
104 {
105 $subnet = 256 - $gtinput;
106 $left = qq(<div style="background-color: #00ff00">255.255.255.$subnet</div>);
107 }
108
109
110 for(my $i = 0; $i < 256; $i++)
111 {
112 #left display -- one less than requested
113 if(defined($gtinput) && $i % $gtinput == 0)
114 {
115 my $upper = $i + $gtinput -1;
116 $left .= "x.x.x.$i - x.x.x.$upper</br>\n";
117 }
118
119 #center display -- the one requested
120 if($i % $input == 0 )
121 {
122 my $upper = $i + $input - 1;
123 $center .= "x.x.x.$i - x.x.x.$upper&nbsp;&nbsp;</br>\n";
124 }
125
126 #right display -- one more than requested
127 if(defined($ltinput) && $i % $ltinput == 0)
128 {
129 my $upper = $i + $ltinput -1;
130 $right .= "x.x.x.$i - x.x.x.$upper&nbsp;&nbsp;</br>\n";
131 }
132 }
133
134 print qq(<tr><td valign="top" >$left</td>
135 <td valign="top" bgcolor="#d0e0e0">$center</td>
136 <td valign="top" >$right</td></tr>
137 );
138 print "</table>\n";
139
140 print '<input type="button" value="Back" onclick="history.go(-1)" class="heading"></div></body></html>';
141
142}
143
144
145sub parse_post {
146 my $buffer;
147 if ($ENV{'REQUEST_METHOD'} eq "GET") {
148 $buffer=$ENV{'QUERY_STRING'}
149 } elsif ($ENV{'REQUEST_METHOD'} eq 'POST' && $ENV{'CONTENT_TYPE'} eq "application/x-www-form-urlencoded") {
150 read(STDIN, $buffer, $ENV{CONTENT_LENGTH});
151 } else {
152 $buffer = $ENV{'QUERY_STRING'};
153 $buffer || read(STDIN, $buffer, $ENV{CONTENT_LENGTH});
154 }
155 my @pairs = split(/&/, $buffer);
156 my %webvarLocal;
157 foreach my $pair (@pairs) {
158 my ($name, $value) = split(/=/, $pair);
159 $name =~ tr/+/ /;
160 $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
161 $value =~ tr/+/ /;
162 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
163 $value =~ s/\'/\\\'/g;
164 $webvarLocal{$name} = $value;
165 }
166 return %webvarLocal;
167}
168sub printAndExit
169{
170 my $errStr = $_[0];
171 print qq(
172 <center><p class="regular"> $errStr </p>
173 <input type="button" value="Back" onclick="history.go(-1)" class="heading">
174 </center>
175 );
176 exit(0);
177}
Note: See TracBrowser for help on using the repository browser.