--- loncom/lond 2012/04/11 06:22:04 1.489
+++ loncom/lond 2014/04/30 17:17:14 1.509
@@ -2,7 +2,7 @@
# The LearningOnline Network
# lond "LON Daemon" Server (port "LOND" 5663)
#
-# $Id: lond,v 1.489 2012/04/11 06:22:04 raeburn Exp $
+# $Id: lond,v 1.509 2014/04/30 17:17:14 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -34,6 +34,7 @@ use strict;
use lib '/home/httpd/lib/perl/';
use LONCAPA;
use LONCAPA::Configuration;
+use LONCAPA::Lond;
use IO::Socket;
use IO::File;
@@ -60,7 +61,7 @@ my $DEBUG = 0; # Non zero to ena
my $status='';
my $lastlog='';
-my $VERSION='$Revision: 1.489 $'; #' stupid emacs
+my $VERSION='$Revision: 1.509 $'; #' stupid emacs
my $remoteVERSION;
my $currenthostid="default";
my $currentdomainid;
@@ -129,32 +130,13 @@ my @passwderrors = ("ok",
"pwchange_failure - lcpasswd Error filename is invalid");
-# The array below are lcuseradd error strings.:
-
-my $lastadderror = 13;
-my @adderrors = ("ok",
- "User ID mismatch, lcuseradd must run as user www",
- "lcuseradd Incorrect number of command line parameters must be 3",
- "lcuseradd Incorrect number of stdinput lines, must be 3",
- "lcuseradd Too many other simultaneous pwd changes in progress",
- "lcuseradd User does not exist",
- "lcuseradd Unable to make www member of users's group",
- "lcuseradd Unable to su to root",
- "lcuseradd Unable to set password",
- "lcuseradd Username has invalid characters",
- "lcuseradd Password has an invalid character",
- "lcuseradd User already exists",
- "lcuseradd Could not add user.",
- "lcuseradd Password mismatch");
-
-
# This array are the errors from lcinstallfile:
my @installerrors = ("ok",
"Initial user id of client not that of www",
"Usage error, not enough command line arguments",
- "Source file name does not exist",
- "Destination file name does not exist",
+ "Source filename does not exist",
+ "Destination filename does not exist",
"Some file operation failed",
"Invalid table filename."
);
@@ -1703,8 +1685,14 @@ sub read_lonnet_global {
sub server_devalidatecache_handler {
my ($cmd,$tail,$client) = @_;
my $userinput = "$cmd:$tail";
- my ($name,$id) = map { &unescape($_); } split(/:/,$tail);
- &Apache::lonnet::devalidate_cache_new($name,$id);
+ my $items = &unescape($tail);
+ my @cached = split(/\&/,$items);
+ foreach my $key (@cached) {
+ if ($key =~ /:/) {
+ my ($name,$id) = map { &unescape($_); } split(/:/,$key);
+ &Apache::lonnet::devalidate_cache_new($name,$id);
+ }
+ }
my $result = 'ok';
&Reply($client,\$result,$userinput);
return 1;
@@ -1906,12 +1894,8 @@ sub authenticate_handler {
if (ref($hostedsession) eq 'HASH') {
$hosted = $hostedsession->{'hosted'};
}
- my $loncaparev = $clientversion;
- if ($loncaparev eq '') {
- $loncaparev = $Apache::lonnet::loncaparevs{$clientname};
- }
$canhost = &Apache::lonnet::can_host_session($udom,$clientname,
- $loncaparev,
+ $clientversion,
$remote,$hosted);
}
}
@@ -2134,10 +2118,9 @@ sub change_authentication_handler {
my $passfilename = &password_path($udom, $uname);
if ($passfilename) { # Not allowed to create a new user!!
# If just changing the unix passwd. need to arrange to run
- # passwd since otherwise make_passwd_file will run
- # lcuseradd which fails if an account already exists
- # (to prevent an unscrupulous LONCAPA admin from stealing
- # an existing account by overwriting it as a LonCAPA account).
+ # passwd since otherwise make_passwd_file will fail as
+ # creation of unix authenticated users is no longer supported
+ # except from the command line, when running make_domain_coordinator.pl
if(($oldauth =~/^unix/) && ($umode eq "unix")) {
my $result = &change_unix_password($uname, $npass);
@@ -2155,15 +2138,8 @@ sub change_authentication_handler {
# re-run manage_permissions for that role in order to be able
# to take ownership of the construction space back to www:www
#
-
-
- if( (($oldauth =~ /^unix/) && ($umode eq "internal")) ||
- (($oldauth =~ /^internal/) && ($umode eq "unix")) ) {
- if(&is_author($udom, $uname)) {
- &Debug(" Need to manage author permissions...");
- &manage_permissions("/$udom/_au", $udom, $uname, "$umode:");
- }
- }
+
+
&Reply($client, \$result, $userinput);
}
@@ -2373,6 +2349,24 @@ sub fetch_user_file_handler {
unlink($transname);
&Failure($client, "failed\n", $userinput);
} else {
+ if ($fname =~ /^default.+\.(page|sequence)$/) {
+ my ($major,$minor) = split(/\./,$clientversion);
+ if (($major < 2) || ($major == 2 && $minor < 11)) {
+ my $now = time;
+ &Apache::lonnet::do_cache_new('crschange',$udom.'_'.$uname,$now,600);
+ my $key = &escape('internal.contentchange');
+ my $what = "$key=$now";
+ my $hashref = &tie_user_hash($udom,$uname,'environment',
+ &GDBM_WRCREAT(),"P",$what);
+ if ($hashref) {
+ $hashref->{$key}=$now;
+ if (!&untie_user_hash($hashref)) {
+ &logthis("error: ".($!+0)." untie (GDBM) failed ".
+ "when updating internal.contentchange");
+ }
+ }
+ }
+ }
&Reply($client, "ok\n", $userinput);
}
}
@@ -3179,6 +3173,17 @@ sub get_profile_keys {
sub dump_profile_database {
my ($cmd, $tail, $client) = @_;
+ my $res = LONCAPA::Lond::dump_profile_database($tail);
+
+ if ($res =~ /^error:/) {
+ Failure($client, \$res, "$cmd:$tail");
+ } else {
+ Reply($client, \$res, "$cmd:$tail");
+ }
+
+ return 1;
+
+ #TODO remove
my $userinput = "$cmd:$tail";
my ($udom,$uname,$namespace) = split(/:/,$tail);
@@ -3248,9 +3253,6 @@ sub dump_profile_database {
# range - optional range of entries
# e.g., 10-20 would return the
# 10th to 19th items, etc.
-# extra - optional ref to hash of
-# additional args. currently
-# skipcheck is only key used.
# $client - Channel open on the client.
# Returns:
# 1 - Continue processing.
@@ -3260,124 +3262,12 @@ sub dump_profile_database {
sub dump_with_regexp {
my ($cmd, $tail, $client) = @_;
-
- my $userinput = "$cmd:$tail";
-
- my ($udom,$uname,$namespace,$regexp,$range,$extra)=split(/:/,$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;
-#
-# When dump is for roles.db, determine if LON-CAPA version checking is needed.
-# Sessions on 2.10 and later will include skipcheck => 1 in extra args ref,
-# to indicate no version checking is needed (in this case, checking occurs
-# on the server hosting the user session, when constructing the roles/courses
-# screen).
-#
- 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 dump is for roles.db from a pre-2.10 server, determine the LON-CAPA
-# version on the server which requested the data. 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.
-#
- 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,$roleend,$rolestart) = split(/\_/,$value);
- if (!$roleend || $roleend > $now) {
-#
-# For active course roles, check that requesting server is running a LON-CAPA
-# version which meets any version requirements for the course. Do not include
-# the role amongst the results returned if the requesting server's version is
-# too old.
-#
-# This determination is handled differently depending on whether the course's
-# homeserver is the current server, or whether it is a different server.
-# In both cases, the course's version requirement needs to be retrieved.
-#
- 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 dump is for roles.db from a pre-2.10 server, check if the LON-CAPA
-# version requirements for courses for which the current server is the home
-# server permit course roles to be usable on the client server hosting the
-# user's session. If so, include those role results in the data returned to
-# the client server.
-#
- if (($namespace eq 'roles') && (!$skipcheck)) {
- if (keys(%homecourses) > 0) {
- $qresult .= &check_homecourses(\%homecourses,$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);
- }
+ my $res = LONCAPA::Lond::dump_with_regexp($tail, $clientversion);
+
+ if ($res =~ /^error:/) {
+ Failure($client, \$res, "$cmd:$tail");
} else {
- &Failure($client, "error: ".($!+0)." tie(GDBM) Failed ".
- "while attempting dump\n", $userinput);
+ Reply($client, \$res, "$cmd:$tail");
}
return 1;
@@ -3947,7 +3837,9 @@ sub put_course_id_hash_handler {
# creationcontext - include courses created in specified context
#
# domcloner - flag to indicate if user can create CCs in course's domain.
-# If so, ability to clone course is automatic.
+# If so, ability to clone course is automatic.
+# hasuniquecode - filter by courses for which a six character unique code has
+# been set.
#
# $client - The socket open on the client.
# Returns:
@@ -3956,12 +3848,23 @@ sub put_course_id_hash_handler {
# a reply is written to $client.
sub dump_course_id_handler {
my ($cmd, $tail, $client) = @_;
+
+ my $res = LONCAPA::Lond::dump_course_id_handler($tail);
+ if ($res =~ /^error:/) {
+ Failure($client, \$res, "$cmd:$tail");
+ } else {
+ Reply($client, \$res, "$cmd:$tail");
+ }
+
+ return 1;
+
+ #TODO remove
my $userinput = "$cmd:$tail";
my ($udom,$since,$description,$instcodefilter,$ownerfilter,$coursefilter,
$typefilter,$regexp_ok,$rtn_as_hash,$selfenrollonly,$catfilter,$showhidden,
$caller,$cloner,$cc_clone_list,$cloneonly,$createdbefore,$createdafter,
- $creationcontext,$domcloner) =split(/:/,$tail);
+ $creationcontext,$domcloner,$hasuniquecode) =split(/:/,$tail);
my $now = time;
my ($cloneruname,$clonerudom,%cc_clone);
if (defined($description)) {
@@ -4034,6 +3937,9 @@ sub dump_course_id_handler {
} else {
$creationcontext = '.';
}
+ unless ($hasuniquecode) {
+ $hasuniquecode = '.';
+ }
my $unpack = 1;
if ($description eq '.' && $instcodefilter eq '.' && $ownerfilter eq '.' &&
$typefilter eq '.') {
@@ -4122,6 +4028,9 @@ sub dump_course_id_handler {
$selfenroll_end = $items->{'selfenroll_end_date'};
$created = $items->{'created'};
$context = $items->{'context'};
+ if ($hasuniquecode ne '.') {
+ next unless ($items->{'uniquecode'});
+ }
if ($selfenrollonly) {
next if (!$selfenroll_types);
if (($selfenroll_end > 0) && ($selfenroll_end <= $now)) {
@@ -4544,6 +4453,49 @@ sub get_id_handler {
}
®ister_handler("idget", \&get_id_handler, 0, 1, 0);
+# Deletes one or more ids in a domain's id database.
+#
+# Parameters:
+# $cmd - Command keyword (iddel).
+# $tail - Command tail. In this case a colon
+# separated list containing:
+# The domain for which we are deleting the id(s).
+# &-separated list of id(s) to delete.
+# $client - File open on client socket.
+# Returns:
+# 1 - Continue processing
+# 0 - Exit server.
+#
+#
+
+sub del_id_handler {
+ my ($cmd,$tail,$client) = @_;
+
+ my $userinput = "$cmd:$tail";
+
+ my ($udom,$what)=split(/:/,$tail);
+ chomp($what);
+ my $hashref = &tie_domain_hash($udom, "ids", &GDBM_WRCREAT(),
+ "D", $what);
+ if ($hashref) {
+ my @keys=split(/\&/,$what);
+ foreach my $key (@keys) {
+ delete($hashref->{$key});
+ }
+ if (&untie_user_hash($hashref)) {
+ &Reply($client, "ok\n", $userinput);
+ } else {
+ &Failure($client, "error: ".($!+0)." untie(GDBM) Failed ".
+ "while attempting iddel\n", $userinput);
+ }
+ } else {
+ &Failure( $client, "error: ".($!+0)." tie(GDBM) Failed ".
+ "while attempting iddel\n", $userinput);
+ }
+ return 1;
+}
+®ister_handler("iddel", \&del_id_handler, 0, 1, 0);
+
#
# Puts broadcast e-mail sent by Domain Coordinator in nohist_dcmail database
#
@@ -5092,9 +5044,10 @@ sub validate_instcode_handler {
my ($dom,$instcode,$owner) = split(/:/, $tail);
$instcode = &unescape($instcode);
$owner = &unescape($owner);
- my ($outcome,$description) =
+ my ($outcome,$description,$credits) =
&localenroll::validate_instcode($dom,$instcode,$owner);
- my $result = &escape($outcome).'&'.&escape($description);
+ my $result = &escape($outcome).'&'.&escape($description).'&'.
+ &escape($credits);
&Reply($client, \$result, $userinput);
return 1;
@@ -5310,7 +5263,7 @@ sub crsreq_checks_handler {
my $userinput = "$cmd:$tail";
my $dom = $tail;
my $result;
- my @reqtypes = ('official','unofficial','community');
+ my @reqtypes = ('official','unofficial','community','textbook');
eval {
local($SIG{__DIE__})='DEFAULT';
my %validations;
@@ -5337,19 +5290,20 @@ sub crsreq_checks_handler {
sub validate_crsreq_handler {
my ($cmd, $tail, $client) = @_;
my $userinput = "$cmd:$tail";
- my ($dom,$owner,$crstype,$inststatuslist,$instcode,$instseclist) = split(/:/, $tail);
+ my ($dom,$owner,$crstype,$inststatuslist,$instcode,$instseclist,$customdata) = split(/:/, $tail);
$instcode = &unescape($instcode);
$owner = &unescape($owner);
$crstype = &unescape($crstype);
$inststatuslist = &unescape($inststatuslist);
$instcode = &unescape($instcode);
$instseclist = &unescape($instseclist);
+ my $custominfo = &Apache::lonnet::thaw_unescape($customdata);
my $outcome;
eval {
local($SIG{__DIE__})='DEFAULT';
$outcome = &localenroll::validate_crsreq($dom,$owner,$crstype,
$inststatuslist,$instcode,
- $instseclist);
+ $instseclist,$custominfo);
};
if (!$@) {
&Reply($client, \$outcome, $userinput);
@@ -5360,6 +5314,53 @@ sub validate_crsreq_handler {
}
®ister_handler("autocrsreqvalidation", \&validate_crsreq_handler, 0, 1, 0);
+sub crsreq_update_handler {
+ my ($cmd, $tail, $client) = @_;
+ my $userinput = "$cmd:$tail";
+ my ($cdom,$cnum,$crstype,$action,$ownername,$ownerdomain,$fullname,$title,$code,
+ $accessstart,$accessend,$infohashref) =
+ split(/:/, $tail);
+ $crstype = &unescape($crstype);
+ $action = &unescape($action);
+ $ownername = &unescape($ownername);
+ $ownerdomain = &unescape($ownerdomain);
+ $fullname = &unescape($fullname);
+ $title = &unescape($title);
+ $code = &unescape($code);
+ $accessstart = &unescape($accessstart);
+ $accessend = &unescape($accessend);
+ my $incoming = &Apache::lonnet::thaw_unescape($infohashref);
+ my ($result,$outcome);
+ eval {
+ local($SIG{__DIE__})='DEFAULT';
+ my %rtnhash;
+ $outcome = &localenroll::crsreq_updates($cdom,$cnum,$crstype,$action,
+ $ownername,$ownerdomain,$fullname,
+ $title,$code,$accessstart,$accessend,
+ $incoming,\%rtnhash);
+ if ($outcome eq 'ok') {
+ my @posskeys = qw(createdweb createdmsg queuedweb queuedmsg formitems reviewweb);
+ foreach my $key (keys(%rtnhash)) {
+ if (grep(/^\Q$key\E/,@posskeys)) {
+ $result .= &escape($key).'='.&Apache::lonnet::freeze_escape($rtnhash{$key}).'&';
+ }
+ }
+ $result =~ s/\&$//;
+ }
+ };
+ if (!$@) {
+ if ($outcome eq 'ok') {
+ &Reply($client, \$result, $userinput);
+ } else {
+ &Reply($client, "format_error\n", $userinput);
+ }
+ } else {
+ &Failure($client,"unknown_cmd\n",$userinput);
+ }
+ return 1;
+}
+®ister_handler("autocrsrequpdate", \&crsreq_update_handler, 0, 1, 0);
+
#
# Read and retrieve institutional code format (for support form).
# Formal Parameters:
@@ -6067,18 +6068,6 @@ sub lcpasswdstrerror {
}
}
-#
-# Convert an error return code from lcuseradd to a string value:
-#
-sub lcuseraddstrerror {
- my $ErrorCode = shift;
- if(($ErrorCode < 0) || ($ErrorCode > $lastadderror)) {
- return "lcuseradd - Unrecognized error code: ".$ErrorCode;
- } else {
- return $adderrors[$ErrorCode];
- }
-}
-
# grabs exception and records it to log before exiting
sub catchexception {
my ($error)=@_;
@@ -6319,6 +6308,9 @@ sub Debug {
# reply - Text to send to 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 {
my ($fd, $reply, $request) = @_;
if (ref($reply)) {
@@ -6565,7 +6557,9 @@ sub make_new_child {
#---------------------------------------------------- kerberos 5 initialization
&Authen::Krb5::init_context();
unless (($dist eq 'fedora5') || ($dist eq 'fedora4') ||
- ($dist eq 'fedora6') || ($dist eq 'suse9.3')) {
+ ($dist eq 'fedora6') || ($dist eq 'suse9.3') ||
+ ($dist eq 'suse12.2') || ($dist eq 'suse12.3') ||
+ ($dist eq 'suse13.1')) {
&Authen::Krb5::init_ets();
}
@@ -6610,7 +6604,14 @@ sub make_new_child {
#
# If the remote is attempting a local init... give that a try:
#
+ logthis("remotereq: $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 contains path to keyfile if $inittype eq 'local'
+ # it's overridden below in this case
+ $clientversion ||= $Apache::lonnet::loncaparevs{$clientname};
# If the connection type is ssl, but I didn't get my
# certificate files yet, then I'll drop back to
@@ -7361,56 +7362,8 @@ sub make_passwd_file {
}
}
} elsif ($umode eq 'unix') {
- {
- #
- # Don't allow the creation of privileged accounts!!! that would
- # be real bad!!!
- #
- my $uid = getpwnam($uname);
- if((defined $uid) && ($uid == 0)) {
- &logthis(">>>Attempt to create privileged account blocked");
- return "no_priv_account_error\n";
- }
-
- my $execpath ="$perlvar{'lonDaemons'}/"."lcuseradd";
-
- my $lc_error_file = $execdir."/tmp/lcuseradd".$$.".status";
- {
- &Debug("Executing external: ".$execpath);
- &Debug("user = ".$uname.", Password =". $npass);
- my $se = IO::File->new("|$execpath > $perlvar{'lonDaemons'}/logs/lcuseradd.log");
- print $se "$uname\n";
- print $se "$udom\n";
- print $se "$npass\n";
- print $se "$npass\n";
- print $se "$lc_error_file\n"; # Status -> unique file.
- }
- if (-r $lc_error_file) {
- &Debug("Opening error file: $lc_error_file");
- my $error = IO::File->new("< $lc_error_file");
- my $useraddok = <$error>;
- $error->close;
- unlink($lc_error_file);
-
- chomp $useraddok;
-
- if($useraddok > 0) {
- my $error_text = &lcuseraddstrerror($useraddok);
- &logthis("Failed lcuseradd: $error_text");
- $result = "lcuseradd_failed:$error_text";
- } else {
- my $pf = IO::File->new(">$passfilename");
- if($pf) {
- print $pf "unix:\n";
- } else {
- $result = "pass_file_failed_error";
- }
- }
- } else {
- &Debug("Could not locate lcuseradd error: $lc_error_file");
- $result="bug_lcuseradd_no_output_file";
- }
- }
+ &logthis(">>>Attempt to create unix account blocked -- unix auth not available for new users.");
+ $result="no_new_unix_accounts";
} elsif ($umode eq 'none') {
{
my $pf = IO::File->new("> $passfilename");
@@ -7474,234 +7427,8 @@ sub get_usersession_config {
return;
}
-#
-# releasereqd_check() will determine if a LON-CAPA version (defined in the
-# $major,$minor args passed) is not too old to allow use of a role in a
-# course ($cnum,$cdom args passed), if at least one of the following applies:
-# (a) the course is a Community, (b) the course's home server is *not* the
-# current server, or (c) cached course information is not stale.
-#
-# For the case where none of these apply, the course is added to the
-# $homecourse hash ref (keys = courseIDs, values = array of a hash of roles).
-# The $homecourse hash ref is for courses for which the current server is the
-# home server. LON-CAPA version requirements are checked elsewhere for the
-# items in $homecourse.
-#
-
-sub releasereqd_check {
- my ($cnum,$cdom,$key,$value,$major,$minor,$homecourses,$ids) = @_;
- my $home = &Apache::lonnet::homeserver($cnum,$cdom);
- return if ($home eq 'no_host');
- my ($reqdmajor,$reqdminor,$displayrole);
- if ($cnum =~ /$LONCAPA::match_community/) {
- if ($major eq '' && $minor eq '') {
- return unless ((ref($ids) eq 'ARRAY') &&
- (grep(/^\Q$home\E$/,@{$ids})));
- } else {
- $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->{$cdom}) eq 'HASH') {
- if (ref($homecourses->{$cdom}{$cnum}) eq 'HASH') {
- if (ref($homecourses->{$cdom}{$cnum}) eq 'ARRAY') {
- push(@{$homecourses->{$cdom}{$cnum}},{$key=>$value});
- } else {
- $homecourses->{$cdom}{$cnum} = [{$key=>$value}];
- }
- } else {
- $homecourses->{$cdom}{$cnum} = [{$key=>$value}];
- }
- } else {
- $homecourses->{$cdom}{$cnum} = [{$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;
-}
-
-#
-# get_courseinfo_hash() is used to retrieve course information from the db
-# file: nohist_courseids.db for a course for which the current server is *not*
-# the home server.
-#
-# A hash of a hash will be retrieved. The outer hash contains a single key --
-# courseID -- for the course for which the data are being requested.
-# The contents of the inner hash, for that single item in the outer hash
-# are returned (and cached in memcache for 10 minutes).
-#
-
-sub get_courseinfo_hash {
- my ($cnum,$cdom,$home) = @_;
- my %info;
- eval {
- local($SIG{ALRM}) = sub { die "timeout\n"; };
- local($SIG{__DIE__})='DEFAULT';
- alarm(3);
- %info = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',$cnum,1,[$home],'.');
- alarm(0);
- };
- if ($@) {
- if ($@ eq "timeout\n") {
- &logthis("WARNING courseiddump for $cnum:$cdom from $home timedout");
- } else {
- &logthis("WARNING unexpected error during eval of call for courseiddump from $home");
- }
- } else {
- if (ref($info{$cdom.'_'.$cnum}) eq 'HASH') {
- my $hashid = $cdom.':'.$cnum;
- return &Apache::lonnet::do_cache_new('courseinfo',$hashid,$info{$cdom.'_'.$cnum},600);
- }
- }
- return;
-}
-
-#
-# check_homecourses() will retrieve course information for those courses which
-# are keys of the $homecourses hash ref (first arg). The nohist_courseids.db
-# GDBM file is tied and course information for each course retrieved. Last
-# visit (lasttime key) is also retrieved for each, and cached values updated
-# for any courses last visited less than 24 hours ago. Cached values are also
-# updated for any courses included in the $homecourses hash ref.
-#
-# The reason for the 24 hours constraint is that the cron entry in
-# /etc/cron.d/loncapa for /home/httpd/perl/refresh_courseids_db.pl causes
-# cached course information to be updated nightly for courses with activity
-# within the past 24 hours.
-#
-# Role information for the user (included in a ref to an array of hashes as the
-# value for each key in $homecourses) is appended to the result returned by the
-# routine, which will in turn be appended to the string returned to the client
-# hosting the user's session.
-#
-sub check_homecourses {
- my ($homecourses,$regexp,$count,$range,$start,$end,$major,$minor) = @_;
- my ($result,%addtocache);
- my $yesterday = time - 24*3600;
- if (ref($homecourses) eq 'HASH') {
- my (%okcourses,%courseinfo,%recent);
- foreach my $domain (keys(%{$homecourses})) {
- my $hashref =
- &tie_domain_hash($domain, "nohist_courseids", &GDBM_WRCREAT());
- if (ref($hashref) eq 'HASH') {
- 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 ($cdom,$cnum) = split(/_/,$unesc_key);
- my $hashid = $cdom.':'.$cnum;
- $courseinfo{$hashid} = $items;
- if (ref($homecourses->{$cdom}{$cnum}) 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 for $domain");
- }
- } else {
- &logthis("Failed to tie hash for nohist_courseids.db for $domain");
- }
- }
- 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 $cdom (keys(%{$homecourses})) {
- if (ref($homecourses->{$cdom}) eq 'HASH') {
- foreach my $cnum (keys(%{$homecourses->{$cdom}})) {
- my $hashid = $cdom.':'.$cnum;
- next if ($recent{$hashid});
- &Apache::lonnet::do_cache_new('courseinfo',$hashid,$courseinfo{$hashid},600);
- }
- }
- }
- foreach my $hashid (keys(%okcourses)) {
- my ($cdom,$cnum) = split(/:/,$hashid);
- if ((ref($homecourses->{$cdom}) eq 'HASH') &&
- (ref($homecourses->{$cdom}{$cnum}) eq 'ARRAY')) {
- foreach my $role (@{$homecourses->{$cdom}{$cnum}}) {
- 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;
-}
-
-#
-# useable_role() will compare the LON-CAPA version required by a course with
-# the version available on the client server. If the client server's version
-# is compatible, 1 will be returned.
-#
-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 {
return $dist.':'.$arch;
@@ -7914,7 +7641,7 @@ Place in B
stores hash in namespace
-=item rolesputy
+=item rolesput
put a role into a user's environment
@@ -8031,6 +7758,8 @@ Authen::Krb5
=head1 COREQUISITES
+none
+
=head1 OSNAMES
linux
@@ -8118,9 +7847,9 @@ or the CA's certificate in the call to l
is the textual reason this failed. Usual reasons:
=over 2
-
+
=item Apache config file for loncapa incorrect:
-
+
one of the variables
lonCertificateDirectory, lonnetCertificateAuthority, or lonnetCertificate
undefined or incorrect
@@ -8239,7 +7968,7 @@ Could not rewrite the
internal password file for a user
=item Result of password change for :
-
+
A unix password change for was attempted
and the pipe returned
@@ -8268,7 +7997,7 @@ lond has been asked to exit by its clien
client systemand is the full exit command sent to the server.
=item Red CRITICAL: ABNORMAL EXIT. child for server died through a crass with this error->[].
-
+
A lond child terminated. NOte that this termination can also occur when the
child receives the QUIT or DIE signals. is the process id of the child,
the host lond is working for, and the reason the child died
@@ -8352,7 +8081,7 @@ file when sent it's USR1 signal. That p
assumed to be hung in some un-fixable way.
=item Finished checking children
-
+
Master processs's USR1 processing is cojmplete.
=item (Red) CRITICAL: ------- Starting ------
@@ -8366,7 +8095,7 @@ Started a new child process for
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
-
+
In child process initialization. either getpeername returned undef or
a zero sized object was returned. Processing continues, but in my opinion,
this should be cause for the child to exit.
@@ -8377,7 +8106,7 @@ In child process initialization. The pe
The client address is stored as "Unavailable" and processing continues.
=item (Yellow) INFO: Connection connection type =
-
+
In child initialization. A good connectionw as received from .
=over 2
@@ -8427,7 +8156,7 @@ The client ( is the peer's name
negotiated an SSL connection with this child process.
=item (Green) Successful insecure authentication with
-
+
The client has successfully negotiated an insecure connection withthe child process.