--- loncom/loncron 2024/07/10 04:10:35 1.131 +++ loncom/loncron 2024/10/24 20:50:05 1.135 @@ -2,7 +2,7 @@ # Housekeeping program, started by cron, loncontrol and loncron.pl # -# $Id: loncron,v 1.131 2024/07/10 04:10:35 raeburn Exp $ +# $Id: loncron,v 1.135 2024/10/24 20:50:05 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -309,7 +309,7 @@ sub log_machine_info { sub start_logging { my $fh=IO::File->new(">$statusdir/newstatus.html"); - my %simplestatus=(); + %simplestatus=(); my $now=time; my $date=localtime($now); @@ -998,11 +998,13 @@ sub log_simplestatus { rename("$statusdir/newstatus.html","$statusdir/index.html"); my $sfh=IO::File->new(">$statusdir/loncron_simple.txt"); - foreach (keys %simplestatus) { - print $sfh $_.'='.$simplestatus{$_}.'&'; + if (defined($sfh)) { + foreach my $key (keys(%simplestatus)) { + print $sfh $key.'='.$simplestatus{$key}.'&'; + } + print $sfh "\n"; + $sfh->close(); } - print $sfh "\n"; - $sfh->close(); } sub write_loncaparevs { @@ -1028,10 +1030,12 @@ sub write_loncaparevs { } } if ($output) { - if (open(my $fh,">$perlvar{'lonTabDir'}/loncaparevs.tab")) { + if (open(my $fh,'>',"$perlvar{'lonTabDir'}/loncaparevs.tab")) { print $fh $output; close($fh); &Apache::lonnet::load_loncaparevs(); + } else { + print "Could not write to $perlvar{'lonTabDir'}/loncaparevs.tab\n"; } } return; @@ -1064,10 +1068,12 @@ sub write_serverhomeIDs { } } if ($output) { - if (open(my $fh,">$perlvar{'lonTabDir'}/serverhomeIDs.tab")) { + if (open(my $fh,'>',"$perlvar{'lonTabDir'}/serverhomeIDs.tab")) { print $fh $output; close($fh); &Apache::lonnet::load_serverhomeIDs(); + } else { + print "Could not write to $perlvar{'lonTabDir'}/serverhomeIDs.tab\n"; } } return; @@ -1128,6 +1134,8 @@ sub write_hostips { } close($fh); chmod(0644,$newfile); + } else { + print "Could not write to $lontabdir/currhostips.tab\n"; } } if (keys(%prevhosts) && keys(%currhosts)) { @@ -1153,6 +1161,8 @@ sub write_hostips { } print $fh "\n*******************\n\n"; close($fh); + } else { + print "Could not write to $perlvar{'lonDaemons'}/logs/hostip.log\n"; } my $emailto = &Apache::loncommon::build_recipient_list(undef, 'hostipmail',$defdom); @@ -1256,6 +1266,8 @@ sub write_connection_config { } close($fh); print "Completed writing SSL options for lonc/lond for $count items.\n"; + } else { + print "Could not write to $perlvar{'lonTabDir'}/connectionrules.tab\n"; } } else { print "Writing of SSL options skipped - no connection rules in domain configuration.\n"; @@ -1361,6 +1373,8 @@ sub write_hosttypes { } close($fh); print "Completed writing host type data for $count hosts.\n"; + } else { + print "Could not write to $perlvar{'lonTabDir'}/hosttypes.tab\n"; } } else { print "Writing of host types skipped - no hosts found.\n"; @@ -1534,9 +1548,17 @@ sub set_bracketed_paste_off { if (!-e $bash_www_cnf) { system("touch $bash_www_cnf"); if (open(my $cfh,'>',$bash_www_cnf)) { - print $cfh "set enable-bracketed-paste off\n"; + 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"; + $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'"; } @@ -1546,39 +1568,91 @@ sub set_bracketed_paste_off { chown($wwwuid,$wwwgid,$bash_www_cnf); } } else { - my ($bracketed_paste_on,$bracketed_paste_off,@preserve); + 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') { - $bracketed_paste_off = 1; + if ($condition ne '') { + $bracketed_paste_off{$condition} = 1; + } else { + $bracketed_paste_off{all} = 1; + } + push(@preserve,$line); } else { - $bracketed_paste_on = 1; + 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); - if ($bracketed_paste_on || !$bracketed_paste_off) { - if (open(my $cfh,'>',$bash_www_cnf)) { - print $cfh "set enable-bracketed-paste off\n"; - if (@preserve) { - foreach my $entry (@preserve) { - print $cfh "$entry\n"; - } + } 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 } - close($cfh); - $result = "Updated $bash_www_cnf"; } else { - $result = "Could not open $bash_www_cnf to add 'set enable-bracketed-paste to off'"; +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 = "No action needed; $bash_www_cnf already includes 'set enable-bracketed-paste to off'"; + $result = "Could not open $bash_www_cnf to add 'set enable-bracketed-paste to off'"; } } else { - $result = "Could not open $bash_www_cnf to check if a value is included for 'enable-bracketed-paste'."; + $result = "No action needed; $bash_www_cnf already includes 'set enable-bracketed-paste to off'"; } } return $result; @@ -1606,7 +1680,7 @@ sub send_mail { "Subject: ".$subj."\n". "Content-type: text/html\; charset=UTF-8\n". "MIME-Version: 1.0\n\n"; - if (open(my $fh,"<$statusdir/index.html")) { + if (open(my $fh,'<',$statusdir/index.html")) { while (<$fh>) { $loncronmail .= $_; } @@ -1722,7 +1796,7 @@ sub main () { my $now = time; my $tmpfile = $perlvar{'lonDaemons'}.'/tmp/lciptables_iphost_'. $now.$$.int(rand(10000)); - if (open(my $fh,">$tmpfile")) { + if (open(my $fh,'>',"$tmpfile")) { my %iphosts = &Apache::lonnet::get_iphost(); foreach my $key (keys(%iphosts)) { print $fh "$key\n"; @@ -1783,8 +1857,18 @@ sub main () { my ($bracketed_warning,$check_bracketed_paste) = &check_bash_settings(); if ($check_bracketed_paste) { &log($fh,'
Distros using bash readline library 8.1 or later need bracketed paste disabled for www, so R commands sent to lon daemon will be processed.
'); - if ($bracketed_warning) { + '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.
'); + 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,''.$bash_update.'
'."\n");