Files
bpfire/html/cgi-bin/index.cgi
Stefan Schantl 4715ddb3f0 index.cgi: Show OpenVPN header if server is disabled but N2N connections are used.
If the ovpn server for roadwarrior connections was stopped, there was no OpenVPN header
displayed on the index.cgi. If there are configured Net-to-Net connections, they
could be established in the background but their  status can be found
on the VPN (IPsec) section which is wrong. If there is also no IPsec
configured there aren't any information about the Net-to-Net connections on the start page.
2013-03-03 13:05:48 +01:00

594 lines
20 KiB
Perl

#!/usr/bin/perl
###############################################################################
# #
# IPFire.org - A linux based firewall #
# Copyright (C) 2007-2012 IPFire Team <info@ipfire.org> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
# #
###############################################################################
use strict;
use Net::Telnet;
# enable only the following on debugging purpose
#use warnings;
#use CGI::Carp 'fatalsToBrowser';
require '/var/ipfire/general-functions.pl';
require "${General::swroot}/lang.pl";
require "${General::swroot}/header.pl";
require "/opt/pakfire/lib/functions.pl";
my %cgiparams=();
my %pppsettings=();
my %modemsettings=();
my %netsettings=();
my %ddnssettings=();
my $warnmessage = '';
my $refresh = "";
my $ipaddr='';
&Header::showhttpheaders();
$cgiparams{'ACTION'} = '';
&Header::getcgihash(\%cgiparams);
$pppsettings{'VALID'} = '';
$pppsettings{'PROFILENAME'} = 'None';
&General::readhash("${General::swroot}/ppp/settings", \%pppsettings);
&General::readhash("${General::swroot}/modem/settings", \%modemsettings);
&General::readhash("${General::swroot}/ethernet/settings", \%netsettings);
&General::readhash("${General::swroot}/ddns/settings", \%ddnssettings);
my %color = ();
my %mainsettings = ();
&General::readhash("${General::swroot}/main/settings", \%mainsettings);
&General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color);
my $connstate = &Header::connectionstatus();
if ( -e "/var/ipfire/main/gpl-accepted" ) {
if ($cgiparams{'ACTION'} eq $Lang::tr{'shutdown'} || $cgiparams{'ACTION'} eq $Lang::tr{'reboot'}) {
$refresh = "<meta http-equiv='refresh' content='300;'>";
} elsif ($connstate =~ /$Lang::tr{'connecting'}/ || /$Lang::tr{'connection closed'}/ ){
$refresh = "<meta http-equiv='refresh' content='5;'>";
} elsif ($connstate =~ /$Lang::tr{'dod waiting'}/ || -e "${General::swroot}/main/refreshindex") {
$refresh = "<meta http-equiv='refresh' content='30;'>";
}
}
if ($cgiparams{'ACTION'} eq $Lang::tr{'dial profile'})
{
my $profile = $cgiparams{'PROFILE'};
my %tempcgiparams = ();
$tempcgiparams{'PROFILE'} = '';
&General::readhash("${General::swroot}/ppp/settings-$cgiparams{'PROFILE'}",
\%tempcgiparams);
# make a link from the selected profile to the "default" one.
unlink("${General::swroot}/ppp/settings");
link("${General::swroot}/ppp/settings-$cgiparams{'PROFILE'}",
"${General::swroot}/ppp/settings");
system ("/usr/bin/touch", "${General::swroot}/ppp/updatesettings");
# read in the new params "early" so we can write secrets.
%cgiparams = ();
&General::readhash("${General::swroot}/ppp/settings", \%cgiparams);
$cgiparams{'PROFILE'} = $profile;
$cgiparams{'BACKUPPROFILE'} = $profile;
&General::writehash("${General::swroot}/ppp/settings-$cgiparams{'PROFILE'}",
\%cgiparams);
# write secrets file.
open(FILE, ">/${General::swroot}/ppp/secrets") or die "Unable to write secrets file.";
flock(FILE, 2);
my $username = $cgiparams{'USERNAME'};
my $password = $cgiparams{'PASSWORD'};
print FILE "'$username' * '$password'\n";
chmod 0600, "${General::swroot}/ppp/secrets";
close FILE;
&General::log("$Lang::tr{'profile made current'} $tempcgiparams{'PROFILENAME'}");
$cgiparams{'ACTION'} = "$Lang::tr{'dial'}";
}
if ($cgiparams{'ACTION'} eq $Lang::tr{'dial'}) {
system('/usr/local/bin/redctrl start > /dev/null') == 0
or &General::log("Dial failed: $?"); sleep 1;}
elsif ($cgiparams{'ACTION'} eq $Lang::tr{'hangup'}) {
system('/usr/local/bin/redctrl stop > /dev/null') == 0
or &General::log("Hangup failed: $?"); sleep 1;}
my $c;
my $maxprofiles = 5;
my @profilenames = ();
for ($c = 1; $c <= $maxprofiles; $c++)
{
my %temppppsettings = ();
$temppppsettings{'PROFILENAME'} = '';
&General::readhash("${General::swroot}/ppp/settings-$c", \%temppppsettings);
$profilenames[$c] = $temppppsettings{'PROFILENAME'};
}
my %selected;
for ($c = 1; $c <= $maxprofiles; $c++) {
$selected{'PROFILE'}{$c} = '';
}
$selected{'PROFILE'}{$pppsettings{'PROFILE'}} = "selected='selected'";
my $dialButtonDisabled = "disabled='disabled'";
&Header::openpage($Lang::tr{'main page'}, 1, $refresh);
&Header::openbigbox('', 'center');
# licence agreement
if ($cgiparams{'ACTION'} eq $Lang::tr{'yes'} && $cgiparams{'gpl_accepted'} eq '1') {
system('touch /var/ipfire/main/gpl_accepted')
}
if ( -e "/var/ipfire/main/gpl_accepted" ) {
&Header::openbox('100%', 'center', &Header::cleanhtml(`/bin/uname -n`,"y"));
if ( ( $pppsettings{'VALID'} eq 'yes' && $modemsettings{'VALID'} eq 'yes' ) || ( $netsettings{'CONFIG_TYPE'} =~ /^(1|2|3|4)$/ && $netsettings{'RED_TYPE'} =~ /^(DHCP|STATIC)$/ )) {
if (open(IPADDR,"${General::swroot}/ddns/ipcache")) {
$ipaddr = <IPADDR>;
close IPADDR;
chomp ($ipaddr);
}
if (open(IPADDR,"${General::swroot}/red/local-ipaddress")) {
$ipaddr = <IPADDR>;
close IPADDR;
chomp ($ipaddr);
}
} elsif ($modemsettings{'VALID'} eq 'no') {
print "$Lang::tr{'modem settings have errors'}\n </b></font>\n";
} else {
print "$Lang::tr{'profile has errors'}\n </b></font>\n";
}
#if ( $netsettings{'RED_TYPE'} =~ /^(DHCP|STATIC)$/ ) {
# $ipaddr = $netsettings{'RED_ADDRESS'};
#}
my $death = 0;
my $rebirth = 0;
if ($cgiparams{'ACTION'} eq $Lang::tr{'shutdown'}) {
$death = 1;
&General::log($Lang::tr{'shutting down ipfire'});
system '/usr/local/bin/ipfirereboot down';
} elsif ($cgiparams{'ACTION'} eq $Lang::tr{'reboot'}) {
$rebirth = 1;
&General::log($Lang::tr{'rebooting ipfire'});
system '/usr/local/bin/ipfirereboot boot';
}
if ($death == 0 && $rebirth == 0) {
if ($mainsettings{'REBOOTQUESTION'} eq "off") {
print <<END
<form method='post' action='$ENV{'SCRIPT_NAME'}'>
<table width='100%'>
<tr>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'reboot'}' /></td>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'refresh'}' /></td>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'shutdown'}' /></td>
</tr>
</table>
</form>
END
;
} else {
if ($cgiparams{'ACTION'} eq $Lang::tr{'reboot ask'}) {
print <<END
<form method='post' action='$ENV{'SCRIPT_NAME'}'>
<table width='100%'>
<tr>
<td colspan="3" align='left'><font color="red">$Lang::tr{'reboot sure'}</font></td>
</tr>
<tr>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'reboot'}' /></td>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'refresh'}' /></td>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'shutdown ask'}' /></td>
</tr>
</table>
</form>
END
;
} elsif ($cgiparams{'ACTION'} eq $Lang::tr{'shutdown ask'}) {
print <<END
<form method='post' action='$ENV{'SCRIPT_NAME'}'>
<table width='100%'>
<tr>
<td colspan="3" align='right'><font color="red">$Lang::tr{'shutdown sure'}</font></td>
</tr>
<tr>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'reboot ask'}' /></td>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'refresh'}' /></td>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'shutdown'}' /></td>
</tr>
</table>
</form>
END
;
} else {
print <<END
<form method='post' action='$ENV{'SCRIPT_NAME'}'>
<table width='100%'>
<tr>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'reboot ask'}' /></td>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'refresh'}' /></td>
<td width='33%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'shutdown ask'}' /></td>
</tr>
</table>
</form>
END
;
}
}
print <<END;
<!-- Table of networks -->
<table border='0' width=80%>
<tr> <th bgcolor='$color{'color20'}'>$Lang::tr{'network'}</th>
<th bgcolor='$color{'color20'}'>IP</th>
<th bgcolor='$color{'color20'}'>$Lang::tr{'status'}</th></tr>
<tr> <td align='center' bgcolor='$Header::colourred' width='25%'><a href="/cgi-bin/pppsetup.cgi"><font size='2' color='white'><b>$Lang::tr{'internet'}</b></font></a><br></td>
<td width='30%' align='center'>$ipaddr </td>
<td width='45%' align='center'>$connstate
END
if ( $netsettings{'RED_TYPE'} ne "STATIC" && $netsettings{'RED_TYPE'} ne "DHCP" ){
print `/usr/local/bin/dialctrl.pl show`;
print <<END;
</td></tr>
<tr><td colspan='2'>
<form method='post' action='$ENV{'SCRIPT_NAME'}'>$Lang::tr{'profile'}:
<select name='PROFILE'>
END
for ($c = 1; $c <= $maxprofiles; $c++)
{
if ($profilenames[$c] ne '') {
$dialButtonDisabled = "";
print "\t<option value='$c' $selected{'PROFILE'}{$c}>$c. $profilenames[$c]</option>\n";
}
}
$dialButtonDisabled = "disabled='disabled'" if (-e '/var/run/ppp-ipfire.pid' || -e "${General::swroot}/red/active");
if ( ( $pppsettings{'VALID'} eq 'yes' ) || ( $netsettings{'CONFIG_TYPE'} =~ /^(1|2|3|4)$/ && $netsettings{'RED_TYPE'} =~ /^(DHCP|STATIC)$/ ) ) {
print <<END;
</select>
<input type='submit' name='ACTION' value='$Lang::tr{'dial profile'}' $dialButtonDisabled />
</form>
<td align='center'>
<table width='100%' border='0'>
<tr>
<td width='50%' align='right'> <form method='post' action='$ENV{'SCRIPT_NAME'}'>
<input type='submit' name='ACTION' value='$Lang::tr{'dial'}'>
</form>
<td width='50%' align='left'> <form method='post' action='$ENV{'SCRIPT_NAME'}'>
<input type='submit' name='ACTION' value='$Lang::tr{'hangup'}'>
</form>
</table>
END
} else {
print "$Lang::tr{'profile has errors'}\n </b></font>\n";
}
}
my $HOSTNAME = (gethostbyaddr(pack("C4", split(/\./, $ipaddr)), 2))[0];
if ( "$HOSTNAME" ne "" ) {
print <<END;
<tr><td><b>Hostname:</b><td align='center'>$HOSTNAME<td>&nbsp;
END
}
if ( -e "/var/ipfire/red/remote-ipaddress" ) {
my $GATEWAY = `cat /var/ipfire/red/remote-ipaddress`;
chomp($GATEWAY);
print <<END;
<tr><td><b>Gateway:</b><td align='center'>$GATEWAY<td>&nbsp;
END
}
my $DNS1 = `cat /var/ipfire/red/dns1`;
my $DNS2 = `cat /var/ipfire/red/dns2`;
chomp($DNS1);
chomp($DNS1);
if ( $DNS1 ) { print <<END;
<tr><td><b>DNS-Server:</b><td align='center'>$DNS1
END
}
if ( $DNS2 ) { print <<END;
<td align='center'>$DNS2
END
} else { print <<END;
<td>&nbsp;
END
}
if ( $netsettings{'GREEN_DEV'} ) { print <<END;
<tr><td align='center' bgcolor='$Header::colourgreen' width='25%'><a href="/cgi-bin/dhcp.cgi"><font size='2' color='white'><b>$Lang::tr{'lan'}</b></font></a>
<td width='30%' align='center'>$netsettings{'GREEN_ADDRESS'}
<td width='45%' align='center'>
END
if ( `cat /var/ipfire/proxy/advanced/settings | grep ^ENABLE=on` ) {
print $Lang::tr{'advproxy on'};
if ( `cat /var/ipfire/proxy/advanced/settings | grep ^TRANSPARENT=on` ) { print " (transparent)"; }
} else { print $Lang::tr{'advproxy off'}; }
}
if ( $netsettings{'BLUE_DEV'} ) { print <<END;
<tr><td align='center' bgcolor='$Header::colourblue' width='25%'><a href="/cgi-bin/wireless.cgi"><font size='2' color='white'><b>$Lang::tr{'wireless'}</b></font></a><br>
<td width='30%' align='center'>$netsettings{'BLUE_ADDRESS'}
<td width='45%' align='center'>
END
if ( `cat /var/ipfire/proxy/advanced/settings | grep ^ENABLE_BLUE=on` ) {
print $Lang::tr{'advproxy on'};
if ( `cat /var/ipfire/proxy/advanced/settings | grep ^TRANSPARENT_BLUE=on` ) { print " (transparent)"; }
} else { print $Lang::tr{'advproxy off'}; }
}
if ( $netsettings{'ORANGE_DEV'} ) { print <<END;
<tr><td align='center' bgcolor='$Header::colourorange' width='25%'><a href="/cgi-bin/dmzholes.cgi"><font size='2' color='white'><b>$Lang::tr{'dmz'}</b></font></a><br>
<td width='30%' align='center'>$netsettings{'ORANGE_ADDRESS'}
<td width='45%' align='center'><font color=$Header::colourgreen>Online</font>
END
}
if ( `cat /var/ipfire/vpn/settings | grep ^ENABLED=on` ||
`cat /var/ipfire/vpn/settings | grep ^ENABLED_BLUE=on` ) {
my $ipsecip = `cat /var/ipfire/vpn/settings | grep ^VPN_IP= | cut -c 8-`;
my @status = `/usr/local/bin/ipsecctrl I`;
my %confighash = ();
&General::readhasharray("${General::swroot}/vpn/config", \%confighash);
print <<END;
<tr><td align='center' bgcolor='$Header::colourvpn' width='25%'><a href="/cgi-bin/vpnmain.cgi"><font size='2' color='white'><b>$Lang::tr{'vpn'}</b></font></a><br>
<td width='30%' align='center'>$ipsecip
<td width='45%' align='center'><font color=$Header::colourgreen>Online</font>
END
my $id = 0;
my $gif;
foreach my $key (sort { uc($confighash{$a}[1]) cmp uc($confighash{$b}[1]) } keys %confighash) {
if ($confighash{$key}[0] eq 'on') { $gif = 'on.gif'; } else { $gif = 'off.gif'; }
if ($id % 2) {
print "<tr><td align='left' nowrap='nowrap' bgcolor='$color{'color20'}'>$confighash{$key}[1] / " . $Lang::tr{"$confighash{$key}[3]"} . " (" . $Lang::tr{"$confighash{$key}[4]"} . ")</td><td align='center'>$confighash{$key}[11]</td>";
} else {
print "<tr></td><td align='left' nowrap='nowrap' bgcolor='$color{'color22'}'>$confighash{$key}[1] / " . $Lang::tr{"$confighash{$key}[3]"} . " (" . $Lang::tr{"$confighash{$key}[4]"} . ")</td><td align='center'>$confighash{$key}[11]</td>";
}
my $active = "<table cellpadding='2' cellspacing='0' bgcolor='${Header::colourred}' width='100%'><tr><td align='center'><b><font color='#FFFFFF'>$Lang::tr{'capsclosed'}</font></b></td></tr></table>";
if ($confighash{$key}[0] eq 'off') {
$active = "<table cellpadding='2' cellspacing='0' bgcolor='${Header::colourblue}' width='100%'><tr><td align='center'><b><font color='#FFFFFF'>$Lang::tr{'capsclosed'}</font></b></td></tr></table>";
} else {
foreach my $line (@status) {
if (($line =~ /\"$confighash{$key}[1]\".*IPsec SA established/) ||
($line =~/$confighash{$key}[1]\{.*INSTALLED/ ))
{
$active = "<table cellpadding='2' cellspacing='0' bgcolor='${Header::colourgreen}' width='100%'><tr><td align='center'><b><font color='#FFFFFF'>$Lang::tr{'capsopen'}</font></b></td></tr></table>";
}
}
}
print "<td align='center'>$active</td>";
}
}
###
# Check if there is any OpenVPN connection configured.
###
if ( -s "${General::swroot}/ovpn/ovpnconfig")
{
print <<END;
<tr>
<td align='center' bgcolor='$Header::colourovpn' width='25%'>
<a href="/cgi-bin/ovpnmain.cgi"><font size='2' color='white'><b>OpenVPN</b></font></a><br>
</td>
END
# Check if the OpenVPN server for Road Warrior Connections is running and display status information.
my %confighash=();
&General::readhash("${General::swroot}/ovpn/settings", \%confighash);
if (($confighash{'ENABLED'} eq "on") ||
($confighash{'ENABLED_BLUE'} eq "on") ||
($confighash{'ENABLED_ORANGE'} eq "on")) {
my $ovpnip = $confighash{'DOVPN_SUBNET'};
print <<END;
<td width='30%' align='center'>$ovpnip
<td width='45%' align='center'><font color=$Header::colourgreen>Online</font>
END
}
# Print the OpenVPN N2N connection status.
if ( -d "${General::swroot}/ovpn/n2nconf") {
my %confighash=();
&General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
foreach my $dkey (keys %confighash) {
if (($confighash{$dkey}[3] eq 'net') && (-e "/var/run/$confighash{$dkey}[1]n2n.pid")) {
my $tport = $confighash{$dkey}[22];
next if ($tport eq '');
my $tnet = new Net::Telnet ( Timeout=>5, Errmode=>'return', Port=>$tport);
$tnet->open('127.0.0.1');
my @output = $tnet->cmd(String => 'state', Prompt => '/(END.*\n|ERROR:.*\n)/');
my @tustate = split(/\,/, $output[1]);
my $display;
my $display_colour = $Header::colourred;
if ( $tustate[1] eq 'CONNECTED') {
$display_colour = $Header::colourgreen;
$display = $Lang::tr{'capsopen'};
} else {
$display = $tustate[1];
}
print <<END;
<tr>
<td align='left' nowrap='nowrap' bgcolor='$color{'color22'}'>
$confighash{$dkey}[1]
</td>
<td align='center'>
$confighash{$dkey}[11]
</td>
<td align='center' bgcolor='$display_colour'>
<b>
<font color='#FFFFFF'>
$display
</font>
</b>
</td>
</tr>
END
}
}
}
}
# Fireinfo
if ( ! -e "/var/ipfire/main/send_profile") {
$warnmessage .= "<li><a style='color: white;' href='fireinfo.cgi'>$Lang::tr{'fireinfo please enable'}</a></li>";
}
# Memory usage warning
my @free = `/usr/bin/free`;
$free[1] =~ m/(\d+)/;
my $mem = $1;
$free[2] =~ m/(\d+)/;
my $used = $1;
my $pct = int 100 * ($mem - $used) / $mem;
if ($used / $mem > 90) {
$warnmessage .= "<li> $Lang::tr{'high memory usage'}: $pct% !</li>\n";
}
# Diskspace usage warning
my @temp=();
my $temp2=();
my @df = `/bin/df -B M -P -x rootfs`;
foreach my $line (@df) {
next if $line =~ m/^Filesystem/;
if ($line =~ m/root/ ) {
$line =~ m/^.* (\d+)M.*$/;
@temp = split(/ +/,$line);
if ($1<5) {
# available:plain value in MB, and not %used as 10% is too much to waste on small disk
# and root size should not vary during time
$warnmessage .= "<li> $Lang::tr{'filesystem full'}: $temp[0] <b>$Lang::tr{'free'}=$1M</b> !</li>\n";
}
} else {
# $line =~ m/^.* (\d+)m.*$/;
$line =~ m/^.* (\d+)\%.*$/;
if ($1>90) {
@temp = split(/ /,$line);
$temp2=int(100-$1);
$warnmessage .= "<li> $Lang::tr{'filesystem full'}: $temp[0] <b>$Lang::tr{'free'}=$temp2%</b> !</li>\n";
}
}
}
# S.M.A.R.T. health warning
my @files = `/bin/ls /var/run/smartctl_out_hddtemp-* 2>/dev/null`;
foreach my $file (@files) {
chomp ($file);
my $disk=`echo $file | cut -d"-" -f2`;
chomp ($disk);
if (`/bin/grep "SAVE ALL DATA" $file`) {
$warnmessage .= "<li> $Lang::tr{'smartwarn1'} /dev/$disk $Lang::tr{'smartwarn2'} !</li>\n\n";
}
}
# Reiser4 warning
my @files = `mount | grep " reiser4 (" 2>/dev/null`;
foreach my $disk (@files) {
chomp ($disk);
$warnmessage .= "<li>$disk - $Lang::tr{'deprecated fs warn'}</li>\n\n";
}
if ($warnmessage) {
print "<tr><td align='center' bgcolor=$Header::colourred colspan='3'><font color='white'>$warnmessage</font></table>";
}
print <<END;
</table>
END
;
&Pakfire::dblist("upgrade", "notice");
print <<END;
END
if ( -e "/var/run/need_reboot" ) {
print "<br /><br /><font color='red'>$Lang::tr{'needreboot'}!</font>";
}
} else {
my $message='';
if ($death) {
$message = $Lang::tr{'ipfire has now shutdown'};
} else {
$message = $Lang::tr{'ipfire has now rebooted'};
}
print <<END
<div align='center'>
<table width='100%' bgcolor='#ffffff'>
<tr><td align='center'>
<br /><br /><img src='/images/IPFire.png' /><br /><br /><br />
</td></tr>
</table>
<br />
<font size='6'>$message</font>
</div>
END
;
}
&Header::closebox();
}
else {
&Header::openbox('100%', 'left', $Lang::tr{'gpl license agreement'});
print <<END;
$Lang::tr{'gpl please read carefully the general public license and accept it below'}.
<br /><br />
END
;
if ( -e "/usr/share/doc/licenses/GPLv3" ) {
print '<textarea rows=\'25\' cols=\'75\' readonly=\'true\'>';
print `cat /usr/share/doc/licenses/GPLv3`;
print '</textarea>';
}
else {
print '<br /><a href=\'http://www.gnu.org/licenses/gpl-3.0.txt\' target=\'_blank\'>GNU GENERAL PUBLIC LICENSE</a><br />';
}
print <<END;
<p>
<form method='post' action='$ENV{'SCRIPT_NAME'}'>
<input type='checkbox' name='gpl_accepted' value='1'/> $Lang::tr{'gpl i accept these terms and conditions'}.
<br/ >
<input type='submit' name='ACTION' value=$Lang::tr{'yes'} />
</form>
</p>
<a href='http://www.gnu.org/licenses/translations.html' target='_blank'>$Lang::tr{'gpl unofficial translation of the general public license v3'}</a>
END
&Header::closebox();
}
&Header::closebigbox();
&Header::closepage();