Diff for /loncom/loncron between versions 1.123 and 1.134

version 1.123, 2020/05/06 14:31:59 version 1.134, 2024/10/24 19:48:51
Line 42  use IO::File; Line 42  use IO::File;
 use IO::Socket;  use IO::Socket;
 use HTML::Entities;  use HTML::Entities;
 use Getopt::Long;  use Getopt::Long;
 use GDBM_File;  use GDBM_File qw(GDBM_READER);
 use Storable qw(thaw);  use Storable qw(thaw);
 use File::ReadBackwards;  use File::ReadBackwards;
 use File::Copy;  use File::Copy;
Line 80  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 121  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 132  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 217  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 230  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 250  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 274  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 294  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 322  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 413  sub recursive_clean_tmp { Line 429  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 471  sub recursive_clean_tmp { Line 487  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 542  sub clean_balanceIDs { Line 558  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 653  sub rotate_lonnet_logs { Line 669  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 982  sub log_simplestatus { Line 998  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();
     }      }
     print $sfh "\n";  
     $sfh->close();  
 }  }
   
 sub write_loncaparevs {  sub write_loncaparevs {
Line 1032  sub write_serverhomeIDs { Line 1050  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 1167  sub write_hostips { Line 1185  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 1329  sub write_hosttypes { Line 1347  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 1476  sub read_serverhomeIDs { Line 1494  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 1580  sub main () { Line 1750  sub main () {
     my $wwwid=getpwnam('www');      my $wwwid=getpwnam('www');
     if ($wwwid!=$<) {      if ($wwwid!=$<) {
  print("User ID mismatch. This program must be run as user 'www'.\n");   print("User ID mismatch. This program must be run as user 'www'.\n");
  my $emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}";   my $emailto="$perlvar{'lonAdmEMail'} $perlvar{'lonSysEMail'}";
  my $subj="LON: $perlvar{'lonHostID'} User ID mismatch";   my $subj="LON: $perlvar{'lonHostID'} User ID mismatch";
  system("echo 'User ID mismatch. loncron must be run as user www.' |".   system("echo 'User ID mismatch. loncron must be run as user www.' |".
                " mail -s '$subj' $emailto > /dev/null");                 " mail -s '$subj' $emailto > /dev/null");
Line 1608  sub main () { Line 1778  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 1623  sub main () { Line 1793  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 1635  sub main () { Line 1805  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();
Line 1672  sub main () { Line 1842  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.123  
changed lines
  Added in v.1.134


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