--- loncom/lond 2013/08/10 01:27:31 1.502
+++ loncom/lond 2014/06/29 03:22:43 1.511
@@ -2,7 +2,7 @@
# The LearningOnline Network
# lond "LON Daemon" Server (port "LOND" 5663)
#
-# $Id: lond,v 1.502 2013/08/10 01:27:31 raeburn Exp $
+# $Id: lond,v 1.511 2014/06/29 03:22:43 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -61,7 +61,7 @@ my $DEBUG = 0; # Non zero to ena
my $status='';
my $lastlog='';
-my $VERSION='$Revision: 1.502 $'; #' stupid emacs
+my $VERSION='$Revision: 1.511 $'; #' stupid emacs
my $remoteVERSION;
my $currenthostid="default";
my $currentdomainid;
@@ -621,7 +621,7 @@ sub ConfigFileFromSelector {
# String to send to client ("ok" or "refused" if bad file).
#
sub PushFile {
- my $request = shift;
+ my $request = shift;
my ($command, $filename, $contents) = split(":", $request, 3);
&Debug("PushFile");
@@ -651,6 +651,44 @@ sub PushFile {
if($filename eq "host") {
$contents = AdjustHostContents($contents);
+ } elsif ($filename eq 'dns_host' || $filename eq 'dns_domain') {
+ if ($contents eq '') {
+ &logthis(' Pushfile: unable to install '
+ .$tablefile." - no data received from push. ");
+ return 'error: push had no data';
+ }
+ if (&Apache::lonnet::get_host_ip($clientname)) {
+ my $clienthost = &Apache::lonnet::hostname($clientname);
+ if ($managers{$clientip} eq $clientname) {
+ my $clientprotocol = $Apache::lonnet::protocol{$clientname};
+ $clientprotocol = 'http' if ($clientprotocol ne 'https');
+ my $url = '/adm/'.$filename;
+ $url =~ s{_}{/};
+ my $ua=new LWP::UserAgent;
+ $ua->timeout(60);
+ my $request=new HTTP::Request('GET',"$clientprotocol://$clienthost$url");
+ my $response=$ua->request($request);
+ if ($response->is_error()) {
+ &logthis(' Pushfile: unable to install '
+ .$tablefile." - error attempting to pull data. ");
+ return 'error: pull failed';
+ } else {
+ my $result = $response->content;
+ chomp($result);
+ unless ($result eq $contents) {
+ &logthis(' Pushfile: unable to install '
+ .$tablefile." - pushed data and pulled data differ. ");
+ my $pushleng = length($contents);
+ my $pullleng = length($result);
+ if ($pushleng != $pullleng) {
+ return "error: $pushleng vs $pullleng bytes";
+ } else {
+ return "error: mismatch push and pull";
+ }
+ }
+ }
+ }
+ }
}
# Install the new file:
@@ -1685,8 +1723,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;
@@ -3831,7 +3875,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:
@@ -3856,7 +3902,7 @@ sub dump_course_id_handler {
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)) {
@@ -3929,6 +3975,9 @@ sub dump_course_id_handler {
} else {
$creationcontext = '.';
}
+ unless ($hasuniquecode) {
+ $hasuniquecode = '.';
+ }
my $unpack = 1;
if ($description eq '.' && $instcodefilter eq '.' && $ownerfilter eq '.' &&
$typefilter eq '.') {
@@ -4017,6 +4066,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)) {
@@ -5249,7 +5301,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;
@@ -5276,19 +5328,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);
@@ -5299,6 +5352,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:
@@ -6494,9 +6594,22 @@ sub make_new_child {
# my $tmpsnum=0; # Now global
#---------------------------------------------------- kerberos 5 initialization
&Authen::Krb5::init_context();
- unless (($dist eq 'fedora5') || ($dist eq 'fedora4') ||
- ($dist eq 'fedora6') || ($dist eq 'suse9.3') ||
- ($dist eq 'suse12.2') || ($dist eq 'suse12.3')) {
+
+ my $no_ets;
+ if ($dist =~ /^(?:centos|rhes)(\d+)$/) {
+ if ($1 >= 7) {
+ $no_ets = 1;
+ }
+ } elsif ($dist =~ /^suse(\d+\.\d+)$/) {
+ if (($1 eq '9.3') || ($1 >= 12.2)) {
+ $no_ets = 1;
+ }
+ } elsif ($dist =~ /^fedora(\d+)$/) {
+ if ($1 < 7) {
+ $no_ets = 1;
+ }
+ }
+ unless ($no_ets) {
&Authen::Krb5::init_ets();
}