Diff for /loncom/lond between versions 1.489.2.8 and 1.510

version 1.489.2.8, 2013/08/10 14:20:52 version 1.510, 2014/06/09 16:51:47
Line 621  sub ConfigFileFromSelector { Line 621  sub ConfigFileFromSelector {
 #     String to send to client ("ok" or "refused" if bad file).  #     String to send to client ("ok" or "refused" if bad file).
 #  #
 sub PushFile {  sub PushFile {
     my $request = shift;          my $request = shift;
     my ($command, $filename, $contents) = split(":", $request, 3);      my ($command, $filename, $contents) = split(":", $request, 3);
     &Debug("PushFile");      &Debug("PushFile");
           
Line 651  sub PushFile { Line 651  sub PushFile {
   
     if($filename eq "host") {      if($filename eq "host") {
  $contents = AdjustHostContents($contents);   $contents = AdjustHostContents($contents);
       } elsif ($filename eq 'dns_host' || $filename eq 'dns_domain') {
           if ($contents eq '') {
               &logthis('<font color="red"> Pushfile: unable to install '
                       .$tablefile." - no data received from push. </font>");
               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('<font color="red"> Pushfile: unable to install '
                               .$tablefile." - error attempting to pull data. </font>");
                       return 'error: pull failed';
                   } else {
                       my $result = $response->content;
                       chomp($result);
                       unless ($result eq $contents) {
                           &logthis('<font color="red"> Pushfile: unable to install '
                                   .$tablefile." - pushed data and pulled data differ. </font>");
                           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:      #  Install the new file:
Line 1685  sub read_lonnet_global { Line 1723  sub read_lonnet_global {
 sub server_devalidatecache_handler {  sub server_devalidatecache_handler {
     my ($cmd,$tail,$client) = @_;      my ($cmd,$tail,$client) = @_;
     my $userinput = "$cmd:$tail";      my $userinput = "$cmd:$tail";
     my ($name,$id) = map { &unescape($_); } split(/:/,$tail);      my $items = &unescape($tail);
     &Apache::lonnet::devalidate_cache_new($name,$id);      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';      my $result = 'ok';
     &Reply($client,\$result,$userinput);      &Reply($client,\$result,$userinput);
     return 1;      return 1;
Line 1888  sub authenticate_handler { Line 1932  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 3171  sub get_profile_keys { Line 3211  sub get_profile_keys {
 sub dump_profile_database {  sub dump_profile_database {
     my ($cmd, $tail, $client) = @_;      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 $userinput = "$cmd:$tail";
         
     my ($udom,$uname,$namespace) = split(/:/,$tail);      my ($udom,$uname,$namespace) = split(/:/,$tail);
Line 3250  sub dump_with_regexp { Line 3301  sub dump_with_regexp {
     my ($cmd, $tail, $client) = @_;      my ($cmd, $tail, $client) = @_;
   
     my $res = LONCAPA::Lond::dump_with_regexp($tail, $clientversion);      my $res = LONCAPA::Lond::dump_with_regexp($tail, $clientversion);
       
     if ($res =~ /^error:/) {      if ($res =~ /^error:/) {
         &Failure($client, \$res, "$cmd:$tail");          Failure($client, \$res, "$cmd:$tail");
     } else {      } else {
         &Reply($client, \$res, "$cmd:$tail");          Reply($client, \$res, "$cmd:$tail");
     }      }
   
     return 1;      return 1;
Line 3824  sub put_course_id_hash_handler { Line 3875  sub put_course_id_hash_handler {
 #                 creationcontext - include courses created in specified context   #                 creationcontext - include courses created in specified context 
 #  #
 #                 domcloner - flag to indicate if user can create CCs in course's domain.  #                 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.  #     $client  - The socket open on the client.
 # Returns:  # Returns:
Line 3833  sub put_course_id_hash_handler { Line 3886  sub put_course_id_hash_handler {
 #   a reply is written to $client.  #   a reply is written to $client.
 sub dump_course_id_handler {  sub dump_course_id_handler {
     my ($cmd, $tail, $client) = @_;      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 $userinput = "$cmd:$tail";
   
     my ($udom,$since,$description,$instcodefilter,$ownerfilter,$coursefilter,      my ($udom,$since,$description,$instcodefilter,$ownerfilter,$coursefilter,
         $typefilter,$regexp_ok,$rtn_as_hash,$selfenrollonly,$catfilter,$showhidden,          $typefilter,$regexp_ok,$rtn_as_hash,$selfenrollonly,$catfilter,$showhidden,
         $caller,$cloner,$cc_clone_list,$cloneonly,$createdbefore,$createdafter,          $caller,$cloner,$cc_clone_list,$cloneonly,$createdbefore,$createdafter,
         $creationcontext,$domcloner) =split(/:/,$tail);          $creationcontext,$domcloner,$hasuniquecode) =split(/:/,$tail);
     my $now = time;      my $now = time;
     my ($cloneruname,$clonerudom,%cc_clone);      my ($cloneruname,$clonerudom,%cc_clone);
     if (defined($description)) {      if (defined($description)) {
Line 3911  sub dump_course_id_handler { Line 3975  sub dump_course_id_handler {
     } else {      } else {
         $creationcontext = '.';          $creationcontext = '.';
     }      }
       unless ($hasuniquecode) {
           $hasuniquecode = '.';
       }
     my $unpack = 1;      my $unpack = 1;
     if ($description eq '.' && $instcodefilter eq '.' && $ownerfilter eq '.' &&       if ($description eq '.' && $instcodefilter eq '.' && $ownerfilter eq '.' && 
         $typefilter eq '.') {          $typefilter eq '.') {
Line 3999  sub dump_course_id_handler { Line 4066  sub dump_course_id_handler {
                 $selfenroll_end = $items->{'selfenroll_end_date'};                  $selfenroll_end = $items->{'selfenroll_end_date'};
                 $created = $items->{'created'};                  $created = $items->{'created'};
                 $context = $items->{'context'};                  $context = $items->{'context'};
                   if ($hasuniquecode ne '.') {
                       next unless ($items->{'uniquecode'});
                   }
                 if ($selfenrollonly) {                  if ($selfenrollonly) {
                     next if (!$selfenroll_types);                      next if (!$selfenroll_types);
                     if (($selfenroll_end > 0) && ($selfenroll_end <= $now)) {                      if (($selfenroll_end > 0) && ($selfenroll_end <= $now)) {
Line 4433  sub get_id_handler { Line 4503  sub get_id_handler {
 # Returns:  # Returns:
 #     1   - Continue processing  #     1   - Continue processing
 #     0   - Exit server.  #     0   - Exit server.
 #  #     
 #  #
   
 sub del_id_handler {  sub del_id_handler {
Line 5231  sub crsreq_checks_handler { Line 5301  sub crsreq_checks_handler {
     my $userinput = "$cmd:$tail";      my $userinput = "$cmd:$tail";
     my $dom = $tail;      my $dom = $tail;
     my $result;      my $result;
     my @reqtypes = ('official','unofficial','community');      my @reqtypes = ('official','unofficial','community','textbook');
     eval {      eval {
         local($SIG{__DIE__})='DEFAULT';          local($SIG{__DIE__})='DEFAULT';
         my %validations;          my %validations;
Line 5258  sub crsreq_checks_handler { Line 5328  sub crsreq_checks_handler {
 sub validate_crsreq_handler {  sub validate_crsreq_handler {
     my ($cmd, $tail, $client) = @_;      my ($cmd, $tail, $client) = @_;
     my $userinput = "$cmd:$tail";      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);      $instcode = &unescape($instcode);
     $owner = &unescape($owner);      $owner = &unescape($owner);
     $crstype = &unescape($crstype);      $crstype = &unescape($crstype);
     $inststatuslist = &unescape($inststatuslist);      $inststatuslist = &unescape($inststatuslist);
     $instcode = &unescape($instcode);      $instcode = &unescape($instcode);
     $instseclist = &unescape($instseclist);      $instseclist = &unescape($instseclist);
       my $custominfo = &Apache::lonnet::thaw_unescape($customdata);
     my $outcome;      my $outcome;
     eval {      eval {
         local($SIG{__DIE__})='DEFAULT';          local($SIG{__DIE__})='DEFAULT';
         $outcome = &localenroll::validate_crsreq($dom,$owner,$crstype,          $outcome = &localenroll::validate_crsreq($dom,$owner,$crstype,
                                                  $inststatuslist,$instcode,                                                   $inststatuslist,$instcode,
                                                  $instseclist);                                                   $instseclist,$custominfo);
     };      };
     if (!$@) {      if (!$@) {
         &Reply($client, \$outcome, $userinput);          &Reply($client, \$outcome, $userinput);
Line 5281  sub validate_crsreq_handler { Line 5352  sub validate_crsreq_handler {
 }  }
 &register_handler("autocrsreqvalidation", \&validate_crsreq_handler, 0, 1, 0);  &register_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;
   }
   &register_handler("autocrsrequpdate", \&crsreq_update_handler, 0, 1, 0);
   
 #  #
 #   Read and retrieve institutional code format (for support form).  #   Read and retrieve institutional code format (for support form).
 # Formal Parameters:  # Formal Parameters:
Line 6228  sub Debug { Line 6346  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 6475  sub make_new_child { Line 6596  sub make_new_child {
         &Authen::Krb5::init_context();          &Authen::Krb5::init_context();
  unless (($dist eq 'fedora5') || ($dist eq 'fedora4') ||     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 'suse12.2') || ($dist eq 'suse12.3') ||
                   ($dist eq 'suse13.1')) {
     &Authen::Krb5::init_ets();      &Authen::Krb5::init_ets();
  }   }
   
Line 6520  sub make_new_child { Line 6642  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:
  #   #
           logthis("remotereq: $remotereq");
  (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          # 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,          # version when initiating the connection. For LON-CAPA 2.8 and older,
                 # the version is retrieved from the global %loncaparevs in lonnet.pm.          # the version is retrieved from the global %loncaparevs in lonnet.pm.            
                 # $clientversion contains path to keyfile if $inittype eq 'local'          # $clientversion contains path to keyfile if $inittype eq 'local'
                 # it's overridden below in this case          # it's overridden below in this case
                 $clientversion ||= $Apache::lonnet::loncaparevs{$clientname};          $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 7343  sub get_usersession_config { Line 7466  sub get_usersession_config {
 }  }
   
   
   
   
 sub distro_and_arch {  sub distro_and_arch {
     return $dist.':'.$arch;      return $dist.':'.$arch;
 }  }
Line 7671  Authen::Krb5 Line 7796  Authen::Krb5
   
 =head1 COREQUISITES  =head1 COREQUISITES
   
   none
   
 =head1 OSNAMES  =head1 OSNAMES
   
 linux  linux
Line 7758  or the CA's certificate in the call to l Line 7885  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 7879  Could not rewrite the Line 8006  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 7908  lond has been asked to exit by its clien Line 8035  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 7992  file when sent it's USR1 signal.  That p Line 8119  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 8006  Started a new child process for <client> Line 8133  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 8017  In child process initialization.  The pe Line 8144  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 8067  The client (<client> is the peer's name Line 8194  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.
   

Removed from v.1.489.2.8  
changed lines
  Added in v.1.510


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>