version 1.485, 2011/11/17 18:22:36
|
version 1.492, 2012/04/26 19:51:40
|
Line 34 use strict;
|
Line 34 use strict;
|
use lib '/home/httpd/lib/perl/'; |
use lib '/home/httpd/lib/perl/'; |
use LONCAPA; |
use LONCAPA; |
use LONCAPA::Configuration; |
use LONCAPA::Configuration; |
|
use LONCAPA::Lond; |
|
|
use IO::Socket; |
use IO::Socket; |
use IO::File; |
use IO::File; |
Line 1906 sub authenticate_handler {
|
Line 1907 sub authenticate_handler {
|
if (ref($hostedsession) eq 'HASH') { |
if (ref($hostedsession) eq 'HASH') { |
$hosted = $hostedsession->{'hosted'}; |
$hosted = $hostedsession->{'hosted'}; |
} |
} |
my $loncaparev = $clientversion; |
|
if ($loncaparev eq '') { |
|
$loncaparev = $Apache::lonnet::loncaparevs{$clientname}; |
|
} |
|
$canhost = &Apache::lonnet::can_host_session($udom,$clientname, |
$canhost = &Apache::lonnet::can_host_session($udom,$clientname, |
$loncaparev, |
$clientversion, |
$remote,$hosted); |
$remote,$hosted); |
} |
} |
} |
} |
Line 2350 sub fetch_user_file_handler {
|
Line 2347 sub fetch_user_file_handler {
|
my $transname=$udir.'/'.$ufile.'.in.transit'; |
my $transname=$udir.'/'.$ufile.'.in.transit'; |
my $clientprotocol=$Apache::lonnet::protocol{$clientname}; |
my $clientprotocol=$Apache::lonnet::protocol{$clientname}; |
$clientprotocol = 'http' if ($clientprotocol ne 'https'); |
$clientprotocol = 'http' if ($clientprotocol ne 'https'); |
my $remoteurl=$clientprotocol.'://'.$clientip.'/userfiles/'.$fname; |
my $clienthost = &Apache::lonnet::hostname($clientname); |
|
my $remoteurl=$clientprotocol.'://'.$clienthost.'/userfiles/'.$fname; |
my $response; |
my $response; |
Debug("Remote URL : $remoteurl Transfername $transname Destname: $destname"); |
Debug("Remote URL : $remoteurl Transfername $transname Destname: $destname"); |
alarm(120); |
alarm(120); |
Line 3244 sub dump_profile_database {
|
Line 3242 sub dump_profile_database {
|
# that is matched against |
# that is matched against |
# database keywords to do |
# database keywords to do |
# selective dumps. |
# selective dumps. |
|
# range - optional range of entries |
|
# e.g., 10-20 would return the |
|
# 10th to 19th items, etc. |
# $client - Channel open on the client. |
# $client - Channel open on the client. |
# Returns: |
# Returns: |
# 1 - Continue processing. |
# 1 - Continue processing. |
Line 3253 sub dump_profile_database {
|
Line 3254 sub dump_profile_database {
|
sub dump_with_regexp { |
sub dump_with_regexp { |
my ($cmd, $tail, $client) = @_; |
my ($cmd, $tail, $client) = @_; |
|
|
|
my $res = LONCAPA::Lond::dump_with_regexp($tail, $clientname, $clientversion); |
my $userinput = "$cmd:$tail"; |
|
|
if ($res =~ /^error:/) { |
my ($udom,$uname,$namespace,$regexp,$range,$extra)=split(/:/,$tail); |
Failure($client, \$res, "$cmd:$tail"); |
if (defined($regexp)) { |
|
$regexp=&unescape($regexp); |
|
} else { |
|
$regexp='.'; |
|
} |
|
my ($start,$end); |
|
if (defined($range)) { |
|
if ($range =~/^(\d+)\-(\d+)$/) { |
|
($start,$end) = ($1,$2); |
|
} elsif ($range =~/^(\d+)$/) { |
|
($start,$end) = (0,$1); |
|
} else { |
|
undef($range); |
|
} |
|
} |
|
my $hashref = &tie_user_hash($udom, $uname, $namespace, |
|
&GDBM_READER()); |
|
my $skipcheck; |
|
if ($hashref) { |
|
my $qresult=''; |
|
my $count=0; |
|
if ($extra ne '') { |
|
$extra = &Apache::lonnet::thaw_unescape($extra); |
|
$skipcheck = $extra->{'skipcheck'}; |
|
} |
|
my @ids = &Apache::lonnet::current_machine_ids(); |
|
my (%homecourses,$major,$minor,$now); |
|
if (($namespace eq 'roles') && (!$skipcheck)) { |
|
my $loncaparev = $clientversion; |
|
if ($loncaparev eq '') { |
|
$loncaparev = $Apache::lonnet::loncaparevs{$clientname}; |
|
} |
|
if ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?/) { |
|
$major = $1; |
|
$minor = $2; |
|
} |
|
$now = time; |
|
} |
|
while (my ($key,$value) = each(%$hashref)) { |
|
if ($namespace eq 'roles') { |
|
if ($key =~ m{^/($LONCAPA::match_domain)/($LONCAPA::match_courseid)(/?[^_]*)_(cc|co|in|ta|ep|ad|st|cr)$}) { |
|
my $cdom = $1; |
|
my $cnum = $2; |
|
unless ($skipcheck) { |
|
my ($role,$end,$start) = split(/\_/,$value); |
|
if (!$end || $end > $now) { |
|
next unless (&releasereqd_check($cnum,$cdom,$key,$value,$major, |
|
$minor,\%homecourses,\@ids)); |
|
} |
|
} |
|
} |
|
} |
|
if ($regexp eq '.') { |
|
$count++; |
|
if (defined($range) && $count >= $end) { last; } |
|
if (defined($range) && $count < $start) { next; } |
|
$qresult.=$key.'='.$value.'&'; |
|
} else { |
|
my $unescapeKey = &unescape($key); |
|
if (eval('$unescapeKey=~/$regexp/')) { |
|
$count++; |
|
if (defined($range) && $count >= $end) { last; } |
|
if (defined($range) && $count < $start) { next; } |
|
$qresult.="$key=$value&"; |
|
} |
|
} |
|
} |
|
if (&untie_user_hash($hashref)) { |
|
if (($namespace eq 'roles') && (!$skipcheck)) { |
|
if (keys(%homecourses) > 0) { |
|
$qresult .= &check_homecourses(\%homecourses,$udom,$regexp,$count, |
|
$range,$start,$end,$major,$minor); |
|
} |
|
} |
|
chop($qresult); |
|
&Reply($client, \$qresult, $userinput); |
|
} else { |
|
&Failure( $client, "error: ".($!+0)." untie(GDBM) Failed ". |
|
"while attempting dump\n", $userinput); |
|
} |
|
} else { |
} else { |
&Failure($client, "error: ".($!+0)." tie(GDBM) Failed ". |
Reply($client, \$res, "$cmd:$tail"); |
"while attempting dump\n", $userinput); |
|
} |
} |
|
|
return 1; |
return 1; |
Line 6281 sub Debug {
|
Line 6201 sub Debug {
|
# reply - Text to send to client. |
# reply - Text to send to client. |
# request - Original request from client. |
# request - Original request from client. |
# |
# |
|
#NOTE $reply must be terminated by exactly *one* \n. If $reply is a reference |
|
#this is done automatically ($$reply must not contain any \n in this case). |
|
#If $reply is a string the caller has to ensure this. |
sub Reply { |
sub Reply { |
my ($fd, $reply, $request) = @_; |
my ($fd, $reply, $request) = @_; |
if (ref($reply)) { |
if (ref($reply)) { |
Line 6573 sub make_new_child {
|
Line 6496 sub make_new_child {
|
# If the remote is attempting a local init... give that a try: |
# If the remote is attempting a local init... give that a try: |
# |
# |
(my $i, my $inittype, $clientversion) = split(/:/, $remotereq); |
(my $i, my $inittype, $clientversion) = split(/:/, $remotereq); |
|
# For LON-CAPA 2.9, the client session will have sent its LON-CAPA |
|
# version when initiating the connection. For LON-CAPA 2.8 and older, |
|
# the version is retrieved from the global %loncaparevs in lonnet.pm. |
|
$clientversion ||= $Apache::lonnet::loncaparevs{$clientname}; |
|
|
# If the connection type is ssl, but I didn't get my |
# If the connection type is ssl, but I didn't get my |
# certificate files yet, then I'll drop back to |
# certificate files yet, then I'll drop back to |
Line 6716 sub is_author {
|
Line 6643 sub is_author {
|
|
|
# Author role should show up as a key /domain/_au |
# Author role should show up as a key /domain/_au |
|
|
my $key = "/$domain/_au"; |
|
my $value; |
my $value; |
if (defined($hashref)) { |
if ($hashref) { |
$value = $hashref->{$key}; |
|
} |
|
|
|
if(defined($value)) { |
my $key = "/$domain/_au"; |
&Debug("$user @ $domain is an author"); |
if (defined($hashref)) { |
|
$value = $hashref->{$key}; |
|
if(!untie_user_hash($hashref)) { |
|
return 'error: ' . ($!+0)." untie (GDBM) Failed"; |
|
} |
|
} |
|
|
|
if(defined($value)) { |
|
&Debug("$user @ $domain is an author"); |
|
} |
|
} else { |
|
return 'error: '.($!+0)." tie (GDBM) Failed"; |
} |
} |
|
|
return defined($value); |
return defined($value); |
Line 7428 sub get_usersession_config {
|
Line 7363 sub get_usersession_config {
|
return; |
return; |
} |
} |
|
|
sub releasereqd_check { |
|
my ($cnum,$cdom,$key,$value,$major,$minor,$homecourses,$ids) = @_; |
# |
my $home = &Apache::lonnet::homeserver($cnum,$cdom); |
# get_courseinfo_hash() is used to retrieve course information from the db |
return if ($home eq 'no_host'); |
# file: nohist_courseids.db for a course for which the current server is *not* |
my ($reqdmajor,$reqdminor,$displayrole); |
# the home server. |
if ($cnum =~ /$LONCAPA::match_community/) { |
# |
if ($major eq '' && $minor eq '') { |
# A hash of a hash will be retrieved. The outer hash contains a single key -- |
return unless ((ref($ids) eq 'ARRAY') && |
# courseID -- for the course for which the data are being requested. |
(grep(/^\Q$home\E$/,@{$ids}))); |
# The contents of the inner hash, for that single item in the outer hash |
} else { |
# are returned (and cached in memcache for 10 minutes). |
$reqdmajor = 2; |
# |
$reqdminor = 9; |
|
return unless (&useable_role($reqdmajor,$reqdminor,$major,$minor)); |
|
} |
|
} |
|
my $hashid = $cdom.':'.$cnum; |
|
my ($courseinfo,$cached) = |
|
&Apache::lonnet::is_cached_new('courseinfo',$hashid); |
|
if (defined($cached)) { |
|
if (ref($courseinfo) eq 'HASH') { |
|
if (exists($courseinfo->{'releaserequired'})) { |
|
my ($reqdmajor,$reqdminor) = split(/\./,$courseinfo->{'releaserequired'}); |
|
return unless (&useable_role($reqdmajor,$reqdminor,$major,$minor)); |
|
} |
|
} |
|
} else { |
|
if (ref($ids) eq 'ARRAY') { |
|
if (grep(/^\Q$home\E$/,@{$ids})) { |
|
if (ref($homecourses) eq 'HASH') { |
|
if (ref($homecourses->{$hashid}) eq 'ARRAY') { |
|
push(@{$homecourses->{$hashid}},{$key=>$value}); |
|
} else { |
|
$homecourses->{$hashid} = [{$key=>$value}]; |
|
} |
|
} |
|
return; |
|
} |
|
} |
|
my $courseinfo = &get_courseinfo_hash($cnum,$cdom,$home); |
|
if (ref($courseinfo) eq 'HASH') { |
|
if (exists($courseinfo->{'releaserequired'})) { |
|
my ($reqdmajor,$reqdminor) = split(/\./,$courseinfo->{'releaserequired'}); |
|
return unless (&useable_role($reqdmajor,$reqdminor,$major,$minor)); |
|
} |
|
} else { |
|
return; |
|
} |
|
} |
|
return 1; |
|
} |
|
|
|
sub get_courseinfo_hash { |
sub get_courseinfo_hash { |
my ($cnum,$cdom,$home) = @_; |
my ($cnum,$cdom,$home) = @_; |
Line 7504 sub get_courseinfo_hash {
|
Line 7400 sub get_courseinfo_hash {
|
return; |
return; |
} |
} |
|
|
sub check_homecourses { |
|
my ($homecourses,$udom,$regexp,$count,$range,$start,$end,$major,$minor) = @_; |
|
my ($result,%addtocache); |
|
my $yesterday = time - 24*3600; |
|
if (ref($homecourses) eq 'HASH') { |
|
my (%okcourses,%courseinfo,%recent); |
|
my $hashref = &tie_domain_hash($udom, "nohist_courseids", &GDBM_WRCREAT()); |
|
if ($hashref) { |
|
while (my ($key,$value) = each(%$hashref)) { |
|
my $unesc_key = &unescape($key); |
|
if ($unesc_key =~ /^lasttime:(\w+)$/) { |
|
my $cid = $1; |
|
$cid =~ s/_/:/; |
|
if ($value > $yesterday ) { |
|
$recent{$cid} = 1; |
|
} |
|
next; |
|
} |
|
my $items = &Apache::lonnet::thaw_unescape($value); |
|
if (ref($items) eq 'HASH') { |
|
my $hashid = $unesc_key; |
|
$hashid =~ s/_/:/; |
|
$courseinfo{$hashid} = $items; |
|
if (ref($homecourses->{$hashid}) eq 'ARRAY') { |
|
my ($reqdmajor,$reqdminor) = split(/\./,$items->{'releaserequired'}); |
|
if (&useable_role($reqdmajor,$reqdminor,$major,$minor)) { |
|
$okcourses{$hashid} = 1; |
|
} |
|
} |
|
} |
|
} |
|
unless (&untie_domain_hash($hashref)) { |
|
&logthis('Failed to untie tied hash for nohist_courseids.db'); |
|
} |
|
} else { |
|
&logthis('Failed to tie hash for nohist_courseids.db'); |
|
return; |
|
} |
|
foreach my $hashid (keys(%recent)) { |
|
my ($result,$cached)=&Apache::lonnet::is_cached_new('courseinfo',$hashid); |
|
unless ($cached) { |
|
&Apache::lonnet::do_cache_new('courseinfo',$hashid,$courseinfo{$hashid},600); |
|
} |
|
} |
|
foreach my $hashid (keys(%{$homecourses})) { |
|
next if ($recent{$hashid}); |
|
&Apache::lonnet::do_cache_new('courseinfo',$hashid,$courseinfo{$hashid},600); |
|
} |
|
foreach my $hashid (keys(%okcourses)) { |
|
if (ref($homecourses->{$hashid}) eq 'ARRAY') { |
|
foreach my $role (@{$homecourses->{$hashid}}) { |
|
if (ref($role) eq 'HASH') { |
|
while (my ($key,$value) = each(%{$role})) { |
|
if ($regexp eq '.') { |
|
$count++; |
|
if (defined($range) && $count >= $end) { last; } |
|
if (defined($range) && $count < $start) { next; } |
|
$result.=$key.'='.$value.'&'; |
|
} else { |
|
my $unescapeKey = &unescape($key); |
|
if (eval('$unescapeKey=~/$regexp/')) { |
|
$count++; |
|
if (defined($range) && $count >= $end) { last; } |
|
if (defined($range) && $count < $start) { next; } |
|
$result.="$key=$value&"; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return $result; |
|
} |
|
|
|
sub useable_role { |
|
my ($reqdmajor,$reqdminor,$major,$minor) = @_; |
|
if ($reqdmajor ne '' && $reqdminor ne '') { |
|
return if (($major eq '' && $minor eq '') || |
|
($major < $reqdmajor) || |
|
(($major == $reqdmajor) && ($minor < $reqdminor))); |
|
} |
|
return 1; |
|
} |
|
|
|
sub distro_and_arch { |
sub distro_and_arch { |
return $dist.':'.$arch; |
return $dist.':'.$arch; |
Line 7918 Authen::Krb5
|
Line 7729 Authen::Krb5
|
|
|
=head1 COREQUISITES |
=head1 COREQUISITES |
|
|
|
none |
|
|
=head1 OSNAMES |
=head1 OSNAMES |
|
|
linux |
linux |
Line 8005 or the CA's certificate in the call to l
|
Line 7818 or the CA's certificate in the call to l
|
<error> is the textual reason this failed. Usual reasons: |
<error> is the textual reason this failed. Usual reasons: |
|
|
=over 2 |
=over 2 |
|
|
=item Apache config file for loncapa incorrect: |
=item Apache config file for loncapa incorrect: |
|
|
one of the variables |
one of the variables |
lonCertificateDirectory, lonnetCertificateAuthority, or lonnetCertificate |
lonCertificateDirectory, lonnetCertificateAuthority, or lonnetCertificate |
undefined or incorrect |
undefined or incorrect |
Line 8126 Could not rewrite the
|
Line 7939 Could not rewrite the
|
internal password file for a user |
internal password file for a user |
|
|
=item Result of password change for <user> : <result> |
=item Result of password change for <user> : <result> |
|
|
A unix password change for <user> was attempted |
A unix password change for <user> was attempted |
and the pipe returned <result> |
and the pipe returned <result> |
|
|
Line 8155 lond has been asked to exit by its clien
|
Line 7968 lond has been asked to exit by its clien
|
client systemand <input> is the full exit command sent to the server. |
client systemand <input> is the full exit command sent to the server. |
|
|
=item Red CRITICAL: ABNORMAL EXIT. child <pid> for server <hostname> died through a crass with this error->[<message>]. |
=item Red CRITICAL: ABNORMAL EXIT. child <pid> for server <hostname> died through a crass with this error->[<message>]. |
|
|
A lond child terminated. NOte that this termination can also occur when the |
A lond child terminated. NOte that this termination can also occur when the |
child receives the QUIT or DIE signals. <pid> is the process id of the child, |
child receives the QUIT or DIE signals. <pid> is the process id of the child, |
<hostname> the host lond is working for, and <message> the reason the child died |
<hostname> the host lond is working for, and <message> the reason the child died |
Line 8239 file when sent it's USR1 signal. That p
|
Line 8052 file when sent it's USR1 signal. That p
|
assumed to be hung in some un-fixable way. |
assumed to be hung in some un-fixable way. |
|
|
=item Finished checking children |
=item Finished checking children |
|
|
Master processs's USR1 processing is cojmplete. |
Master processs's USR1 processing is cojmplete. |
|
|
=item (Red) CRITICAL: ------- Starting ------ |
=item (Red) CRITICAL: ------- Starting ------ |
Line 8253 Started a new child process for <client>
|
Line 8066 Started a new child process for <client>
|
connected to the child. This was as a result of a TCP/IP connection from a client. |
connected to the child. This was as a result of a TCP/IP connection from a client. |
|
|
=item Unable to determine who caller was, getpeername returned nothing |
=item Unable to determine who caller was, getpeername returned nothing |
|
|
In child process initialization. either getpeername returned undef or |
In child process initialization. either getpeername returned undef or |
a zero sized object was returned. Processing continues, but in my opinion, |
a zero sized object was returned. Processing continues, but in my opinion, |
this should be cause for the child to exit. |
this should be cause for the child to exit. |
Line 8264 In child process initialization. The pe
|
Line 8077 In child process initialization. The pe
|
The client address is stored as "Unavailable" and processing continues. |
The client address is stored as "Unavailable" and processing continues. |
|
|
=item (Yellow) INFO: Connection <ip> <name> connection type = <type> |
=item (Yellow) INFO: Connection <ip> <name> connection type = <type> |
|
|
In child initialization. A good connectionw as received from <ip>. |
In child initialization. A good connectionw as received from <ip>. |
|
|
=over 2 |
=over 2 |
Line 8314 The client (<client> is the peer's name
|
Line 8127 The client (<client> is the peer's name
|
negotiated an SSL connection with this child process. |
negotiated an SSL connection with this child process. |
|
|
=item (Green) Successful insecure authentication with <client> |
=item (Green) Successful insecure authentication with <client> |
|
|
|
|
The client has successfully negotiated an insecure connection withthe child process. |
The client has successfully negotiated an insecure connection withthe child process. |
|
|