version 1.406, 2003/08/26 04:56:30
|
version 1.423, 2003/09/25 20:02:54
|
Line 76 qw(%perlvar %hostname %homecache %badSer
|
Line 76 qw(%perlvar %hostname %homecache %badSer
|
%libserv %pr %prp %metacache %packagetab %titlecache |
%libserv %pr %prp %metacache %packagetab %titlecache |
%courselogs %accesshash %userrolehash $processmarker $dumpcount |
%courselogs %accesshash %userrolehash $processmarker $dumpcount |
%coursedombuf %coursenumbuf %coursehombuf %coursedescrbuf %courseresdatacache |
%coursedombuf %coursenumbuf %coursehombuf %coursedescrbuf %courseresdatacache |
%domaindescription %domain_auth_def %domain_auth_arg_def |
%userresdatacache %usectioncache %domaindescription %domain_auth_def %domain_auth_arg_def |
%domain_lang_def %domain_city %domain_longi %domain_lati $tmpdir); |
%domain_lang_def %domain_city %domain_longi %domain_lati $tmpdir); |
|
|
use IO::Socket; |
use IO::Socket; |
Line 85 use Apache::Constants qw(:common :http);
|
Line 85 use Apache::Constants qw(:common :http);
|
use HTML::LCParser; |
use HTML::LCParser; |
use Fcntl qw(:flock); |
use Fcntl qw(:flock); |
use Apache::loncoursedata; |
use Apache::loncoursedata; |
|
use Apache::lonlocal; |
|
|
my $readit; |
my $readit; |
|
|
Line 246 sub critical {
|
Line 247 sub critical {
|
return $answer; |
return $answer; |
} |
} |
|
|
|
# |
# -------------- Remove all key from the env that start witha lowercase letter |
# -------------- Remove all key from the env that start witha lowercase letter |
# (Which is alweways a lon-capa value) |
# (Which is always a lon-capa value) |
|
|
sub cleanenv { |
sub cleanenv { |
|
# unless (defined(&Apache::exists_config_define("MODPERL2"))) { return; } |
|
# unless (&Apache::exists_config_define("MODPERL2")) { return; } |
foreach my $key (keys(%ENV)) { |
foreach my $key (keys(%ENV)) { |
if ($key =~ /^[a-z]/) { |
if ($key =~ /^[a-z]/) { |
delete($ENV{$key}); |
delete($ENV{$key}); |
Line 436 sub spareserver {
|
Line 441 sub spareserver {
|
my $lowestserver=$loadpercent > $userloadpercent? |
my $lowestserver=$loadpercent > $userloadpercent? |
$loadpercent : $userloadpercent; |
$loadpercent : $userloadpercent; |
foreach $tryserver (keys %spareid) { |
foreach $tryserver (keys %spareid) { |
my $loadans=reply('load',$tryserver); |
my $loadans=reply('load',$tryserver); |
my $userloadans=reply('userload',$tryserver); |
my $userloadans=reply('userload',$tryserver); |
if ($userloadans !~ /\d/) { $userloadans=0; } |
if ($loadans !~ /\d/ && $userloadans !~ /\d/) { |
my $answer=$loadans > $userloadans? |
next; #didn't get a number from the server |
$loadans : $userloadans; |
} |
if (($answer =~ /\d/) && ($answer<$lowestserver)) { |
my $answer; |
$spareserver="http://$hostname{$tryserver}"; |
if ($loadans =~ /\d/) { |
$lowestserver=$answer; |
if ($userloadans =~ /\d/) { |
} |
#both are numbers, pick the bigger one |
|
$answer=$loadans > $userloadans? |
|
$loadans : $userloadans; |
|
} else { |
|
$answer = $loadans; |
|
} |
|
} else { |
|
$answer = $userloadans; |
|
} |
|
if (($answer =~ /\d/) && ($answer<$lowestserver)) { |
|
$spareserver="http://$hostname{$tryserver}"; |
|
$lowestserver=$answer; |
|
} |
} |
} |
return $spareserver; |
return $spareserver; |
} |
} |
Line 831 sub getsection {
|
Line 848 sub getsection {
|
return '-1'; |
return '-1'; |
} |
} |
|
|
|
sub devalidate_cache { |
|
my ($cache,$id) = @_; |
|
delete $$cache{$id.'.time'}; |
|
delete $$cache{$id}; |
|
} |
|
|
|
sub is_cached { |
|
my ($cache,$id,$time) = @_; |
|
if (!$time) { $time=300; } |
|
if (!exists($$cache{$id.'.time'})) { |
|
return (undef,undef); |
|
} else { |
|
if (time-$$cache{$id.'.time'}>$time) { |
|
&devalidate_cache($cache,$id); |
|
return (undef,undef); |
|
} |
|
} |
|
return ($$cache{$id},1); |
|
} |
|
|
|
sub do_cache { |
|
my ($cache,$id,$value) = @_; |
|
$$cache{$id.'.time'}=time; |
|
# do_cache implictly return the set value |
|
$$cache{$id}=$value; |
|
} |
|
|
sub usection { |
sub usection { |
my ($udom,$unam,$courseid)=@_; |
my ($udom,$unam,$courseid)=@_; |
|
my $hashid="$udom:$unam:$courseid"; |
|
|
|
my ($result,$cached)=&is_cached(\%usectioncache,$hashid); |
|
if (defined($cached)) { return $result; } |
$courseid=~s/\_/\//g; |
$courseid=~s/\_/\//g; |
$courseid=~s/^(\w)/\/$1/; |
$courseid=~s/^(\w)/\/$1/; |
foreach (split(/\&/,&reply('dump:'.$udom.':'.$unam.':roles', |
foreach (split(/\&/,&reply('dump:'.$udom.':'.$unam.':roles', |
Line 851 sub usection {
|
Line 899 sub usection {
|
if ($end) { |
if ($end) { |
if ($now>$end) { $notactive=1; } |
if ($now>$end) { $notactive=1; } |
} |
} |
unless ($notactive) { return $section; } |
unless ($notactive) { |
|
return &do_cache(\%usectioncache,$hashid,$section); |
|
} |
} |
} |
} |
} |
return '-1'; |
return &do_cache(\%usectioncache,$hashid,'-1'); |
} |
} |
|
|
# ------------------------------------- Read an entry from a user's environment |
# ------------------------------------- Read an entry from a user's environment |
Line 1228 sub courseacclog {
|
Line 1278 sub courseacclog {
|
my $fnsymb=shift; |
my $fnsymb=shift; |
unless ($ENV{'request.course.id'}) { return ''; } |
unless ($ENV{'request.course.id'}) { return ''; } |
my $what=$fnsymb.':'.$ENV{'user.name'}.':'.$ENV{'user.domain'}; |
my $what=$fnsymb.':'.$ENV{'user.name'}.':'.$ENV{'user.domain'}; |
if ($fnsymb=~/(problem|exam|quiz|assess|survey|form)$/) { |
if ($fnsymb=~/(problem|exam|quiz|assess|survey|form|page)$/) { |
$what.=':POST'; |
$what.=':POST'; |
foreach (keys %ENV) { |
foreach (keys %ENV) { |
if ($_=~/^form\.(.*)/) { |
if ($_=~/^form\.(.*)/) { |
Line 2136 sub dump {
|
Line 2186 sub dump {
|
return %returnhash; |
return %returnhash; |
} |
} |
|
|
|
# -------------------------------------------------------------- keys interface |
|
|
|
sub getkeys { |
|
my ($namespace,$udomain,$uname)=@_; |
|
if (!$udomain) { $udomain=$ENV{'user.domain'}; } |
|
if (!$uname) { $uname=$ENV{'user.name'}; } |
|
my $uhome=&homeserver($uname,$udomain); |
|
my $rep=reply("keys:$udomain:$uname:$namespace",$uhome); |
|
my @keyarray=(); |
|
foreach (split(/\&/,$rep)) { |
|
push (@keyarray,&unescape($_)); |
|
} |
|
return @keyarray; |
|
} |
|
|
# --------------------------------------------------------------- currentdump |
# --------------------------------------------------------------- currentdump |
sub currentdump { |
sub currentdump { |
my ($courseid,$sdom,$sname)=@_; |
my ($courseid,$sdom,$sname)=@_; |
Line 2575 sub is_on_map {
|
Line 2640 sub is_on_map {
|
if ($match) { |
if ($match) { |
return (1,$1); |
return (1,$1); |
} else { |
} else { |
return (0,0); |
my ($name,$ext)=($filename=~/^(.+)\.(\w+)$/); |
|
$ENV{'acc.res.'.$ENV{'request.course.id'}.'.'.$pathname}=~ |
|
/\&(\Q$name\E\.\d+\.$ext)\:([\d\|]+)\&/; |
|
return (0,$2,$pathname.'/'.$1); |
} |
} |
} |
} |
|
|
Line 2705 sub userlog_query {
|
Line 2773 sub userlog_query {
|
|
|
sub plaintext { |
sub plaintext { |
my $short=shift; |
my $short=shift; |
return $prp{$short}; |
return &mt($prp{$short}); |
} |
} |
|
|
# ----------------------------------------------------------------- Assign Role |
# ----------------------------------------------------------------- Assign Role |
Line 3150 sub dirlist {
|
Line 3218 sub dirlist {
|
# when it was last modified. It will also return an error of -1 |
# when it was last modified. It will also return an error of -1 |
# if an error occurs |
# if an error occurs |
|
|
|
## |
|
## FIXME: This subroutine assumes its caller knows something about the |
|
## directory structure of the home server for the student ($root). |
|
## Not a good assumption to make. Since this is for looking up files |
|
## in user directories, the full path should be constructed by lond, not |
|
## whatever machine we request data from. |
|
## |
sub GetFileTimestamp { |
sub GetFileTimestamp { |
my ($studentDomain,$studentName,$filename,$root)=@_; |
my ($studentDomain,$studentName,$filename,$root)=@_; |
$studentDomain=~s/\W//g; |
$studentDomain=~s/\W//g; |
Line 3226 sub condval {
|
Line 3301 sub condval {
|
sub devalidatecourseresdata { |
sub devalidatecourseresdata { |
my ($coursenum,$coursedomain)=@_; |
my ($coursenum,$coursedomain)=@_; |
my $hashid=$coursenum.':'.$coursedomain; |
my $hashid=$coursenum.':'.$coursedomain; |
delete $courseresdatacache{$hashid.'.time'}; |
&devalidate_cache(\%courseresdatacache,$hashid); |
} |
} |
|
|
# --------------------------------------------------- Course Resourcedata Query |
# --------------------------------------------------- Course Resourcedata Query |
Line 3235 sub courseresdata {
|
Line 3310 sub courseresdata {
|
my ($coursenum,$coursedomain,@which)=@_; |
my ($coursenum,$coursedomain,@which)=@_; |
my $coursehom=&homeserver($coursenum,$coursedomain); |
my $coursehom=&homeserver($coursenum,$coursedomain); |
my $hashid=$coursenum.':'.$coursedomain; |
my $hashid=$coursenum.':'.$coursedomain; |
my $dodump=0; |
my ($result,$cached)=&is_cached(\%courseresdatacache,$hashid); |
if (!defined($courseresdatacache{$hashid.'.time'})) { |
unless (defined($cached)) { |
$dodump=1; |
|
} else { |
|
if (time-$courseresdatacache{$hashid.'.time'}>300) { $dodump=1; } |
|
} |
|
if ($dodump) { |
|
my %dumpreply=&dump('resourcedata',$coursedomain,$coursenum); |
my %dumpreply=&dump('resourcedata',$coursedomain,$coursenum); |
|
$result=\%dumpreply; |
my ($tmp) = keys(%dumpreply); |
my ($tmp) = keys(%dumpreply); |
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
$courseresdatacache{$hashid.'.time'}=time; |
&do_cache(\%courseresdatacache,$hashid,$result); |
$courseresdatacache{$hashid}=\%dumpreply; |
|
} elsif ($tmp =~ /^(con_lost|no_such_host)/) { |
} elsif ($tmp =~ /^(con_lost|no_such_host)/) { |
return $tmp; |
return $tmp; |
|
} elsif ($tmp =~ /^(error)/) { |
|
$result=undef; |
|
&do_cache(\%courseresdatacache,$hashid,$result); |
} |
} |
} |
} |
foreach my $item (@which) { |
foreach my $item (@which) { |
if (defined($courseresdatacache{$hashid}->{$item})) { |
if (defined($result->{$item})) { |
return $courseresdatacache{$hashid}->{$item}; |
return $result->{$item}; |
} |
} |
} |
} |
return undef; |
return undef; |
Line 3395 sub EXT {
|
Line 3468 sub EXT {
|
# ----------------------------------------------------- Cascading lookup scheme |
# ----------------------------------------------------- Cascading lookup scheme |
if (!$symbparm) { $symbparm=&symbread(); } |
if (!$symbparm) { $symbparm=&symbread(); } |
my $symbp=$symbparm; |
my $symbp=$symbparm; |
my $mapp=(split(/\_\_\_/,$symbp))[0]; |
my $mapp=(&decode_symb($symbp))[0]; |
|
|
my $symbparm=$symbp.'.'.$spacequalifierrest; |
my $symbparm=$symbp.'.'.$spacequalifierrest; |
my $mapparm=$mapp.'___(all).'.$spacequalifierrest; |
my $mapparm=$mapp.'___(all).'.$spacequalifierrest; |
Line 3421 sub EXT {
|
Line 3494 sub EXT {
|
|
|
# ----------------------------------------------------------- first, check user |
# ----------------------------------------------------------- first, check user |
#most student don\'t have any data set, check if there is some data |
#most student don\'t have any data set, check if there is some data |
#every thirty minutes |
|
if (! &EXT_cache_status($udom,$uname)) { |
if (! &EXT_cache_status($udom,$uname)) { |
my %resourcedata=&get('resourcedata', |
my $hashid="$udom:$uname"; |
[$courselevelr,$courselevelm,$courselevel], |
my ($result,$cached)=&is_cached(\%userresdatacache,$hashid); |
$udom,$uname); |
if (!defined($cached)) { |
my ($tmp)=keys(%resourcedata); |
my %resourcedata=&get('resourcedata', |
|
[$courselevelr,$courselevelm, |
|
$courselevel],$udom,$uname); |
|
$result=\%resourcedata; |
|
} |
|
my ($tmp)=keys(%$result); |
if (($tmp!~/^error\:/) && ($tmp!~/^con_lost/)) { |
if (($tmp!~/^error\:/) && ($tmp!~/^con_lost/)) { |
if ($resourcedata{$courselevelr}) { |
&do_cache(\%userresdatacache,$hashid,$result); |
return $resourcedata{$courselevelr}; } |
if ($$result{$courselevelr}) { |
if ($resourcedata{$courselevelm}) { |
return $$result{$courselevelr}; } |
return $resourcedata{$courselevelm}; } |
if ($$result{$courselevelm}) { |
if ($resourcedata{$courselevel}) { |
return $$result{$courselevelm}; } |
return $resourcedata{$courselevel}; } |
if ($$result{$courselevel}) { |
|
return $$result{$courselevel}; } |
} else { |
} else { |
if ($tmp!~/No such file/) { |
if ($tmp!~/No such file/) { |
&logthis("<font color=blue>WARNING:". |
&logthis("<font color=blue>WARNING:". |
" Trying to get resource data for ". |
" Trying to get resource data for ". |
$uname." at ".$udom.": ". |
$uname." at ".$udom.": ". |
$tmp."</font>"); |
$tmp."</font>"); |
|
&do_cache(\%userresdatacache,$hashid,undef); |
} elsif ($tmp=~/error:No such file/) { |
} elsif ($tmp=~/error:No such file/) { |
&EXT_cache_set($udom,$uname); |
&EXT_cache_set($udom,$uname); |
} elsif ($tmp =~ /^(con_lost|no_such_host)/) { |
} elsif ($tmp =~ /^(con_lost|no_such_host)/) { |
|
&do_cache(\%userresdatacache,$hashid,undef); |
return $tmp; |
return $tmp; |
} |
} |
} |
} |
Line 3474 sub EXT {
|
Line 3554 sub EXT {
|
my $filename; |
my $filename; |
if (!$symbparm) { $symbparm=&symbread(); } |
if (!$symbparm) { $symbparm=&symbread(); } |
if ($symbparm) { |
if ($symbparm) { |
$filename=(split(/\_\_\_/,$symbparm))[2]; |
$filename=(&decode_symb($symbparm))[2]; |
} else { |
} else { |
$filename=$ENV{'request.filename'}; |
$filename=$ENV{'request.filename'}; |
} |
} |
Line 3549 sub add_prefix_and_part {
|
Line 3629 sub add_prefix_and_part {
|
|
|
sub metadata { |
sub metadata { |
my ($uri,$what,$liburi,$prefix,$depthcount)=@_; |
my ($uri,$what,$liburi,$prefix,$depthcount)=@_; |
|
|
$uri=&declutter($uri); |
$uri=&declutter($uri); |
# if it is a non metadata possible uri return quickly |
# if it is a non metadata possible uri return quickly |
if (($uri eq '') || (($uri =~ m|^/*adm/|) && ($uri !~ m|^adm/includes|)) || |
if (($uri eq '') || (($uri =~ m|^/*adm/|) && ($uri !~ m|^adm/includes|)) || |
($uri =~ m|/$|) || ($uri =~ m|/.meta$|)) { |
($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ /^~/) || |
|
($uri =~ m|home/[^/]+/public_html/|)) { |
return ''; |
return ''; |
} |
} |
my $filename=$uri; |
my $filename=$uri; |
Line 3742 sub gettitle {
|
Line 3822 sub gettitle {
|
unless ($urlsymb) { $urlsymb=$ENV{'request.filename'}; } |
unless ($urlsymb) { $urlsymb=$ENV{'request.filename'}; } |
return &metadata($urlsymb,'title'); |
return &metadata($urlsymb,'title'); |
} |
} |
if ($titlecache{$symb}) { |
my ($result,$cached)=&is_cached(\%titlecache,$symb,600); |
if (time < ($titlecache{$symb}[1] + 600)) { |
if (defined($cached)) { return $result; } |
return $titlecache{$symb}[0]; |
my ($map,$resid,$url)=&decode_symb($symb); |
} else { |
|
delete($titlecache{$symb}); |
|
} |
|
} |
|
my ($map,$resid,$url)=split(/\_\_\_/,$symb); |
|
my $title=''; |
my $title=''; |
my %bighash; |
my %bighash; |
if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', |
if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', |
Line 3760 sub gettitle {
|
Line 3835 sub gettitle {
|
} |
} |
$title=~s/\&colon\;/\:/gs; |
$title=~s/\&colon\;/\:/gs; |
if ($title) { |
if ($title) { |
$titlecache{$symb}=[$title,time]; |
return &do_cache(\%titlecache,$symb,$title); |
return $title; |
|
} else { |
} else { |
return &metadata($urlsymb,'title'); |
return &metadata($urlsymb,'title'); |
} |
} |
Line 3795 sub symbverify {
|
Line 3869 sub symbverify {
|
# direct jump to resource in page or to a sequence - will construct own symbs |
# direct jump to resource in page or to a sequence - will construct own symbs |
if ($thisfn=~/\.(page|sequence)$/) { return 1; } |
if ($thisfn=~/\.(page|sequence)$/) { return 1; } |
# check URL part |
# check URL part |
my ($map,$resid,$url)=split(/\_\_\_/,$symb); |
my ($map,$resid,$url)=&decode_symb($symb); |
unless (&symbclean($url) eq &symbclean($thisfn)) { return 0; } |
unless (&symbclean($url) eq &symbclean($thisfn)) { return 0; } |
|
|
$symb=&symbclean($symb); |
$symb=&symbclean($symb); |
Line 3838 sub symbclean {
|
Line 3912 sub symbclean {
|
return $symb; |
return $symb; |
} |
} |
|
|
|
# ---------------------------------------------- Split symb to find map and url |
|
|
|
sub decode_symb { |
|
my ($map,$resid,$url)=split(/\_\_\_/,shift); |
|
return (&fixversion($map),$resid,&fixversion($url)); |
|
} |
|
|
|
sub fixversion { |
|
my $fn=shift; |
|
if ($fn=~/^(adm|uploaded|public)/) { return $fn; } |
|
my ($match,$cond,$versioned)=&is_on_map($fn); |
|
unless ($match) { |
|
$fn=$versioned; |
|
} |
|
return $fn; |
|
} |
|
|
# ------------------------------------------------------ Return symb list entry |
# ------------------------------------------------------ Return symb list entry |
|
|
sub symbread { |
sub symbread { |
Line 4137 sub unescape {
|
Line 4228 sub unescape {
|
return $str; |
return $str; |
} |
} |
|
|
|
sub mod_perl_version { |
|
if (defined($perlvar{'MODPERL2'})) { |
|
return 2; |
|
} |
|
return 1; |
|
} |
# ================================================================ Main Program |
# ================================================================ Main Program |
|
|
sub goodbye { |
sub goodbye { |