Diff for /loncom/loncron between versions 1.99 and 1.111

version 1.99, 2013/05/29 18:10:54 version 1.111, 2018/10/29 02:46:41
Line 41  use IO::File; Line 41  use IO::File;
 use IO::Socket;  use IO::Socket;
 use HTML::Entities;  use HTML::Entities;
 use Getopt::Long;  use Getopt::Long;
   use GDBM_File;
   use Storable qw(thaw);
 #globals  #globals
 use vars qw (%perlvar %simplestatus $errors $warnings $notices $totalcount);  use vars qw (%perlvar %simplestatus $errors $warnings $notices $totalcount);
   
Line 111  sub checkon_daemon { Line 113  sub checkon_daemon {
     my $result;      my $result;
     &log($fh,'<hr /><a name="'.$daemon.'" /><h2>'.$daemon.'</h2><h3>Log</h3><p style="white-space: pre;"><tt>');      &log($fh,'<hr /><a name="'.$daemon.'" /><h2>'.$daemon.'</h2><h3>Log</h3><p style="white-space: pre;"><tt>');
     printf("%-15s ",$daemon);      printf("%-15s ",$daemon);
     if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){      if ($fh) {
  open (DFH,"tail -n25 $perlvar{'lonDaemons'}/logs/$daemon.log|");          if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){
  while (my $line=<DFH>) {       if (open(DFH,"tail -n25 $perlvar{'lonDaemons'}/logs/$daemon.log|")) {
     &log($fh,"$line");          while (my $line=<DFH>) { 
     if ($line=~/INFO/) { $notices++; }              &log($fh,"$line");
     if ($line=~/WARNING/) { $notices++; }              if ($line=~/INFO/) { $notices++; }
     if ($line=~/CRITICAL/) { $warnings++; }              if ($line=~/WARNING/) { $notices++; }
  };              if ($line=~/CRITICAL/) { $warnings++; }
  close (DFH);          }
           close (DFH);
               }
           }
           &log($fh,"</tt></p>");
     }      }
     &log($fh,"</tt></p>");  
           
     my $pidfile="$perlvar{'lonDaemons'}/logs/$daemon.pid";      my $pidfile="$perlvar{'lonDaemons'}/logs/$daemon.pid";
           
Line 157  sub checkon_daemon { Line 162  sub checkon_daemon {
  $errors++;   $errors++;
  my $kadaemon=$daemon;   my $kadaemon=$daemon;
  if ($kadaemon eq 'lonmemcached') { $kadaemon='memcached'; }   if ($kadaemon eq 'lonmemcached') { $kadaemon='memcached'; }
  &log($fh,'<br><font color="red">Killall '.$daemon.': '.   &log($fh,'<br /><font color="red">Killall '.$daemon.': '.
     `killall $kadaemon 2>&1`.' - ');      `killall $kadaemon 2>&1`.' - ');
  sleep 1;   sleep 1;
  &log($fh,unlink($pidfile).' - '.   &log($fh,unlink($pidfile).' - '.
     `killall -9 $kadaemon 2>&1`.      `killall -9 $kadaemon 2>&1`.
     '</font><br>');      '</font><br />');
           if ($kadaemon eq 'loncnew') {
               &clean_lonc_childpids();
           }
  &log($fh,"<h3>$daemon not running, trying to start</h3>");   &log($fh,"<h3>$daemon not running, trying to start</h3>");
   
  if (&start_daemon($fh,$daemon,$pidfile,$args)) {   if (&start_daemon($fh,$daemon,$pidfile,$args)) {
     &log($fh,"<h3>$daemon at pid $daemonpid responding</h3>");      &log($fh,"<h3>$daemon at pid $daemonpid responding</h3>");
     $simplestatus{$daemon}='restarted';      $simplestatus{$daemon}='restarted';
Line 189  sub checkon_daemon { Line 197  sub checkon_daemon {
  &log($fh,"<p>Unable to start $daemon</p>");   &log($fh,"<p>Unable to start $daemon</p>");
     }      }
  }   }
           if ($fh) {
  if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){      if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){
     &log($fh,"<p><pre>");          &log($fh,"<p><pre>");
     open (DFH,"tail -n100 $perlvar{'lonDaemons'}/logs/$daemon.log|");          if (open(DFH,"tail -n100 $perlvar{'lonDaemons'}/logs/$daemon.log|")) {
     while (my $line=<DFH>) {               while (my $line=<DFH>) { 
  &log($fh,"$line");          &log($fh,"$line");
  if ($line=~/WARNING/) { $notices++; }          if ($line=~/WARNING/) { $notices++; }
  if ($line=~/CRITICAL/) { $notices++; }          if ($line=~/CRITICAL/) { $notices++; }
     };              }
     close (DFH);              close (DFH);
     &log($fh,"</pre></p>");                  }
           &log($fh,"</pre></p>");
               }
  }   }
     }      }
           
Line 285  sub start_logging { Line 295  sub start_logging {
           
   
     &log($fh,(<<ENDHEADERS));      &log($fh,(<<ENDHEADERS));
 <html>  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>  <head>
 <title>LON Status Report $perlvar{'lonHostID'}</title>  <title>LON Status Report $perlvar{'lonHostID'}</title>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 </head>  </head>
 <body bgcolor="#AAAAAA">  <body bgcolor="#AAAAAA">
 <a name="top" />  <a name="top" />
Line 298  sub start_logging { Line 310  sub start_logging {
 <li><a href="#machine">Machine Information</a></li>  <li><a href="#machine">Machine Information</a></li>
 <li><a href="#tmp">Temporary Files</a></li>  <li><a href="#tmp">Temporary Files</a></li>
 <li><a href="#tokens">Session Tokens</a></li>  <li><a href="#tokens">Session Tokens</a></li>
   <li><a href="#webdav">WebDAV Session Tokens</a></li>
 <li><a href="#httpd">httpd</a></li>  <li><a href="#httpd">httpd</a></li>
 <li><a href="#lonsql">lonsql</a></li>  <li><a href="#lonsql">lonsql</a></li>
 <li><a href="#lond">lond</a></li>  <li><a href="#lond">lond</a></li>
Line 328  ENDHEADERS Line 341  ENDHEADERS
     "</td><td>".$role.      "</td><td>".$role.
     "</td><td>".&Apache::lonnet::hostname($id)."</td></tr>\n");      "</td><td>".&Apache::lonnet::hostname($id)."</td></tr>\n");
     }      }
     &log($fh,"</table><h3>Spare Hosts</h3><ul>");      &log($fh,"</table><h3>Spare Hosts</h3>");
     foreach my $type (sort(keys(%Apache::lonnet::spareid))) {      if (keys(%Apache::lonnet::spareid) > 0) {
  &log($fh,"<li>$type\n<ol>");          &log($fh,"<ul>");
  foreach my $id (@{ $Apache::lonnet::spareid{$type} }) {          foreach my $type (sort(keys(%Apache::lonnet::spareid))) {
     &log($fh,"<li>$id</li>\n");      &log($fh,"<li>$type\n<ol>");
  }      foreach my $id (@{ $Apache::lonnet::spareid{$type} }) {
  &log($fh,"</ol>\n</li>\n");          &log($fh,"<li>$id</li>\n");
       }
       &log($fh,"</ol>\n</li>\n");
           }
           &log($fh,"</ul>\n");
       } else {
           &log($fh,"No spare hosts specified<br />\n");
     }      }
     &log($fh,"</ul>\n");  
     return $fh;      return $fh;
 }  }
   
Line 482  sub clean_lonIDs { Line 500  sub clean_lonIDs {
  my $since=$now-$mtime;   my $since=$now-$mtime;
  if ($since>$perlvar{'lonExpire'}) {   if ($since>$perlvar{'lonExpire'}) {
     $cleaned++;      $cleaned++;
     &log($fh,"Unlinking $fname<br>");      &log($fh,"Unlinking $fname<br />");
     unlink("$fname");      unlink("$fname");
  } else {   } else {
     $active++;      $active++;
Line 492  sub clean_lonIDs { Line 510  sub clean_lonIDs {
     &log($fh,"<h3>$active open session(s)</h3>");      &log($fh,"<h3>$active open session(s)</h3>");
 }  }
   
   # ------------------------------------------------ clean out webDAV Session IDs
   sub clean_webDAV_sessionIDs {
       my ($fh)=@_;
       if ($perlvar{'lonRole'} eq 'library') {
           &log($fh,'<hr /><a name="webdav" /><h2>WebDAV Session Tokens</h2>');
           my $cleaned=0;
           my $active=0;
           my $now = time;
           if (-d $perlvar{'lonDAVsessDir'}) {
               while (my $fname=<$perlvar{'lonDAVsessDir'}/*>) {
                   my @stats = stat($fname);
                   my $since=$now-$stats[9];
                   if ($since>$perlvar{'lonExpire'}) {
                       $cleaned++;
                       &log($fh,"Unlinking $fname<br />");
                       unlink("$fname");
                   } else {
                       $active++;
                   }
               }
               &log($fh,"<p>Cleaned up ".$cleaned." stale webDAV session token(s).</p>");
               &log($fh,"<h3>$active open webDAV session(s)</h3>");
           }
       }
   }
   
 # ----------------------------------------------------------- clean out sockets  # ----------------------------------------------------------- clean out sockets
 sub clean_sockets {  sub clean_sockets {
     my ($fh)=@_;      my ($fh)=@_;
Line 526  sub check_httpd_logs { Line 570  sub check_httpd_logs {
 sub rotate_lonnet_logs {  sub rotate_lonnet_logs {
     my ($fh)=@_;      my ($fh)=@_;
     &log($fh,'<hr /><a name="lonnet" /><h2>lonnet</h2><h3>Temp Log</h3><pre>');      &log($fh,'<hr /><a name="lonnet" /><h2>lonnet</h2><h3>Temp Log</h3><pre>');
     print "checking logs\n";      print "Checking logs.\n";
     if (-e "$perlvar{'lonDaemons'}/logs/lonnet.log"){      if (-e "$perlvar{'lonDaemons'}/logs/lonnet.log"){
  open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lonnet.log|");   open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lonnet.log|");
  while (my $line=<DFH>) {    while (my $line=<DFH>) { 
Line 570  sub rotate_other_logs { Line 614  sub rotate_other_logs {
 sub test_connections {  sub test_connections {
     my ($fh)=@_;      my ($fh)=@_;
     &log($fh,'<hr /><a name="connections" /><h2>Connections</h2>');      &log($fh,'<hr /><a name="connections" /><h2>Connections</h2>');
     print "testing connections\n";      print "Testing connections.\n";
     &log($fh,"<table border='2'>");      &log($fh,"<table border='2'>");
     my ($good,$bad)=(0,0);      my ($good,$bad)=(0,0);
     my %hostname = &Apache::lonnet::all_hostnames();      my %hostname = &Apache::lonnet::all_hostnames();
Line 604  sub test_connections { Line 648  sub test_connections {
 sub check_delayed_msg {  sub check_delayed_msg {
     my ($fh)=@_;      my ($fh)=@_;
     &log($fh,'<hr /><a name="delayed" /><h2>Delayed Messages</h2>');      &log($fh,'<hr /><a name="delayed" /><h2>Delayed Messages</h2>');
     print "checking buffers\n";      print "Checking buffers.\n";
           
     &log($fh,'<h3>Scanning Permanent Log</h3>');      &log($fh,'<h3>Scanning Permanent Log</h3>');
   
     my $unsend=0;      my $unsend=0;
   
       my %hostname = &Apache::lonnet::all_hostnames();
       my $numhosts = scalar(keys(%hostname));
   
     my $dfh=IO::File->new("$perlvar{'lonDaemons'}/logs/lonnet.perm.log");      my $dfh=IO::File->new("$perlvar{'lonDaemons'}/logs/lonnet.perm.log");
     while (my $line=<$dfh>) {      while (my $line=<$dfh>) {
  my ($time,$sdf,$dserv,$dcmd)=split(/:/,$line);   my ($time,$sdf,$dserv,$dcmd)=split(/:/,$line);
           if ($numhosts) {
               next unless ($hostname{$dserv});
           }
  if ($sdf eq 'F') {    if ($sdf eq 'F') { 
     my $local=localtime($time);      my $local=localtime($time);
     &log($fh,"<b>Failed: $time, $dserv, $dcmd</b><br>");      &log($fh,"<b>Failed: $time, $dserv, $dcmd</b><br />");
     $warnings++;      $warnings++;
  }   }
  if ($sdf eq 'S') { $unsend--; }   if ($sdf eq 'S') { $unsend--; }
Line 639  sub check_delayed_msg { Line 689  sub check_delayed_msg {
     }      }
     &log($fh,"</pre>\n");      &log($fh,"</pre>\n");
     close (DFH);      close (DFH);
     my %hostname = &Apache::lonnet::all_hostnames();  
     my $numhosts = scalar(keys(%hostname));  
 # pong to all servers that have delayed messages  # pong to all servers that have delayed messages
 # this will trigger a reverse connection, which should flush the buffers  # this will trigger a reverse connection, which should flush the buffers
     foreach my $tryserver (sort(keys(%servers))) {      foreach my $tryserver (sort(keys(%servers))) {
Line 654  sub check_delayed_msg { Line 702  sub check_delayed_msg {
             };              };
             if ($@ && $@ =~ m/TIMEOUT/) {              if ($@ && $@ =~ m/TIMEOUT/) {
                 &log($fh,"Attempted pong to $tryserver timed out<br />");                  &log($fh,"Attempted pong to $tryserver timed out<br />");
                 print "time out while contacting: $tryserver for pong\n";                  print "Time out while contacting: $tryserver for pong.\n";
             } else {              } else {
                 &log($fh,"Pong to $tryserver: $answer<br />");                  &log($fh,"Pong to $tryserver: $answer<br />");
             }              }
Line 673  sub finish_logging { Line 721  sub finish_logging {
     my $now=time;      my $now=time;
     my $date=localtime($now);      my $date=localtime($now);
     &log($fh,"<hr />$date ($now)</body></html>\n");      &log($fh,"<hr />$date ($now)</body></html>\n");
     print "lon-status webpage updated\n";      print "lon-status webpage updated.\n";
     $fh->close();      $fh->close();
   
     if ($errors) { $simplestatus{'errors'}=$errors; }      if ($errors) { $simplestatus{'errors'}=$errors; }
Line 694  sub log_simplestatus { Line 742  sub log_simplestatus {
 }  }
   
 sub write_loncaparevs {  sub write_loncaparevs {
     print "Retrieving LON-CAPA version information\n";      print "Retrieving LON-CAPA version information.\n";
     my %hostname = &Apache::lonnet::all_hostnames();      my %hostname = &Apache::lonnet::all_hostnames();
     my $output;      my $output;
     foreach my $id (sort(keys(%hostname))) {      foreach my $id (sort(keys(%hostname))) {
Line 708  sub write_loncaparevs { Line 756  sub write_loncaparevs {
                 alarm(0);                  alarm(0);
             };              };
             if ($@ && $@ =~ m/TIMEOUT/) {              if ($@ && $@ =~ m/TIMEOUT/) {
                 print "time out while contacting lonHost: $id for version\n";                     print "Time out while contacting lonHost: $id for version.\n";   
             }              }
             if ($loncaparev =~ /^[\w.\-]+$/) {              if ($loncaparev =~ /^[\w.\-]+$/) {
                 $output .= $id.':'.$loncaparev."\n";                  $output .= $id.':'.$loncaparev."\n";
Line 726  sub write_loncaparevs { Line 774  sub write_loncaparevs {
 }  }
   
 sub write_serverhomeIDs {  sub write_serverhomeIDs {
     print "Retrieving LON-CAPA lonHostID information\n";      print "Retrieving LON-CAPA lonHostID information.\n";
     my %name_to_host = &Apache::lonnet::all_names();      my %name_to_host = &Apache::lonnet::all_names();
     my $output;      my $output;
     foreach my $name (sort(keys(%name_to_host))) {      foreach my $name (sort(keys(%name_to_host))) {
Line 781  sub write_checksums { Line 829  sub write_checksums {
     return;      return;
 }  }
   
   sub clean_nosslverify {
       my ($fh) = @_;
       my %unlinked; 
       if (-d "$perlvar{'lonSockDir'}/nosslverify") {
           if (opendir(my $dh,"$perlvar{'lonSockDir'}/nosslverify")) {
               while (my $fname=readdir($dh)) {
                   next if ($fname =~ /^\.+$/);
                   if (unlink("/home/httpd/sockets/nosslverify/$fname")) {
                       &log($fh,"Unlinking $fname<br />");
                       $unlinked{$fname} = 1;
                   }
               }
               closedir($dh);
           }
       }
       &log($fh,"<p>Removed ".scalar(keys(%unlinked))." nosslverify clients</p>");
       return %unlinked;
   }
   sub clean_lonc_childpids {
       my $childpiddir = "$perlvar{'lonDocRoot'}/lon-status/loncchld";
       if (-d $childpiddir) {
           if (opendir(my $dh,$childpiddir)) {
               while (my $fname=readdir($dh)) {
                   next if ($fname =~ /^\.+$/);
                   unlink("$childpiddir/$fname");
               }
               closedir($dh);
           }
       }
   }
   
   sub write_connection_config {
       my ($isprimary,$domconf,$url,%connectssl,%changes);
       my $primaryLibServer = &Apache::lonnet::domain($perlvar{'lonDefDomain'},'primary');
       if ($primaryLibServer eq $perlvar{'lonHostID'}) {
           $isprimary = 1;
       } elsif ($primaryLibServer ne '') {
           my $protocol = $Apache::lonnet::protocol{$primaryLibServer};
           my $hostname = &Apache::lonnet::hostname($primaryLibServer);
           unless ($protocol eq 'https') {
               $protocol = 'http';
           }
           $url = $protocol.'://'.$hostname.'/cgi-bin/listdomconfig.pl';
       }
       my $domconf = &get_domain_config($perlvar{'lonDefDomain'},$primaryLibServer,$isprimary,
                                        $url);
       if (ref($domconf) eq 'HASH') {
           if (ref($domconf->{'ssl'}) eq 'HASH') {
               foreach my $connect ('connto','connfrom') {
                   if (ref($domconf->{'ssl'}->{$connect}) eq 'HASH') {
                       my ($sslreq,$sslnoreq,$currsetting);
                       my %contypes;
                       foreach my $type ('dom','intdom','other') {
                           $connectssl{$connect.'_'.$type} = $domconf->{'ssl'}->{$connect}->{$type};
                       }
                   }
               }
           }
           if (keys(%connectssl)) {
               my %currconf; 
               if (open(my $fh,'<',"$perlvar{'lonTabDir'}/connectionrules.tab")) {
                   while (my $line = <$fh>) {
                       chomp($line);
                       my ($name,$value) = split(/=/,$line);
                       if ($value =~ /^(?:no|yes|req)$/) {
                           if ($name =~ /^conn(to|from)_(dom|intdom|other)$/) {
                               $currconf{$name} = $value;
                           }
                       }
                   }
                   close($fh);
               }
               if (open(my $fh,'>',"$perlvar{'lonTabDir'}/connectionrules.tab")) {
                   my $count = 0;
                   foreach my $key (sort(keys(%connectssl))) { 
                       print $fh "$key=$connectssl{$key}\n";
                       if (exists($currconf{$key})) {
                           unless ($currconf{$key} eq $connectssl{$key}) {
                               $changes{$key} = 1;
                           }
                       } else {
                           $changes{$key} = 1;
                       }
                       $count ++;
                   }
                   close($fh);
                   print "Completed writing SSL options for lonc/lond for $count items.\n";
               }
           } else {
               print "Writing of SSL options skipped - no connection rules in domain configuration.\n";
           }
       } else {
           print "Retrieval of SSL options for lonc/lond skipped - no configuration data available for domain.\n";
       }
       return %changes;
   }
   
   sub get_domain_config {
       my ($dom,$primlibserv,$isprimary,$url) = @_;
       my %confhash;
       if ($isprimary) {
           my $lonusersdir = $perlvar{'lonUsersDir'};
           my $fname = $lonusersdir.'/'.$dom.'/configuration.db';
           if (-e $fname) {
               my $dbref=&LONCAPA::locking_hash_tie($fname,&GDBM_READER());
               if (ref($dbref) eq 'HASH') {
                   foreach my $key (sort(keys(%{$dbref}))) {
                       my $value = $dbref->{$key};
                       if ($value =~ s/^__FROZEN__//) {
                           $value = thaw(&LONCAPA::unescape($value));
                       } else {
                           $value = &LONCAPA::unescape($value);
                       }
                       $confhash{$key} = $value;
                   }
                   &LONCAPA::locking_hash_untie($dbref);
               }
           }
       } else {
           if (open(PIPE,"wget --no-check-certificate '$url?primary=$primlibserv&format=raw' |")) {
               my $config = '';
               while (<PIPE>) {
                   $config .= $_;
               }
               close(PIPE);
               if ($config) {
                   my @pairs=split(/\&/,$config);
                   foreach my $item (@pairs) {
                       my ($key,$value)=split(/=/,$item,2);
                       my $what = &LONCAPA::unescape($key);
                       if ($value =~ s/^__FROZEN__//) {
                           $value = thaw(&LONCAPA::unescape($value));
                       } else {
                           $value = &LONCAPA::unescape($value);
                       }
                       $confhash{$what}=$value;
                   }
               }
           }
       }
       return \%confhash;
   }
   
   sub write_hosttypes {
       my %intdom = &Apache::lonnet::all_host_intdom();
       my %hostdom = &Apache::lonnet::all_host_domain();
       my $dom = $hostdom{$perlvar{'lonHostID'}};
       my $internetdom = $intdom{$perlvar{'lonHostID'}};
       my %changes;
       if (($dom ne '') && ($internetdom ne '')) {
           if (keys(%hostdom)) {
               my %currhosttypes;
               if (open(my $fh,'<',"$perlvar{'lonTabDir'}/hosttypes.tab")) {
                   while (my $line = <$fh>) {
                       chomp($line);
                       my ($name,$value) = split(/:/,$line);
                       if (($name ne '') && ($value =~ /^(dom|intdom|other)$/)) {
                           $currhosttypes{$name} = $value;
                       }
                   }
                   close($fh);
               }
               if (open(my $fh,'>',"$perlvar{'lonTabDir'}/hosttypes.tab")) {
                   my $count = 0;
                   foreach my $lonid (sort(keys(%hostdom))) {
                       my $type = 'other';
                       if ($hostdom{$lonid} eq $dom) {
                           $type = 'dom'; 
                       } elsif ($intdom{$lonid} eq $internetdom) {
                           $type = 'intdom';
                       }
                       print $fh "$lonid:$type\n";
                       if (exists($currhosttypes{$lonid})) {
                           if ($type ne $currhosttypes{$lonid}) {
                               $changes{$lonid} = 1;
                           }
                       } else {
                           $changes{$lonid} = 1;
                       }
                       $count ++;
                   }
                   close($fh);
                   print "Completed writing host type data for $count hosts.\n";
               }
           } else {
               print "Writing of host types skipped - no hosts found.\n";
           }
       } else {
           print "Writing of host types skipped - could not determine this host's LON-CAPA domain or 'internet' domain.\n";
       }
       return %changes;
   }
   
   sub update_revocation_list {
       my ($result,$changed) = &Apache::lonnet::fetch_crl_pemfile();
       if ($result eq 'ok') {
           print "Certificate Revocation List (from CA) updated.\n";
       } else {
           print "Certificate Revocation List from (CA) not updated.\n";
       }
       return $changed;
   }
   
   sub reset_nosslverify_pids {
       my ($fh,%sslrem) = @_;
       &checkon_daemon($fh,'lond',40000,'USR2');
       my $loncpidfile="$perlvar{'lonDaemons'}/logs/lonc.pid";
       my $loncppid;
       if ((-e $loncpidfile) && (open(my $pfh,'<',$loncpidfile))) {
           $loncppid=<$pfh>;
           chomp($loncppid);
           close($pfh);
           if ($loncppid =~ /^\d+$/) {
               my %pids_by_host;
               my $docdir = $perlvar{'lonDocRoot'};
               if (-d "$docdir/lon-status/loncchld") {
                   if (opendir(my $dh,"$docdir/lon-status/loncchld")) {
                       while (my $file = readdir($dh)) {
                           next if ($file =~ /^\./);
                           if (open(my $fh,'<',"$docdir/lon-status/loncchld/$file")) {
                               my $record = <$fh>;
                               chomp($record);
                               close($fh);
                               my ($remotehost,$authmode) = split(/:/,$record);
                               $pids_by_host{$remotehost}{$authmode}{$file} = 1;
                           }
                       }
                       closedir($dh);
                       if (keys(%pids_by_host)) {
                           foreach my $host (keys(%pids_by_host)) {
                               if ($sslrem{$host}) {
                                   if (ref($pids_by_host{$host}) eq 'HASH') {
                                       if (ref($pids_by_host{$host}{'insecure'}) eq 'HASH') {
                                           if (keys(%{$pids_by_host{$host}{'insecure'}})) {
                                               foreach my $pid (keys(%{$pids_by_host{$host}{'insecure'}})) {
                                                   if (open(PIPE,"ps -o ppid= -p $pid |")) {
                                                       my $ppid = <PIPE>;
                                                       chomp($ppid);
                                                       close(PIPE);
                                                       $ppid =~ s/(^\s+|\s+$)//g;
                                                       if (($ppid == $loncppid) && (kill 0 => $pid)) {
                                                           kill QUIT => $pid;
                                                       }
                                                   }
                                               }
                                           }
                                       }
                                   }
                               }
                           }
                       }
                   }
               }
           }
       }
       return;
   }
   
 sub send_mail {  sub send_mail {
     print "sending mail\n";  
     my $defdom = $perlvar{'lonDefDomain'};      my $defdom = $perlvar{'lonDefDomain'};
     my $origmail = $perlvar{'lonAdmEMail'};      my $origmail = $perlvar{'lonAdmEMail'};
     my $emailto = &Apache::loncommon::build_recipient_list(undef,      my $emailto = &Apache::loncommon::build_recipient_list(undef,
Line 790  sub send_mail { Line 1095  sub send_mail {
     if ($totalcount>2500) {      if ($totalcount>2500) {
  $emailto.=",$perlvar{'lonSysEMail'}";   $emailto.=",$perlvar{'lonSysEMail'}";
     }      }
     my $subj="LON: $perlvar{'lonHostID'} E:$errors W:$warnings N:$notices";       my $from;
       my $hostname=`/bin/hostname`;
     my $result=system("metasend -b -S 4000000 -t $emailto -s '$subj' -f $statusdir/index.html -m text/html >& /dev/null");      chop($hostname);
     if ($result != 0) {      $hostname=~s/[^\w\.]//g;
  $result=system("mail -s '$subj' $emailto < $statusdir/index.html");      if ($hostname) {
           $from = 'www@'.$hostname;
       }
       my $subj="LON: $perlvar{'lonHostID'} E:$errors W:$warnings N:$notices";
       my $loncronmail = "To: $emailto\n".
                         "From: $from\n".
                         "Subject: ".$subj."\n".
                         "Content-type: text/html\; charset=UTF-8\n".
                         "MIME-Version: 1.0\n\n";
       if (open(my $fh,"<$statusdir/index.html")) {
           while (<$fh>) {
               $loncronmail .= $_;
           }
           close($fh);
       } else {
           $loncronmail .= "Failed to read from http://$hostname/lon-status/index.html\n";
       }
       $loncronmail .= "\n\n";
       if (open(my $mailh, "|/usr/lib/sendmail -oi -t -odb")) {
           print $mailh $loncronmail;
           close($mailh);
           print "Sending mail.\n";
       } else {
           print "Sending mail failed.\n";
     }      }
 }  }
   
 sub usage {  sub usage {
     print(<<USAGE);      print(<<USAGE);
 loncron - housekeeping program that checks up on various parts of Lon-CAPA  loncron - housekeeping program that checks up on various parts of LON-CAPA
   
 Options:  Options:
    --help     Display      --help     Display 
Line 849  sub main () { Line 1177  sub main () {
  $hostname=~s/[^\w\.]//g; # make sure is safe to pass through shell   $hostname=~s/[^\w\.]//g; # make sure is safe to pass through shell
  my $subj="LON: Unconfigured machine $hostname";   my $subj="LON: Unconfigured machine $hostname";
  system("echo 'Unconfigured machine $hostname.' |\   system("echo 'Unconfigured machine $hostname.' |\
  mailto $emailto -s '$subj' > /dev/null");                 mail -s '$subj' $emailto > /dev/null");
  exit 1;   exit 1;
     }      }
   
 # ----------------------------- Make sure this process is running from user=www  # ----------------------------- Make sure this process is running from user=www
     my $wwwid=getpwnam('www');      my $wwwid=getpwnam('www');
     if ($wwwid!=$<) {      if ($wwwid!=$<) {
  print("User ID mismatch.  This program must be run as user 'www'\n");   print("User ID mismatch. This program must be run as user 'www'.\n");
  my $emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}";   my $emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}";
  my $subj="LON: $perlvar{'lonHostID'} User ID mismatch";   my $subj="LON: $perlvar{'lonHostID'} User ID mismatch";
  system("echo 'User ID mismatch.  loncron must be run as user www.' |\   system("echo 'User ID mismatch. loncron must be run as user www.' |\
  mailto $emailto -s '$subj' > /dev/null");                 mail -s '$subj' $emailto > /dev/null");
  exit 1;   exit 1;
     }      }
   
 # -------------------------------------------- Force reload of host information  # -------------------------------------------- Force reload of host information
     &Apache::lonnet::load_hosts_tab(1);      my $nomemcache;
     &Apache::lonnet::load_domain_tab(1);      if ($justcheckdaemons) {
     &Apache::lonnet::get_iphost(1);          $nomemcache=1;
           my $memcachepidfile="$perlvar{'lonDaemons'}/logs/memcached.pid";
           my $memcachepid;
           if (-e $memcachepidfile) {
               my $memfh=IO::File->new($memcachepidfile);
               $memcachepid=<$memfh>;
               chomp($memcachepid);
               if ($memcachepid =~ /^\d+$/ && kill 0 => $memcachepid) {
                   undef($nomemcache);
               }
           }
       }
       &Apache::lonnet::load_hosts_tab(1,$nomemcache);
       &Apache::lonnet::load_domain_tab(1,$nomemcache);
       &Apache::lonnet::get_iphost(1,$nomemcache);
   
 # ----------------------------------------- Force firewall update for lond port    # ----------------------------------------- Force firewall update for lond port  
   
Line 904  sub main () { Line 1246  sub main () {
  &log_machine_info($fh);   &log_machine_info($fh);
  &clean_tmp($fh);   &clean_tmp($fh);
  &clean_lonIDs($fh);   &clean_lonIDs($fh);
           &clean_webDAV_sessionIDs($fh);
  &check_httpd_logs($fh);   &check_httpd_logs($fh);
  &rotate_lonnet_logs($fh);   &rotate_lonnet_logs($fh);
  &rotate_other_logs($fh);   &rotate_other_logs($fh);
Line 919  sub main () { Line 1262  sub main () {
         &checkon_daemon($fh,'lonr',40000);          &checkon_daemon($fh,'lonr',40000);
     }      }
     if ($justreload) {      if ($justreload) {
           &clean_nosslverify($fh);
           &write_connection_config();
           &write_hosttypes();
           &update_revocation_list(); 
  &checkon_daemon($fh,'lond',40000,'USR2');   &checkon_daemon($fh,'lond',40000,'USR2');
  &checkon_daemon($fh,'lonc',40000,'USR2');   &checkon_daemon($fh,'lonc',40000,'USR2');
     }      }
Line 927  sub main () { Line 1274  sub main () {
     }      }
     if (!$justcheckdaemons && !$justcheckconnections && !$justreload) {      if (!$justcheckdaemons && !$justcheckconnections && !$justreload) {
  &check_delayed_msg($fh);   &check_delayed_msg($fh);
  &finish_logging($fh);  
  &log_simplestatus();   &log_simplestatus();
         &write_loncaparevs();          &write_loncaparevs();
         &write_serverhomeIDs();          &write_serverhomeIDs();
  &write_checksums();   &write_checksums();
           my %sslrem = &clean_nosslverify($fh);
           my %conchgs = &write_connection_config();
           my %hosttypechgs = &write_hosttypes();
           my $hadcrlchg = &update_revocation_list();
           if ((keys(%conchgs) > 0) || (keys(%hosttypechgs) > 0) ||
               $hadcrlchg || (keys(%sslrem) > 0)) {
               &checkon_daemon($fh,'lond',40000,'USR2');
               &reset_nosslverify_pids($fh,%sslrem);
           }
           &finish_logging($fh);
  if ($totalcount>200 && !$noemail) { &send_mail(); }   if ($totalcount>200 && !$noemail) { &send_mail(); }
     }      }
 }  }

Removed from v.1.99  
changed lines
  Added in v.1.111


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