Diff for /loncom/loncron between versions 1.119 and 1.126

version 1.119, 2019/07/18 18:28:40 version 1.126, 2021/02/01 01:24:09
Line 46  use GDBM_File; Line 46  use GDBM_File;
 use Storable qw(thaw);  use Storable qw(thaw);
 use File::ReadBackwards;  use File::ReadBackwards;
 use File::Copy;  use File::Copy;
   use Sys::Hostname::FQDN();
   
 #globals  #globals
 use vars qw (%perlvar %simplestatus $errors $warnings $notices $totalcount);  use vars qw (%perlvar %simplestatus $errors $warnings $notices $totalcount);
   
Line 78  sub rotate_logfile { Line 80  sub rotate_logfile {
  rename("$file.2","$file.3");   rename("$file.2","$file.3");
  rename("$file.1","$file.2");   rename("$file.1","$file.2");
  rename("$file","$file.1");   rename("$file","$file.1");
     }       }
 }  }
   
 sub start_daemon {  sub start_daemon {
     my ($fh,$daemon,$pidfile,$args) = @_;      my ($fh,$daemon,$pidfile,$args) = @_;
     my $progname=$daemon;      my $progname=$daemon;
     if ($daemon eq 'lonc') {      if ($daemon eq 'lonc') {
  $progname='loncnew';    $progname='loncnew';
     }      }
     my $error_fname="$perlvar{'lonDaemons'}/logs/${daemon}_errors";      my $error_fname="$perlvar{'lonDaemons'}/logs/${daemon}_errors";
     &rotate_logfile($error_fname,$fh,'error logs');      &rotate_logfile($error_fname,$fh,'error logs');
Line 119  sub checkon_daemon { Line 121  sub checkon_daemon {
     if ($fh) {      if ($fh) {
         if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){          if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){
     if (open(DFH,"tail -n25 $perlvar{'lonDaemons'}/logs/$daemon.log|")) {      if (open(DFH,"tail -n25 $perlvar{'lonDaemons'}/logs/$daemon.log|")) {
         while (my $line=<DFH>) {           while (my $line=<DFH>) {
             &log($fh,"$line");              &log($fh,"$line");
             if ($line=~/INFO/) { $notices++; }              if ($line=~/INFO/) { $notices++; }
             if ($line=~/WARNING/) { $notices++; }              if ($line=~/WARNING/) { $notices++; }
Line 130  sub checkon_daemon { Line 132  sub checkon_daemon {
         }          }
         &log($fh,"</tt></p>");          &log($fh,"</tt></p>");
     }      }
       
     my $pidfile="$perlvar{'lonDaemons'}/logs/$daemon.pid";      my $pidfile="$perlvar{'lonDaemons'}/logs/$daemon.pid";
        
     my $restartflag=1;      my $restartflag=1;
     my $daemonpid;      my $daemonpid;
     if (-e $pidfile) {      if (-e $pidfile) {
Line 215  sub checkon_daemon { Line 217  sub checkon_daemon {
             }              }
  }   }
     }      }
       
     my $fname="$perlvar{'lonDaemons'}/logs/$daemon.log";      my $fname="$perlvar{'lonDaemons'}/logs/$daemon.log";
     &rotate_logfile($fname,$fh,'logs');      &rotate_logfile($fname,$fh,'logs');
   
Line 228  sub log_machine_info { Line 230  sub log_machine_info {
     my ($fh)=@_;      my ($fh)=@_;
     &log($fh,'<hr /><a name="machine" /><h2>Machine Information</h2>');      &log($fh,'<hr /><a name="machine" /><h2>Machine Information</h2>');
     &log($fh,"<h3>loadavg</h3>");      &log($fh,"<h3>loadavg</h3>");
   
       my $cpucount;
       if (open(PIPE,"lscpu |grep '^CPU(s)' 2>&1 |")) {
           my $info = <PIPE>;
           chomp($info);
           ($cpucount) = ($info =~ /^\QCPU(s):\E\s+(\d+)$/);
           close(PIPE);
       }
       if (!$cpucount) {
           $cpucount = 1;
       }
       my %loadtarget = (
                           error => 4.0*$cpucount,
                           warn  => 2.0*$cpucount,
                           note  => 1.0*$cpucount,
                        );
     open (LOADAVGH,"/proc/loadavg");      open (LOADAVGH,"/proc/loadavg");
     my $loadavg=<LOADAVGH>;      my $loadavg=<LOADAVGH>;
     close (LOADAVGH);      close (LOADAVGH);
        
     &log($fh,"<tt>$loadavg</tt>");      &log($fh,"<tt>$loadavg</tt>");
       
     my @parts=split(/\s+/,$loadavg);      my @parts=split(/\s+/,$loadavg);
     if ($parts[1]>4.0) {      if ($parts[1]>$loadtarget{'error'}) {
  $errors++;   $errors++;
     } elsif ($parts[1]>2.0) {      } elsif ($parts[1]>$loadtarget{'warn'}) {
  $warnings++;   $warnings++;
     } elsif ($parts[1]>1.0) {      } elsif ($parts[1]>$loadtarget{'note'}) {
  $notices++;   $notices++;
     }      }
   
Line 248  sub log_machine_info { Line 265  sub log_machine_info {
     &log($fh,"<pre>");      &log($fh,"<pre>");
   
     open (DFH,"df|");      open (DFH,"df|");
     while (my $line=<DFH>) {       while (my $line=<DFH>) {
  &log($fh,&encode_entities($line,'<>&"'));    &log($fh,&encode_entities($line,'<>&"'));
  @parts=split(/\s+/,$line);   @parts=split(/\s+/,$line);
  my $usage=$parts[4];   my $usage=$parts[4];
  $usage=~s/\W//g;   $usage=~s/\W//g;
  if ($usage>90) {    if ($usage>90) {
     $warnings++;      $warnings++;
     $notices++;       $notices++;
  } elsif ($usage>80) {   } elsif ($usage>80) {
     $warnings++;      $warnings++;
  } elsif ($usage>60) {   } elsif ($usage>60) {
Line 272  sub log_machine_info { Line 289  sub log_machine_info {
     my $psproc=0;      my $psproc=0;
   
     open (PSH,"ps aux --cols 140 |");      open (PSH,"ps aux --cols 140 |");
     while (my $line=<PSH>) {       while (my $line=<PSH>) {
  &log($fh,&encode_entities($line,'<>&"'));    &log($fh,&encode_entities($line,'<>&"'));
  $psproc++;   $psproc++;
     }      }
     close (PSH);      close (PSH);
Line 295  sub start_logging { Line 312  sub start_logging {
     my %simplestatus=();      my %simplestatus=();
     my $now=time;      my $now=time;
     my $date=localtime($now);      my $date=localtime($now);
        
   
     &log($fh,(<<ENDHEADERS));      &log($fh,(<<ENDHEADERS));
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Line 411  sub recursive_clean_tmp { Line 428  sub recursive_clean_tmp {
                 ($cleaned,$old,$removed) =                   ($cleaned,$old,$removed) = 
                      &recursive_clean_tmp($innerdir,$cleaned,$old,$removed,$errors);                       &recursive_clean_tmp($innerdir,$cleaned,$old,$removed,$errors);
                 my @doms = &Apache::lonnet::current_machine_domains();                  my @doms = &Apache::lonnet::current_machine_domains();
                   
                 if (open(my $dirhandle,$fname)) {                  if (open(my $dirhandle,$fname)) {
                     unless (($innerdir eq 'helprequests') ||                      unless (($innerdir eq 'helprequests') ||
                             (($innerdir =~ /^addcourse/) && ($innerdir !~ m{/\d+$}))) {                              (($innerdir =~ /^addcourse/) && ($innerdir !~ m{/\d+$}))) {
                         my @contents = grep {!/^\.\.?$/} readdir($dirhandle);                          my @contents = grep {!/^\.\.?$/} readdir($dirhandle);
                                       join('&&',@contents)."\n";                                            join('&&',@contents)."\n";
                         if (scalar(grep {!/^\.\.?$/} readdir($dirhandle)) == 0) {                          if (scalar(grep {!/^\.\.?$/} readdir($dirhandle)) == 0) {
                             closedir($dirhandle);                              closedir($dirhandle);
                             if ($fname =~ m{^\Q$perlvar{'lonDaemons'}\E/tmp/}) {                              if ($fname =~ m{^\Q$perlvar{'lonDaemons'}\E/tmp/}) {
Line 469  sub recursive_clean_tmp { Line 486  sub recursive_clean_tmp {
                                 }                                  }
                             }                              }
                         } elsif (ref($errors->{failopen}) eq 'ARRAY') {                          } elsif (ref($errors->{failopen}) eq 'ARRAY') {
                             push(@{$errors->{failopen}},$fname);                               push(@{$errors->{failopen}},$fname);
                         }                          }
                     } else {                      } else {
                         if (unlink($fname)) {                          if (unlink($fname)) {
Line 495  sub clean_lonIDs { Line 512  sub clean_lonIDs {
     my $cleaned=0;      my $cleaned=0;
     my $active=0;      my $active=0;
     while (my $fname=<$perlvar{'lonIDsDir'}/*>) {      while (my $fname=<$perlvar{'lonIDsDir'}/*>) {
  my ($dev,$ino,$mode,$nlink,          my $now=time;
     $uid,$gid,$rdev,$size,          if (-l $fname) {
     $atime,$mtime,$ctime,              my $linkfname = readlink($fname);
     $blksize,$blocks)=stat($fname);              if (-f $linkfname) {
  my $now=time;                  if ($linkfname =~ m{^$perlvar{'lonIDsDir'}/[^/]+\.id$}) {
  my $since=$now-$mtime;                      my @data = stat($linkfname);
  if ($since>$perlvar{'lonExpire'}) {                      my $mtime = $data[9];
     $cleaned++;                      my $since=$now-$mtime;
     &log($fh,"Unlinking $fname<br />");                      if ($since>$perlvar{'lonExpire'}) {
     unlink("$fname");                          if (unlink($linkfname)) {
  } else {                              $cleaned++;
     $active++;                              &log($fh,"Unlinking $linkfname<br />");
  }                              unlink($fname);
                           }
                       }
                   }
               } else {
                  unlink($fname);
               }
           } elsif (-f $fname) {
               my @data = stat($fname);
               my $mtime = $data[9];
               my $since=$now-$mtime;
               if ($since>$perlvar{'lonExpire'}) {
                   if (unlink($fname)) {
                       $cleaned++;
                       &log($fh,"Unlinking $fname<br />");
                   }
               } else {
                   $active++;
               }
           }
     }      }
     &log($fh,"<p>Cleaned up ".$cleaned." stale session token(s).</p>");      &log($fh,"<p>Cleaned up ".$cleaned." stale session token(s).</p>");
     &log($fh,"<h3>$active open session(s)</h3>");      &log($fh,"<h3>$active open session(s)</h3>");
Line 521  sub clean_balanceIDs { Line 557  sub clean_balanceIDs {
     my $cleaned=0;      my $cleaned=0;
     my $active=0;      my $active=0;
     if (-d $perlvar{'lonBalanceDir'}) {      if (-d $perlvar{'lonBalanceDir'}) {
         while (my $fname=<$perlvar{'balanceDir'}/*.id>) {          while (my $fname=<$perlvar{'lonBalanceDir'}/*.id>) {
             my ($dev,$ino,$mode,$nlink,              my ($dev,$ino,$mode,$nlink,
                 $uid,$gid,$rdev,$size,                  $uid,$gid,$rdev,$size,
                 $atime,$mtime,$ctime,                  $atime,$mtime,$ctime,
Line 632  sub rotate_lonnet_logs { Line 668  sub rotate_lonnet_logs {
     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>) {
     &log($fh,&encode_entities($line,'<>&"'));      &log($fh,&encode_entities($line,'<>&"'));
  }   }
  close (DFH);   close (DFH);
     }      }
     &log($fh,"</pre><h3>Perm Log</h3><pre>");      &log($fh,"</pre><h3>Perm Log</h3><pre>");
       
     if (-e "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {      if (-e "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {
  open(DFH,"tail -n10 $perlvar{'lonDaemons'}/logs/lonnet.perm.log|");   open(DFH,"tail -n10 $perlvar{'lonDaemons'}/logs/lonnet.perm.log|");
  while (my $line=<DFH>) {    while (my $line=<DFH>) {
     &log($fh,&encode_entities($line,'<>&"'));      &log($fh,&encode_entities($line,'<>&"'));
  }   }
  close (DFH);   close (DFH);
Line 1011  sub write_serverhomeIDs { Line 1047  sub write_serverhomeIDs {
                 eval {                  eval {
                     local $SIG{ ALRM } = sub { die "TIMEOUT" };                      local $SIG{ ALRM } = sub { die "TIMEOUT" };
                     alarm(10);                      alarm(10);
                     $serverhomeID =                       $serverhomeID =
                         &Apache::lonnet::get_server_homeID($name,1,'loncron');                          &Apache::lonnet::get_server_homeID($name,1,'loncron');
                     alarm(0);                      alarm(0);
                 };                  };
Line 1096  sub write_hostips { Line 1132  sub write_hostips {
     if (keys(%prevhosts) && keys(%currhosts)) {      if (keys(%prevhosts) && keys(%currhosts)) {
         foreach my $key (keys(%prevhosts)) {          foreach my $key (keys(%prevhosts)) {
             unless ($currhosts{$key} eq $prevhosts{$key}) {              unless ($currhosts{$key} eq $prevhosts{$key}) {
                 $ipchange{$key} = $prevhosts{$key}.'|'.$currhosts{$key};                  $ipchange{$key} = $prevhosts{$key}.' | '.$currhosts{$key};
             }              }
         }          }
         foreach my $key (keys(%currhosts)) {          foreach my $key (keys(%currhosts)) {
Line 1109  sub write_hostips { Line 1145  sub write_hostips {
         if (keys(%ipchange)) {          if (keys(%ipchange)) {
             if (open(my $fh,'>>',$perlvar{'lonDaemons'}.'/logs/hostip.log')) {              if (open(my $fh,'>>',$perlvar{'lonDaemons'}.'/logs/hostip.log')) {
                print $fh "********************\n".localtime(time).' Changes --'."\n".                 print $fh "********************\n".localtime(time).' Changes --'."\n".
                          "Hostname | Previous IP | New IP\n".                           "| Hostname | Previous IP | New IP |\n".
                          "--------------------------------\n";                           " --------------------------------- \n";
                foreach my $hostname (sort(keys(%ipchange))) {                 foreach my $hostname (sort(keys(%ipchange))) {
                     print $fh "$hostname | $ipchange{$hostname}\n";                      print $fh "| $hostname | $ipchange{$hostname} |\n";
                 }                  }
                 print $fh "\n*******************\n\n";                  print $fh "\n*******************\n\n";
                 close($fh);                  close($fh);
Line 1127  sub write_hostips { Line 1163  sub write_hostips {
                               "MIME-Version: 1.0\n\n".                                "MIME-Version: 1.0\n\n".
                               "Host/IP changes\n".                                "Host/IP changes\n".
                               " \n".                                " \n".
                               "Hostname | Previous IP | New IP\n".                                "| Hostname | Previous IP | New IP |\n".
                               "--------------------------------\n";                                " --------------------------------- \n";
                 foreach my $hostname (sort(keys(%ipchange))) {                  foreach my $hostname (sort(keys(%ipchange))) {
                     $chgmail .= "$hostname | $ipchange{$hostname}\n";                      $chgmail .= "| $hostname | $ipchange{$hostname} |\n";
                 }                  }
                 $chgmail .= "\n\n";                  $chgmail .= "\n\n";
                 if (open(my $mailh, "|/usr/lib/sendmail -oi -t -odb")) {                  if (open(my $mailh, "|/usr/lib/sendmail -oi -t -odb")) {
Line 1146  sub write_hostips { Line 1182  sub write_hostips {
   
 sub clean_nosslverify {  sub clean_nosslverify {
     my ($fh) = @_;      my ($fh) = @_;
     my %unlinked;       my %unlinked;
     if (-d "$perlvar{'lonSockDir'}/nosslverify") {      if (-d "$perlvar{'lonSockDir'}/nosslverify") {
         if (opendir(my $dh,"$perlvar{'lonSockDir'}/nosslverify")) {          if (opendir(my $dh,"$perlvar{'lonSockDir'}/nosslverify")) {
             while (my $fname=readdir($dh)) {              while (my $fname=readdir($dh)) {
Line 1308  sub write_hosttypes { Line 1344  sub write_hosttypes {
                 foreach my $lonid (sort(keys(%hostdom))) {                  foreach my $lonid (sort(keys(%hostdom))) {
                     my $type = 'other';                      my $type = 'other';
                     if ($hostdom{$lonid} eq $dom) {                      if ($hostdom{$lonid} eq $dom) {
                         $type = 'dom';                           $type = 'dom';
                     } elsif ($intdom{$lonid} eq $internetdom) {                      } elsif ($intdom{$lonid} eq $internetdom) {
                         $type = 'intdom';                          $type = 'intdom';
                     }                      }
Line 1545  sub main () { Line 1581  sub main () {
     if ('{[[[[lonHostID]]]]}' eq $perlvar{'lonHostID'}) {      if ('{[[[[lonHostID]]]]}' eq $perlvar{'lonHostID'}) {
  print("Unconfigured machine.\n");   print("Unconfigured machine.\n");
  my $emailto=$perlvar{'lonSysEMail'};   my $emailto=$perlvar{'lonSysEMail'};
  my $hostname=`/bin/hostname`;   my $hostname = Sys::Hostname::FQDN::fqdn();
  chop $hostname;   $hostname=~s/\.+/./g;
  $hostname=~s/[^\w\.]//g; # make sure is safe to pass through shell   $hostname=~s/\-+/-/g;
    $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.' |".
                " mail -s '$subj' $emailto > /dev/null");                 " mail -s '$subj' $emailto > /dev/null");
Line 1586  sub main () { Line 1623  sub main () {
         &Apache::lonnet::get_iphost(1,$nomemcache);          &Apache::lonnet::get_iphost(1,$nomemcache);
     }      }
   
 # ----------------------------------------- Force firewall update for lond port    # ----------------------------------------- Force firewall update for lond port
   
     if ((!$justcheckdaemons) && (!$justreload)) {      if ((!$justcheckdaemons) && (!$justreload)) {
         my $now = time;          my $now = time;
Line 1601  sub main () { Line 1638  sub main () {
             if (&LONCAPA::try_to_lock('/tmp/lock_lciptables')) {              if (&LONCAPA::try_to_lock('/tmp/lock_lciptables')) {
                 my $execpath = $perlvar{'lonDaemons'}.'/lciptables';                  my $execpath = $perlvar{'lonDaemons'}.'/lciptables';
                 system("$execpath $tmpfile");                  system("$execpath $tmpfile");
                 unlink('/tmp/lock_lciptables');  # Remove the lock file.                   unlink('/tmp/lock_lciptables');  # Remove the lock file.
             }              }
             unlink($tmpfile);              unlink($tmpfile);
         }          }
Line 1613  sub main () { Line 1650  sub main () {
     $warnings=0;      $warnings=0;
     $notices=0;      $notices=0;
   
   
     my $fh;      my $fh;
     if (!$justcheckdaemons && !$justcheckconnections && !$justreload && !$justiptables) {      if (!$justcheckdaemons && !$justcheckconnections && !$justreload && !$justiptables) {
  $fh=&start_logging();   $fh=&start_logging();

Removed from v.1.119  
changed lines
  Added in v.1.126


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