--- loncom/loncron	2024/07/10 04:10:35	1.131
+++ loncom/loncron	2024/10/24 21:24:43	1.136
@@ -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.136 2024/10/24 21:24:43 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,15 @@ 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();
+    } else {
+        print "Could not write to $statusdir/loncron_simple.txt\n";
     }
-    print $sfh "\n";
-    $sfh->close();
 }
 
 sub write_loncaparevs {
@@ -1028,10 +1032,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 +1070,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 +1136,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 +1163,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 +1268,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 +1375,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 +1550,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 +1570,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 +1682,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 +1798,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 +1859,18 @@ sub main () {
         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 www, so R commands sent to lon daemon will be processed.</p>');
-           if ($bracketed_warning) {
+                '<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");