#!/usr/local/bin/perl -w
# _____ ___ ____ _ _
# | ___| __ ___ ___|_ _| _ \ __| | |__
# | |_ | '__/ _ \/ _ \| || |_) / _` | '_ \
# | _|| | | __/ __/| || __/ (_| | |_) |
# |_| |_| \___|\___|___|_| \__,_|_.__/
#
# admin.cgi-$Name: $-$Revision: 1.16 $ $Date: 2002/04/16 21:39:00 $ <$Author: bapril $@freeipdb.org>
######################################################################
require 'ipdb_httpcgi.pl';
use config;
%config = config::config();
$config{'_REMOTE_USER'} = $ENV{'REMOTE_USER'};
$config{'_REMOTE_ADDR'} = $ENV{'REMOTE_ADDR'};
printHead("$config{ver}");
print <<EOF;
<center><table BORDER COLS=2>
<tr>
<td BGCOLOR="$config{headcolor}" COLSPAN=2>
<center>
<h1>
<b><font face="Arial,Helvetica" color="$config{headtextcolor}" SIZE=+2>
$config{ver}</font>
</font></b></h1></center>
</td>
</tr>
EOF
use DBI;
my $script = get_cgi($0);
my $conn = DBI->connect("DBI:Pg:dbname=$config{dbname};host=$config{dbhost};port=$config{dbport}", "$config{dbuser}", "$config{dbpass}",);
my $buffer;
my @pairs;
my $pair;
my $name;
my $value;
my %FORM;
my $exit;
#Get Variable Space
if($ENV{'CONTENT_LENGTH'}){
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buffer);
foreach $pair (@pairs){
($name,$value) = split(/=/,$pair);
$name =~ tr/+/ /;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
} else {
$FORM{'FORM'} = "NULL";
}
if($FORM{'FORM'} =~ /IMPORT/){
print "Importing IP Blocks<BR>\n";
my @lines = split('\n',$FORM{'DATA'});
my $i = 0;
while($lines[$i]){
my @line = split(':',$lines[$i]);
my $ver = &VersionFromRegion($conn,$FORM{'REGION'});
my $added = &SetBlockP($conn,$line[0],$FORM{'REGION'},$line[1],$line[2],$line[3],$ver);
if($added){
print "Line successfully added Block: $added\n<BR>\n";
} else {
print "Line Failed: $lines[$i]<BR>\n";
}
$i++;
}
}
if($FORM{'FORM'} =~ /DELREGION/){
if($FORM{'REGION'} =~ /---/){
print "<TR><TD><H1>Please go back and choose a REGION</TD></TR>\n";
$exit = 1;
}
if($exit){
print "</TABLE>\n";
&printTail();
$conn->disconnect;
exit();
} # Bail Missing some info.
&DeleteRegion($conn,$FORM{'REGION'});
}
if($FORM{'FORM'} =~ /RECLAIM/){
#procede to reclaim
&ReclaimBlock($conn,$FORM{'RECLAIM'});
print "Reclaim Block $FORM{'RECLAIM'}\n <BR>";
}
if($FORM{'FORM'} =~ /EDIT/){
&EditForm($conn,$FORM{'EDIT'},$script);
printTail();
$conn->disconnect;
exit();
}
if($FORM{'FORM'} =~ /UPDATE/){
if($exit){
printTail();
$conn->disconnect;
exit();
}
&UpdateBlock($conn,$FORM{'UPDATE'},$FORM{'REGION'},$FORM{'CUSTOMER'},$FORM{'CUSTDESC'});
print "Updated\n";
}
if($FORM{'FORM'} =~ /SUBMIT4/){
print <<EOF;
<tr>
<td COLSPAN=2 bgcolor="$config{headcolor}" color="$config{headtextcolor}" SIZE=+2 face="Arial,Helvetica"><center><b>Confirm New IP Block
Assignment</b></center></font></td>
</tr>
EOF
my $exit = "";
if($FORM{'REGION'} =~ /---/){
print "<TR><TD><H1>Please go back and choose a REGION</TD></TR>\n";
$exit = 1;
}
if($FORM{'BITS'} =~ /---/){
print "<TR><TD><H1>Please go back and choose a Block Size</TD></TR>\n";
$exit = 1;
}
if($exit){
print "</TABLE>";
&printTail();
$conn->disconnect;
exit();
} # Bail Missing some info.
print "<TR><TD COLSPAN=2>";
$ver = &VersionFromRegion($conn,$FORM{'REGION'});
my $id = &SetBlockP($conn,$FORM{'BLOCK'},$FORM{'REGION'},$FORM{'BITS'},$FORM{'CUSTDESC'},$FORM{'CUSTOMER'},$ver);
@block = &GetBlockFromID($conn,$id);
&SetRegion($conn,$id,$FORM{'REGION'},$block[2]);
if($id){
print "<H1>Success Your block id $id</H1>\n";
} else {
print "<H1>For some reason this request failed</H1>\n";
}
print "</TD></TR>";
}
if($FORM{'FORM'} =~ /SUBMIT5/){
if($FORM{'REGION'} =~ /---/){
print "<TR><TD><H1>Please go back and set a Region</TD></TR>\n";
$exit = 1;
}
unless($FORM{'BLOCK'} =~ /[\dA-Fa-f\:\.]+/){
print "<TR><TD><H1>Please go back and set a Block</TD></TR>\n";
my $BLK = IP2Deci($FORM{'BLOCK'});
print "$FORM{'BLOCK'} $BLK\n";
$exit = 1;
}
unless($FORM{'BITS'}){
print "<TR><TD><H1>Please go back and set Bits</TD></TR>\n";
$exit = 1;
}
if($exit){
print "</TABLE>";
&printTail();
$conn->disconnect;
exit();
} # Bail Missing some info.
#my $blk_bits = ip2deci($FORM{'BLOCK'});
&AddBlock($conn,$FORM{'BLOCK'},$FORM{'BITS'},$FORM{'REGION'},$FORM{'PRIORITY'});
}
if($FORM{'FORM'} =~ /AddRegion/){
if($FORM{'REGIONNAME'} =~ m/^[a-zA-Z0-9-_\.]{1,20}$/){
if($FORM{'PARENT'} !~ /---/){
if($FORM{'HOLDTIME'} =~ m/^[0-9]*$/){
$FORM{'HOLDTIME'} = $FORM{'HOLDTIME'} * 86400;
} else {
$FORM{'HOLDTIME'} = "";
}
&AddRegion($conn,$FORM{'REGIONNAME'},$FORM{'v6'},$FORM{'PARENT'},$FORM{'HOLDTIME'});
} else {
print "<H1>Invalid parent selection.</H1>\n";
}
} else {
print "<H1>Invalid Region Name [ ^[a-zA-Z0-9 \.]{1,20}$ ]</H1>\n";
}
}
if($FORM{'FORM'} =~ /SUBMIT9/){
$bblock = &ip2deci($FORM{'BLOCK'});
$id = &GetBlockId($conn,$bblock,$FORM{'BITS'},$FORM{'REGION_START'});
unless($id){
print "The block does not exist in the starting region";
$conn->disconnect;
exit();
}
$ver = &Version($conn,$id);
#my $added = &SetBlockP($conn,$FORM{'BLOCK'},$FORM{'REGION_END'},$FORM{'BITS'},1,1,$ver);
#if($added){
# print "A parent of that block exists.<BR>\n";
# &reclaim($conn,$added);
#} else {
# $newblock = &CheckBlockFree($conn,$bblock,$FORM{'BITS'},$FORM{'REGION_START'});
# if($newblock == -1){
# print "The block's parent must exist.\n";
# $conn->disconnect;
# exit();
# }
# if($newblock == 0){
# $ver = &VersionFromRegion($conn,$FORM{'REGION_START'});
# $newblock = &MakeParent($conn,$bblock,$FORM{'BITS'},$FORM{'REGION_START'},$bblock,$ver);
# unless($newblock){print "Could not find parent block"; }
# }
if(&SetRegion($conn,$id,$FORM{'REGION_END'},$FORM{'REGION_START'})){
print "Success $newblock!\n";
} else {
print "There was an error\n";
}
#}
}
if($FORM{'FORM'} =~ /SUBMITA/){
$bblock = &ip2deci($FORM{'BLOCK'});
$id = &CheckBlockFree($conn,$bblock,$FORM{'BITS'},$FORM{'REGION'});
if($id == -1){
print "Block's parent must exist\n";
return(0);
} elsif ($id == 0){
print "Block's must exist\n";
return(0);
}
&SetReclaim($conn,$id,1);
}
print <<EOF;
<tr>
<td bgcolor=#000000><font color=#FFFFFF>Add a specified Block:</font></td>
<td bgcolor=#000000><font color=#FFFFFF>Add Allocations.</font></td>
</tr>
<TR><FORM ACTION=$script METHOD=POST>
<INPUT TYPE=HIDDEN NAME=FORM VALUE=SUBMIT4>
<TD>
<TABLE BORDER=0 BGCOLOR=BLACK CELLPADDING=1 CELLSPACING=1>
<TR><TH>Block:</TH><TD><input TYPE=TEXT NAME="BLOCK" SIZE=18></TD></TR>
<TR><TD COLSPAN=2>(e.g. 10.0.0.0 or 0000:0000:0000:0000:0000:0000:0000:0000)</TD></TR>
<TR><TH>Region:</TH><TD><SELECT NAME="REGION">
<option selected>--- Please Choose ---
EOF
ListRegions($conn);
print " </SELECT></TD></TR>";
print <<EOF;
<TR><TH>Bits:</TH><TD><INPUT NAME=BITS SIZE=4></TD></TR>
<TR><TD COLSPAN=2>(e.g. 0-32 or 0-128)</TD></TR>
EOF
if($config{custname}){
print "<TR><TH>$config{custname_f}:</TH><TD><INPUT NAME=CUSTDESC></TD></TR>";
}
if($config{custnum}){
print "<TR><TH>$config{custnum_f}:</TH><TD><INPUT NAME=CUSTOMER></TD></TR>";
}
print <<EOF;
<TR><TD COLSPAN=2><input TYPE=SUBMIT VALUE=Add Block></TD></TR></FORM>
<TR><TD COLSPAN=2><H2><FONT COLOR=RED>WARNING: This function will override
the 10 day holding period</FONT></H2></TD></TR>
</TABLE>
</TD><TD>
<FORM ACTION=$script METHOD=POST>
<INPUT TYPE=HIDDEN NAME=FORM VALUE=SUBMIT5>
<TABLE BORDER=0 BGCOLOR=BLACK CELLPADDING=1 CELLSPACING=1>
<TR><TH>Block:</TH><TD><INPUT NAME=BLOCK></TD></TR>
<TR><TD COLSPAN=2>(e.g. 10.0.0.0 or 0000:0000:0000:0000:0000:0000:0000:0000)</TD></TR>
<TR><TH>Bits:</TH><TD><INPUT NAME=BITS SIZE=4></TD></TR>
<TR><TD COLSPAN=2>(e.g. 0-32 or 0-128)</TD></TR>
<TR><TH>Region:</TH><TD><SELECT NAME=REGION><OPTION SELECTED>--- Please Choose ---
EOF
ListRegions($conn);
print <<EOF;
</SELECT></TD></TR>
<TR><TH>Priority:</TH><TD><INPUT NAME=PRIORITY></TD></TR>
<TR><TD COLSPAN=2>(e.g. lower number = more likely to be used)</TD></TR>
<TR><TD COLSPAN=2><INPUT TYPE=SUBMIT VALUE=Add Block></TD></TR>
</TABLE>
</TD></TR></FORM>
<tr>
<td bgcolor=#000000><font color=#FFFFFF></FONT></TD>
<td bgcolor=#000000><font color=#FFFFFF>Add a Region</FONT></TD>
</TR>
<TR><TD></TD>
<FORM ACTION=$script METHOD=POST>
<INPUT TYPE=HIDDEN NAME=FORM VALUE=AddRegion>
<TD>
<TABLE BORDER=0 BGCOLOR=BLACK CELLPADDING=1 CELLSPACING=1>
<TR><TH>Name:</TH><TD><INPUT NAME=REGIONNAME></TD></TR>
<TR><TH>IPv6:</TH><TD><INPUT TYPE=CHECKBOX NAME=v6></TD></TR>
<TR><TH>Holdtime (days): </TH><TD><INPUT NAME=HOLDTIME></TD></TR>
<TR><TH>Parent:</TH><TD><SELECT NAME=PARENT><OPTION> --- None or choose one ---
<OPTION VALUE=ROOT> --- This is a root region ---
EOF
&ListRegions($conn);
print <<EOF;
</SELECT></TD></TR>
<TR><TD COLSPAN=2><INPUT TYPE=SUBMIT VALUE="Add Region"></TD></TR>
</TABLE></TD></FORM>
</TR>
<tr>
<td bgcolor=#000000>
<font color=#FFFFFF>
</FONT>
</TD>
<td bgcolor=#000000>
<font color=#FFFFFF>
Delete a Region
</FONT>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<TABLE BORDER=0 BGCOLOR=BLACK CELLPADDING=1 CELLSPACING=1>
<FORM ACTION=$script METHOD=POST>
<INPUT TYPE=HIDDEN NAME=FORM VALUE=DELREGION>
<TR>
<TH>
Name:
</TH>
<TD>
<SELECT NAME=REGION>
<OPTION> --- Please Choose a Region ---
EOF
&ListDeleteRegions($conn);
print <<EOF;
</SELECT>
</TD>
</TR>
<TR>
<TD COLSPAN=2>
<INPUT TYPE=SUBMIT VALUE="Delete Region">
</TD>
</TR>
</FORM>
</TABLE>
</TD>
</TR>
<tr>
<td bgcolor=#000000><font color=#FFFFFF>Put a block in a region(Block must exist):</FONT></TD>
<td bgcolor=#000000><font color=#FFFFFF>Set the Reclaim flag on a block(and all children):</FONT></TD>
</TR>
<TR><FORM ACTION=$script METHOD=POST>
<INPUT TYPE=HIDDEN NAME=FORM VALUE=SUBMIT9>
<TD><TABLE BORDER=0 BGCOLOR=BLACK CELLPADDING=1 CELLSPACING=1>
<TR><TH>Block:</TH><TD><INPUT NAME=BLOCK></TD></TR>
<TR><TH>Bits:</TH><TD><INPUT NAME=BITS></TD></TR>
<TR><TH>Starting Region:</TH><TD><SELECT NAME=REGION_START>
<OPTION SELECTED>--- Please Choose ---
EOF
ListRegions($conn);
print <<EOF;
</SELECT></TD></TR>
<TR><TH>Ending Region:</TH><TD><SELECT NAME=REGION_END>
<OPTION SELECTED>--- Please Choose ---
EOF
ListRegions($conn);
print <<EOF;
</SELECT></TD></TR>
<TR><TD COLSPAN=2><INPUT TYPE=SUBMIT VALUE="Move Block"></TD></TR>
</TABLE></TD></FORM>
<FORM ACTION=$script METHOD=POST>
<INPUT TYPE=HIDDEN NAME=FORM VALUE=SUBMITA>
<TD><TABLE BORDER=0 BGCOLOR=BLACK CELLPADDING=1 CELLSPACING=1>
<TR><TH>Block:</TH><TD><INPUT NAME=BLOCK></TD></TR>
<TR><TH>Bits:</TH><TD><INPUT NAME=BITS></TD></TR>
<TR><TH>Region:(for confirmation)</TH><TD><SELECT NAME=REGION>
<OPTION SELECTED>--- Please Choose ---
EOF
ListRegions($conn);
print <<EOF;
</SELECT></TD></TR>
<TR><TD COLSPAN=2><INPUT TYPE=SUBMIT VALUE="Set Reclaim"></TD></TR>
<TR><TD COLSPAN=2><H1><FONT COLOR=RED>WARNING!!! WARNING!!! DANGER Will Robinson!</FONT></H1>
<H2>This will prevent any blocks that are children of this one from being allocated.</H2></TD></TR>
</TABLE>
</TD></FORM>
</TR>
<tr>
<td bgcolor=#000000 COLSPAN=2><font color=#FFFFFF>Import Blocks:</FONT></TD>
</TR>
<TR><FORM ACTION=$script METHOD=POST>
<INPUT TYPE=HIDDEN NAME=FORM VALUE=IMPORT>
<TD COLSPAN=2><TABLE BORDER=0 BGCOLOR=BLACK CELLPADDING=1 CELLSPACING=1>
<TR><TH>Region:</TH><TD><SELECT NAME=REGION>
<OPTION SELECTED>--- Please Choose ---
EOF
ListRegions($conn);
print <<EOF;
</SELECT></TD></TR>
<TR><TH>Blocks:</TH><TD>
<TEXTAREA COLS=100 ROWS=20 NAME=DATA></TEXTAREA></TD></TR>
<TR><TD COLSPAN=2>Format:<br>
<I>ip address:netmask
EOF
if($config{custname}){
print ":$config{custname_f}";
}
if($config{custnum}){
print ":$config{custnum_f}";
}
print <<EOF;
</I></TD></TR>
<TR><TD COLSPAN=2>Parent is required to exist and be availiable.
<INPUT TYPE=SUBMIT VALUE="Import Blocks"></TD></TR>
</TABLE></TD></FORM>
</TR>
</table>
EOF
&printTail;
$conn->disconnect;