#!/usr/bin/perl
#                _____              ___ ____     _ _
#               |  ___| __ ___  ___|_ _|  _ \ __| | |__
#               | |_ | '__/ _ \/ _ \| || |_) / _` | '_ \
#               |  _|| | |  __/  __/| ||  __/ (_| | |_) |
#               |_|  |_|  \___|\___|___|_|   \__,_|_.__/
#
#	index.cgi-$Name:  $-$Revision: 1.24 $ $Date: 2002/04/29 18:59:02 $ <$Author: bapril $@freeipdb.org>
######################################################################

use strict;
use warnings;
require 'ipdb_httpcgi.pl';

use config;
use CGI qw( :standard :cgi-lib );
use DBI;
$config::config{'_REMOTE_USER'} = $ENV{'REMOTE_USER'};
$config::config{'_REMOTE_ADDR'} = $ENV{'REMOTE_ADDR'};
$config::config{'debug'} = 1;

$| = 1;

my $css = <<EOF;
body
{
  font-family: Verdana,arial,helvetica,sans;
  font-size: 11px;
  color:#330000;
}
th
{
  font: verdana 16px normal bold;
  color: #ffffff;
  background-color: blue;
}
td
{
  font-family: verdana 11px normal;
  color:#000000;
  background-color:#eeeeee;
}
/* end default font*/

/* links */
a         {color:#101010; text-decoration: underline; }
a:visited {color:#101010; }
a:active  {color:#808080; }
a:hover   {color:#ff4040; }
EOF


print
  header,
  start_html
  (
    -head  => meta({ -http_equiv => 'PRAGMA', -content => 'NO-CACHE' }),
    -title => $config::config{ver},
    -style => { -code => [ $css ] },
  );


my $conn = DBI->connect("DBI:Pg:dbname=$config::config{dbname};host=$config::config{dbhost};port=$config::config{dbport}", $config::config{dbuser}, $config::config{dbpass});

my $script = get_cgi($0);
our %FORM = Vars;


if( $FORM{BLOCK} && $FORM{BLOCK} =~ /([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\/([0-9]{1,2})/ )
{
	$FORM{BLOCK} = $1;
	$FORM{BITS} = $2;
}

if( ! $FORM{ACTION} )
{
  goto MAIN;
}
elsif( $FORM{ACTION} eq 'RECLAIM' )
{
	if($config::config{confirm_reclaim}){
		if( $FORM{CONFIRM} ) {
			if( $FORM{CONFIRM} eq $FORM{CONFIRM2} ){
				print "CONFIRM:\n";
				unless(&ClearRevDNS($conn,$FORM{RECLAIM})){
					unless(&ReclaimBlock($conn,$FORM{RECLAIM})){
						print "Reclaim Block ".$FORM{RECLAIM}." CONFIRMED\n <BR>";
					}
				}
			} else {
				print "Confirm Failed\n";
				&ReclaimConfirm($conn,$FORM{RECLAIM});
				&printTail();
				$conn->disconnect;
				exit();
			}
		} else {
			&ReclaimConfirm($conn,$FORM{RECLAIM});
			&printTail();
			$conn->disconnect;
			exit();
		}
	} else {
		#procede to reclaim
		unless(&ClearRevDNS($conn,$FORM{RECLAIM})){
			unless(&ReclaimBlock($conn,$FORM{RECLAIM})){
				print "Reclaim Block ".$FORM{RECLAIM}."\n <BR>";
			}
		}
	}
	goto MAIN;
}
elsif( $FORM{ACTION} eq 'UPDATE' )
{
	&UpdateBlock($conn,$FORM{UPDATE},$FORM{REGION},$FORM{CUSTOMER},$FORM{CUSTDESC});
	print "Block Updated\n";
	$FORM{ACTION} = 'EDIT'; # Show edit form with new values.
	$FORM{EDIT} = $FORM{UPDATE};
	goto MAIN;
}
elsif( $FORM{ACTION} eq 'DNSEDIT' )
{
	if($FORM{'SUB'} =~ /Add A\+PTR/){
		print "Creating Forward and Reverse DNS Record for $FORM{'HOSTNAME'}<BR>\n";
		my $host = &CleanDNSText($FORM{'HOSTNAME'});
		$host =~ s/^([a-zA-Z0-9-]+)\.//;
		my $zone = &GetZone($conn,$host);
		$host = $1;
		&SetFwdDNS($conn,$FORM{'BLOCK'},$zone,$FORM{'INDEX'},$host);
		&SetRevDNS($conn,$FORM{'BLOCK'},$zone,$FORM{'INDEX'},$host);
	} elsif($FORM{'SUB'} =~ /Add A/){
		#Add A Record
		print "Creating Forward DNS Record for $FORM{'HOSTNAME'}<BR>\n";
		my $host = &CleanDNSText($FORM{'HOSTNAME'});
		$host =~ s/^([a-zA-Z0-9-]+)\.//;
		my $zone = &GetZone($conn,$host);
		$host = $1;
		&SetFwdDNS($conn,$FORM{'BLOCK'},$zone,$FORM{'INDEX'},$host);
	} elsif($FORM{'SUB'} =~ /Add CNAME/){
		#Add CNAME
	} elsif($FORM{'SUB'} =~ /Add MX/){
		#Add MX record
	} elsif($FORM{'SUB'} =~ /Add NS/){
		#Add NS Record
	} elsif($FORM{'SUB'} =~ /Add PTR/){
		#Add PTR record.
		print "Creating Reverse DNS Record for $FORM{'HOSTNAME'}<BR>\n";
		my $host = &CleanDNSText($FORM{'HOSTNAME'});
		$host =~ s/^([a-zA-Z0-9-]+)\.//;
		my $zone = &GetZone($conn,$host);
		$host = $1;
		&SetRevDNS($conn,$FORM{'BLOCK'},$zone,$FORM{'INDEX'},$host);
	} elsif($FORM{'SUB'} =~ /Delegate Block/){
		my $host = &CleanDNSText($FORM{'HOSTNAME'});
		if($host ne $FORM{'HOSTNAME'}){&IPDBError(-1,"Hostname supplied for Delegation is illegal");}
		#Delegate full block.
		&DelegateBlock($conn,$FORM{'BLOCK'},$FORM{'HOSTNAME'});
		print "Delegating block to:$FORM{'HOSTNAME'}\n";
	}
	$FORM{'ACTION'} = "EDIT"; # Show edit form with new values.
	$FORM{'EDIT'} = $FORM{'BLOCK'};
	goto MAIN;
}
elsif( $FORM{ACTION} eq 'DELETEDNS' )
{
	&DeleteDNSRecord($conn,$FORM{'ID'});
	print "DNS Record Deleted.";
	$FORM{'ACTION'} = "EDIT"; # Show edit form with new values.
	goto MAIN;
}
elsif( $FORM{ACTION} eq 'EDIT' )
{
	&EditForm($conn,$FORM{'EDIT'},$script);
	if($config::config{allowDNS}){
		&DNSTable($conn,$FORM{'EDIT'},$script);
		&DNSForm($conn,$FORM{'EDIT'},$script);
	}
	&printTail();
	$conn->disconnect;
	exit();
}
elsif( $FORM{ACTION} eq 'CLEARHOLD' )
{
	print "Clear holdtime on block $FORM{'EDIT'}<BR>\n";
	&ClearHoldtime($conn,$FORM{'EDIT'});
	print "Success!\n";
	&printTail();
	$conn->disconnect;
	exit();
}
elsif( $FORM{ACTION} eq 'ASSIGN' )
{
	my @block = &GetBlockFromID($conn,$FORM{'UPDATE'});
	print "Here $FORM{'UPDATE'} $block[0]/$block[1]";
	my $ver = &VersionFromRegion($conn,$FORM{'REGION'});
	my $ip = deci2ip($block[0],$ver);
	my $id = &SetBlockP($conn,$ip,$FORM{'REGION'},$block[1],$FORM{'CUSTDESC'},$FORM{'CUSTOMER'},$ver);
	print "Assigned\n";
	goto MAIN;
}
elsif( $FORM{ACTION} eq 'SUBMIT6' )
{
	print "Reclaim?";
	if($FORM{'ACCEPT'}){
		print "Done!\n";
	}
	if($FORM{'DENY'}){
		&ReclaimBlock($conn,$FORM{'BLOCK'});
	}
	goto MAIN;
}
elsif( $FORM{ACTION} eq 'ZONEED' )
{
	if($FORM{'OPER'} =~ /Toggle State/){
		&ToggleZone($conn,$FORM{'ZONE'});
	} elsif($FORM{'OPER'} =~ /Edit Zone/){
		print "Edit Zone $FORM{'ZONE'}\n";
		&SOAEdit($conn,$FORM{'ZONE'});
		if(&IsReverse($conn,$FORM{'ZONE'})){
			&EditRevZone($conn,$FORM{'ZONE'});
		} else {
			&EditFwdZone($conn,$FORM{'ZONE'});
		}
	} elsif($FORM{'OPER'} =~ /View Zone/){
		print "Zone: $FORM{'ZONE'}\n";
		print "<PRE>\n";
		&DNSHead($conn,$FORM{'ZONE'},0);
		if(&IsReverse($conn,$FORM{'ZONE'})){
			my $block = &GetBlockFromZone($conn,$FORM{'ZONE'});
			&WalkReverseBlocks($conn,$block);
		} else {
			&WalkZone($conn,$FORM{'ZONE'});
		}
		print "</PRE>\n";
		&printTail();
		$conn->disconnect;
		exit();
	} else{
		print "<TABLE BORDER=0 BGCOLOR=BLACK CELLPADDING=1 CELLSPACING=1>\n";
		&ZoneTable($conn,$script,$FORM{'ZONEPARENT'});
		print "</TABLE>\n";
		&printTail();
		$conn->disconnect;
		exit();
	}
}
elsif( $FORM{ACTION} eq 'DATADUMP' )
{
	my $exit = 0;
	if($FORM{'REGION'} =~ /---/){
		print "<TR><TD><H1>Must Select Region </TD></TR>\n";
		$exit = 1;
	}
	if($FORM{'BLOCK'}){
		if($FORM{'BLOCK'} =~ m/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\/([0-9]{1,2})/){
			$FORM{'BLOCK'} = $1;
			$FORM{'BITS'} = $2;
		} elsif ($FORM{'BLOCK'} =~ m/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/ && $FORM{'BITS'}){
			$FORM{'BLOCK'} = $1;
		} elsif ($FORM{'BLOCK'} =~ m/([0-9A-F]{4}:[0-9A-F]{4}:[0-9A-F]{4}:[0-9A-F]{4}:[0-9A-F]{4}:[0-9A-F]{4}:[0-9A-F]{4}:[0-9A-F]{4})\/([0-9]{1,3})/){
			$FORM{'BLOCK'} = $1;
			$FORM{'BITS'} = $2;
		} else {
			print "<TR><TD><H1>Bad IP block format.</TD></TR>\n";
			#exit = 1;
		}
		if($exit){ 
			print "</TABLE>";
			&printTail();
			$conn->disconnect;exit();
		} # Bail Missing some info.
		&DataDump($conn,$FORM{BLOCK},$FORM{BITS},$FORM{'REGION'});
	} else {
		my @List = &RegionAllocations($conn,$FORM{'REGION'});
		my $i = 0;
		my $ver = &Version($conn,$FORM{'REGION'});
		while($List[$i]){
			my @block = &GetBlockFromID($conn,$List[$i]);
			my $ip = &deci2ip($block[0],$ver);
			&DataDump($conn,$ip,$block[1],$FORM{'REGION'});
			$i++;
		}
	}
	&printTail;
	exit();
}
elsif( $FORM{ACTION} eq 'SEARCHLOG' )
{
	&LogHead();
	&LogSearch($conn,$FORM{'REGION'});
	&printTail;
	exit();
}
elsif( $FORM{ACTION} eq 'REQ' )
{
	print "<table WIDTH=100% COLS=2>\n";
	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($FORM{'HOSTNAME'}){
		print "<TR><TD><H1>Can't Sethostname and request a block at the same time </TD></TR>\n";
		$exit = 1;
	}
	if($config::config{'custname_r'} && $config::config{'custname'}){
		if(!$FORM{'CUSTDESC'}){
			print "<TR><TD><H1>No $config::config{'custname_f'}</TD></TR>\n";
			$exit = 1;
		}
	}
	if($config::config{'custnum_r'} && $config::config{'custnum'}){
		if(!$FORM{'CUSTOMER'}){
			print "<TR><TD><H1>No $config::config{'custnum_f'}</TD></TR>\n";
			$exit = 1;
		}
	}
	if($config::config{'allowRwhois'}){
		if($FORM{'ADMINC'} =~ /---/){
			print "<TR><TD><H1>Please Choose an Admin Contact</TD></TR>\n";
			$exit = 1;
		}
		if($FORM{'TECHC'} =~ /---/){
			print "<TR><TD><H1>Please Choose an Tech Contact</TD></TR>\n";
		}
		if($config::config{'requireRwhois'}){
			if(!$FORM{'NETNAME'}){
				print "<TR><TD><H1>No NetName</TD></TR>\n";
				$exit = 1;
			} elsif (!$FORM{'ORG'}) {
				print "Rwhois Form";
				#&RwhoisForm($conn,,$FORM{'NETNAME'});
				$exit = 1;
			}
		}
	}
	if($exit){ 
		print "</TABLE>";
		&printTail();
		$conn->disconnect;
		exit();
	} # Bail Missing some info.
	print "<tr>\n";
	print "<td COLSPAN=2 bgcolor=\"$config::config{'headcolor'}\" color=\"$config::config{'headtextcolor'}\" face=\"Arial,Helvetica\">";
	print "<center><b>Confirm New IP Block Assignment</b></center></font></td>\n";
	print "</tr>\n";
	print "<TR><TD>";
	my $newblock = &GetNewBlock($conn,$FORM{'REGION'},$FORM{'BITS'},$FORM{'CUSTDESC'},$FORM{'CUSTOMER'});
	print "</TD></TR><TR><TD>\n";
	print "<form METHOD=GET ACTION=$script >";
	print "<INPUT TYPE=HIDDEN NAME=ACTION VALUE=SUBMIT6>";
	print "<INPUT TYPE=HIDDEN NAME=BLOCK VALUE=$newblock>";
	print "<INPUT TYPE=SUBMIT NAME=ACCEPT VALUE=\"Confirm Allocation\">";
	print "<INPUT TYPE=SUBMIT NAME=DENY VALUE=\"Cancel Allocation\">";
	print "</TD></TR>";
	print "</TABLE></FORM>";
	&printTail();
	$conn->disconnect;
	exit();
}
elsif( $FORM{ACTION} eq 'SEARCH' )
{
	my $block = "";
	if($FORM{'BLOCK'}){
		$block = &IP2Deci($FORM{'BLOCK'});
	}
	my $region = $FORM{'REGION'};
	my $bits = $FORM{'BITS'};
	my $cust = $FORM{'CUSTOMER'};
	my $custdesc = $FORM{'CUSTDESC'};
	my $hostname = $FORM{'HOSTNAME'};
	my $id = $FORM{'BLOCKID'};
	print "<!-- BLOCK $block REGION $region BITS $bits CUST $cust CUSTDESC $custdesc HOSTNAME $hostname-->\n";
	&AllocatedSearch_Head();
	&AllocatedSearch($conn,$script,1,$id,$block,$bits,$region,$cust,$custdesc,$hostname,1);
	print "</TABLE></FORM>";
        &printTail();
	$conn->disconnect;
        exit();
}
elsif( $FORM{ACTION} eq 'RECURSE' )
{
	my $id1 = $FORM{'CHILDL'};
	my $id2 = $FORM{'CHILDR'};
	&AllocatedSearch_Head();
	&AllocatedSearch($conn,$script,1,$id1);
	&AllocatedSearch($conn,$script,1,$id2);
	print "</TABLE></FORM>";
        &printTail();
	$conn->disconnect;
	exit();
}
elsif( $FORM{ACTION} eq 'LISTFREE' )
{
	print "<TABLE BORDER=0 BGCOLOR=BLACK CELLPADDING=1 CELLSPACING=1>";
	print "<TR><TH>REGION</TH><TH>Block</TH><TH>Reclaim</TH><TH>ID</TH><TH>Holdtime</TH></TR>\n";
	&FreeList($conn);
	print "</TABLE></FORM>";
	&printTail();
	$conn->disconnect;
	exit();
}
elsif( $FORM{ACTION} eq 'SETDNS' )
{
	# Check for hostname and an IP address.
	my $exit = 0;
	if($FORM{'HOSTNAME'} =~ m/[^A-Za-z0-9\.-]/){
                print "<TR><TD><H1>Hostname contains invalid symbols.</TD></TR>\n";
                $exit = 1;
	}
        if($exit){ 
		print "</TABLE>";
		&printTail();
		$conn->disconnect;
		exit();
	} # Bail Missing some info.
	if($FORM{'BLOCK'} && $FORM{'HOSTNAME'} && ($FORM{'REGION'} !~ m/---/)){
		print "<TABLE BORDER=0 BGCOLOR=BLACK CELLPADDING=1 CELLSPACING=1>";
		my $fqdn = $FORM{'HOSTNAME'};
		$fqdn =~ m/^([0-9A-Za-z-]*)\.(.*)$/;
		my $hostname = $1;
		$hostname =~ s/[\/:_]/-/g;
		$hostname =~ s/[ ]//g;
		$hostname =~ s/--//g;
		$hostname =~ s/^-//g;
		$hostname =~ s/\.\././g;
		$hostname =~ s/-\././g;
		my $zone = $2;
		$zone =~ s/[\/:_]/-/g;
		$zone =~ s/[ ]//g;
		$zone =~ s/--//g;
		$zone =~ s/^-//g;
		$zone =~ s/\.\././g;
		$zone =~ s/-\././g;
		my $ForZone = &GetZone($conn,$zone);
		#Get Block ID and Offset.
		my $BLK = ip2deci($FORM{'BLOCK'});
		my @blk = &GetBlockIdNM($conn,$BLK,$FORM{'REGION'});
		my $block = $blk[0];
		my $index = $blk[1];
		unless($block){
			print "Block not allocated.(Can't assign DNS)";
		} else {
			#Set the reverse enrty.
			if($FORM{'DNSTYPE'} eq "REV" || $FORM{'DNSTYPE'} eq "BOTH"){
				print "Set Reverse DNS for $FORM{'BLOCK'} to $fqdn { $index }<BR>\n";
				&SetRevDNS($conn,$block,$ForZone,$index,$hostname);
				&SetRevZone($conn,$FORM{'BLOCK'},$FORM{'REGION'});
			}
			#Get/Create the Forward Block ID
			#Set the forward entry.
			if($FORM{'DNSTYPE'} eq "FWD" || $FORM{'DNSTYPE'} eq "BOTH"){
				print "Set Forward DNS for $FORM{'BLOCK'} to $fqdn<BR>\n";
				&SetFwdDNS($conn,$block,$ForZone,$index,$hostname);
			}
		}
		print "</TABLE>";
	} else {
		print "<H1><FONT COLOR=RED>No IP address ,region or hostname set</FONT></H1>\n";
		&printTail();
		$conn->disconnect;
		exit();
	}
}

exit;

MAIN:
print <<EOF;
  <FORM ACTION=$script METHOD=GET>
  <TABLE BORDER=0 BGCOLOR=BLACK CELLPADDING=1 CELLSPACING=1>
   <tr>
     <th COLSPAN="2" ALIGN="CENTER">$config::config{'ver'}</td>
   </tr>
   <tr>
     <td>
        Block:
     </td>
     <td>
        <INPUT NAME=BLOCK SIZE=20>
     </td>
   </tr>
   <tr>
     <td>
       Subnet Mask:
     </td>
     <td>
       <select NAME="BITS">
         <option selected>--- Please Choose --
         <option value="32">/32 - 1 IP
         <option value="30">/30 - 4 IPs
         <option value="29">/29 - 8 IPs
         <option value="28">/28 - 16 IPs
         <option value="27">/27 - 32 IPs
         <option value="26">/26 - 64 IPs
         <option value="25">/25 - 128 IPs
         <option value="24">/24 - 256 IPs (1 Class C)
         <option value="23">/23 - 512 IPs (2 Class Cs)
         <option value="22">/22 - 1024 IPs (4 Class Cs)
         <option value="21">/21 - 2048 IPs (8 Class Cs)
         <option value="20">/20 - 4096 IPs (16 Class Cs)
         <option value="19">/19 - 8192 IPs (32 Class Cs)
         <option value="18">/18 - 16384 IPs (64 Class Cs)
         <option value="17">/17 - 32768 IPs (128 Class Cs)
         <option value="16">/16 - (1 Class B)
         <option value="15">/15 - (2 Class Bs)
         <option value="14">/14 - (4 Class Bs)
         <option value="12">/13 - (8 Class Bs)
         <option value="12">/12 - (16 Class Bs)
         <option value="11">/11 - (32 Class Bs)
         <option value="10">/10 - (64 Class Bs)
         <option value="9">/9 - (128 Class Bs)
         <option value="8">/8 - (1 Class A)
EOF

        print "<option value=$_>/$_ - IPV6\n" for 35..128;

	print <<EOF;
        </select>
       </td>
     </tr>
     <tr>
       <td>
        Region:
       </td>
       <td>
        <SELECT NAME=REGION>
         <OPTION> --- Please Choose ---
EOF
&ListRegions($conn);
print <<EOF;
        </SELECT>
       </td>
     </tr>
EOF
if($config::config{'custname'}){
print <<EOF;
      <tr>
       <td>
        <NOBR>
        $config::config{'custname_f'}:
        </NOBR>
       </td>
       <td>
        <INPUT NAME=CUSTDESC SIZE=20>
       </td>
      </tr>
EOF
}
if($config::config{'custnum'}){
print <<EOF;
      <tr>
       <td>
        <NOBR>
        $config::config{'custnum_f'}:
        </NOBR>
       </td>
       <td>
        <INPUT NAME=CUSTOMER SIZE=20>
       </td>
      </tr>
EOF
}
if($config::config{'allowDNS'}){
print <<EOF;
      <TR>
       <TD> 
        Hostname:
       </TD>
       <TD>
        <NOBR>
        <INPUT NAME=HOSTNAME SIZE=20>  
        Set :
        <SELECT NAME=DNSTYPE>
         <OPTION VALUE=BOTH>Both forward and reverse
         <OPTION VALUE=REV>Reverse Only
         <OPTION VALUE=FWD>Forward Only
        </SELECT>
        </NOBR>
       </TD>
      </TR>
EOF
}
if($config::config{'allowRwhois'}){
print <<EOF;
      <TR>
       <TD> 
        Rhowis:
       </TD>
       <TD>
        Net-Name:<INPUT NAME=NETNAME>
	Admin-c:<SELECT NAME=ADMINC>
		<OPTION> --- Please Choose ---
		<OPTION VALUE=ADD> --- Add Contact ---
	</SELECT>
	Tech-c:<SELECT NAME=TECHC>
		<OPTION> --- Please Choose ---
		<OPTION VALUE=ADD> --- Add Contact ---
	</SELECT>
       </TD>

      </TR>
EOF
}

print <<EOF;
      <tr>
       <td>
        Action:
       </td>
       <td>
	<INPUT TYPE=HIDDEN NAME=ZONEPARENT VALUE = 1>
        <SELECT NAME=ACTION>
         <OPTION> --- Please Choose ---
         <OPTION VALUE=REQ>Request Assignment
         <OPTION VALUE=SEARCH>Search for block in database.
         <OPTION VALUE=LISTFREE>List free blocks.
EOF

if($config::config{'allowDNS'}){
print <<EOF;
         <OPTION VALUE=SETDNS>Set DNS Mapping for address.
         <OPTION VALUE=ZONEED>List DNS Zones.
EOF
}
if($config::config{'allowRwhois'}){
print <<EOF;
         <OPTION VALUE=SETRWHOIS>Set Rwhois record.
EOF
}

if($config::config{'allowDump'}){
	print <<EOF;
	<OPTION VALUE=DATADUMP>Block Dump.
EOF
}
	print "<OPTION VALUE=SEARCHLOG>Search Log.\n";

print <<EOF;
        </SELECT>
       </td>
     </tr>
     <TR>
       <TD COLSPAN=2>
        <CENTER><INPUT TYPE=SUBMIT VALUE="Submit Request"><INPUT TYPE=RESET>
        </CENTER></FORM>
      </TD>
    </TR>
  </table>
EOF
&printTail;
$conn->disconnect;