Diff for /loncom/lonsql between versions 1.71.2.1 and 1.94

version 1.71.2.1, 2006/02/10 09:50:50 version 1.94, 2015/08/05 18:47:12
Line 95  the database. Line 95  the database.
   
 =head1 Internals  =head1 Internals
   
 =over 4  
   
 =cut  =cut
   
 use strict;  use strict;
   
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
   use LONCAPA;
 use LONCAPA::Configuration;  use LONCAPA::Configuration;
 use LONCAPA::lonmetadata();  use LONCAPA::lonmetadata();
   use Apache::lonnet;
   
 use IO::Socket;  use IO::Socket;
 use Symbol;  use Symbol;
 use POSIX;  use POSIX;
 use IO::Select;  use IO::Select;
 use IO::File;  
 use Socket;  
 use Fcntl;  
 use Tie::RefHash;  
 use DBI;  use DBI;
 use File::Find;  use File::Find;
 use localenroll;  use localenroll;
   use GDBM_File;
   
 ########################################################  ########################################################
 ########################################################  ########################################################
   
 =pod  =pod
   
   =over 4
   
 =item Global Variables  =item Global Variables
   
 =over 4  =over 4
Line 203  my $run =0;              # running count Line 202  my $run =0;              # running count
 #  #
 # Read loncapa_apache.conf and loncapa.conf  # Read loncapa_apache.conf and loncapa.conf
 #  #
 my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf');  my %perlvar=%{&LONCAPA::Configuration::read_conf('loncapa.conf')};
 my %perlvar=%{$perlvarref};  
 #  #
 # Write the /home/www/.my.cnf file   # Write the /home/www/.my.cnf file 
 my $conf_file = '/home/www/.my.cnf';  my $conf_file = '/home/www/.my.cnf';
Line 235  unless ($dbh = DBI->connect("DBI:mysql:l Line 233  unless ($dbh = DBI->connect("DBI:mysql:l
     system("echo 'Cannot connect to MySQL database!' |".      system("echo 'Cannot connect to MySQL database!' |".
            " mailto $emailto -s '$subj' > /dev/null");             " mailto $emailto -s '$subj' > /dev/null");
   
     open(SMP,'>/home/httpd/html/lon-status/mysql.txt');      open(SMP,">$perlvar{'lonDocRoot'}/lon-status/mysql.txt");
     print SMP 'time='.time.'&mysql=defunct'."\n";      print SMP 'time='.time.'&mysql=defunct'."\n";
     close(SMP);      close(SMP);
   
     exit 1;      exit 1;
 } else {  } else {
     unlink('/home/httpd/html/lon-status/mysql.txt');      unlink("$perlvar{'lonDocRoot'}/lon-status/mysql.txt");
     $dbh->disconnect;      $dbh->disconnect;
 }  }
   
Line 250  unless ($dbh = DBI->connect("DBI:mysql:l Line 248  unless ($dbh = DBI->connect("DBI:mysql:l
 #  #
 my $pidfile="$perlvar{'lonDaemons'}/logs/lonsql.pid";  my $pidfile="$perlvar{'lonDaemons'}/logs/lonsql.pid";
 if (-e $pidfile) {  if (-e $pidfile) {
    my $lfh=IO::File->new("$pidfile");     open(my $lfh,"$pidfile");
    my $pide=<$lfh>;     my $pide=<$lfh>;
    chomp($pide);     chomp($pide);
    if (kill 0 => $pide) { die "already running"; }     if (kill 0 => $pide) { die "already running"; }
 }  }
   
 #  
 # Read hosts file  
 #  
 my $thisserver;  
 my $PREFORK=4; # number of children to maintain, at least four spare  my $PREFORK=4; # number of children to maintain, at least four spare
 open (CONFIG,"$perlvar{'lonTabDir'}/hosts.tab") || die "Can't read host file";  
 while (my $configline=<CONFIG>) {  
     my ($id,$domain,$role,$name)=split(/:/,$configline);  
     $name=~s/\s//g;  
     $thisserver=$name if ($id eq $perlvar{'lonHostID'});  
     #$PREFORK++;  
 }  
 close(CONFIG);  
 #  #
 #$PREFORK=int($PREFORK/4);  #$PREFORK=int($PREFORK/4);
   
Line 386  sub make_new_child { Line 372  sub make_new_child {
     $run = $run+1;      $run = $run+1;
     my $userinput = <$client>;      my $userinput = <$client>;
     chomp($userinput);      chomp($userinput);
               $userinput=~s/\:($LONCAPA::domain_re)$//;
               my $searchdomain=$1;
             #              #
     my ($conserver,$query,      my ($conserver,$query,
  $arg1,$arg2,$arg3)=split(/&/,$userinput);   $arg1,$arg2,$arg3)=split(/&/,$userinput);
     my $query=unescape($query);      my $query=unescape($query);
             #              #
             #send query id which is pid_unixdatetime_runningcounter              #send query id which is pid_unixdatetime_runningcounter
     my $queryid = $thisserver;      my $queryid = &Apache::lonnet::hostname($perlvar{'lonHostID'});
     $queryid .="_".($$)."_";      $queryid .="_".($$)."_";
     $queryid .= time."_";      $queryid .= time."_";
     $queryid .= $run;      $queryid .= $run;
     print $client "$queryid\n";      print $client "$queryid\n";
     #      #
     # &logthis("QUERY: $query - $arg1 - $arg2 - $arg3");      # &logthis("QUERY: $query - $arg1 - $arg2 - $arg3 - $queryid");
     sleep 1;      # sleep 1;
             #              #
             my $result='';              my $result='';
             #              #
Line 418  sub make_new_child { Line 406  sub make_new_child {
                     } else {                      } else {
                         $result=&courselog($path,$command);                          $result=&courselog($path,$command);
                     }                      }
                       $result = &escape($result);
                 } else {                  } else {
                     &logthis('Unable to do log query: '.$uname.'@'.$udom);                      &logthis('Unable to do log query: '.$uname.'@'.$udom);
                     $result='no_such_file';                      $result='no_such_file';
Line 452  sub make_new_child { Line 441  sub make_new_child {
                 if ($locresult) {                  if ($locresult) {
                     $result .= &escape(join(':',map{$_.'='.$replies{$_}} keys %replies));                      $result .= &escape(join(':',map{$_.'='.$replies{$_}} keys %replies));
                 }                  }
               } elsif ($query eq 'usersearch') {
                   my ($srchby,$srchtype,$srchterm);
                   if ((&unescape($arg1) eq $searchdomain) &&
                       ($arg2 =~ /\%\%/)) {
                       ($srchby,$srchtype) =
                           map {&unescape($_);} (split(/\%\%/,$arg2));
                       $srchterm = &unescape($arg3);
                   } else {
                       ($srchby,$srchtype,$srchterm) =
                           map {&unescape($_);} ($arg1,$arg2,$arg3);
                   }
                   $result = &do_user_search($searchdomain,$srchby,
                                             $srchtype,$srchterm);
       } elsif ($query eq 'instdirsearch') {
    $result = &do_inst_dir_search($searchdomain,$arg1,$arg2,$arg3);
               } elsif ($query eq 'getinstuser') {
                   $result = &get_inst_user($searchdomain,$arg1,$arg2);
               } elsif ($query eq 'getmultinstusers') {
                   $result = &get_multiple_instusers($searchdomain,$arg3);
             } elsif ($query eq 'prepare activity log') {              } elsif ($query eq 'prepare activity log') {
                 my ($cid,$domain) = map {&unescape($_);} ($arg1,$arg2);                  my ($cid,$domain) = map {&unescape($_);} ($arg1,$arg2);
                 &logthis('preparing activity log tables for '.$cid);                  &logthis('preparing activity log tables for '.$cid);
Line 466  sub make_new_child { Line 474  sub make_new_child {
                 } else {                  } else {
                     $result = 'success';                      $result = 'success';
                 }                  }
               } elsif (($query eq 'portfolio_metadata') || 
                       ($query eq 'portfolio_access')) {
                   $result = &portfolio_table_update($query,$arg1,$arg2,
                                                     $arg3);
               } elsif ($query eq 'allusers') {
                   my ($uname,$udom) = map {&unescape($_);} ($arg1,$arg2);
                   my %userdata;
                   my (@data) = split(/\%\%/,$arg3);
                   foreach my $item (@data) {
                       my ($key,$value) = split(/=/,$item);
                       $userdata{$key} = &unescape($value);
                   }
                   $userdata{'username'} = $uname;
                   $userdata{'domain'} = $udom;
                   $result = &allusers_table_update($query,$uname,$udom,\%userdata);
             } else {              } else {
                 # Do an sql query                  # Do an sql query
                 $result = &do_sql_query($query,$arg1,$arg2);                  $result = &do_sql_query($query,$arg1,$arg2,$arg3,$searchdomain);
             }              }
             # result does not need to be escaped because it has already been              # result does not need to be escaped because it has already been
             # escaped.              # escaped.
             #$result=&escape($result);              #$result=&escape($result);
             &reply("queryreply:$queryid:$result",$conserver);              &Apache::lonnet::reply("queryreply:$queryid:$result",$conserver);
         }          }
         # tidy up gracefully and finish          # tidy up gracefully and finish
         #          #
Line 488  sub make_new_child { Line 511  sub make_new_child {
     }      }
 }  }
   
   sub do_user_search {
       my ($domain,$srchby,$srchtype,$srchterm) = @_;
       my $result;
       my $quoted_dom = $dbh->quote( $domain );
       my ($query,$quoted_srchterm,@fields);
       my ($table_columns,$table_indices) =
           &LONCAPA::lonmetadata::describe_metadata_storage('allusers');
       foreach my $coldata (@{$table_columns}) {
           push(@fields,$coldata->{'name'});
       }
       my $fieldlist = join(',',@fields);
       $query = "SELECT $fieldlist FROM allusers WHERE (domain = $quoted_dom AND ";
       if ($srchby eq 'lastfirst') {
           my ($fraglast,$fragfirst) = split(/,/,$srchterm);
           $fragfirst =~ s/^\s+//;
           $fraglast =~ s/\s+$//;
           if ($srchtype eq 'exact') {
               $query .= 'lastname = '.$dbh->quote($fraglast).
                         ' AND firstname = '.$dbh->quote($fragfirst);
           } elsif ($srchtype eq 'begins') {
               $query .= 'lastname LIKE '.$dbh->quote($fraglast.'%').
                         ' AND firstname LIKE '.$dbh->quote($fragfirst.'%');
           } else {
               $query .= 'lastname LIKE '.$dbh->quote('%'.$fraglast.'%').
                         ' AND firstname LIKE '.$dbh->quote('%'.$fragfirst.'%');
           }
       } else {
           my %srchfield = (
                             uname    => 'username',
                             lastname => 'lastname',
                           );
           if ($srchtype eq 'exact') {
               $query .= $srchfield{$srchby}.' = '.$dbh->quote($srchterm);
           } elsif ($srchtype eq 'begins') {
                $query .= $srchfield{$srchby}.' LIKE '.$dbh->quote($srchterm.'%');
           } else {
                $query .= $srchfield{$srchby}.' LIKE '.$dbh->quote('%'.$srchterm.'%');
           }
       }
       $query .= ") ORDER BY username ";
       my $sth = $dbh->prepare($query);
       if ($sth->execute()) {
           my @results;
           while (my @row = $sth->fetchrow_array) {
               my @items;
               for (my $i=0; $i<@row; $i++) {
                   push(@items,&escape($fields[$i]).'='.&escape($row[$i]));
               }
               my $userstr = join(':', @items);
               push(@results,&escape($userstr));
           }
           $sth->finish;
           $result = join('&',@results);
       } else {
           &logthis('<font color="blue">'.
                   'WARNING: Could not retrieve from database:'.
           $sth->errstr().'</font>');
       }
       return $result;
   }
   
   sub do_inst_dir_search {
       my ($domain,$srchby,$srchterm,$srchtype) = @_;
       $srchby   = &unescape($srchby);
       $srchterm = &unescape($srchterm);
       $srchtype = &unescape($srchtype);
       my (%instusers,%instids,$result,$response);
       eval {
           local($SIG{__DIE__})='DEFAULT';
           $result=&localenroll::get_userinfo($domain,undef,undef,\%instusers,
      \%instids,undef,$srchby,$srchterm,
      $srchtype);
       };
       if ($result eq 'ok') {
           if (%instusers) {
               foreach my $key (keys(%instusers)) {
                   my $usrstr = &Apache::lonnet::freeze_escape($instusers{$key});
                   $response .=&escape(&escape($key).'='.$usrstr).'&';
               }
           }
           $response=~s/\&$//;
       } else {
           $response = 'unavailable';
       }
       return $response;
   }
   
   sub get_inst_user {
       my ($domain,$uname,$id) = @_;
       $uname = &unescape($uname);
       $id = &unescape($id);
       my (%instusers,%instids,$result,$response);
       eval {
           local($SIG{__DIE__})='DEFAULT';
           $result=&localenroll::get_userinfo($domain,$uname,$id,\%instusers,
                                              \%instids);
       };
       if ($result eq 'ok') {
           if (keys(%instusers) > 0) {
               foreach my $key (keys(%instusers)) {
                   my $usrstr = &Apache::lonnet::freeze_escape($instusers{$key});
                   $response .= &escape(&escape($key).'='.$usrstr).'&';
               }
           }
           $response=~s/\&$//;
       } else {
           $response = 'unavailable';
       }
       return $response;
   }
   
   sub get_multiple_instusers {
       my ($domain,$data) = @_;
       my ($type,$users) = split(/=/,$data,2);
       my $requested = &Apache::lonnet::thaw_unescape($users);
       my $response;
       if (ref($requested) eq 'HASH') {
           my (%instusers,%instids,$result);
           eval {
               local($SIG{__DIE__})='DEFAULT';
               $result=&localenroll::get_multusersinfo($domain,$type,$requested,\%instusers,
                                                       \%instids);
           };
           if ($@) {
               $response = 'error';
           } elsif ($result eq 'ok') {
               if (keys(%instusers)) {
                   $response = $result.':'.&Apache::lonnet::freeze_escape(\%instusers); 
               }
           } else {
               $response = 'unavailable';
           }
       } else {
           $response = 'invalid';
       }
       return $response;
   }
   
 ########################################################  ########################################################
 ########################################################  ########################################################
   
Line 519  sub process_file { Line 680  sub process_file {
 }  }
   
 sub do_sql_query {  sub do_sql_query {
     my ($query,$custom,$customshow) = @_;      my ($query,$custom,$customshow,$domainstr,$searchdomain) = @_;
 #    &logthis('doing query '.$query);  
   #
   # limit to searchdomain if given and table is metadata
   #
       if ($domainstr && ($query=~/FROM metadata/)) {
           my $havingstr;
           $domainstr = &unescape($domainstr); 
           if ($domainstr =~ /,/) {
               foreach my $dom (split(/,/,$domainstr)) {
                   if ($dom =~ /^$LONCAPA::domain_re$/) {
                       $havingstr .= 'domain="'.$dom.'" OR ';
                   }
               }
               $havingstr =~ s/ OR $//;
           } else {
               if ($domainstr =~ /^$LONCAPA::domain_re$/) {
                   $havingstr = 'domain="'.$domainstr.'"';
               }
           }
           if ($havingstr) {
               $query.=' HAVING ('.$havingstr.')';
           }
       } elsif (($searchdomain) && ($query=~/FROM metadata/)) {
    $query.=' HAVING (domain="'.$searchdomain.'")';
       }
   #    &logthis('doing query ('.$searchdomain.')'.$query);
   
   
   
     $custom     = &unescape($custom);      $custom     = &unescape($custom);
     $customshow = &unescape($customshow);      $customshow = &unescape($customshow);
     #      #
Line 580  sub do_sql_query { Line 769  sub do_sql_query {
     my $customresult='';      my $customresult='';
     my @results;      my @results;
     foreach my $metafile (@metalist) {      foreach my $metafile (@metalist) {
         my $fh=IO::File->new($metafile);          open(my $fh,$metafile);
         my @lines=<$fh>;          my @lines=<$fh>;
         my $stuff=join('',@lines);          my $stuff=join('',@lines);
         if ($stuff=~/$custom/s) {          if ($stuff=~/$custom/s) {
Line 617  sub do_sql_query { Line 806  sub do_sql_query {
 } # End of &do_sql_query  } # End of &do_sql_query
   
 } # End of scoping curly braces for &process_file and &do_sql_query  } # End of scoping curly braces for &process_file and &do_sql_query
 ########################################################  
 ########################################################  
   
 =pod  
   
 =item &logthis  
   
 Inputs: $message, the message to log  
   
 Returns: nothing  
   
 Writes $message to the logfile.  
   
 =cut  
   
 ########################################################  sub portfolio_table_update { 
 ########################################################      my ($query,$arg1,$arg2,$arg3) = @_;
 sub logthis {      my %tablenames = (
     my $message=shift;                         'portfolio'   => 'portfolio_metadata',
     my $execdir=$perlvar{'lonDaemons'};                         'access'      => 'portfolio_access',
     my $fh=IO::File->new(">>$execdir/logs/lonsql.log");                         'addedfields' => 'portfolio_addedfields',
     my $now=time;                       );
     my $local=localtime($now);      my $result = 'ok';
     print $fh "$local ($$): $message\n";      my $tablechk = &check_table($query);
       if ($tablechk == 0) {
           my $request =
      &LONCAPA::lonmetadata::create_metadata_storage($query,$query);
           $dbh->do($request);
           if ($dbh->err) {
               &logthis("create $query".
                        " ERROR: ".$dbh->errstr);
                        $result = 'error';
           }
       }
       if ($result eq 'ok') {
           my ($uname,$udom,$group) = split(/:/,&unescape($arg1));
           my $file_name = &unescape($arg2);
           my $action = $arg3;
           my $is_course = 0;
           if ($group ne '') {
               $is_course = 1;
           }
           my $urlstart = '/uploaded/'.$udom.'/'.$uname;
           my $pathstart = &propath($udom,$uname).'/userfiles';
           my ($fullpath,$url);
           if ($is_course) {
               $fullpath = $pathstart.'/groups/'.$group.'/portfolio'.
                           $file_name;
               $url = $urlstart.'/groups/'.$group.'/portfolio'.$file_name;
           } else {
               $fullpath = $pathstart.'/portfolio'.$file_name;
               $url = $urlstart.'/portfolio'.$file_name;
           }
           if ($query eq 'portfolio_metadata') {
               if ($action eq 'delete') {
                   my %loghash = &LONCAPA::lonmetadata::process_portfolio_metadata($dbh,undef,\%tablenames,$url,$fullpath,$is_course,$udom,$uname,$group,'update');
               } elsif (-e $fullpath.'.meta') {
                   my %loghash = &LONCAPA::lonmetadata::process_portfolio_metadata($dbh,undef,\%tablenames,$url,$fullpath,$is_course,$udom,$uname,$group,'update');
                   if (keys(%loghash) > 0) {
                       &portfolio_logging(%loghash);
                   }
               }
           } elsif ($query eq 'portfolio_access') {
               my %access = &get_access_hash($uname,$udom,$group.$file_name);
               my %loghash =
        &LONCAPA::lonmetadata::process_portfolio_access_data($dbh,undef,
            \%tablenames,$url,$fullpath,\%access,'update');
               if (keys(%loghash) > 0) {
                   &portfolio_logging(%loghash);
               } else {
                   my $available = 0;
                   foreach my $key (keys(%access)) {
                       my ($num,$scope,$end,$start) =
                           ($key =~ /^([^:]+):([a-z]+)_(\d*)_?(\d*)$/);
                       if ($scope eq 'public' || $scope eq 'guest') {
                           $available = 1;
                           last;
                       }
                   }
                   if ($available) {
                       # Retrieve current values
                       my $condition = 'url='.$dbh->quote("$url");
                       my ($error,$row) =
       &LONCAPA::lonmetadata::lookup_metadata($dbh,$condition,undef,
                                              'portfolio_metadata');
                       if (!$error) {
                           if (!(ref($row->[0]) eq 'ARRAY')) {  
                               my %loghash =
        &LONCAPA::lonmetadata::process_portfolio_metadata($dbh,undef,
            \%tablenames,$url,$fullpath,$is_course,$udom,$uname,$group);
                               if (keys(%loghash) > 0) {
                                   &portfolio_logging(%loghash);
                               }
                           } 
                       }
                   }
               }
           }
       }
       return $result;
 }  }
   
 # -------------------------------------------------- Non-critical communication  sub get_access_hash {
       my ($uname,$udom,$file) = @_;
 ########################################################      my $hashref = &tie_user_hash($udom,$uname,'file_permissions',
 ########################################################                                   &GDBM_READER());
       my %curr_perms;
 =pod      my %access; 
       if ($hashref) {
 =item &subreply          while (my ($key,$value) = each(%$hashref)) {
               $key = &unescape($key);
 Sends a command to a server.  Called only by &reply.              next if ($key =~ /^error: 2 /);
               $curr_perms{$key}=&Apache::lonnet::thaw_unescape($value);
 Inputs: $cmd,$server          }
           if (!&untie_user_hash($hashref)) {
 Returns: The results of the message or 'con_lost' on error.              &logthis("error: ".($!+0)." untie (GDBM) Failed");
           }
 =cut      } else {
           &logthis("error: ".($!+0)." tie (GDBM) Failed");
 ########################################################      }
 ########################################################      if (keys(%curr_perms) > 0) {
 sub subreply {          if (ref($curr_perms{$file."\0".'accesscontrol'}) eq 'HASH') {
     my ($cmd,$server)=@_;              foreach my $acl (keys(%{$curr_perms{$file."\0".'accesscontrol'}})) {
     my $peerfile="$perlvar{'lonSockDir'}/$server";                  $access{$acl} = $curr_perms{$file."\0".$acl};
     my $sclient=IO::Socket::UNIX->new(Peer    =>"$peerfile",              }
                                       Type    => SOCK_STREAM,          }
                                       Timeout => 10)      }
        or return "con_lost";      return %access;
     print $sclient "$cmd\n";  
     my $answer=<$sclient>;  
     chomp($answer);  
     $answer="con_lost" if (!$answer);  
     return $answer;  
 }  }
   
 ########################################################  sub allusers_table_update {
 ########################################################      my ($query,$uname,$udom,$userdata) = @_;
       my %tablenames = (
 =pod                         'allusers'   => 'allusers',
                        );
 =item &reply      my $result = 'ok';
       my $tablechk = &check_table($query);
 Sends a command to a server.      if ($tablechk == 0) {
           my $request =
 Inputs: $cmd,$server     &LONCAPA::lonmetadata::create_metadata_storage($query,$query);
           $dbh->do($request);
 Returns: The results of the message or 'con_lost' on error.          if ($dbh->err) {
               &logthis("create $query".
 =cut                       " ERROR: ".$dbh->errstr);
                        $result = 'error';
 ########################################################          }
 ########################################################      }
 sub reply {      if ($result eq 'ok') {
   my ($cmd,$server)=@_;          my %loghash = 
   my $answer;              &LONCAPA::lonmetadata::process_allusers_data($dbh,undef,
   if ($server ne $perlvar{'lonHostID'}) {                   \%tablenames,$uname,$udom,$userdata,'update');
     $answer=subreply($cmd,$server);          foreach my $key (keys(%loghash)) {
     if ($answer eq 'con_lost') {              &logthis($loghash{$key});
  $answer=subreply("ping",$server);          }
         $answer=subreply($cmd,$server);      }
     }      return $result;
   } else {  
     $answer='self_reply';  
     $answer=subreply($cmd,$server);  
   }   
   return $answer;  
 }  }
   
 ########################################################  ###########################################
 ########################################################  sub check_table {
       my ($table_id) = @_;
 =pod      my $sth=$dbh->prepare('SHOW TABLES');
       $sth->execute();
 =item &escape      my $aref = $sth->fetchall_arrayref;
       $sth->finish();
 Escape special characters in a string.      if ($sth->err()) {
           &logthis("fetchall_arrayref after SHOW TABLES".
 Inputs: string to escape              " ERROR: ".$sth->errstr);
           return undef;
 Returns: The input string with special characters escaped.      }
       my $result = 0;
       foreach my $table (@{$aref}) {
           if ($table->[0] eq $table_id) { 
               $result = 1;
               last;
           }
       }
       return $result;
   }
   
 =cut  ###########################################
   
 ########################################################  sub portfolio_logging {
 ########################################################      my (%portlog) = @_;
 sub escape {      foreach my $key (keys(%portlog)) {
     my $str=shift;          if (ref($portlog{$key}) eq 'HASH') {
     $str =~ s/(\W)/"%".unpack('H2',$1)/eg;              foreach my $item (keys(%{$portlog{$key}})) {
     return $str;                  &logthis($portlog{$key}{$item});
               }
           }
       }
 }  }
   
   
 ########################################################  ########################################################
 ########################################################  ########################################################
   
 =pod  =pod
   
 =item &unescape  =item &logthis
   
 Unescape special characters in a string.  Inputs: $message, the message to log
   
 Inputs: string to unescape  Returns: nothing
   
 Returns: The input string with special characters unescaped.  Writes $message to the logfile.
   
 =cut  =cut
   
 ########################################################  ########################################################
 ########################################################  ########################################################
 sub unescape {  sub logthis {
     my $str=shift;      my $message=shift;
     $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;      my $execdir=$perlvar{'lonDaemons'};
     return $str;      open(my $fh,">>$execdir/logs/lonsql.log");
       my $now=time;
       my $local=localtime($now);
       print $fh "$local ($$): $message\n";
 }  }
   
 ########################################################  ########################################################
Line 790  sub ishome { Line 1047  sub ishome {
   
 =pod  =pod
   
 =item &propath  
   
 Inputs: user name, user domain  
   
 Returns: The full path to the users directory.  
   
 =cut  
   
 ########################################################  
 ########################################################  
 sub propath {  
     my ($udom,$uname)=@_;  
     $udom=~s/\W//g;  
     $uname=~s/\W//g;  
     my $subdir=$uname.'__';  
     $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;  
     my $proname="$perlvar{'lonUsersDir'}/$udom/$subdir/$uname";  
     return $proname;  
 }   
   
 ########################################################  
 ########################################################  
   
 =pod  
   
 =item &courselog  =item &courselog
   
 Inputs: $path, $command  Inputs: $path, $command
Line 914  sub userlog { Line 1146  sub userlog {
                                                              { $include=0; }                                                               { $include=0; }
         if (($filters{'end'}) && ($timestamp>$filters{'end'}))           if (($filters{'end'}) && ($timestamp>$filters{'end'})) 
                                                              { $include=0; }                                                               { $include=0; }
           if (($filters{'action'} eq 'Role') && ($log !~/^Role/))
                                                                { $include=0; }
         if (($filters{'action'} eq 'log') && ($log!~/^Log/)) { $include=0; }          if (($filters{'action'} eq 'log') && ($log!~/^Log/)) { $include=0; }
         if (($filters{'action'} eq 'check') && ($log!~/^Check/))           if (($filters{'action'} eq 'check') && ($log!~/^Check/)) 
                                                              { $include=0; }                                                               { $include=0; }
         if ($include) {          if ($include) {
    push(@results,$timestamp.':'.$log);     push(@results,$timestamp.':'.$host.':'.&escape($log));
         }          }
     }      }
     close IN;      close IN;

Removed from v.1.71.2.1  
changed lines
  Added in v.1.94


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.