Diff for /loncom/loncron between versions 1.129 and 1.137

version 1.129, 2024/06/22 14:29:36 version 1.137, 2024/12/25 02:32:47
Line 134  sub checkon_daemon { Line 134  sub checkon_daemon {
     }      }
   
     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 206  sub checkon_daemon { Line 206  sub checkon_daemon {
     if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){      if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){
         &log($fh,"<p><pre>");          &log($fh,"<p><pre>");
         if (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++; }
Line 249  sub log_machine_info { Line 249  sub log_machine_info {
     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);
Line 309  sub log_machine_info { Line 309  sub log_machine_info {
   
 sub start_logging {  sub start_logging {
     my $fh=IO::File->new(">$statusdir/newstatus.html");      my $fh=IO::File->new(">$statusdir/newstatus.html");
     my %simplestatus=();      %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 337  sub start_logging { Line 337  sub start_logging {
 <li><a href="#lonc">lonc</a></li>  <li><a href="#lonc">lonc</a></li>
 <li><a href="#lonnet">lonnet</a></li>  <li><a href="#lonnet">lonnet</a></li>
 <li><a href="#connections">Connections</a></li>  <li><a href="#connections">Connections</a></li>
   <li><a href="#bashconf">bash readline config</a></li>
 <li><a href="#delayed">Delayed Messages</a></li>  <li><a href="#delayed">Delayed Messages</a></li>
 <li><a href="#errcount">Error Count</a></li>  <li><a href="#errcount">Error Count</a></li>
 </ol>  </ol>
Line 425  sub recursive_clean_tmp { Line 426  sub recursive_clean_tmp {
                 } else {                  } else {
                     $innerdir = $subdir.'/'.$file;                      $innerdir = $subdir.'/'.$file;
                 }                  }
                 ($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();
   
Line 471  sub recursive_clean_tmp { Line 472  sub recursive_clean_tmp {
                             if ($line=~/^CHECKOUTTOKEN\&/) {                              if ($line=~/^CHECKOUTTOKEN\&/) {
                                 if ($since>365*$perlvar{'lonExpire'}) {                                  if ($since>365*$perlvar{'lonExpire'}) {
                                     if (unlink($fname)) {                                      if (unlink($fname)) {
                                         $cleaned++;                                           $cleaned++;
                                     } elsif (ref($errors->{file}) eq 'ARRAY') {                                      } elsif (ref($errors->{file}) eq 'ARRAY') {
                                         push(@{$errors->{file}},$fname);                                          push(@{$errors->{file}},$fname);
                                     }                                      }
Line 637  sub clean_sockets { Line 638  sub clean_sockets {
     my $cleaned=0;      my $cleaned=0;
     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|rsock|\Q$perlvar{'lonSockDir'}\E)/);   || $fname=~/(mysqlsock|maximasock|rsock|\Q$perlvar{'lonSockDir'}\E)/);
  $cleaned++;   $cleaned++;
  &log($fh,"Unlinking $fname<br />");   &log($fh,"Unlinking $fname<br />");
Line 744  sub check_delayed_msg { Line 745  sub check_delayed_msg {
     my ($fh,$weightsref,$exclusionsref)=@_;      my ($fh,$weightsref,$exclusionsref)=@_;
     &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;
Line 815  sub check_delayed_msg { Line 816  sub check_delayed_msg {
             last;              last;
         }          }
         undef $dfh;          undef $dfh;
     }       }
   
     if ($checkbackwards) {      if ($checkbackwards) {
         if (tie *BW, 'File::ReadBackwards', "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {          if (tie *BW, 'File::ReadBackwards', "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {
Line 995  sub finish_logging { Line 996  sub finish_logging {
   
 sub log_simplestatus {  sub log_simplestatus {
     rename("$statusdir/newstatus.html","$statusdir/index.html");      rename("$statusdir/newstatus.html","$statusdir/index.html");
       
     my $sfh=IO::File->new(">$statusdir/loncron_simple.txt");      my $sfh=IO::File->new(">$statusdir/loncron_simple.txt");
     foreach (keys %simplestatus) {      if (defined($sfh)) {
  print $sfh $_.'='.$simplestatus{$_}.'&';          foreach my $key (keys(%simplestatus)) {
               print $sfh $key.'='.$simplestatus{$key}.'&';
           }
           print $sfh "\n";
           $sfh->close();
       } else {
           print "Could not write to $statusdir/loncron_simple.txt\n";
     }      }
     print $sfh "\n";  
     $sfh->close();  
 }  }
   
 sub write_loncaparevs {  sub write_loncaparevs {
Line 1019  sub write_loncaparevs { Line 1024  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 1027  sub write_loncaparevs { Line 1032  sub write_loncaparevs {
         }          }
     }      }
     if ($output) {      if ($output) {
         if (open(my $fh,">$perlvar{'lonTabDir'}/loncaparevs.tab")) {          if (open(my $fh,'>',"$perlvar{'lonTabDir'}/loncaparevs.tab")) {
             print $fh $output;              print $fh $output;
             close($fh);              close($fh);
             &Apache::lonnet::load_loncaparevs();              &Apache::lonnet::load_loncaparevs();
           } else {
               print "Could not write to $perlvar{'lonTabDir'}/loncaparevs.tab\n";
         }          }
     }      }
     return;      return;
Line 1052  sub write_serverhomeIDs { Line 1059  sub write_serverhomeIDs {
                     alarm(0);                      alarm(0);
                 };                  };
                 if ($@ && $@ =~ m/TIMEOUT/) {                  if ($@ && $@ =~ m/TIMEOUT/) {
                     print "Time out while contacting server: $name\n";                       print "Time out while contacting server: $name\n";
                 }                  }
                 if ($serverhomeID ne '') {                  if ($serverhomeID ne '') {
                     $output .= $name.':'.$serverhomeID."\n";                      $output .= $name.':'.$serverhomeID."\n";
Line 1063  sub write_serverhomeIDs { Line 1070  sub write_serverhomeIDs {
         }          }
     }      }
     if ($output) {      if ($output) {
         if (open(my $fh,">$perlvar{'lonTabDir'}/serverhomeIDs.tab")) {          if (open(my $fh,'>',"$perlvar{'lonTabDir'}/serverhomeIDs.tab")) {
             print $fh $output;              print $fh $output;
             close($fh);              close($fh);
             &Apache::lonnet::load_serverhomeIDs();              &Apache::lonnet::load_serverhomeIDs();
           } else {
               print "Could not write to $perlvar{'lonTabDir'}/serverhomeIDs.tab\n";
         }          }
     }      }
     return;      return;
Line 1087  sub write_checksums { Line 1096  sub write_checksums {
         }          }
         print "File version retrieved and checksumming completed for $numchksums files.\n";          print "File version retrieved and checksumming completed for $numchksums files.\n";
     } else {      } else {
         print "File version retrieval and checksumming skipped - could not determine Linux distro.\n";           print "File version retrieval and checksumming skipped - could not determine Linux distro.\n";
     }      }
     return;      return;
 }  }
Line 1127  sub write_hostips { Line 1136  sub write_hostips {
             }              }
             close($fh);              close($fh);
             chmod(0644,$newfile);              chmod(0644,$newfile);
           } else {
               print "Could not write to $lontabdir/currhostips.tab\n";
         }          }
     }      }
     if (keys(%prevhosts) && keys(%currhosts)) {      if (keys(%prevhosts) && keys(%currhosts)) {
Line 1152  sub write_hostips { Line 1163  sub write_hostips {
                 }                  }
                 print $fh "\n*******************\n\n";                  print $fh "\n*******************\n\n";
                 close($fh);                  close($fh);
               } else {
                   print "Could not write to $perlvar{'lonDaemons'}/logs/hostip.log\n";
             }              }
             my $emailto = &Apache::loncommon::build_recipient_list(undef,              my $emailto = &Apache::loncommon::build_recipient_list(undef,
                                    'hostipmail',$defdom);                                     'hostipmail',$defdom);
Line 1227  sub write_connection_config { Line 1240  sub write_connection_config {
             }              }
         }          }
         if (keys(%connectssl)) {          if (keys(%connectssl)) {
             my %currconf;               my %currconf;
             if (open(my $fh,'<',"$perlvar{'lonTabDir'}/connectionrules.tab")) {              if (open(my $fh,'<',"$perlvar{'lonTabDir'}/connectionrules.tab")) {
                 while (my $line = <$fh>) {                  while (my $line = <$fh>) {
                     chomp($line);                      chomp($line);
Line 1242  sub write_connection_config { Line 1255  sub write_connection_config {
             }              }
             if (open(my $fh,'>',"$perlvar{'lonTabDir'}/connectionrules.tab")) {              if (open(my $fh,'>',"$perlvar{'lonTabDir'}/connectionrules.tab")) {
                 my $count = 0;                  my $count = 0;
                 foreach my $key (sort(keys(%connectssl))) {                   foreach my $key (sort(keys(%connectssl))) {
                     print $fh "$key=$connectssl{$key}\n";                      print $fh "$key=$connectssl{$key}\n";
                     if (exists($currconf{$key})) {                      if (exists($currconf{$key})) {
                         unless ($currconf{$key} eq $connectssl{$key}) {                          unless ($currconf{$key} eq $connectssl{$key}) {
Line 1255  sub write_connection_config { Line 1268  sub write_connection_config {
                 }                  }
                 close($fh);                  close($fh);
                 print "Completed writing SSL options for lonc/lond for $count items.\n";                  print "Completed writing SSL options for lonc/lond for $count items.\n";
               } else {
                   print "Could not write to $perlvar{'lonTabDir'}/connectionrules.tab\n";
             }              }
         } else {          } else {
             print "Writing of SSL options skipped - no connection rules in domain configuration.\n";              print "Writing of SSL options skipped - no connection rules in domain configuration.\n";
Line 1360  sub write_hosttypes { Line 1375  sub write_hosttypes {
                 }                  }
                 close($fh);                  close($fh);
                 print "Completed writing host type data for $count hosts.\n";                  print "Completed writing host type data for $count hosts.\n";
               } else {
                   print "Could not write to $perlvar{'lonTabDir'}/hosttypes.tab\n";
             }              }
         } else {          } else {
             print "Writing of host types skipped - no hosts found.\n";              print "Writing of host types skipped - no hosts found.\n";
Line 1491  sub read_serverhomeIDs { Line 1508  sub read_serverhomeIDs {
     return %server;      return %server;
 }  }
   
   sub check_bash_settings {
       my $distro = &LONCAPA::distro();
       my ($check_bracketed_paste,$bracketed_warning);
       if ($distro  =~ /^debian(\d+)$/) {
           if ($1 >= 12) {
               $check_bracketed_paste = 1;
           }
       } elsif ($distro =~ /^ubuntu(\d+)$/) {
           if ($1 >= 22) {
               $check_bracketed_paste = 1;
           }
       } elsif ($distro =~ /^(?:redhat|oracle|alma|rocky|centos-stream)(\d+)$/) {
           if ($1 >= 9) {
               $check_bracketed_paste = 1;
           }
       } elsif ($distro =~ /^fedora(\d+)/) {
           if ($1 >= 34) {
               $check_bracketed_paste = 1;
           }
       }
       if ($check_bracketed_paste) {
           if (open(PIPE,"bind -V 2>&1 | grep enable-bracketed-paste |")) {
               my $info = <PIPE>;
               chomp($info);
               my ($bracketed) = ($info =~ /^\Qenable-bracketed-paste\E\s+is\s+set\s+to\s+\W(on|off)\W$/);
               close(PIPE);
               if ($bracketed eq 'on') {
                   $bracketed_warning = 1;
               }
           } else {
               print "Unable to check if bracketed paste is set to off for www user's shell\n";
           }
       }
       return ($bracketed_warning,$check_bracketed_paste);
   }
   
   sub set_bracketed_paste_off {
       my $bash_www_cnf = '/home/www/.inputrc';
       my $result;
       if (!-e $bash_www_cnf) {
           system("touch $bash_www_cnf");
           if (open(my $cfh,'>',$bash_www_cnf)) {
               print $cfh <<'END';
   $if R
       set enable-bracketed-paste off
   $endif
   
   $if maxima
       set enable-bracketed-paste off
   $endif
   END
               close($cfh);
               $result = "Updated $bash_www_cnf so enable-bracketed-paste is off for R bash shell";
           } else {
               $result = "Could not open $bash_www_cnf to add 'set enable-bracketed-paste to off'";
           }
           my $wwwuid = getpwnam('www');
           my $wwwgid = getgrnam('www');
           if ($wwwuid!=$<) {
               chown($wwwuid,$wwwgid,$bash_www_cnf);
           }
       } else {
           my (%bracketed_paste_on,%bracketed_paste_off,@preserve,$condition);
           $condition = '';
           if (open(my $cfh,'<',$bash_www_cnf)) {
               while (my $line=<$cfh>) {
                   chomp($line);
                   if ($line =~ /^\$if\s+(\w+)\s*$/) {
                       if ($1 eq 'R') {
                           $condition = 'r';
                       } elsif ($1 eq 'maxima') {
                           $condition = 'maxima';
                       } else {
                           $condition = 'other';
                       }
                   } elsif ($line =~ /^\$endif\s*$/) {
                       $condition = '';
                   }
                   if ($line =~ /^\s*set\s+enable\-bracketed\-paste\s+(off|on)\s*$/) {
                       if ($1 eq 'off') {
                           if ($condition ne '') {
                               $bracketed_paste_off{$condition} = 1;
                           } else {
                               $bracketed_paste_off{all} = 1;
                           }
                           push(@preserve,$line);
                       } else {
                           if ($condition ne '') {
                               $bracketed_paste_on{$condition} = 1;
                               if (($condition eq 'r') || ($condition eq 'maxima')) {
                                   push(@preserve,'    set enable-bracketed-paste off');
                               } else {
                                   push(@preserve,$line);
                               }
                           } else {
                               $bracketed_paste_on{all} = 1;
                               push(@preserve,$line);
                           }
                       }
                   } else {
                       push(@preserve,$line);
                   }
               }
               close($cfh);
           } else {
               $result = "Could not open $bash_www_cnf to check if a value is included for 'enable-bracketed-paste'.";
           }
           if (($bracketed_paste_on{r} || $bracketed_paste_on{maxima}) ||
               (!exists($bracketed_paste_off{r}) && !exists($bracketed_paste_on{r}) &&
                !exists($bracketed_paste_off{maxima}) && !exists($bracketed_paste_on{maxima}))) {
               if (open(my $cfh,'>',$bash_www_cnf)) {
                   if (@preserve) {
                       foreach my $entry (@preserve) {
                           print $cfh "$entry\n";
                       }
                       if (!exists($bracketed_paste_off{r}) && !exists($bracketed_paste_on{r})) {
   print $cfh <<'END';
   $if R
       set enable-bracketed-paste off
   $endif
   END
                       }
                       if (!exists($bracketed_paste_off{r}) && !exists($bracketed_paste_on{r})) {
   print $cfh <<'END';
   $if maxima
       set enable-bracketed-paste off
   $endif
   END
                       }
                   } else {
   print $cfh <<'END';
   $if R
       set enable-bracketed-paste off
   $endif
   
   $if maxima
       set enable-bracketed-paste off
   $endif
   END
                   }
                   close($cfh);
                   $result = "Updated $bash_www_cnf";
               } else {
                   $result = "Could not open $bash_www_cnf to add 'set enable-bracketed-paste to off'";
               }
           } else {
               $result = "No action needed; $bash_www_cnf already includes 'set enable-bracketed-paste to off'";
           }
       }
       return $result;
   }
   
 sub send_mail {  sub send_mail {
     my ($sysmail,$reportstatus) = @_;      my ($sysmail,$reportstatus) = @_;
     my $defdom = $perlvar{'lonDefDomain'};      my $defdom = $perlvar{'lonDefDomain'};
Line 1513  sub send_mail { Line 1682  sub send_mail {
                       "Subject: ".$subj."\n".                        "Subject: ".$subj."\n".
                       "Content-type: text/html\; charset=UTF-8\n".                        "Content-type: text/html\; charset=UTF-8\n".
                       "MIME-Version: 1.0\n\n";                        "MIME-Version: 1.0\n\n";
     if (open(my $fh,"<$statusdir/index.html")) {      if (open(my $fh,'<',"$statusdir/index.html")) {
         while (<$fh>) {          while (<$fh>) {
             $loncronmail .= $_;              $loncronmail .= $_;
         }          }
Line 1536  sub usage { Line 1705  sub 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
    --noemail  Do not send the status email     --noemail  Do not send the status email
    --justcheckconnections  Only check the current status of the lonc/d     --justcheckconnections  Only check the current status of the lonc/d
                                 connections, do not send emails do not                                  connections, do not send emails do not
Line 1629  sub main () { Line 1798  sub main () {
         my $now = time;          my $now = time;
         my $tmpfile = $perlvar{'lonDaemons'}.'/tmp/lciptables_iphost_'.          my $tmpfile = $perlvar{'lonDaemons'}.'/tmp/lciptables_iphost_'.
                       $now.$$.int(rand(10000));                        $now.$$.int(rand(10000));
         if (open(my $fh,">$tmpfile")) {          if (open(my $fh,'>',"$tmpfile")) {
             my %iphosts = &Apache::lonnet::get_iphost();              my %iphosts = &Apache::lonnet::get_iphost();
             foreach my $key (keys(%iphosts)) {              foreach my $key (keys(%iphosts)) {
                 print $fh "$key\n";                  print $fh "$key\n";
Line 1679  sub main () { Line 1848  sub main () {
         &clean_nosslverify($fh);          &clean_nosslverify($fh);
         &write_connection_config();          &write_connection_config();
         &write_hosttypes();          &write_hosttypes();
         &update_revocation_list();           &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 1687  sub main () { Line 1856  sub main () {
  &test_connections($fh);   &test_connections($fh);
     }      }
     if (!$justcheckdaemons && !$justcheckconnections && !$justreload && !$justiptables) {      if (!$justcheckdaemons && !$justcheckconnections && !$justreload && !$justiptables) {
           my ($bracketed_warning,$check_bracketed_paste) = &check_bash_settings();
           if ($check_bracketed_paste) {
              &log($fh,'<hr /><a name="bashconf" /><h2>bash readline config</h2><h3>Bracketed Paste</h3>'.
                   '<p>Distros using bash readline library 8.1 or later need bracketed paste disabled for the R bash shell for the www user so R commands sent to lonr daemon will be processed.</p>');
              my $bash_www_cnf = '/home/www/.inputrc';
              my $non_empty_conffile;
              unless ($bracketed_warning) {
                  if (-e $bash_www_cnf) {
                      my $filesize = (stat($bash_www_cnf))[7];
                      if ($filesize > 0) {
                          $non_empty_conffile = 1;
                      }
                  }
              }
              if (($bracketed_warning) || ($non_empty_conffile)) {
                  my $bash_update = &set_bracketed_paste_off();
                  if ($bash_update) {
                      &log($fh,'<p>'.$bash_update.'</p>'."\n");
                  }
              } else {
                  &log($fh,'<p>No action needed; /home/www/.inputrc already set.</p>'."\n");
              }
           } else {
               &log($fh,'<hr /><a name="bashconf" /><h2>bash readline config</h2><h3>Bracketed Paste</h3>'.
                        '<p>No action needed for distros using pre-8.1 bash readline library</p>'."\n");
           }
         my $domconf = &get_domain_config();          my $domconf = &get_domain_config();
         my ($threshold,$sysmail,$reportstatus,$weightsref,$exclusionsref) =          my ($threshold,$sysmail,$reportstatus,$weightsref,$exclusionsref) =
             &get_permcount_settings($domconf);              &get_permcount_settings($domconf);

Removed from v.1.129  
changed lines
  Added in v.1.137


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