parent
8f3fb23c2b
commit
d4dbe7f512
2 changed files with 0 additions and 627 deletions
@ -1,626 +0,0 @@ |
||||
#============================================================= -*-perl-*- |
||||
# |
||||
# BackupPC::CGI::Lib package |
||||
# |
||||
# DESCRIPTION |
||||
# |
||||
# This library defines a BackupPC::Lib class and a variety of utility |
||||
# functions used by BackupPC. |
||||
# |
||||
# AUTHOR |
||||
# Craig Barratt <cbarratt@users.sourceforge.net> |
||||
# |
||||
# COPYRIGHT |
||||
# Copyright (C) 2003-2019 Craig Barratt |
||||
# |
||||
# 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/>. |
||||
# |
||||
#======================================================================== |
||||
# |
||||
# Version 4.3.1, released 14 Jul 2019. |
||||
# |
||||
# See http://backuppc.sourceforge.net. |
||||
# |
||||
#======================================================================== |
||||
|
||||
package BackupPC::CGI::Lib; |
||||
|
||||
use strict; |
||||
use BackupPC::Lib; |
||||
|
||||
require Exporter; |
||||
|
||||
use vars qw( @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS ); |
||||
|
||||
use vars qw($Cgi %In $MyURL $User %Conf $TopDir $LogDir $BinDir $bpc); |
||||
use vars qw(%Status %Info %Jobs @BgQueue @UserQueue @CmdQueue |
||||
%QueueLen %StatusHost); |
||||
use vars qw($Hosts $HostsMTime $ConfigMTime $PrivAdmin); |
||||
use vars qw(%UserEmailInfo $UserEmailInfoMTime %RestoreReq %ArchiveReq); |
||||
use vars qw($Lang); |
||||
|
||||
@ISA = qw(Exporter); |
||||
|
||||
@EXPORT = qw( ); |
||||
|
||||
@EXPORT_OK = qw( |
||||
timeStamp2 |
||||
HostLink |
||||
UserLink |
||||
EscHTML |
||||
EscURI |
||||
ErrorExit |
||||
ServerConnect |
||||
GetStatusInfo |
||||
ReadUserEmailInfo |
||||
CheckPermission |
||||
GetUserHosts |
||||
ConfirmIPAddress |
||||
Header |
||||
Trailer |
||||
NavSectionTitle |
||||
NavSectionStart |
||||
NavSectionEnd |
||||
NavLink |
||||
h1 |
||||
h2 |
||||
$Cgi %In $MyURL $User %Conf $TopDir $LogDir $BinDir $bpc |
||||
%Status %Info %Jobs @BgQueue @UserQueue @CmdQueue |
||||
%QueueLen %StatusHost |
||||
$Hosts $HostsMTime $ConfigMTime $PrivAdmin |
||||
%UserEmailInfo $UserEmailInfoMTime %RestoreReq %ArchiveReq |
||||
$Lang |
||||
); |
||||
|
||||
%EXPORT_TAGS = ( |
||||
'all' => [ @EXPORT_OK ], |
||||
); |
||||
|
||||
sub NewRequest |
||||
{ |
||||
$Cgi = new CGI; |
||||
%In = $Cgi->Vars; |
||||
|
||||
if ( !defined($bpc) ) { |
||||
ErrorExit($Lang->{BackupPC__Lib__new_failed__check_apache_error_log}) |
||||
if ( !($bpc = BackupPC::Lib->new(undef, undef, undef, 1)) ); |
||||
$TopDir = $bpc->TopDir(); |
||||
$LogDir = $bpc->LogDir(); |
||||
$BinDir = $bpc->BinDir(); |
||||
%Conf = $bpc->Conf(); |
||||
$Lang = $bpc->Lang(); |
||||
$ConfigMTime = $bpc->ConfigMTime(); |
||||
umask($Conf{UmaskMode}); |
||||
} elsif ( $bpc->ConfigMTime() != $ConfigMTime ) { |
||||
$bpc->ConfigRead(); |
||||
$TopDir = $bpc->TopDir(); |
||||
$LogDir = $bpc->LogDir(); |
||||
$BinDir = $bpc->BinDir(); |
||||
%Conf = $bpc->Conf(); |
||||
$Lang = $bpc->Lang(); |
||||
$ConfigMTime = $bpc->ConfigMTime(); |
||||
umask($Conf{UmaskMode}); |
||||
} |
||||
|
||||
# |
||||
# Default REMOTE_USER so in a miminal installation the user |
||||
# has a sensible default. |
||||
# |
||||
$ENV{REMOTE_USER} = $Conf{BackupPCUser} if ( $ENV{REMOTE_USER} eq "" ); |
||||
|
||||
# |
||||
# We require that Apache pass in $ENV{SCRIPT_NAME} and $ENV{REMOTE_USER}. |
||||
# The latter requires .ht_access style authentication. Replace this |
||||
# code if you are using some other type of authentication, and have |
||||
# a different way of getting the user name. |
||||
# |
||||
$MyURL = $ENV{SCRIPT_NAME}; |
||||
$User = $ENV{REMOTE_USER}; |
||||
|
||||
# |
||||
# Handle LDAP uid=user when using mod_authz_ldap and otherwise untaint |
||||
# |
||||
$User = $1 if ( $User =~ /uid=([^,]+)/i || $User =~ /(.*)/ ); |
||||
|
||||
# |
||||
# Clean up %ENV for taint checking |
||||
# |
||||
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; |
||||
$ENV{PATH} = $Conf{MyPath}; |
||||
|
||||
# |
||||
# Verify we are running as the correct user |
||||
# |
||||
if ( $Conf{BackupPCUserVerify} |
||||
&& $> != (my $uid = getpwnam($Conf{BackupPCUser})) ) { |
||||
ErrorExit(eval("qq{$Lang->{Wrong_user__my_userid_is___}}"), <<EOF); |
||||
This script needs to run as the user specified in \$Conf{BackupPCUser}, |
||||
which is set to $Conf{BackupPCUser}. |
||||
<p> |
||||
This is an installation problem. If you are using mod_perl then |
||||
it appears that Apache is not running as user $Conf{BackupPCUser}. |
||||
If you are not using mod_perl, then most like setuid is not working |
||||
properly on BackupPC_Admin. Check the permissions on |
||||
$Conf{CgiDir}/BackupPC_Admin and look at the documentation. |
||||
EOF |
||||
} |
||||
|
||||
if ( !defined($Hosts) || $bpc->HostsMTime() != $HostsMTime ) { |
||||
$HostsMTime = $bpc->HostsMTime(); |
||||
$Hosts = $bpc->HostInfoRead(); |
||||
|
||||
# turn moreUsers list into a hash for quick lookups |
||||
foreach my $host (keys %$Hosts) { |
||||
$Hosts->{$host}{moreUsers} = |
||||
{map {$_, 1} split(",", $Hosts->{$host}{moreUsers}) } |
||||
} |
||||
} |
||||
|
||||
# |
||||
# Untaint the host name |
||||
# |
||||
if ( $In{host} =~ /^([\w.\s-]+)$/ ) { |
||||
$In{host} = $1; |
||||
} else { |
||||
delete($In{host}); |
||||
} |
||||
} |
||||
|
||||
sub timeStamp2 |
||||
{ |
||||
my $now = $_[0] == 0 ? time : $_[0]; |
||||
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) |
||||
= localtime($now); |
||||
$mon++; |
||||
if ( $Conf{CgiDateFormatMMDD} == 2 ) { |
||||
$year += 1900; |
||||
return sprintf("%04d-%02d-%02d %02d:%02d", $year, $mon, $mday, $hour, $min); |
||||
} elsif ( $Conf{CgiDateFormatMMDD} ) { |
||||
# |
||||
# Add the year if the time is more than 330 days ago |
||||
# |
||||
if ( time - $now > 330 * 24 * 3600 ) { |
||||
$year -= 100; |
||||
return sprintf("$mon/$mday/%02d %02d:%02d", $year, $hour, $min); |
||||
} else { |
||||
return sprintf("$mon/$mday %02d:%02d", $hour, $min); |
||||
} |
||||
} else { |
||||
# |
||||
# Add the year if the time is more than 330 days ago |
||||
# |
||||
if ( time - $now > 330 * 24 * 3600 ) { |
||||
$year -= 100; |
||||
return sprintf("$mday/$mon/%02d %02d:%02d", $year, $hour, $min); |
||||
} else { |
||||
return sprintf("$mday/$mon %02d:%02d", $hour, $min); |
||||
} |
||||
} |
||||
} |
||||
|
||||
sub HostLink |
||||
{ |
||||
my($host) = @_; |
||||
my($s); |
||||
if ( defined($Hosts->{$host}) ) { |
||||
$s = "<a href=\"$MyURL?host=${EscURI($host)}\">$host</a>"; |
||||
} else { |
||||
$s = $host; |
||||
} |
||||
return \$s; |
||||
} |
||||
|
||||
sub UserLink |
||||
{ |
||||
my($user) = @_; |
||||
my($s); |
||||
|
||||
return \$user if ( $user eq "" |
||||
|| $Conf{CgiUserUrlCreate} eq "" ); |
||||
if ( $Conf{CgiUserHomePageCheck} eq "" |
||||
|| -f sprintf($Conf{CgiUserHomePageCheck}, $user, $user, $user) ) { |
||||
$s = "<a href=\"" |
||||
. sprintf($Conf{CgiUserUrlCreate}, $user, $user, $user) |
||||
. "\">$user</a>"; |
||||
} else { |
||||
$s = $user; |
||||
} |
||||
return \$s; |
||||
} |
||||
|
||||
sub EscHTML |
||||
{ |
||||
my($s) = @_; |
||||
$s =~ s/&/&/g; |
||||
$s =~ s/\"/"/g; |
||||
$s =~ s/>/>/g; |
||||
$s =~ s/</</g; |
||||
### $s =~ s{([^[:print:]])}{sprintf("&\#x%02X;", ord($1));}eg; |
||||
return \$s; |
||||
} |
||||
|
||||
sub EscURI |
||||
{ |
||||
my($s) = @_; |
||||
$s =~ s{([^\w.\/-])}{sprintf("%%%02X", ord($1));}eg; |
||||
return \$s; |
||||
} |
||||
|
||||
sub ErrorExit |
||||
{ |
||||
my(@mesg) = @_; |
||||
my($head) = shift(@mesg); |
||||
my($mesg) = join("</p>\n<p>", @mesg); |
||||
|
||||
if ( !defined($ENV{REMOTE_USER}) ) { |
||||
$mesg .= <<EOF; |
||||
<p> |
||||
Note: \$ENV{REMOTE_USER} is not set, which could mean there is an |
||||
installation problem. BackupPC_Admin expects Apache to authenticate |
||||
the user and pass their user name into this script as the REMOTE_USER |
||||
environment variable. See the documentation. |
||||
EOF |
||||
} |
||||
|
||||
$bpc->ServerMesg("log User $User (host=$In{host}) got CGI error: $head") |
||||
if ( defined($bpc) ); |
||||
if ( !defined($Lang->{Error}) ) { |
||||
$mesg = <<EOF if ( !defined($mesg) ); |
||||
There is some problem with the BackupPC installation. |
||||
Please check the permissions on BackupPC_Admin. |
||||
EOF |
||||
my $content = <<EOF; |
||||
${h1("Error: Unable to read config.pl or language strings!!")} |
||||
<p>$mesg</p> |
||||
EOF |
||||
Header("BackupPC: Error", $content); |
||||
Trailer(); |
||||
} else { |
||||
my $content = eval("qq{$Lang->{Error____head}}"); |
||||
Header(eval("qq{$Lang->{Error}}"), $content); |
||||
Trailer(); |
||||
} |
||||
exit(1); |
||||
} |
||||
|
||||
sub ServerConnect |
||||
{ |
||||
# |
||||
# Verify that the server connection is ok |
||||
# |
||||
return if ( $bpc->ServerOK() ); |
||||
$bpc->ServerDisconnect(); |
||||
if ( my $err = $bpc->ServerConnect($Conf{ServerHost}, $Conf{ServerPort}) ) { |
||||
if ( CheckPermission() |
||||
&& -f $Conf{ServerInitdPath} |
||||
&& $Conf{ServerInitdStartCmd} ne "" ) { |
||||
my $content = eval("qq{$Lang->{Admin_Start_Server}}"); |
||||
Header(eval("qq{$Lang->{Unable_to_connect_to_BackupPC_server}}"), $content); |
||||
Trailer(); |
||||
exit(1); |
||||
} else { |
||||
ErrorExit(eval("qq{$Lang->{Unable_to_connect_to_BackupPC_server}}"), |
||||
eval("qq{$Lang->{Unable_to_connect_to_BackupPC_server_error_message}}")); |
||||
} |
||||
} |
||||
} |
||||
|
||||
sub GetStatusInfo |
||||
{ |
||||
my($status) = @_; |
||||
ServerConnect(); |
||||
%Status = () if ( $status =~ /\bhosts\b/ ); |
||||
%StatusHost = () if ( $status =~ /\bhost\(/ ); |
||||
my $reply = $bpc->ServerMesg("status $status"); |
||||
$reply = $1 if ( $reply =~ /(.*)/s ); |
||||
eval($reply); |
||||
# ignore status related to admin jobs |
||||
if ( $status =~ /\bhosts\b/ ) { |
||||
foreach my $host ( grep(/admin/, keys(%Status)) ) { |
||||
delete($Status{$host}) if ( $bpc->isAdminJob($host) ); |
||||
} |
||||
delete($Status{$bpc->scgiJob}); |
||||
} |
||||
} |
||||
|
||||
sub ReadUserEmailInfo |
||||
{ |
||||
if ( (stat("$LogDir/UserEmailInfo.pl"))[9] != $UserEmailInfoMTime ) { |
||||
do "$LogDir/UserEmailInfo.pl"; |
||||
$UserEmailInfoMTime = (stat("$LogDir/UserEmailInfo.pl"))[9]; |
||||
} |
||||
} |
||||
|
||||
# |
||||
# Check if the user is privileged. A privileged user can access |
||||
# any information (backup files, logs, status pages etc). |
||||
# |
||||
# A user is privileged if they belong to the group |
||||
# $Conf{CgiAdminUserGroup}, or they are in $Conf{CgiAdminUsers} |
||||
# or they are the user assigned to a host in the host file. |
||||
# |
||||
sub CheckPermission |
||||
{ |
||||
my($host) = @_; |
||||
my $Privileged = 0; |
||||
|
||||
return 0 if ( $User eq "" && $Conf{CgiAdminUsers} ne "*" |
||||
|| $host ne "" && !defined($Hosts->{$host}) ); |
||||
if ( $Conf{CgiAdminUserGroup} ne "" ) { |
||||
for ( split(/\s+/, $Conf{CgiAdminUserGroup}) ) { |
||||
my ($n, $p, $gid, $mem) = getgrnam($_); |
||||
$Privileged ||= ( $mem =~ /\b\Q$User\E\b/ ); |
||||
last if ( $Privileged ); |
||||
} |
||||
} |
||||
if ( $Conf{CgiAdminUsers} ne "" ) { |
||||
$Privileged ||= ($Conf{CgiAdminUsers} =~ /\b\Q$User\E\b/); |
||||
$Privileged ||= $Conf{CgiAdminUsers} eq "*"; |
||||
} |
||||
$PrivAdmin = $Privileged; |
||||
return $Privileged if ( !defined($host) ); |
||||
|
||||
$Privileged ||= $User eq $Hosts->{$host}{user}; |
||||
$Privileged ||= defined($Hosts->{$host}{moreUsers}{$User}); |
||||
return $Privileged; |
||||
} |
||||
|
||||
# |
||||
# Returns the list of hosts that should appear in the navigation bar |
||||
# for this user. If $getAll is set, the admin gets all the hosts. |
||||
# Otherwise, regular users get hosts for which they are the user or |
||||
# are listed in the moreUsers column in the hosts file. |
||||
# |
||||
sub GetUserHosts |
||||
{ |
||||
my($getAll) = @_; |
||||
my @hosts; |
||||
|
||||
if ( $getAll && CheckPermission() ) { |
||||
@hosts = sort keys %$Hosts; |
||||
} else { |
||||
@hosts = sort grep { $Hosts->{$_}{user} eq $User || |
||||
defined($Hosts->{$_}{moreUsers}{$User}) } keys(%$Hosts); |
||||
} |
||||
return @hosts; |
||||
} |
||||
|
||||
# |
||||
# Given a host name tries to find the IP address. For non-dhcp hosts |
||||
# we just return the host name. For dhcp hosts we check the address |
||||
# the user is using ($ENV{REMOTE_ADDR}) and also the last-known IP |
||||
# address for $host. (Later we should replace this with a broadcast |
||||
# nmblookup.) |
||||
# |
||||
sub ConfirmIPAddress |
||||
{ |
||||
my($host) = @_; |
||||
my $ipAddr = $host; |
||||
|
||||
if ( defined($Hosts->{$host}) && $Hosts->{$host}{dhcp} |
||||
&& $ENV{REMOTE_ADDR} =~ /^(\d+[\.\d]*)$/ ) { |
||||
$ipAddr = $1; |
||||
my($netBiosHost, $netBiosUser) = $bpc->NetBiosInfoGet($ipAddr); |
||||
if ( $netBiosHost ne $host ) { |
||||
my($tryIP); |
||||
GetStatusInfo("host(${EscURI($host)})"); |
||||
if ( defined($StatusHost{dhcpHostIP}) |
||||
&& $StatusHost{dhcpHostIP} ne $ipAddr ) { |
||||
$tryIP = eval("qq{$Lang->{tryIP}}"); |
||||
($netBiosHost, $netBiosUser) |
||||
= $bpc->NetBiosInfoGet($StatusHost{dhcpHostIP}); |
||||
} |
||||
if ( $netBiosHost ne $host ) { |
||||
ErrorExit(eval("qq{$Lang->{Can_t_find_IP_address_for}}"), |
||||
eval("qq{$Lang->{host_is_a_DHCP_host}}")); |
||||
} |
||||
$ipAddr = $StatusHost{dhcpHostIP}; |
||||
} |
||||
} |
||||
return $ipAddr; |
||||
} |
||||
|
||||
########################################################################### |
||||
# HTML layout subroutines |
||||
########################################################################### |
||||
|
||||
sub Header |
||||
{ |
||||
my($title, $content, $noBrowse, $contentSub, $contentPost) = @_; |
||||
my @adminLinks = ( |
||||
{ link => "?action=status", name => $Lang->{Status}}, |
||||
{ link => "?action=summary", name => $Lang->{PC_Summary}}, |
||||
{ link => "?action=editConfig", name => $Lang->{CfgEdit_Edit_Config}, |
||||
priv => 1}, |
||||
{ link => "?action=editConfig&newMenu=hosts", |
||||
name => $Lang->{CfgEdit_Edit_Hosts}, |
||||
priv => 1}, |
||||
{ link => "?action=adminOpts", name => $Lang->{Admin_Options}, |
||||
priv => 1}, |
||||
{ link => "?action=view&type=LOG", name => $Lang->{LOG_file}, |
||||
priv => 1}, |
||||
{ link => "?action=LOGlist", name => $Lang->{Old_LOGs}, |
||||
priv => 1}, |
||||
{ link => "?action=emailSummary", name => $Lang->{Email_summary}, |
||||
priv => 1}, |
||||
{ link => "?action=queue", name => $Lang->{Current_queues}, |
||||
priv => 1}, |
||||
@{$Conf{CgiNavBarLinks} || []}, |
||||
); |
||||
my $host = $In{host}; |
||||
|
||||
binmode(select, ":utf8"); |
||||
print $Cgi->header(-charset => "utf-8"); |
||||
print <<EOF; |
||||
<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN"> |
||||
<html><head> |
||||
<title>$title</title> |
||||
<link rel=stylesheet type="text/css" href="$Conf{CgiImageDirURL}/$Conf{CgiCSSFile}" title="CSSFile"> |
||||
<link rel=icon href="$Conf{CgiImageDirURL}/favicon.ico" type="image/x-icon"> |
||||
$Conf{CgiHeaders} |
||||
<script src="$Conf{CgiImageDirURL}/sorttable.js"></script> |
||||
</head><body onLoad="document.getElementById('NavMenu').style.height=document.body.scrollHeight"> |
||||
|
||||
<div id="navigation-container"> |
||||
<div id="logo-container"> |
||||
<a href="https://backuppc.github.io/backuppc/"><img src="$Conf{CgiImageDirURL}/logo.gif"></a> |
||||
</div> |
||||
EOF |
||||
|
||||
if ( defined($Hosts) && defined($host) && defined($Hosts->{$host}) ) { |
||||
print "<div class=\"NavMenu section-title\">"; |
||||
NavSectionTitle("${EscHTML($host)}"); |
||||
print <<EOF; |
||||
</div> |
||||
<div class="NavMenu host"> |
||||
EOF |
||||
NavLink("?host=${EscURI($host)}", |
||||
"$host $Lang->{Home}", " class=\"navbar\""); |
||||
NavLink("?action=browse&host=${EscURI($host)}", |
||||
$Lang->{Browse}, " class=\"navbar\"") if ( !$noBrowse ); |
||||
NavLink("?action=view&type=LOG&host=${EscURI($host)}", |
||||
$Lang->{LOG_file}, " class=\"navbar\""); |
||||
NavLink("?action=LOGlist&host=${EscURI($host)}", |
||||
$Lang->{LOG_files}, " class=\"navbar\""); |
||||
if ( -f "$TopDir/pc/$host/SmbLOG.bad" |
||||
|| -f "$TopDir/pc/$host/SmbLOG.bad.z" |
||||
|| -f "$TopDir/pc/$host/XferLOG.bad" |
||||
|| -f "$TopDir/pc/$host/XferLOG.bad.z" ) { |
||||
NavLink("?action=view&type=XferLOGbad&host=${EscURI($host)}", |
||||
$Lang->{Last_bad_XferLOG}, " class=\"navbar\""); |
||||
NavLink("?action=view&type=XferErrbad&host=${EscURI($host)}", |
||||
$Lang->{Last_bad_XferLOG_errors_only}, |
||||
" class=\"navbar\""); |
||||
} |
||||
if ( $Conf{CgiUserConfigEditEnable} || $PrivAdmin ) { |
||||
NavLink("?action=editConfig&host=${EscURI($host)}", |
||||
$Lang->{CfgEdit_Edit_Config}, " class=\"navbar\""); |
||||
} elsif ( -f "$TopDir/pc/$host/config.pl" |
||||
|| ($host ne "config" && -f "$TopDir/conf/$host.pl") ) { |
||||
NavLink("?action=view&type=config&host=${EscURI($host)}", |
||||
$Lang->{Config_file}, " class=\"navbar\""); |
||||
} |
||||
print "</div>\n"; |
||||
} |
||||
print <<EOF; |
||||
<div class="NavMenu" id="NavMenu"> |
||||
EOF |
||||
my $hostSelectbox = "<option value=\"#\">$Lang->{Select_a_host}</option>"; |
||||
my @hosts = GetUserHosts($Conf{CgiNavBarAdminAllHosts}); |
||||
NavSectionTitle($Lang->{Hosts}); |
||||
if ( defined($Hosts) && %$Hosts > 0 && @hosts ) { |
||||
foreach my $host ( @hosts ) { |
||||
NavLink("?host=${EscURI($host)}", $host) |
||||
if ( @hosts < $Conf{CgiNavBarAdminAllHosts} ); |
||||
my $sel = " selected" if ( $host eq $In{host} ); |
||||
$hostSelectbox .= "<option value=\"?host=${EscURI($host)}\"$sel>" |
||||
. "$host</option>"; |
||||
} |
||||
} |
||||
if ( @hosts >= $Conf{CgiNavBarAdminAllHosts} ) { |
||||
print <<EOF; |
||||
<select onChange="document.location=this.value"> |
||||
$hostSelectbox |
||||
</select> |
||||
EOF |
||||
} |
||||
if ( $Conf{CgiSearchBoxEnable} ) { |
||||
print <<EOF; |
||||
<form action="$MyURL" method="get"> |
||||
<input type="text" name="host" size="14" maxlength="64"> |
||||
<input type="hidden" name="action" value="hostInfo"><input type="submit" value="$Lang->{Go}" name="ignore"> |
||||
</form> |
||||
EOF |
||||
} |
||||
NavSectionTitle($Lang->{NavSectionTitle_}); |
||||
foreach my $l ( @adminLinks ) { |
||||
if ( $PrivAdmin || !$l->{priv} ) { |
||||
my $txt = $l->{lname} ne "" ? $Lang->{$l->{lname}} : $l->{name}; |
||||
NavLink($l->{link}, $txt); |
||||
} |
||||
} |
||||
|
||||
print <<EOF; |
||||
</div> |
||||
</div> <!-- end #navigation-container --> |
||||
EOF |
||||
|
||||
print("<div id=\"Content\">\n$content\n"); |
||||
if ( defined($contentSub) && ref($contentSub) eq "CODE" ) { |
||||
while ( (my $s = &$contentSub()) ne "" ) { |
||||
print($s); |
||||
} |
||||
} |
||||
print($contentPost) if ( defined($contentPost) ); |
||||
} |
||||
|
||||
sub Trailer |
||||
{ |
||||
print <<EOF; |
||||
</body></html> |
||||
EOF |
||||
} |
||||
|
||||
|
||||
sub NavSectionTitle |
||||
{ |
||||
my($head) = @_; |
||||
print <<EOF; |
||||
<h2 class="NavTitle">$head</h2> |
||||
EOF |
||||
} |
||||
|
||||
sub NavSectionStart |
||||
{ |
||||
} |
||||
|
||||
sub NavSectionEnd |
||||
{ |
||||
} |
||||
|
||||
sub NavLink |
||||
{ |
||||
my($link, $text) = @_; |
||||
if ( defined($link) ) { |
||||
my($class); |
||||
$class = " class=\"NavCurrent\"" |
||||
if ( length($link) && $ENV{REQUEST_URI} =~ /\Q$link\E$/ |
||||
|| length($link) && $link =~ /\&host=/ && $ENV{REQUEST_URI} =~ /\Q$link\E/ |
||||
|| $link eq "" && $ENV{REQUEST_URI} !~ /\?/ ); |
||||
$link = "$MyURL$link" if ( $link eq "" || $link =~ /^\?/ ); |
||||
print <<EOF; |
||||
<a href="$link"$class>$text</a> |
||||
EOF |
||||
} else { |
||||
print <<EOF; |
||||
$text<br> |
||||
EOF |
||||
} |
||||
} |
||||
|
||||
sub h1 |
||||
{ |
||||
my($str) = @_; |
||||
return \<<EOF; |
||||
<h1>$str</h1> |
||||
EOF |
||||
} |
||||
|
||||
sub h2 |
||||
{ |
||||
my($str) = @_; |
||||
return \<<EOF; |
||||
<h2>$str</h2> |
||||
EOF |
||||
} |
Loading…
Reference in new issue