version 1.202, 2002/02/19 21:53:42
|
version 1.209, 2002/04/26 18:49:09
|
Line 84 qw(%perlvar %hostname %homecache %hostip
|
Line 84 qw(%perlvar %hostname %homecache %hostip
|
use IO::Socket; |
use IO::Socket; |
use GDBM_File; |
use GDBM_File; |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
use HTML::TokeParser; |
use HTML::LCParser; |
use Fcntl qw(:flock); |
use Fcntl qw(:flock); |
my $readit; |
my $readit; |
|
|
Line 137 sub subreply {
|
Line 137 sub subreply {
|
|
|
sub reply { |
sub reply { |
my ($cmd,$server)=@_; |
my ($cmd,$server)=@_; |
|
unless (defined($hostname{$server})) { return 'no_such_host'; } |
my $answer=subreply($cmd,$server); |
my $answer=subreply($cmd,$server); |
if ($answer eq 'con_lost') { $answer=subreply($cmd,$server); } |
if ($answer eq 'con_lost') { |
|
sleep 5; |
|
$answer=subreply($cmd,$server); |
|
if ($answer eq 'con_lost') { |
|
&logthis("Second attempt con_lost on $server"); |
|
my $peerfile="$perlvar{'lonSockDir'}/$server"; |
|
my $client=IO::Socket::UNIX->new(Peer =>"$peerfile", |
|
Type => SOCK_STREAM, |
|
Timeout => 10) |
|
or return "con_lost"; |
|
&logthis("Killing socket"); |
|
print $client "close_connection_exit\n"; |
|
sleep 5; |
|
$answer=subreply($cmd,$server); |
|
} |
|
} |
if (($answer=~/^refused/) || ($answer=~/^rejected/)) { |
if (($answer=~/^refused/) || ($answer=~/^rejected/)) { |
&logthis("<font color=blue>WARNING:". |
&logthis("<font color=blue>WARNING:". |
" $cmd to $server returned $answer</font>"); |
" $cmd to $server returned $answer</font>"); |
Line 700 sub flushcourselogs {
|
Line 716 sub flushcourselogs {
|
&logthis('Flushing course log buffers'); |
&logthis('Flushing course log buffers'); |
foreach (keys %courselogs) { |
foreach (keys %courselogs) { |
my $crsid=$_; |
my $crsid=$_; |
|
&logthis(":$crsid:$coursehombuf{$crsid}"); |
if (&reply('log:'.$coursedombuf{$crsid}.':'. |
if (&reply('log:'.$coursedombuf{$crsid}.':'. |
&escape($courselogs{$crsid}), |
&escape($courselogs{$crsid}), |
$coursehombuf{$crsid}) eq 'ok') { |
$coursehombuf{$crsid}) eq 'ok') { |
Line 897 sub devalidate {
|
Line 914 sub devalidate {
|
} |
} |
} |
} |
|
|
|
sub arrayref2str { |
|
my ($arrayref) = @_; |
|
my $result='_ARRAY_REF__'; |
|
foreach my $elem (@$arrayref) { |
|
if (ref($elem) eq 'ARRAY') { |
|
$result.=&escape(&arrayref2str($elem)).'&'; |
|
} elsif (ref($elem) eq 'HASH') { |
|
$result.=&escape(&hashref2str($elem)).'&'; |
|
} elsif (ref($elem)) { |
|
&logthis("Got a ref of ".(ref($elem))." skipping."); |
|
} else { |
|
$result.=&escape($elem).'&'; |
|
} |
|
} |
|
$result=~s/\&$//; |
|
return $result; |
|
} |
|
|
sub hash2str { |
sub hash2str { |
my (%hash)=@_; |
my (%hash) = @_; |
my $result=''; |
my $result=&hashref2str(\%hash); |
foreach (keys %hash) { $result.=escape($_).'='.escape($hash{$_}).'&'; } |
$result=~s/^_HASH_REF__//; |
|
return $result; |
|
} |
|
|
|
sub hashref2str { |
|
my ($hashref)=@_; |
|
my $result='_HASH_REF__'; |
|
foreach (keys(%$hashref)) { |
|
if (ref($_) eq 'ARRAY') { |
|
$result.=&escape(&arrayref2str($_)).'='; |
|
} elsif (ref($_) eq 'HASH') { |
|
$result.=&escape(&hashref2str($_)).'='; |
|
} elsif (ref($_)) { |
|
&logthis("Got a ref of ".(ref($_))." skipping."); |
|
} else { |
|
$result.=&escape($_).'='; |
|
} |
|
|
|
if (ref($$hashref{$_}) eq 'ARRAY') { |
|
$result.=&escape(&arrayref2str($$hashref{$_})).'&'; |
|
} elsif (ref($$hashref{$_}) eq 'HASH') { |
|
$result.=&escape(&hashref2str($$hashref{$_})).'&'; |
|
} elsif (ref($$hashref{$_})) { |
|
&logthis("Got a ref of ".(ref($$hashref{$_}))." skipping."); |
|
} else { |
|
$result.=&escape($$hashref{$_}).'&'; |
|
} |
|
} |
$result=~s/\&$//; |
$result=~s/\&$//; |
return $result; |
return $result; |
} |
} |
Line 910 sub str2hash {
|
Line 972 sub str2hash {
|
my %returnhash; |
my %returnhash; |
foreach (split(/\&/,$string)) { |
foreach (split(/\&/,$string)) { |
my ($name,$value)=split(/\=/,$_); |
my ($name,$value)=split(/\=/,$_); |
$returnhash{&unescape($name)}=&unescape($value); |
$name=&unescape($name); |
|
$value=&unescape($value); |
|
if ($value =~ /^_HASH_REF__/) { |
|
$value =~ s/^_HASH_REF__//; |
|
my %hash=&str2hash($value); |
|
$value=\%hash; |
|
} elsif ($value =~ /^_ARRAY_REF__/) { |
|
$value =~ s/^_ARRAY_REF__//; |
|
my @array=&str2array($value); |
|
$value=\@array; |
|
} |
|
$returnhash{$name}=$value; |
} |
} |
return %returnhash; |
return (%returnhash); |
|
} |
|
|
|
sub str2array { |
|
my ($string) = @_; |
|
my @returnarray; |
|
foreach my $value (split(/\&/,$string)) { |
|
$value=&unescape($value); |
|
if ($value =~ /^_HASH_REF__/) { |
|
$value =~ s/^_HASH_REF__//; |
|
my %hash=&str2hash($value); |
|
$value=\%hash; |
|
} elsif ($value =~ /^_ARRAY_REF__/) { |
|
$value =~ s/^_ARRAY_REF__//; |
|
my @array=&str2array($value); |
|
$value=\@array; |
|
} |
|
push(@returnarray,$value); |
|
} |
|
return (@returnarray); |
} |
} |
|
|
# -------------------------------------------------------------------Temp Store |
# -------------------------------------------------------------------Temp Store |
Line 1768 sub modifyuserauth {
|
Line 1860 sub modifyuserauth {
|
|
|
# --------------------------------------------------------------- Modify a user |
# --------------------------------------------------------------- Modify a user |
|
|
|
|
sub modifyuser { |
sub modifyuser { |
my ($udom,$uname,$uid,$umode,$upass,$first,$middle,$last,$gene, |
my ($udom, $uname, $uid, |
$forceid)=@_; |
$umode, $upass, $first, |
|
$middle, $last, $gene, |
|
$forceid, $desiredhome)=@_; |
$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.', '. |
$umode.', '.$first.', '.$middle.', '. |
$umode.', '.$first.', '.$middle.', '. |
$last.', '.$gene.'(forceid: '.$forceid.') by '. |
$last.', '.$gene.'(forceid: '.$forceid.')'. |
$ENV{'user.name'}.' at '.$ENV{'user.domain'}); |
(defined($desiredhome) ? ' desiredhome = '.$desiredhome : |
|
' desiredhome not specified'). |
|
' by '.$ENV{'user.name'}.' at '.$ENV{'user.domain'}); |
my $uhome=&homeserver($uname,$udom); |
my $uhome=&homeserver($uname,$udom); |
# ----------------------------------------------------------------- Create User |
# ----------------------------------------------------------------- Create User |
if (($uhome eq 'no_host') && ($umode) && ($upass)) { |
if (($uhome eq 'no_host') && ($umode) && ($upass)) { |
my $unhome=''; |
my $unhome=''; |
if ($ENV{'course.'.$ENV{'request.course.id'}.'.domain'} eq $udom) { |
if (defined($desiredhome) && $hostdom{$desiredhome} eq $udom) { |
|
$unhome = $desiredhome; |
|
} elsif($ENV{'course.'.$ENV{'request.course.id'}.'.domain'} eq $udom) { |
$unhome=$ENV{'course.'.$ENV{'request.course.id'}.'.home'}; |
$unhome=$ENV{'course.'.$ENV{'request.course.id'}.'.home'}; |
} else { |
} else { # load balancing routine for determining $unhome |
my $tryserver; |
my $tryserver; |
my $loadm=10000000; |
my $loadm=10000000; |
foreach $tryserver (keys %libserv) { |
foreach $tryserver (keys %libserv) { |
Line 1798 sub modifyuser {
|
Line 1895 sub modifyuser {
|
} |
} |
} |
} |
if (($unhome eq '') || ($unhome eq 'no_host')) { |
if (($unhome eq '') || ($unhome eq 'no_host')) { |
return 'error: find home'; |
return 'error: unable to find a home server for '.$uname. |
|
' in domain '.$udom; |
} |
} |
my $reply=&reply('encrypt:makeuser:'.$udom.':'.$uname.':'.$umode.':'. |
my $reply=&reply('encrypt:makeuser:'.$udom.':'.$uname.':'.$umode.':'. |
&escape($upass),$unhome); |
&escape($upass),$unhome); |
Line 1809 sub modifyuser {
|
Line 1907 sub modifyuser {
|
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: verify home'; |
} |
} |
} |
} # End of creation of new user |
# ---------------------------------------------------------------------- Add ID |
# ---------------------------------------------------------------------- Add ID |
if ($uid) { |
if ($uid) { |
$uid=~tr/A-Z/a-z/; |
$uid=~tr/A-Z/a-z/; |
Line 1827 sub modifyuser {
|
Line 1925 sub modifyuser {
|
my %names=&get('environment', |
my %names=&get('environment', |
['firstname','middlename','lastname','generation'], |
['firstname','middlename','lastname','generation'], |
$udom,$uname); |
$udom,$uname); |
|
if ($names{'firstname'} =~ m/^error:.*/) { %names=(); } |
if ($first) { $names{'firstname'} = $first; } |
if ($first) { $names{'firstname'} = $first; } |
if ($middle) { $names{'middlename'} = $middle; } |
if ($middle) { $names{'middlename'} = $middle; } |
if ($last) { $names{'lastname'} = $last; } |
if ($last) { $names{'lastname'} = $last; } |
Line 1844 sub modifyuser {
|
Line 1943 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)=@_; |
$end,$start,$forceid,$desiredhome)=@_; |
my $cid=''; |
my $cid=''; |
unless ($cid=$ENV{'request.course.id'}) { |
unless ($cid=$ENV{'request.course.id'}) { |
return 'not_in_class'; |
return 'not_in_class'; |
} |
} |
# --------------------------------------------------------------- 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); |
unless ($reply eq 'ok') { return $reply; } |
unless ($reply eq 'ok') { return $reply; } |
my $uhome=&homeserver($uname,$udom); |
my $uhome=&homeserver($uname,$udom); |
if (($uhome eq '') || ($uhome eq 'no_host')) { |
if (($uhome eq '') || ($uhome eq 'no_host')) { |
Line 2290 sub metadata {
|
Line 2390 sub metadata {
|
my %metathesekeys=(); |
my %metathesekeys=(); |
unless ($filename=~/\.meta$/) { $filename.='.meta'; } |
unless ($filename=~/\.meta$/) { $filename.='.meta'; } |
my $metastring=&getfile($perlvar{'lonDocRoot'}.'/res/'.$filename); |
my $metastring=&getfile($perlvar{'lonDocRoot'}.'/res/'.$filename); |
my $parser=HTML::TokeParser->new(\$metastring); |
my $parser=HTML::LCParser->new(\$metastring); |
my $token; |
my $token; |
undef %metathesekeys; |
undef %metathesekeys; |
while ($token=$parser->get_token) { |
while ($token=$parser->get_token) { |
Line 2379 sub metadata {
|
Line 2479 sub metadata {
|
$metacache{$uri.':'.$unikey.'.'.$_}=$token->[2]->{$_}; |
$metacache{$uri.':'.$unikey.'.'.$_}=$token->[2]->{$_}; |
} |
} |
unless ( |
unless ( |
$metacache{$uri.':'.$unikey}=$parser->get_text('/'.$entry) |
$metacache{$uri.':'.$unikey}=&HTML::Entities::decode($parser->get_text('/'.$entry)) |
) { $metacache{$uri.':'.$unikey}= |
) { $metacache{$uri.':'.$unikey}= |
$metacache{$uri.':'.$unikey.'.default'}; |
$metacache{$uri.':'.$unikey.'.default'}; |
} |
} |
Line 2620 sub unescape {
|
Line 2720 sub unescape {
|
# ================================================================ Main Program |
# ================================================================ Main Program |
|
|
sub goodbye { |
sub goodbye { |
|
&logthis("Starting Shut down"); |
&flushcourselogs(); |
&flushcourselogs(); |
&logthis("Shutting down"); |
&logthis("Shutting down"); |
} |
} |
Line 2882 devalidate($symb) : devalidate spreadshe
|
Line 2983 devalidate($symb) : devalidate spreadshe
|
=item * |
=item * |
|
|
hash2str(%hash) : convert a hash into a string complete with escaping and '=' |
hash2str(%hash) : convert a hash into a string complete with escaping and '=' |
and '&' separators |
and '&' separators, supports elements that are arrayrefs and hashrefs |
|
|
|
=item * |
|
|
|
hashref2str($hashref) : convert a hashref into a string complete with |
|
escaping and '=' and '&' separators, supports elements that are |
|
arrayrefs and hashrefs |
|
|
|
=item * |
|
|
|
arrayref2str($arrayref) : convert an arrayref into a string complete |
|
with escaping and '&' separators, supports elements that are arrayrefs |
|
and hashrefs |
|
|
|
=item * |
|
|
|
str2hash($string) : convert string to hash using unescaping and |
|
splitting on '=' and '&', supports elements that are arrayrefs and |
|
hashrefs |
|
|
=item * |
=item * |
|
|
str2hash($string) : convert string to hash using unescaping and splitting on |
str2array($string) : convert string to hash using unescaping and |
'=' and '&' |
splitting on '&', supports elements that are arrayrefs and hashrefs |
|
|
=item * |
=item * |
|
|