version 1.267.4.7, 2002/09/17 20:01:30
|
version 1.287, 2002/10/01 07:09:05
|
Line 348 sub delenv {
|
Line 348 sub delenv {
|
return 'ok'; |
return 'ok'; |
} |
} |
|
|
|
# ------------------------------------------ Fight off request when overloaded |
|
|
|
sub overloaderror { |
|
my ($r,$checkserver)=@_; |
|
unless ($checkserver) { $checkserver=$perlvar{'lonHostID'}; } |
|
my $loadavg; |
|
if ($checkserver eq $perlvar{'lonHostID'}) { |
|
my $loadfile=Apache::File->new('/proc/loadavg'); |
|
$loadavg=<$loadfile>; |
|
$loadavg =~ s/\s.*//g; |
|
$loadavg = 100*$loadavg/$perlvar{'lonLoadLim'}; |
|
} else { |
|
$loadavg=&reply('load',$checkserver); |
|
} |
|
my $overload=$loadavg-100; |
|
if ($overload>0) { |
|
$r->err_headers_out->{'Retry-After'}=$overload; |
|
$r->log_error('Overload of '.$overload.' on '.$checkserver); |
|
return 413; |
|
} |
|
return ''; |
|
} |
|
|
# ------------------------------ Find server with least workload from spare.tab |
# ------------------------------ Find server with least workload from spare.tab |
|
|
sub spareserver { |
sub spareserver { |
Line 762 sub userfileupload {
|
Line 785 sub userfileupload {
|
$docudom=$ENV{'user.domain'}; |
$docudom=$ENV{'user.domain'}; |
$docuhome=$ENV{'user.home'}; |
$docuhome=$ENV{'user.home'}; |
} |
} |
|
return |
|
&finishuserfileupload($docuname,$docudom,$docuhome,$formname,$fname); |
|
} |
|
|
|
sub finishuserfileupload { |
|
my ($docuname,$docudom,$docuhome,$formname,$fname)=@_; |
my $path=$docudom.'/'.$docuname.'/'; |
my $path=$docudom.'/'.$docuname.'/'; |
my $filepath=$perlvar{'lonDocRoot'}; |
my $filepath=$perlvar{'lonDocRoot'}; |
my @parts=split(/\//,$filepath.'/userfiles/'.$path); |
my @parts=split(/\//,$filepath.'/userfiles/'.$path); |
Line 866 sub countacc {
|
Line 895 sub countacc {
|
my $url=&declutter(shift); |
my $url=&declutter(shift); |
unless ($ENV{'request.course.id'}) { return ''; } |
unless ($ENV{'request.course.id'}) { return ''; } |
$accesshash{$ENV{'request.course.id'}.'___'.$url.'___course'}=1; |
$accesshash{$ENV{'request.course.id'}.'___'.$url.'___course'}=1; |
my $key=$processmarker.'_'.$dumpcount.'___'.$url.'___count'; |
my $key=$$.$processmarker.'_'.$dumpcount.'___'.$url.'___count'; |
if (defined($accesshash{$key})) { |
if (defined($accesshash{$key})) { |
$accesshash{$key}++; |
$accesshash{$key}++; |
} else { |
} else { |
Line 1436 sub coursedescription {
|
Line 1465 sub coursedescription {
|
while (my ($name,$value) = each %returnhash) { |
while (my ($name,$value) = each %returnhash) { |
$envhash{'course.'.$normalid.'.'.$name}=$value; |
$envhash{'course.'.$normalid.'.'.$name}=$value; |
} |
} |
$returnhash{'url'}='/res/'.declutter($returnhash{'url'}); |
$returnhash{'url'}=&clutter($returnhash{'url'}); |
$returnhash{'fn'}=$perlvar{'lonDaemons'}.'/tmp/'. |
$returnhash{'fn'}=$perlvar{'lonDaemons'}.'/tmp/'. |
$ENV{'user.name'}.'_'.$cdomain.'_'.$cnum; |
$ENV{'user.name'}.'_'.$cdomain.'_'.$cnum; |
$envhash{'course.'.$normalid.'.last_cache'}=time; |
$envhash{'course.'.$normalid.'.last_cache'}=time; |
Line 1564 sub get {
|
Line 1593 sub get {
|
|
|
my $rep=&reply("get:$udomain:$uname:$namespace:$items",$uhome); |
my $rep=&reply("get:$udomain:$uname:$namespace:$items",$uhome); |
my @pairs=split(/\&/,$rep); |
my @pairs=split(/\&/,$rep); |
|
if ( $#pairs==0 && $pairs[0] =~ /^(con_lost|error|no_such_host)/i) { |
|
return @pairs; |
|
} |
my %returnhash=(); |
my %returnhash=(); |
my $i=0; |
my $i=0; |
foreach (@$storearr) { |
foreach (@$storearr) { |
Line 2296 sub writecoursepref {
|
Line 2328 sub writecoursepref {
|
# ---------------------------------------------------------- Make/modify course |
# ---------------------------------------------------------- Make/modify course |
|
|
sub createcourse { |
sub createcourse { |
my ($udom,$description,$url,$course_server)=@_; |
my ($udom,$description,$url,$course_server,$nonstandard)=@_; |
$url=&declutter($url); |
$url=&declutter($url); |
my $cid=''; |
my $cid=''; |
unless (&allowed('ccc',$udom)) { |
unless (&allowed('ccc',$udom)) { |
Line 2328 sub createcourse {
|
Line 2360 sub createcourse {
|
if (($uhome eq '') || ($uhome eq 'no_host')) { |
if (($uhome eq '') || ($uhome eq 'no_host')) { |
return 'error: no such course'; |
return 'error: no such course'; |
} |
} |
|
# ----------------------------------------------------------------- Course made |
|
my $topurl=$url; |
|
unless ($nonstandard) { |
|
# ------------------------------------------ For standard courses, make top url |
|
my $mapurl=&clutter($url); |
|
if ($mapurl eq '/res/') { $mapurl=''; } |
|
$ENV{'form.initmap'}=(<<ENDINITMAP); |
|
<map> |
|
<resource id="1" type="start"></resource> |
|
<resource id="2" src="$mapurl"></resource> |
|
<resource id="3" type="finish"></resource> |
|
<link index="1" from="1" to="2"></link> |
|
<link index="2" from="2" to="3"></link> |
|
</map> |
|
ENDINITMAP |
|
$topurl=&declutter( |
|
&finishuserfileupload($uname,$udom,$uhome,'initmap','default.sequence') |
|
); |
|
} |
|
# ----------------------------------------------------------- Write preferences |
&writecoursepref($udom.'_'.$uname, |
&writecoursepref($udom.'_'.$uname, |
('description' => $description, |
('description' => $description, |
'url' => $url)); |
'url' => $topurl)); |
return '/'.$udom.'/'.$uname; |
return '/'.$udom.'/'.$uname; |
} |
} |
|
|
Line 2507 sub condval {
|
Line 2559 sub condval {
|
return $result; |
return $result; |
} |
} |
|
|
|
# ---------------------------------------------------- Devalidate courseresdata |
|
|
|
sub devalidatecourseresdata { |
|
my ($coursenum,$coursedomain)=@_; |
|
my $hashid=$coursenum.':'.$coursedomain; |
|
delete $courseresdatacache{$hashid.'.time'}; |
|
} |
|
|
# --------------------------------------------------- Course Resourcedata Query |
# --------------------------------------------------- Course Resourcedata Query |
|
|
sub courseresdata { |
sub courseresdata { |
Line 2528 sub courseresdata {
|
Line 2588 sub courseresdata {
|
} |
} |
} |
} |
foreach my $item (@which) { |
foreach my $item (@which) { |
if ($courseresdatacache{$hashid}->{$item}) { |
if (defined($courseresdatacache{$hashid}->{$item})) { |
return $courseresdatacache{$hashid}->{$item}; |
return $courseresdatacache{$hashid}->{$item}; |
} |
} |
} |
} |
Line 2679 sub EXT {
|
Line 2739 sub EXT {
|
($seclevelr,$seclevelm,$seclevel, |
($seclevelr,$seclevelm,$seclevel, |
$courselevelr,$courselevelm, |
$courselevelr,$courselevelm, |
$courselevel)); |
$courselevel)); |
if ($coursereply) { return $coursereply; } |
if (defined($coursereply)) { return $coursereply; } |
|
|
# ------------------------------------------------------ third, check map parms |
# ------------------------------------------------------ third, check map parms |
my %parmhash=(); |
my %parmhash=(); |
Line 2940 sub symbverify {
|
Line 3000 sub symbverify {
|
my $okay=0; |
my $okay=0; |
if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', |
if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', |
&GDBM_READER(),0640)) { |
&GDBM_READER(),0640)) { |
my $ids=$bighash{'ids_/res/'.$thisfn}; |
my $ids=$bighash{'ids_'.&clutter($thisfn)}; |
unless ($ids) { |
unless ($ids) { |
$ids=$bighash{'ids_/'.$thisfn}; |
$ids=$bighash{'ids_/'.$thisfn}; |
} |
} |
Line 3011 sub symbread {
|
Line 3071 sub symbread {
|
if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', |
if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', |
&GDBM_READER(),0640)) { |
&GDBM_READER(),0640)) { |
# ---------------------------------------------- Get ID(s) for current resource |
# ---------------------------------------------- Get ID(s) for current resource |
my $ids=$bighash{'ids_/res/'.$thisfn}; |
my $ids=$bighash{'ids_'.&clutter($thisfn)}; |
unless ($ids) { |
unless ($ids) { |
$ids=$bighash{'ids_/'.$thisfn}; |
$ids=$bighash{'ids_/'.$thisfn}; |
} |
} |
Line 3118 sub receipt {
|
Line 3178 sub receipt {
|
# ------------------------------------------------------------ Serves up a file |
# ------------------------------------------------------------ Serves up a file |
# returns either the contents of the file or a -1 |
# returns either the contents of the file or a -1 |
sub getfile { |
sub getfile { |
my $file=shift; |
my $file=shift; |
|
if ($file=~/^\/*uploaded\//) { # user file |
|
my $ua=new LWP::UserAgent; |
|
my $request=new HTTP::Request('GET',&tokenwrapper($file)); |
|
my $response=$ua->request($request); |
|
if ($response->is_success()) { |
|
return $response->content; |
|
} else { |
|
return -1; |
|
} |
|
} else { # normal file from res space |
&repcopy($file); |
&repcopy($file); |
if (! -e $file ) { return -1; }; |
if (! -e $file ) { return -1; }; |
my $fh=Apache::File->new($file); |
my $fh=Apache::File->new($file); |
my $a=''; |
my $a=''; |
while (<$fh>) { $a .=$_; } |
while (<$fh>) { $a .=$_; } |
return $a |
return $a; |
|
} |
} |
} |
|
|
sub filelocation { |
sub filelocation { |
Line 3134 sub filelocation {
|
Line 3205 sub filelocation {
|
if ($file=~m:^/~:) { # is a contruction space reference |
if ($file=~m:^/~:) { # is a contruction space reference |
$location = $file; |
$location = $file; |
$location =~ s:/~(.*?)/(.*):/home/$1/public_html/$2:; |
$location =~ s:/~(.*?)/(.*):/home/$1/public_html/$2:; |
|
} elsif ($file=~/^\/*uploaded/) { # is an uploaded file |
|
$location=$file; |
} else { |
} else { |
$file=~s/^$perlvar{'lonDocRoot'}//; |
$file=~s/^$perlvar{'lonDocRoot'}//; |
$file=~s:^/*res::; |
$file=~s:^/*res::; |
Line 3171 sub declutter {
|
Line 3244 sub declutter {
|
return $thisfn; |
return $thisfn; |
} |
} |
|
|
|
# ------------------------------------------------------------- Clutter up URLs |
|
|
|
sub clutter { |
|
my $thisfn='/'.&declutter(shift); |
|
unless ($thisfn=~/^\/(uploaded|adm|userfiles|ext|raw|priv)\//) { |
|
$thisfn='/res'.$thisfn; |
|
} |
|
return $thisfn; |
|
} |
|
|
# -------------------------------------------------------- Escape Special Chars |
# -------------------------------------------------------- Escape Special Chars |
|
|
sub escape { |
sub escape { |
Line 3296 BEGIN {
|
Line 3379 BEGIN {
|
|
|
%metacache=(); |
%metacache=(); |
|
|
$processmarker=$$.'_'.time.'_'.$perlvar{'lonHostID'}; |
$processmarker='_'.time.'_'.$perlvar{'lonHostID'}; |
$dumpcount=0; |
$dumpcount=0; |
|
|
&logtouch(); |
&logtouch(); |
Line 3512 modify user
|
Line 3595 modify user
|
|
|
=item * |
=item * |
|
|
modifystudent($udom,$uname,$uid,$umode,$upass,$first,$middle,$last,$gene,$usec,$end,$start) : modify student |
modifystudent |
|
|
|
modify a students enrollment and identification information. |
|
The course id is resolved based on the current users environment. |
|
This means the envoking user must be a course coordinator or otherwise |
|
associated with a course. |
|
|
|
This call is essentially a wrapper for lonnet::modifyuser |
|
|
|
Inputs: |
|
|
|
=over 4 |
|
|
|
=item B<$udom> Students loncapa domain |
|
|
|
=item B<$uname> Students loncapa login name |
|
|
|
=item B<$uid> Students id/student number |
|
|
|
=item B<$umode> Students authentication mode |
|
|
|
=item B<$upass> Students password |
|
|
|
=item B<$first> Students first name |
|
|
|
=item B<$middle> Students middle name |
|
|
|
=item B<$last> Students last name |
|
|
|
=item B<$gene> Students generation |
|
|
|
=item B<$usec> Students section in course |
|
|
|
=item B<$end> Unix time of the roles expiration |
|
|
|
=item B<$start> Unix time of the roles start date |
|
|
|
=item B<$forceid> If defined, allow $uid to be changed |
|
|
|
=item B<$desiredhome> server to use as home server for student |
|
|
|
=back |
|
|
=item * |
=item * |
|
|