version 1.353, 2003/03/26 04:57:04
|
version 1.389, 2003/07/09 06:20:42
|
Line 243 sub critical {
|
Line 243 sub critical {
|
} |
} |
return $answer; |
return $answer; |
} |
} |
|
|
|
# ------------------------------------------- Transfer profile into environment |
|
|
|
sub transfer_profile_to_env { |
|
my ($lonidsdir,$handle)=@_; |
|
my @profile; |
|
{ |
|
my $idf=Apache::File->new("$lonidsdir/$handle.id"); |
|
flock($idf,LOCK_SH); |
|
@profile=<$idf>; |
|
$idf->close(); |
|
} |
|
my $envi; |
|
for ($envi=0;$envi<=$#profile;$envi++) { |
|
chomp($profile[$envi]); |
|
my ($envname,$envvalue)=split(/=/,$profile[$envi]); |
|
$ENV{$envname} = $envvalue; |
|
} |
|
$ENV{'user.environment'} = "$lonidsdir/$handle.id"; |
|
} |
|
|
# ---------------------------------------------------------- Append Environment |
# ---------------------------------------------------------- Append Environment |
|
|
Line 347 sub delenv {
|
Line 367 sub delenv {
|
return 'ok'; |
return 'ok'; |
} |
} |
|
|
|
# ------------------------------------------ Find out current server userload |
|
# there is a copy in lond |
|
sub userload { |
|
my $numusers=0; |
|
{ |
|
opendir(LONIDS,$perlvar{'lonIDsDir'}); |
|
my $filename; |
|
my $curtime=time; |
|
while ($filename=readdir(LONIDS)) { |
|
if ($filename eq '.' || $filename eq '..') {next;} |
|
my ($atime)=(stat($perlvar{'lonIDsDir'}.'/'.$filename))[8]; |
|
if ($curtime-$atime < 3600) { $numusers++; } |
|
} |
|
closedir(LONIDS); |
|
} |
|
my $userloadpercent=0; |
|
my $maxuserload=$perlvar{'lonUserLoadLim'}; |
|
if ($maxuserload) { |
|
$userloadpercent=100*$numusers/$maxuserload; |
|
} |
|
$userloadpercent=sprintf("%.2f",$userloadpercent); |
|
return $userloadpercent; |
|
} |
|
|
# ------------------------------------------ Fight off request when overloaded |
# ------------------------------------------ Fight off request when overloaded |
|
|
sub overloaderror { |
sub overloaderror { |
Line 373 sub overloaderror {
|
Line 417 sub overloaderror {
|
# ------------------------------ Find server with least workload from spare.tab |
# ------------------------------ Find server with least workload from spare.tab |
|
|
sub spareserver { |
sub spareserver { |
my $loadpercent = shift; |
my ($loadpercent,$userloadpercent) = @_; |
my $tryserver; |
my $tryserver; |
my $spareserver=''; |
my $spareserver=''; |
my $lowestserver=$loadpercent; |
if ($userloadpercent !~ /\d/) { $userloadpercent=0; } |
|
my $lowestserver=$loadpercent > $userloadpercent? |
|
$loadpercent : $userloadpercent; |
foreach $tryserver (keys %spareid) { |
foreach $tryserver (keys %spareid) { |
my $answer=reply('load',$tryserver); |
my $loadans=reply('load',$tryserver); |
|
my $userloadans=reply('userload',$tryserver); |
|
if ($userloadans !~ /\d/) { $userloadans=0; } |
|
my $answer=$loadans > $userloadans? |
|
$loadans : $userloadans; |
if (($answer =~ /\d/) && ($answer<$lowestserver)) { |
if (($answer =~ /\d/) && ($answer<$lowestserver)) { |
$spareserver="http://$hostname{$tryserver}"; |
$spareserver="http://$hostname{$tryserver}"; |
$lowestserver=$answer; |
$lowestserver=$answer; |
} |
} |
} |
} |
return $spareserver; |
return $spareserver; |
} |
} |
|
|
Line 591 sub idput {
|
Line 641 sub idput {
|
# --------------------------------------------------- Assign a key to a student |
# --------------------------------------------------- Assign a key to a student |
|
|
sub assign_access_key { |
sub assign_access_key { |
my ($ckey,$cdom,$cnum,$udom,$uname)=@_; |
# |
|
# a valid key looks like uname:udom#comments |
|
# comments are being appended |
|
# |
|
my ($ckey,$cdom,$cnum,$udom,$uname,$logentry)=@_; |
$cdom= |
$cdom= |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'} unless (defined($cdom)); |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'} unless (defined($cdom)); |
$cnum= |
$cnum= |
Line 599 sub assign_access_key {
|
Line 653 sub assign_access_key {
|
$udom=$ENV{'user.name'} unless (defined($udom)); |
$udom=$ENV{'user.name'} unless (defined($udom)); |
$uname=$ENV{'user.domain'} unless (defined($uname)); |
$uname=$ENV{'user.domain'} unless (defined($uname)); |
my %existing=&get('accesskeys',[$ckey],$cdom,$cnum); |
my %existing=&get('accesskeys',[$ckey],$cdom,$cnum); |
if (($existing{$ckey}=~/^\d+$/) || # has time - new key |
if (($existing{$ckey}=~/^\#(.*)$/) || # - new key |
($existing{$ckey} eq $uname.':'.$udom)) { # this should not happen, |
($existing{$ckey}=~/^$uname\:$udom\#(.*)$/)) { |
|
# assigned to this person |
|
# - this should not happen, |
# unless something went wrong |
# unless something went wrong |
# the first time around |
# the first time around |
# ready to assign |
# ready to assign |
} elsif (!$existing{$ckey}) { |
$logentry=$1.'; '.$logentry; |
if (&put('accesskey',{$ckey=>$uname.':'.$udom},$cdom,$cnum) eq 'ok') { |
if (&put('accesskey',{$ckey=>$uname.':'.$udom.'#'.$logentry}, |
|
$cdom,$cnum) eq 'ok') { |
# key now belongs to user |
# key now belongs to user |
my $envkey='key.'.$cdom.'_'.$cnum; |
my $envkey='key.'.$cdom.'_'.$cnum; |
if (&put('environment',{$envkey => $ckey}) eq 'ok') { |
if (&put('environment',{$envkey => $ckey}) eq 'ok') { |
Line 618 sub assign_access_key {
|
Line 675 sub assign_access_key {
|
} else { |
} else { |
return 'error: Could not assign key, try again later.'; |
return 'error: Could not assign key, try again later.'; |
} |
} |
|
} elsif (!$existing{$ckey}) { |
# the key does not exist |
# the key does not exist |
return 'error: The key does not exist'; |
return 'error: The key does not exist'; |
} else { |
} else { |
Line 626 sub assign_access_key {
|
Line 684 sub assign_access_key {
|
} |
} |
} |
} |
|
|
|
# ------------------------------------------ put an additional comment on a key |
|
|
|
sub comment_access_key { |
|
# |
|
# a valid key looks like uname:udom#comments |
|
# comments are being appended |
|
# |
|
my ($ckey,$cdom,$cnum,$logentry)=@_; |
|
$cdom= |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'} unless (defined($cdom)); |
|
$cnum= |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'} unless (defined($cnum)); |
|
my %existing=&get('accesskeys',[$ckey],$cdom,$cnum); |
|
if ($existing{$ckey}) { |
|
$existing{$ckey}.='; '.$logentry; |
|
# ready to assign |
|
if (&put('accesskeys',{$ckey=>$existing{$ckey}}, |
|
$cdom,$cnum) eq 'ok') { |
|
return 'ok'; |
|
} else { |
|
return 'error: Count not store comment.'; |
|
} |
|
} else { |
|
# the key does not exist |
|
return 'error: The key does not exist'; |
|
} |
|
} |
|
|
# ------------------------------------------------------ Generate a set of keys |
# ------------------------------------------------------ Generate a set of keys |
|
|
sub generate_access_keys { |
sub generate_access_keys { |
my ($number,$cdom,$cnum)=@_; |
my ($number,$cdom,$cnum,$logentry)=@_; |
$cdom= |
$cdom= |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'} unless (defined($cdom)); |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'} unless (defined($cdom)); |
$cnum= |
$cnum= |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'} unless (defined($cnum)); |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'} unless (defined($cnum)); |
unless (&allowed('ccc',$cdom)) { return 0; } |
unless (&allowed('mky',$cdom)) { return 0; } |
unless (($cdom) && ($cnum)) { return 0; } |
unless (($cdom) && ($cnum)) { return 0; } |
if ($number>10000) { return 0; } |
if ($number>10000) { return 0; } |
sleep(2); # make sure don't get same seed twice |
sleep(2); # make sure don't get same seed twice |
Line 650 sub generate_access_keys {
|
Line 736 sub generate_access_keys {
|
if ($existing{$newkey}) { |
if ($existing{$newkey}) { |
$i--; |
$i--; |
} else { |
} else { |
if (&put('accesskeys',{ $newkey => time() },$cdom,$cnum) eq 'ok') { |
if (&put('accesskeys', |
|
{ $newkey => '# generated '.localtime(). |
|
' by '.$ENV{'user.name'}.'@'.$ENV{'user.domain'}. |
|
'; '.$logentry }, |
|
$cdom,$cnum) eq 'ok') { |
$total++; |
$total++; |
} |
} |
} |
} |
Line 671 sub validate_access_key {
|
Line 761 sub validate_access_key {
|
$udom=$ENV{'user.name'} unless (defined($udom)); |
$udom=$ENV{'user.name'} unless (defined($udom)); |
$uname=$ENV{'user.domain'} unless (defined($uname)); |
$uname=$ENV{'user.domain'} unless (defined($uname)); |
my %existing=&get('accesskeys',[$ckey],$cdom,$cnum); |
my %existing=&get('accesskeys',[$ckey],$cdom,$cnum); |
return ($existing{$ckey} eq $uname.':'.$udom); |
return ($existing{$ckey}=~/^$uname\:$udom\#/); |
} |
} |
|
|
# ------------------------------------- Find the section of student in a course |
# ------------------------------------- Find the section of student in a course |
Line 892 sub repcopy {
|
Line 982 sub repcopy {
|
|
|
# ------------------------------------------------ Get server side include body |
# ------------------------------------------------ Get server side include body |
sub ssi_body { |
sub ssi_body { |
my $filelink=shift; |
my ($filelink,%form)=@_; |
my $output=($filelink=~/^http\:/?&externalssi($filelink): |
my $output=($filelink=~/^http\:/?&externalssi($filelink): |
&ssi($filelink)); |
&ssi($filelink,%form)); |
$output=~s/^.*\<body[^\>]*\>//si; |
$output=~s/^.*\<body[^\>]*\>//si; |
$output=~s/\<\/body\s*\>.*$//si; |
$output=~s/\<\/body\s*\>.*$//si; |
$output=~ |
$output=~ |
Line 1149 sub countacc {
|
Line 1239 sub countacc {
|
} |
} |
} |
} |
|
|
|
sub linklog { |
|
my ($from,$to)=@_; |
|
$from=&declutter($from); |
|
$to=&declutter($to); |
|
$accesshash{$from.'___'.$to.'___comefrom'}=1; |
|
$accesshash{$to.'___'.$from.'___goto'}=1; |
|
} |
|
|
sub userrolelog { |
sub userrolelog { |
my ($trole,$username,$domain,$area,$tstart,$tend)=@_; |
my ($trole,$username,$domain,$area,$tstart,$tend)=@_; |
if (($trole=~/^ca/) || ($trole=~/^in/) || |
if (($trole=~/^ca/) || ($trole=~/^in/) || |
Line 1182 sub get_course_adv_roles {
|
Line 1280 sub get_course_adv_roles {
|
} else { |
} else { |
$returnhash{$key}=$username.':'.$domain; |
$returnhash{$key}=$username.':'.$domain; |
} |
} |
} |
} |
return sort %returnhash; |
return %returnhash; |
} |
} |
|
|
# ---------------------------------------------------------- Course ID routines |
# ---------------------------------------------------------- Course ID routines |
Line 1198 sub courseidput {
|
Line 1296 sub courseidput {
|
sub courseiddump { |
sub courseiddump { |
my ($domfilter,$descfilter,$sincefilter)=@_; |
my ($domfilter,$descfilter,$sincefilter)=@_; |
my %returnhash=(); |
my %returnhash=(); |
|
unless ($domfilter) { $domfilter=''; } |
foreach my $tryserver (keys %libserv) { |
foreach my $tryserver (keys %libserv) { |
if ($hostdom{$tryserver}=~/$domfilter/) { |
if ((!$domfilter) || ($hostdom{$tryserver} eq $domfilter)) { |
foreach ( |
foreach ( |
split(/\&/,&reply('courseiddump:'.$hostdom{$tryserver}.':'. |
split(/\&/,&reply('courseiddump:'.$hostdom{$tryserver}.':'. |
$sincefilter.':'.&escape($descfilter)))) { |
$sincefilter.':'.&escape($descfilter), |
|
$tryserver))) { |
my ($key,$value)=split(/\=/,$_); |
my ($key,$value)=split(/\=/,$_); |
if (($key) && ($value)) { |
if (($key) && ($value)) { |
$returnhash{&unescape($key)}=&unescape($value); |
$returnhash{&unescape($key)}=&unescape($value); |
Line 1543 sub tmpreset {
|
Line 1643 sub tmpreset {
|
my ($symb,$namespace,$domain,$stuname) = @_; |
my ($symb,$namespace,$domain,$stuname) = @_; |
if (!$symb) { |
if (!$symb) { |
$symb=&symbread(); |
$symb=&symbread(); |
if (!$symb) { $symb= $ENV{'REQUEST_URI'}; } |
if (!$symb) { $symb= $ENV{'request.url'}; } |
} |
} |
$symb=escape($symb); |
$symb=escape($symb); |
|
|
Line 2548 sub plaintext {
|
Line 2648 sub plaintext {
|
# ----------------------------------------------------------------- Assign Role |
# ----------------------------------------------------------------- Assign Role |
|
|
sub assignrole { |
sub assignrole { |
my ($udom,$uname,$url,$role,$end,$start)=@_; |
my ($udom,$uname,$url,$role,$end,$start,$deleteflag)=@_; |
my $mrole; |
my $mrole; |
if ($role =~ /^cr\//) { |
if ($role =~ /^cr\//) { |
unless (&allowed('ccr',$url)) { |
unless (&allowed('ccr',$url)) { |
Line 2561 sub assignrole {
|
Line 2661 sub assignrole {
|
} else { |
} else { |
my $cwosec=$url; |
my $cwosec=$url; |
$cwosec=~s/^\/(\w+)\/(\w+)\/.*/$1\/$2/; |
$cwosec=~s/^\/(\w+)\/(\w+)\/.*/$1\/$2/; |
unless (&allowed('c'.$role,$cwosec)) { |
unless ((&allowed('c'.$role,$cwosec)) || &allowed('c'.$role,$udom)) { |
&logthis('Refused assignrole: '. |
&logthis('Refused assignrole: '. |
$udom.' '.$uname.' '.$url.' '.$role.' '.$end.' '.$start.' by '. |
$udom.' '.$uname.' '.$url.' '.$role.' '.$end.' '.$start.' by '. |
$ENV{'user.name'}.' at '.$ENV{'user.domain'}); |
$ENV{'user.name'}.' at '.$ENV{'user.domain'}); |
Line 2579 sub assignrole {
|
Line 2679 sub assignrole {
|
$command.='_0_'.$start; |
$command.='_0_'.$start; |
} |
} |
} |
} |
|
# actually delete |
|
if ($deleteflag) { |
|
if ((&allowed('dro',$udom)) || (&allowed('dro',$url))) { |
|
# modify command to delete the role |
|
$command="encrypt:rolesdel:$ENV{'user.domain'}:$ENV{'user.name'}:". |
|
"$udom:$uname:$url".'_'."$mrole"; |
|
&logthis("$ENV{'user.name'} at $ENV{'user.domain'} deletes $mrole in $url for $uname at $udom"); |
|
# set start and finish to negative values for userrolelog |
|
$start=-1; |
|
$end=-1; |
|
} |
|
} |
|
# send command |
my $answer=&reply($command,&homeserver($uname,$udom)); |
my $answer=&reply($command,&homeserver($uname,$udom)); |
|
# log new user role if status is ok |
if ($answer eq 'ok') { |
if ($answer eq 'ok') { |
&userrolelog($mrole,$uname,$udom,$url,$start,$end); |
&userrolelog($mrole,$uname,$udom,$url,$start,$end); |
} |
} |
Line 2618 sub modifyuser {
|
Line 2732 sub modifyuser {
|
my ($udom, $uname, $uid, |
my ($udom, $uname, $uid, |
$umode, $upass, $first, |
$umode, $upass, $first, |
$middle, $last, $gene, |
$middle, $last, $gene, |
$forceid, $desiredhome)=@_; |
$forceid, $desiredhome, $email)=@_; |
$udom=~s/\W//g; |
$udom=~s/\W//g; |
$uname=~s/\W//g; |
$uname=~s/\W//g; |
&logthis('Call to modify user '.$udom.', '.$uname.', '.$uid.', '. |
&logthis('Call to modify user '.$udom.', '.$uname.', '.$uid.', '. |
Line 2660 sub modifyuser {
|
Line 2774 sub modifyuser {
|
} |
} |
$uhome=&homeserver($uname,$udom,'true'); |
$uhome=&homeserver($uname,$udom,'true'); |
if (($uhome eq '') || ($uhome eq 'no_host') || ($uhome ne $unhome)) { |
if (($uhome eq '') || ($uhome eq 'no_host') || ($uhome ne $unhome)) { |
return 'error: verify home'; |
return 'error: unable verify users home machine.'; |
} |
} |
} # End of creation of new user |
} # End of creation of new user |
# ---------------------------------------------------------------------- Add ID |
# ---------------------------------------------------------------------- Add ID |
Line 2670 sub modifyuser {
|
Line 2784 sub modifyuser {
|
if (($uidhash{$uname}) && ($uidhash{$uname}!~/error\:/) |
if (($uidhash{$uname}) && ($uidhash{$uname}!~/error\:/) |
&& (!$forceid)) { |
&& (!$forceid)) { |
unless ($uid eq $uidhash{$uname}) { |
unless ($uid eq $uidhash{$uname}) { |
return 'error: mismatch '.$uidhash{$uname}.' versus '.$uid; |
return 'error: user id "'.$uid.'" does not match '. |
|
'current user id "'.$uidhash{$uname}.'".'; |
} |
} |
} else { |
} else { |
&idput($udom,($uname => $uid)); |
&idput($udom,($uname => $uid)); |
Line 2686 sub modifyuser {
|
Line 2801 sub modifyuser {
|
} else { |
} else { |
%names = @tmp; |
%names = @tmp; |
} |
} |
|
# |
|
# Make sure to not trash student environment if instructor does not bother |
|
# to supply name and email information |
|
# |
if ($first) { $names{'firstname'} = $first; } |
if ($first) { $names{'firstname'} = $first; } |
if ($middle) { $names{'middlename'} = $middle; } |
if (defined($middle)) { $names{'middlename'} = $middle; } |
if ($last) { $names{'lastname'} = $last; } |
if ($last) { $names{'lastname'} = $last; } |
if ($gene) { $names{'generation'} = $gene; } |
if (defined($gene)) { $names{'generation'} = $gene; } |
|
if ($email) { $names{'notification'} = $email; |
|
$names{'critnotification'} = $email; } |
|
|
my $reply = &put('environment', \%names, $udom,$uname); |
my $reply = &put('environment', \%names, $udom,$uname); |
if ($reply ne 'ok') { return 'error: '.$reply; } |
if ($reply ne 'ok') { return 'error: '.$reply; } |
&logthis('Success modifying user '.$udom.', '.$uname.', '.$uid.', '. |
&logthis('Success modifying user '.$udom.', '.$uname.', '.$uid.', '. |
Line 2703 sub modifyuser {
|
Line 2825 sub modifyuser {
|
|
|
sub modifystudent { |
sub modifystudent { |
my ($udom,$uname,$uid,$umode,$upass,$first,$middle,$last,$gene,$usec, |
my ($udom,$uname,$uid,$umode,$upass,$first,$middle,$last,$gene,$usec, |
$end,$start,$forceid,$desiredhome)=@_; |
$end,$start,$forceid,$desiredhome,$email)=@_; |
my $cid=''; |
my $cid=''; |
unless ($cid=$ENV{'request.course.id'}) { |
unless ($cid=$ENV{'request.course.id'}) { |
return 'not_in_class'; |
return 'not_in_class'; |
Line 2711 sub modifystudent {
|
Line 2833 sub modifystudent {
|
# --------------------------------------------------------------- Make the user |
# --------------------------------------------------------------- Make the user |
my $reply=&modifyuser |
my $reply=&modifyuser |
($udom,$uname,$uid,$umode,$upass,$first,$middle,$last,$gene,$forceid, |
($udom,$uname,$uid,$umode,$upass,$first,$middle,$last,$gene,$forceid, |
$desiredhome); |
$desiredhome,$email); |
unless ($reply eq 'ok') { return $reply; } |
unless ($reply eq 'ok') { return $reply; } |
# This will cause &modify_student_enrollment to get the uid from the |
# This will cause &modify_student_enrollment to get the uid from the |
# students environment |
# students environment |
Line 2829 sub createcourse {
|
Line 2951 sub createcourse {
|
return 'error: no such course'; |
return 'error: no such course'; |
} |
} |
# ----------------------------------------------------------------- Course made |
# ----------------------------------------------------------------- Course made |
|
# log existance |
|
&courseidput($udom,&escape($udom.'_'.$uname).'='.&escape($description), |
|
$uhome); |
|
&flushcourselogs(); |
|
# set toplevel url |
my $topurl=$url; |
my $topurl=$url; |
unless ($nonstandard) { |
unless ($nonstandard) { |
# ------------------------------------------ For standard courses, make top url |
# ------------------------------------------ For standard courses, make top url |
Line 2857 ENDINITMAP
|
Line 2984 ENDINITMAP
|
# ---------------------------------------------------------- Assign Custom Role |
# ---------------------------------------------------------- Assign Custom Role |
|
|
sub assigncustomrole { |
sub assigncustomrole { |
my ($udom,$uname,$url,$rdom,$rnam,$rolename,$end,$start)=@_; |
my ($udom,$uname,$url,$rdom,$rnam,$rolename,$end,$start,$deleteflag)=@_; |
return &assignrole($udom,$uname,$url,'cr/'.$rdom.'/'.$rnam.'/'.$rolename, |
return &assignrole($udom,$uname,$url,'cr/'.$rdom.'/'.$rnam.'/'.$rolename, |
$end,$start); |
$end,$start,$deleteflag); |
} |
} |
|
|
# ----------------------------------------------------------------- Revoke Role |
# ----------------------------------------------------------------- Revoke Role |
|
|
sub revokerole { |
sub revokerole { |
my ($udom,$uname,$url,$role)=@_; |
my ($udom,$uname,$url,$role,$deleteflag)=@_; |
my $now=time; |
my $now=time; |
return &assignrole($udom,$uname,$url,$role,$now); |
return &assignrole($udom,$uname,$url,$role,$now,$deleteflag); |
} |
} |
|
|
# ---------------------------------------------------------- Revoke Custom Role |
# ---------------------------------------------------------- Revoke Custom Role |
|
|
sub revokecustomrole { |
sub revokecustomrole { |
my ($udom,$uname,$url,$rdom,$rnam,$rolename)=@_; |
my ($udom,$uname,$url,$rdom,$rnam,$rolename,$deleteflag)=@_; |
my $now=time; |
my $now=time; |
return &assigncustomrole($udom,$uname,$url,$rdom,$rnam,$rolename,$now); |
return &assigncustomrole($udom,$uname,$url,$rdom,$rnam,$rolename,$now, |
|
$deleteflag); |
} |
} |
|
|
# ------------------------------------------------------------ Directory lister |
# ------------------------------------------------------------ Directory lister |
Line 2964 sub GetFileTimestamp {
|
Line 3092 sub GetFileTimestamp {
|
$subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/; |
$subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/; |
my $proname="$studentDomain/$subdir/$studentName"; |
my $proname="$studentDomain/$subdir/$studentName"; |
$proname .= '/'.$filename; |
$proname .= '/'.$filename; |
my @dir = &Apache::lonnet::dirlist($proname, $studentDomain, $studentName, |
my ($fileStat) = &Apache::lonnet::dirlist($proname, $studentDomain, |
$root); |
$studentName, $root); |
my $fileStat = $dir[0]; |
|
my @stats = split('&', $fileStat); |
my @stats = split('&', $fileStat); |
if($stats[0] ne 'empty' && $stats[0] ne 'no_such_dir') { |
if($stats[0] ne 'empty' && $stats[0] ne 'no_such_dir') { |
return $stats[9]; |
# @stats contains first the filename, then the stat output |
|
return $stats[10]; # so this is 10 instead of 9. |
} else { |
} else { |
return -1; |
return -1; |
} |
} |
Line 3065 sub courseresdata {
|
Line 3193 sub courseresdata {
|
return undef; |
return undef; |
} |
} |
|
|
# --------------------------------------------------------- Value of a Variable |
# |
|
# EXT resource caching routines |
|
# |
|
|
|
sub clear_EXT_cache_status { |
|
&delenv('cache.EXT.'); |
|
} |
|
|
|
sub EXT_cache_status { |
|
my ($target_domain,$target_user) = @_; |
|
my $cachename = 'cache.EXT.'.$target_user.'.'.$target_domain; |
|
if (exists($ENV{$cachename}) && ($ENV{$cachename}+600) > time) { |
|
# We know already the user has no data |
|
return 1; |
|
} else { |
|
return 0; |
|
} |
|
} |
|
|
|
sub EXT_cache_set { |
|
my ($target_domain,$target_user) = @_; |
|
my $cachename = 'cache.EXT.'.$target_user.'.'.$target_domain; |
|
&appenv($cachename => time); |
|
} |
|
|
|
# --------------------------------------------------------- Value of a Variable |
sub EXT { |
sub EXT { |
my ($varname,$symbparm,$udom,$uname,)=@_; |
my ($varname,$symbparm,$udom,$uname,$usection)=@_; |
|
|
unless ($varname) { return ''; } |
unless ($varname) { return ''; } |
#get real user name/domain, courseid and symb |
#get real user name/domain, courseid and symb |
my $courseid; |
my $courseid; |
|
my $publicuser; |
if (!($uname && $udom)) { |
if (!($uname && $udom)) { |
(my $cursymb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser(); |
(my $cursymb,$courseid,$udom,$uname,$publicuser)= |
|
&Apache::lonxml::whichuser($symbparm); |
if (!$symbparm) { $symbparm=$cursymb; } |
if (!$symbparm) { $symbparm=$cursymb; } |
} else { |
} else { |
$courseid=$ENV{'request.course.id'}; |
$courseid=$ENV{'request.course.id'}; |
Line 3097 sub EXT {
|
Line 3251 sub EXT {
|
if (defined($Apache::lonhomework::parsing_a_problem)) { |
if (defined($Apache::lonhomework::parsing_a_problem)) { |
return $Apache::lonhomework::history{$qualifierrest}; |
return $Apache::lonhomework::history{$qualifierrest}; |
} else { |
} else { |
my %restored=&restore($symbparm,$courseid,$udom,$uname); |
my %restored; |
|
if ($publicuser || $ENV{'request.state'} eq 'construct') { |
|
%restored=&tmprestore($symbparm,$courseid,$udom,$uname); |
|
} else { |
|
%restored=&restore($symbparm,$courseid,$udom,$uname); |
|
} |
return $restored{$qualifierrest}; |
return $restored{$qualifierrest}; |
} |
} |
# ----------------------------------------------------------------- user.access |
# ----------------------------------------------------------------- user.access |
Line 3110 sub EXT {
|
Line 3269 sub EXT {
|
($udom eq $ENV{'user.domain'})) { |
($udom eq $ENV{'user.domain'})) { |
return $ENV{join('.',('environment',$qualifierrest))}; |
return $ENV{join('.',('environment',$qualifierrest))}; |
} else { |
} else { |
my %returnhash=&userenvironment($udom,$uname,$qualifierrest); |
my %returnhash; |
|
if (!$publicuser) { |
|
%returnhash=&userenvironment($udom,$uname, |
|
$qualifierrest); |
|
} |
return $returnhash{$qualifierrest}; |
return $returnhash{$qualifierrest}; |
} |
} |
# ----------------------------------------------------------------- user.course |
# ----------------------------------------------------------------- user.course |
Line 3134 sub EXT {
|
Line 3297 sub EXT {
|
return $uname; |
return $uname; |
# ---------------------------------------------------- Any other user namespace |
# ---------------------------------------------------- Any other user namespace |
} else { |
} else { |
my %reply=&get($space,[$qualifierrest],$udom,$uname); |
my %reply; |
return $reply{$qualifierrest}; |
if (!$publicuser) { |
|
%reply=&get($space,[$qualifierrest],$udom,$uname); |
|
} |
|
return $reply{$qualifierrest}; |
} |
} |
} elsif ($realm eq 'query') { |
} elsif ($realm eq 'query') { |
# ---------------------------------------------- pull stuff out of query string |
# ---------------------------------------------- pull stuff out of query string |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},[$space]); |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
return $ENV{'form.'.$space}; |
[$spacequalifierrest]); |
|
return $ENV{'form.'.$spacequalifierrest}; |
} elsif ($realm eq 'request') { |
} elsif ($realm eq 'request') { |
# ------------------------------------------------------------- request.browser |
# ------------------------------------------------------------- request.browser |
if ($space eq 'browser') { |
if ($space eq 'browser') { |
Line 3154 sub EXT {
|
Line 3321 sub EXT {
|
return $ENV{'course.'.$courseid.'.'.$spacequalifierrest}; |
return $ENV{'course.'.$courseid.'.'.$spacequalifierrest}; |
} elsif ($realm eq 'resource') { |
} elsif ($realm eq 'resource') { |
|
|
if ($courseid eq $ENV{'request.course.id'}) { |
if (defined($courseid) && $courseid eq $ENV{'request.course.id'}) { |
|
|
#print '<br>'.$space.' - '.$qualifier.' - '.$spacequalifierrest; |
#print '<br>'.$space.' - '.$qualifier.' - '.$spacequalifierrest; |
|
|
Line 3171 sub EXT {
|
Line 3338 sub EXT {
|
($ENV{'user.domain'} eq $udom)) { |
($ENV{'user.domain'} eq $udom)) { |
$section=$ENV{'request.course.sec'}; |
$section=$ENV{'request.course.sec'}; |
} else { |
} else { |
$section=&usection($udom,$uname,$courseid); |
if (! defined($usection)) { |
|
$section=&usection($udom,$uname,$courseid); |
|
} else { |
|
$section = $usection; |
|
} |
} |
} |
|
|
my $seclevel=$courseid.'.['.$section.'].'.$spacequalifierrest; |
my $seclevel=$courseid.'.['.$section.'].'.$spacequalifierrest; |
Line 3183 sub EXT {
|
Line 3354 sub EXT {
|
my $courselevelm=$courseid.'.'.$mapparm; |
my $courselevelm=$courseid.'.'.$mapparm; |
|
|
# ----------------------------------------------------------- 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 |
#every thirty minutes |
if (! |
if (! &EXT_cache_status($udom,$uname)) { |
(exists($ENV{'cache.studentresdata'}) |
|
&& (($ENV{'cache.studentresdata'}+1800) > time))) { |
|
my %resourcedata=&get('resourcedata', |
my %resourcedata=&get('resourcedata', |
[$courselevelr,$courselevelm,$courselevel], |
[$courselevelr,$courselevelm,$courselevel], |
$udom,$uname); |
$udom,$uname); |
Line 3206 sub EXT {
|
Line 3375 sub EXT {
|
$uname." at ".$udom.": ". |
$uname." at ".$udom.": ". |
$tmp."</font>"); |
$tmp."</font>"); |
} elsif ($tmp=~/error:No such file/) { |
} elsif ($tmp=~/error:No such file/) { |
$ENV{'cache.studentresdata'}=time; |
&EXT_cache_set($udom,$uname); |
&appenv(('cache.studentresdata'=> |
|
$ENV{'cache.studentresdata'})); |
|
} elsif ($tmp =~ /^(con_lost|no_such_host)/) { |
} elsif ($tmp =~ /^(con_lost|no_such_host)/) { |
return $tmp; |
return $tmp; |
} |
} |
Line 3328 sub metadata {
|
Line 3495 sub metadata {
|
my $parser=HTML::LCParser->new(\$metastring); |
my $parser=HTML::LCParser->new(\$metastring); |
my $token; |
my $token; |
undef %metathesekeys; |
undef %metathesekeys; |
|
delete($metacache{$uri.':packages'}); |
while ($token=$parser->get_token) { |
while ($token=$parser->get_token) { |
if ($token->[0] eq 'S') { |
if ($token->[0] eq 'S') { |
if (defined($token->[2]->{'package'})) { |
if (defined($token->[2]->{'package'})) { |
Line 3354 sub metadata {
|
Line 3522 sub metadata {
|
$value.=' [Part: '.$part.']'; |
$value.=' [Part: '.$part.']'; |
} |
} |
my $unikey='parameter'.$keyroot.'_'.$name; |
my $unikey='parameter'.$keyroot.'_'.$name; |
if ($subp eq 'default') { $unikey='parameter_0_'.$name; } |
if ($subp eq 'default') { |
$metathesekeys{$unikey}=1; |
$unikey='parameter_0_'.$name; |
$metacache{$uri.':'.$unikey.'.part'}=$part; |
$metacache{$uri.':'.$unikey.'.part'}='0'; |
|
} else { |
|
$metacache{$uri.':'.$unikey.'.part'}=$part; |
|
$metathesekeys{$unikey}=1; |
|
} |
unless (defined($metacache{$uri.':'.$unikey.'.'.$subp})) { |
unless (defined($metacache{$uri.':'.$unikey.'.'.$subp})) { |
$metacache{$uri.':'.$unikey.'.'.$subp}=$value; |
$metacache{$uri.':'.$unikey.'.'.$subp}=$value; |
} |
} |
if (defined($metacache{$uri.':'.$unikey.'.default'})) { |
if (defined($metacache{$uri.':'.$unikey.'.default'})) { |
$metacache{$uri.':'.$unikey}= |
$metacache{$uri.':'.$unikey}= |
$metacache{$uri.':'.$unikey.'.default'} |
$metacache{$uri.':'.$unikey.'.default'}; |
} |
} |
} |
} |
} |
} |
} else { |
} else { |
Line 3459 sub metadata_generate_part0 {
|
Line 3631 sub metadata_generate_part0 {
|
if ($metakey=~/^parameter\_(.*)/) { |
if ($metakey=~/^parameter\_(.*)/) { |
my $part=$$metacache{$uri.':'.$metakey.'.part'}; |
my $part=$$metacache{$uri.':'.$metakey.'.part'}; |
my $name=$$metacache{$uri.':'.$metakey.'.name'}; |
my $name=$$metacache{$uri.':'.$metakey.'.name'}; |
if (! exists($$metadata{'parameter_0_'.$name})) { |
if (! exists($$metadata{'parameter_0_'.$name.'.name'})) { |
$allnames{$name}=$part; |
$allnames{$name}=$part; |
} |
} |
} |
} |
Line 3489 sub gettitle {
|
Line 3661 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}) { return $titlecache{$symb}; } |
if ($titlecache{$symb}) { |
|
if (time < ($titlecache{$symb}[1] + 600)) { |
|
return $titlecache{$symb}[0]; |
|
} else { |
|
delete($titlecache{$symb}); |
|
} |
|
} |
my ($map,$resid,$url)=split(/\_\_\_/,$symb); |
my ($map,$resid,$url)=split(/\_\_\_/,$symb); |
my $title=''; |
my $title=''; |
my %bighash; |
my %bighash; |
Line 3499 sub gettitle {
|
Line 3677 sub gettitle {
|
$title=$bighash{'title_'.$mapid.'.'.$resid}; |
$title=$bighash{'title_'.$mapid.'.'.$resid}; |
untie %bighash; |
untie %bighash; |
} |
} |
|
$title=~s/\&colon\;/\:/gs; |
if ($title) { |
if ($title) { |
$titlecache{$symb}=$title; |
$titlecache{$symb}=[$title,time]; |
return $title; |
return $title; |
} else { |
} else { |
return &metadata($urlsymb,'title'); |
return &metadata($urlsymb,'title'); |
Line 3672 sub numval {
|
Line 3851 sub numval {
|
$txt=~tr/u-z/0-5/; |
$txt=~tr/u-z/0-5/; |
$txt=~s/\D//g; |
$txt=~s/\D//g; |
return int($txt); |
return int($txt); |
} |
} |
|
|
|
sub latest_rnd_algorithm_id { |
|
return '64bit'; |
|
} |
|
|
sub rndseed { |
sub rndseed { |
my ($symb,$courseid,$domain,$username)=@_; |
my ($symb,$courseid,$domain,$username)=@_; |
|
|
|
my ($wsymb,$wcourseid,$wdomain,$wusername)=&Apache::lonxml::whichuser(); |
if (!$symb) { |
if (!$symb) { |
unless ($symb=&symbread()) { return time; } |
unless ($symb=$wsymb) { return time; } |
|
} |
|
if (!$courseid) { $courseid=$wcourseid; } |
|
if (!$domain) { $domain=$wdomain; } |
|
if (!$username) { $username=$wusername } |
|
my $which=$ENV{"course.$courseid.rndseed"}; |
|
my $CODE=$ENV{'scantron.CODE'}; |
|
if (defined($CODE)) { |
|
&rndseed_CODE_64bit($symb,$courseid,$domain,$username); |
|
} elsif ($which eq '64bit') { |
|
return &rndseed_64bit($symb,$courseid,$domain,$username); |
|
} |
|
return &rndseed_32bit($symb,$courseid,$domain,$username); |
|
} |
|
|
|
sub rndseed_32bit { |
|
my ($symb,$courseid,$domain,$username)=@_; |
|
{ |
|
use integer; |
|
my $symbchck=unpack("%32C*",$symb) << 27; |
|
my $symbseed=numval($symb) << 22; |
|
my $namechck=unpack("%32C*",$username) << 17; |
|
my $nameseed=numval($username) << 12; |
|
my $domainseed=unpack("%32C*",$domain) << 7; |
|
my $courseseed=unpack("%32C*",$courseid); |
|
my $num=$symbseed+$nameseed+$domainseed+$courseseed+$namechck+$symbchck; |
|
#&Apache::lonxml::debug("$symbseed:$nameseed;$domainseed|$courseseed;$namechck:$symbchck"); |
|
#&Apache::lonxml::debug("rndseed :$num:$symb"); |
|
return $num; |
|
} |
|
} |
|
|
|
sub rndseed_64bit { |
|
my ($symb,$courseid,$domain,$username)=@_; |
|
{ |
|
use integer; |
|
my $symbchck=unpack("%32S*",$symb) << 21; |
|
my $symbseed=numval($symb) << 10; |
|
my $namechck=unpack("%32S*",$username); |
|
|
|
my $nameseed=numval($username) << 21; |
|
my $domainseed=unpack("%32S*",$domain) << 10; |
|
my $courseseed=unpack("%32S*",$courseid); |
|
|
|
my $num1=$symbchck+$symbseed+$namechck; |
|
my $num2=$nameseed+$domainseed+$courseseed; |
|
#&Apache::lonxml::debug("$symbseed:$nameseed;$domainseed|$courseseed;$namechck:$symbchck"); |
|
#&Apache::lonxml::debug("rndseed :$num:$symb"); |
|
return "$num1,$num2"; |
} |
} |
if (!$courseid) { $courseid=$ENV{'request.course.id'};} |
} |
if (!$domain) {$domain=$ENV{'user.domain'};} |
|
if (!$username) {$username=$ENV{'user.name'};} |
sub rndseed_CODE_64bit { |
|
my ($symb,$courseid,$domain,$username)=@_; |
{ |
{ |
use integer; |
use integer; |
my $symbchck=unpack("%32C*",$symb) << 27; |
my $symbchck=unpack("%32S*",$symb) << 16; |
my $symbseed=numval($symb) << 22; |
my $symbseed=numval($symb); |
my $namechck=unpack("%32C*",$username) << 17; |
my $CODEseed=numval($ENV{'scantron.CODE'}) << 16; |
my $nameseed=numval($username) << 12; |
my $courseseed=unpack("%32S*",$courseid); |
my $domainseed=unpack("%32C*",$domain) << 7; |
my $num1=$symbseed+$CODEseed; |
my $courseseed=unpack("%32C*",$courseid); |
my $num2=$courseseed+$symbchck; |
my $num=$symbseed+$nameseed+$domainseed+$courseseed+$namechck+$symbchck; |
#&Apache::lonxml::debug("$symbseed:$CODEseed|$courseseed:$symbchck"); |
#uncommenting these lines can break things! |
#&Apache::lonxml::debug("rndseed :$num1:$num2:$symb"); |
#&Apache::lonxml::debug("$symbseed:$nameseed;$domainseed|$courseseed;$namechck:$symbchck"); |
return "$num1,$num2"; |
#&Apache::lonxml::debug("rndseed :$num:$symb"); |
} |
return $num; |
} |
|
|
|
sub setup_random_from_rndseed { |
|
my ($rndseed)=@_; |
|
if ($rndseed =~/,/) { |
|
my ($num1,$num2)=split(/,/,$rndseed); |
|
&Math::Random::random_set_seed(abs($num1),abs($num2)); |
|
} else { |
|
&Math::Random::random_set_seed_from_phrase($rndseed); |
} |
} |
} |
} |
|
|
Line 3820 sub goodbye {
|
Line 4062 sub goodbye {
|
&logthis("Starting Shut down"); |
&logthis("Starting Shut down"); |
&flushcourselogs(); |
&flushcourselogs(); |
&logthis("Shutting down"); |
&logthis("Shutting down"); |
|
return DONE; |
} |
} |
|
|
BEGIN { |
BEGIN { |