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

Last change on this file since 4 was 4, checked in by Kris Deugau, 19 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
Line 
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.