Diff for /loncom/loncron between versions 1.78 and 1.87

version 1.78, 2009/02/11 15:19:57 version 1.87, 2010/08/21 22:23:05
Line 33  use strict; Line 33  use strict;
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
 use LONCAPA::Configuration;  use LONCAPA::Configuration;
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::loncommon;
   
 use IO::File;  use IO::File;
 use IO::Socket;  use IO::Socket;
Line 346  ENDHEADERS Line 347  ENDHEADERS
 sub clean_tmp {  sub clean_tmp {
     my ($fh)=@_;      my ($fh)=@_;
     &log($fh,'<hr /><a name="tmp" /><h2>Temporary Files</h2>');      &log($fh,'<hr /><a name="tmp" /><h2>Temporary Files</h2>');
     my $cleaned=0;      my ($cleaned,$old,$removed) = (0,0,0);
     my $old=0;      my %errors = (
     while (my $fname=<$perlvar{'lonDaemons'}/tmp/*>) {                       dir       => [],
  my ($dev,$ino,$mode,$nlink,                       file      => [],
     $uid,$gid,$rdev,$size,                       failopen  => [],
     $atime,$mtime,$ctime,                   );
     $blksize,$blocks)=stat($fname);      my %error_titles = (
  my $now=time;                           dir       => 'failed to remove empty directory:',
  my $since=$now-$mtime;                           file      => 'failed to unlike stale file',
  if ($since>$perlvar{'lonExpire'}) {                           failopen  => 'failed to open file or directory'
     my $line='';                         );
     if (open(PROBE,$fname)) {      ($cleaned,$old,$removed) = &recursive_clean_tmp('',$cleaned,$old,$removed,\%errors);
  $line=<PROBE>;      &log($fh,"Cleaned up: ".$cleaned." files; removed: $removed empty directories; (found: $old old checkout tokens)");
  close(PROBE);      foreach my $key (sort(keys(%errors))) {
     }          if (ref($errors{$key}) eq 'ARRAY') {
     unless ($line=~/^CHECKOUTTOKEN\&/) {              if (@{$errors{$key}} > 0) {
  $cleaned++;                  &log($fh,"Error during cleanup ($error_titles{$key}):<ul><li>".
  unlink("$fname");                       join('</li><li><tt>',@{$errors{$key}}).'</tt></li></ul><br />');
     } else {              }
  if ($since>365*$perlvar{'lonExpire'}) {          }
     $cleaned++;      }
     unlink("$fname");  }
  } else { $old++; }  
     }  sub recursive_clean_tmp {
  }      my ($subdir,$cleaned,$old,$removed,$errors) = @_;
       my $base = "$perlvar{'lonDaemons'}/tmp";
       my $path = $base;
       next if ($subdir =~ m{\.\./});
       next unless (ref($errors) eq 'HASH');
       unless ($subdir eq '') {
           $path .= '/'.$subdir;
       }
       if (opendir(my $dh,"$path")) {
           while (my $file = readdir($dh)) {
               next if ($file =~ /^\.\.?$/);
               my $fname = "$path/$file";
               if (-d $fname) {
                   my $innerdir;
                   if ($subdir eq '') {
                       $innerdir = $file;
                   } else {
                       $innerdir = $subdir.'/'.$file;
                   }
                   ($cleaned,$old,$removed) = 
                        &recursive_clean_tmp($innerdir,$cleaned,$old,$removed,$errors);
                   my @doms = &Apache::lonnet::current_machine_domains();
                   
                   if (open(my $dirhandle,$fname)) {
                       unless (($innerdir eq 'helprequests') ||
                               (($innerdir =~ /^addcourse/) && ($innerdir !~ m{/\d+$}))) {
                           my @contents = grep {!/^\.\.?$/} readdir($dirhandle);
                                         join('&&',@contents)."\n";    
                           if (scalar(grep {!/^\.\.?$/} readdir($dirhandle)) == 0) {
                               closedir($dirhandle);
                               if ($fname =~ m{^\Q$perlvar{'lonDaemons'}\E/tmp/}) {
                                   if (rmdir($fname)) {
                                       $removed ++;
                                   } elsif (ref($errors->{dir}) eq 'ARRAY') {
                                       push(@{$errors->{dir}},$fname);
                                   }
                               }
                           }
                       } else {
                           closedir($dirhandle);
                       }
                   }
               } else {
                   my ($dev,$ino,$mode,$nlink,
                       $uid,$gid,$rdev,$size,
                       $atime,$mtime,$ctime,
                       $blksize,$blocks)=stat($fname);
                   my $now=time;
                   my $since=$now-$mtime;
                   if ($since>$perlvar{'lonExpire'}) {
                       if ($subdir eq '') {
                           my $line='';
                           if ($fname =~ /\.db$/) {
                               if (unlink($fname)) {
                                   $cleaned++;
                               } elsif (ref($errors->{file}) eq 'ARRAY') {
                                   push(@{$errors->{file}},$fname);
                               }
                           } elsif (open(PROBE,$fname)) {
                               my $line='';
                               $line=<PROBE>;
                               close(PROBE);
                               if ($line=~/^CHECKOUTTOKEN\&/) {
                                   if ($since>365*$perlvar{'lonExpire'}) {
                                       if (unlink($fname)) {
                                           $cleaned++; 
                                       } elsif (ref($errors->{file}) eq 'ARRAY') {
                                           push(@{$errors->{file}},$fname);
                                       }
                                   } else {
                                       $old++;
                                   }
                               } else {
                                   if (unlink($fname)) {
                                       $cleaned++;
                                   } elsif (ref($errors->{file}) eq 'ARRAY') {
                                       push(@{$errors->{file}},$fname);
                                   }
                               }
                           } elsif (ref($errors->{failopen}) eq 'ARRAY') {
                               push(@{$errors->{failopen}},$fname); 
                           }
                       } else {
                           if (unlink($fname)) {
                               $cleaned++;
                           } elsif (ref($errors->{file}) eq 'ARRAY') {
                               push(@{$errors->{file}},$fname);
                           }
                       }
                   }
               }
           }
           closedir($dh);
       } elsif (ref($errors->{failopen}) eq 'ARRAY') {
           push(@{$errors->{failopen}},$path);
     }      }
     &log($fh,"Cleaned up ".$cleaned." files (".$old." old checkout tokens).");      return ($cleaned,$old,$removed);
 }  }
   
 # ------------------------------------------------------------ clean out lonIDs  # ------------------------------------------------------------ clean out lonIDs
Line 407  sub clean_sockets { Line 502  sub clean_sockets {
     opendir(SOCKETS,$perlvar{'lonSockDir'});      opendir(SOCKETS,$perlvar{'lonSockDir'});
     while (my $fname=readdir(SOCKETS)) {      while (my $fname=readdir(SOCKETS)) {
  next if (-d $fname    next if (-d $fname 
  || $fname=~/(mysqlsock|maximasock|\Q$perlvar{'lonSockDir'}\E)/);   || $fname=~/(mysqlsock|maximasock|rsock|\Q$perlvar{'lonSockDir'}\E)/);
  $cleaned++;   $cleaned++;
  &log($fh,"Unlinking $fname<br />");   &log($fh,"Unlinking $fname<br />");
  unlink("/home/httpd/sockets/$fname");   unlink("/home/httpd/sockets/$fname");
Line 469  sub rotate_lonnet_logs { Line 564  sub rotate_lonnet_logs {
   
 sub rotate_other_logs {  sub rotate_other_logs {
     my ($fh) = @_;      my ($fh) = @_;
     my $fname="$perlvar{'lonDaemons'}/logs/autoenroll.log";      my %logs = (
     &rotate_logfile($fname,$fh,'Auto Enroll log');                    autoenroll          => 'Auto Enroll log',
     $fname="$perlvar{'lonDaemons'}/logs/autocreate.log";                    autocreate          => 'Create Course log',
     &rotate_logfile($fname,$fh,'Create Course log');                    searchcat           => 'Search Cataloguing log',
     $fname="$perlvar{'lonDaemons'}/logs/searchcat.log";                    autoupdate          => 'Auto Update log',
     &rotate_logfile($fname,$fh,'Search Cataloguing log');                    refreshcourseids_db => 'Refresh CourseIDs db log',
                  );
       foreach my $item (keys(%logs)) {
           my $fname=$perlvar{'lonDaemons'}.'/logs/'.$item.'.log';
           &rotate_logfile($fname,$fh,$logs{$item});
       }
 }  }
   
 # ----------------------------------------------------------------- Connections  # ----------------------------------------------------------------- Connections
Line 585  sub log_simplestatus { Line 685  sub log_simplestatus {
     $sfh->close();      $sfh->close();
 }  }
   
   sub write_loncaparevs {
       if (open(my $fh,">$perlvar{'lonTabDir'}/loncaparevs.tab")) {
           my %hostname = &Apache::lonnet::all_hostnames();
           foreach my $id (sort(keys(%hostname))) {
               if ($id ne '') {
                   my $loncaparev = &Apache::lonnet::get_server_loncaparev('',$id,1,'loncron');
                   if ($loncaparev =~ /^[\w.\-]+$/) {
                       print $fh $id.':'.$loncaparev."\n";
                   }
               }
           }
           close($fh);
       }
       return;
   }
   
   sub write_serverhomeIDs {
       if (open(my $fh,">$perlvar{'lonTabDir'}/serverhomeIDs.tab")) {
           my %name_to_host = &Apache::lonnet::all_names();
           foreach my $name (sort(keys(%name_to_host))) {
               if ($name ne '') {
                   if (ref($name_to_host{$name}) eq 'ARRAY') {
                       my $serverhomeID = &Apache::lonnet::get_server_homeID($name,1,'loncron');
                       if ($serverhomeID ne '') {
                           print $fh $name.':'.$serverhomeID."\n";
                       } else {
                           print $fh $name.':'.$name_to_host{$name}->[0]."\n";
                       }
                   }
               }
           }
           close($fh);
       }
       return;
   }
   
 sub send_mail {  sub send_mail {
     print "sending mail\n";      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,
                                    'lonstatusmail',$defdom,$origmail);                                     'lonstatusmail',$defdom,$origmail);
     if ($totalcount>2500) {      if ($totalcount>2500) {
Line 673  sub main () { Line 809  sub main () {
     &Apache::lonnet::load_domain_tab(1);      &Apache::lonnet::load_domain_tab(1);
     &Apache::lonnet::get_iphost(1);      &Apache::lonnet::get_iphost(1);
   
   # ----------------------------------------- Force firewall update for lond port  
   
       if ((!$justcheckdaemons) && (!$justreload)) {
           my $now = time;
           my $tmpfile = $perlvar{'lonDaemons'}.'/tmp/lciptables_iphost_'.
                         $now.$$.int(rand(10000));
           if (open(my $fh,">$tmpfile")) {
               my %iphosts = &Apache::lonnet::get_iphost();
               foreach my $key (keys(%iphosts)) {
                   print $fh "$key\n";
               }
               close($fh);
               my $execpath = $perlvar{'lonDaemons'}.'/lciptables';
               system("$execpath $tmpfile");
               unlink($fh);
           }
       }
   
 # ---------------------------------------------------------------- Start report  # ---------------------------------------------------------------- Start report
   
     $errors=0;      $errors=0;
Line 699  sub main () { Line 853  sub main () {
  }   }
  &checkon_daemon($fh,'lonc',40000,'USR1');   &checkon_daemon($fh,'lonc',40000,'USR1');
         &checkon_daemon($fh,'lonmaxima',40000);          &checkon_daemon($fh,'lonmaxima',40000);
           &checkon_daemon($fh,'lonr',40000);
     }      }
     if ($justreload) {      if ($justreload) {
  &checkon_daemon($fh,'lond',40000,'USR2');   &checkon_daemon($fh,'lond',40000,'USR2');
Line 711  sub main () { Line 866  sub main () {
  &check_delayed_msg($fh);   &check_delayed_msg($fh);
  &finish_logging($fh);   &finish_logging($fh);
  &log_simplestatus();   &log_simplestatus();
           &write_loncaparevs();
           &write_serverhomeIDs();
   
  if ($totalcount>200 && !$noemail) { &send_mail(); }   if ($totalcount>200 && !$noemail) { &send_mail(); }
     }      }

Removed from v.1.78  
changed lines
  Added in v.1.87


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