version 1.139, 2003/08/25 15:33:47
|
version 1.141, 2003/09/08 10:32:07
|
Line 57
|
Line 57
|
# Management functions supported include: |
# Management functions supported include: |
# - pushing /home/httpd/lonTabs/hosts.tab |
# - pushing /home/httpd/lonTabs/hosts.tab |
# - pushing /home/httpd/lonTabs/domain.tab |
# - pushing /home/httpd/lonTabs/domain.tab |
### |
# 09/08/2003 Ron Fox: Told lond to take care of change logging so we |
|
# don't have to remember it: |
|
# $Log$ |
|
# Revision 1.141 2003/09/08 10:32:07 foxr |
|
# Added PushFile sub This sub oversees the push of a new configuration table file |
|
# Currently supported files are: |
|
# - hosts.tab (transaction pushfile:hosts:contents) |
|
# - domain.tab (transaction pushfile:domain:contents) |
|
# |
|
|
|
|
use strict; |
use strict; |
use lib '/home/httpd/lib/perl/'; |
use lib '/home/httpd/lib/perl/'; |
Line 87 my $currenthostid;
|
Line 96 my $currenthostid;
|
my $currentdomainid; |
my $currentdomainid; |
|
|
my $client; |
my $client; |
|
my $clientip; |
|
|
my $server; |
my $server; |
my $thisserver; |
my $thisserver; |
|
|
my %hostid; |
my %hostid; |
my %hostdom; |
my %hostdom; |
my %hostip; |
my %hostip; |
|
my %perlvar; # Will have the apache conf defined perl vars. |
|
|
# |
# |
# The array below are password error strings." |
# The array below are password error strings." |
Line 133 my @adderrors = ("ok",
|
Line 145 my @adderrors = ("ok",
|
|
|
|
|
# |
# |
|
# GetCertificate: Given a transaction that requires a certificate, |
|
# this function will extract the certificate from the transaction |
|
# request. Note that at this point, the only concept of a certificate |
|
# is the hostname to which we are connected. |
|
# |
|
# Parameter: |
|
# request - The request sent by our client (this parameterization may |
|
# need to change when we really use a certificate granting |
|
# authority. |
|
# |
|
sub GetCertificate { |
|
my $request = shift; |
|
|
|
return $clientip; |
|
} |
|
|
|
|
|
# |
|
# ValidManager: Determines if a given certificate represents a valid manager. |
|
# in this primitive implementation, the 'certificate' is |
|
# just the connecting loncapa client name. This is checked |
|
# against a valid client list in the configuration. |
|
# |
|
# |
|
sub ValidManager { |
|
my $certificate = shift; |
|
|
|
my $hostentry = $hostid{$certificate}; |
|
if ($hostentry ne undef) { |
|
&logthis('<font color="yellow">Authenticating manager'. |
|
" $hostentry</font>"); |
|
return 1; |
|
} else { |
|
&logthis('<font color="red"> Failed manager authentication '. |
|
"$certificate </font>"); |
|
} |
|
} |
|
# |
|
# PushFile: Called to do an administrative push of a file. |
|
# - Ensure the file being pushed is one we support. |
|
# - Backup the old file to <filename.saved> |
|
# - Separate the contents of the new file out from the |
|
# rest of the request. |
|
# - Write the new file. |
|
# Parameter: |
|
# Request - The entire user request. This consists of a : separated |
|
# string pushfile:tablename:contents. |
|
# NOTE: The contents may have :'s in it as well making things a bit |
|
# more interesting... but not much. |
|
# Returns: |
|
# String to send to client ("ok" or "refused" if bad file). |
|
# |
|
sub PushFile { |
|
my $request = shift; |
|
my ($command, $filename, $contents) = split(":", $request, 3); |
|
|
|
# At this point in time, pushes for only the following tables are |
|
# supported: |
|
# hosts.tab ($filename eq host). |
|
# domain.tab ($filename eq domain). |
|
# Construct the destination filename or reject the request. |
|
# |
|
# lonManage is supposed to ensure this, however this session could be |
|
# part of some elaborate spoof that managed somehow to authenticate. |
|
# |
|
|
|
my $tablefile = $perlvar{'lonTabDir'}.'/'; # need to precede with dir. |
|
if ($filename eq "host") { |
|
$tablefile .= "hosts.tab"; |
|
} elsif ($filename eq "domain") { |
|
$tablefile .= "domain.tab"; |
|
} else { |
|
return "refused"; |
|
} |
|
# |
|
# >copy< the old table to the backup table |
|
# don't rename in case system crashes/reboots etc. in the time |
|
# window between a rename and write. |
|
# |
|
my $backupfile = $tablefile; |
|
$backupfile =~ s/\.tab$/.old/; |
|
# CopyFile($tablefile, $backupfile); |
|
&logthis('<font color="green"> Pushfile: backed up ' |
|
.$tablefile." to $backupfile</font>"); |
|
|
|
# Install the new file: |
|
|
|
# InstallFile($tablefile, $contents); |
|
|
|
# Indicate success: |
|
|
|
return "ok"; |
|
|
|
} |
|
# |
# Convert an error return code from lcpasswd to a string value. |
# Convert an error return code from lcpasswd to a string value. |
# |
# |
sub lcpasswdstrerror { |
sub lcpasswdstrerror { |
Line 182 $SIG{__DIE__}=\&catchexception;
|
Line 289 $SIG{__DIE__}=\&catchexception;
|
# ---------------------------------- Read loncapa_apache.conf and loncapa.conf |
# ---------------------------------- Read loncapa_apache.conf and loncapa.conf |
&status("Read loncapa.conf and loncapa_apache.conf"); |
&status("Read loncapa.conf and loncapa_apache.conf"); |
my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf'); |
my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf'); |
my %perlvar=%{$perlvarref}; |
%perlvar=%{$perlvarref}; |
undef $perlvarref; |
undef $perlvarref; |
|
|
# ----------------------------- Make sure this process is running from user=www |
# ----------------------------- Make sure this process is running from user=www |
Line 534 sub make_new_child {
|
Line 641 sub make_new_child {
|
sigprocmask(SIG_BLOCK, $sigset) |
sigprocmask(SIG_BLOCK, $sigset) |
or die "Can't block SIGINT for fork: $!\n"; |
or die "Can't block SIGINT for fork: $!\n"; |
|
|
my $clientip; |
|
die "fork: $!" unless defined ($pid = fork); |
die "fork: $!" unless defined ($pid = fork); |
|
|
if ($pid) { |
if ($pid) { |
Line 703 sub make_new_child {
|
Line 809 sub make_new_child {
|
} |
} |
#--------------------------------------------------------------------- pushfile |
#--------------------------------------------------------------------- pushfile |
} elsif($userinput =~ /^pushfile/) { |
} elsif($userinput =~ /^pushfile/) { |
print $client "ok\n"; |
if($wasenc == 1) { |
|
my $cert = GetCertificate($userinput); |
|
if(ValidManager($cert)) { |
|
my $reply = PushFile($userinput); |
|
print $client "$reply\n"; |
|
} else { |
|
print $client "refused\n"; |
|
} |
|
} else { |
|
print $client "refused\n"; |
|
} |
#--------------------------------------------------------------------- reinit |
#--------------------------------------------------------------------- reinit |
} elsif($userinput =~ /^reinit/) { |
} elsif($userinput =~ /^reinit/) { |
print $client "ok\n"; |
if ($wasenc == 1) { |
|
my $cert = GetCertificate($userinput); |
|
if(ValidManager($cert)) { |
|
print $client "ok\n"; |
|
} else { |
|
print $client "refused\n"; |
|
} |
|
} else { |
|
print $client "refused\n"; |
|
} |
# ------------------------------------------------------------------------ auth |
# ------------------------------------------------------------------------ auth |
} elsif ($userinput =~ /^auth/) { |
} elsif ($userinput =~ /^auth/) { |
if ($wasenc==1) { |
if ($wasenc==1) { |