version 1.3, 1999/11/16 22:00:17
|
version 1.11, 2000/02/29 16:24:00
|
Line 1
|
Line 1
|
# The LearningOnline Network |
# The LearningOnline Network |
# TCP networking package |
# TCP networking package |
# 6/1/99,6/2,6/10,6/11,6/12,6/14,6/26,6/28,6/29,6/30, |
# 6/1/99,6/2,6/10,6/11,6/12,6/14,6/26,6/28,6/29,6/30, |
# 7/1,7/2,7/9,7/10,7/12,7/14,7/15,7/19,11/8,11/16 Gerd Kortemeyer |
# 7/1,7/2,7/9,7/10,7/12,7/14,7/15,7/19, |
|
# 11/8,11/16,11/18,11/22,11/23,12/22, |
|
# 01/06,01/13,02/24,02/28,02/29 Gerd Kortemeyer |
|
|
package Apache::lonnet; |
package Apache::lonnet; |
|
|
use strict; |
use strict; |
use Apache::File; |
use Apache::File; |
use vars qw(%perlvar %hostname %homecache %spareid %hostdom %libserv $readit); |
use LWP::UserAgent(); |
|
use vars |
|
qw(%perlvar %hostname %homecache %spareid %hostdom %libserv %pr %prp $readit); |
use IO::Socket; |
use IO::Socket; |
|
use Apache::Constants qw(:common :http); |
|
|
# --------------------------------------------------------------------- Logging |
# --------------------------------------------------------------------- Logging |
|
|
Line 42 sub subreply {
|
Line 47 sub subreply {
|
or return "con_lost"; |
or return "con_lost"; |
print $client "$cmd\n"; |
print $client "$cmd\n"; |
my $answer=<$client>; |
my $answer=<$client>; |
chomp($answer); |
|
if (!$answer) { $answer="con_lost"; } |
if (!$answer) { $answer="con_lost"; } |
|
chomp($answer); |
return $answer; |
return $answer; |
} |
} |
|
|
Line 54 sub reply {
|
Line 59 sub reply {
|
return $answer; |
return $answer; |
} |
} |
|
|
# ------------------------------------------------ Try to send delayed messages |
|
|
|
sub senddelayed { |
|
my $server=shift; |
|
my $dfname; |
|
my $path="$perlvar{'lonSockDir'}/delayed"; |
|
while ($dfname=<$path/*.$server>) { |
|
my $wcmd; |
|
{ |
|
my $dfh=Apache::File->new($dfname); |
|
$wcmd=<$dfh>; |
|
} |
|
my ($server,$cmd)=split(/:/,$wcmd); |
|
chomp($cmd); |
|
my $answer=subreply($cmd,$server); |
|
if ($answer ne 'con_lost') { |
|
unlink("$dfname"); |
|
&logthis("Delayed $cmd to $server: $answer"); |
|
&logperm("S:$server:$cmd"); |
|
} |
|
} |
|
} |
|
|
|
# ----------------------------------------------------------- Send USR1 to lonc |
# ----------------------------------------------------------- Send USR1 to lonc |
|
|
sub reconlonc { |
sub reconlonc { |
Line 106 sub reconlonc {
|
Line 88 sub reconlonc {
|
# ------------------------------------------------------ Critical communication |
# ------------------------------------------------------ Critical communication |
sub critical { |
sub critical { |
my ($cmd,$server)=@_; |
my ($cmd,$server)=@_; |
&senddelayed($server); |
|
my $answer=reply($cmd,$server); |
my $answer=reply($cmd,$server); |
if ($answer eq 'con_lost') { |
if ($answer eq 'con_lost') { |
my $pingreply=reply('ping',$server); |
my $pingreply=reply('ping',$server); |
Line 117 sub critical {
|
Line 98 sub critical {
|
if ($answer eq 'con_lost') { |
if ($answer eq 'con_lost') { |
my $now=time; |
my $now=time; |
my $middlename=$cmd; |
my $middlename=$cmd; |
|
$middlename=substr($middlename,0,16); |
$middlename=~s/\W//g; |
$middlename=~s/\W//g; |
my $dfilename= |
my $dfilename= |
"$perlvar{'lonSockDir'}/delayed/$now.$middlename.$server"; |
"$perlvar{'lonSockDir'}/delayed/$now.$middlename.$server"; |
{ |
{ |
my $dfh; |
my $dfh; |
if ($dfh=Apache::File->new(">$dfilename")) { |
if ($dfh=Apache::File->new(">$dfilename")) { |
print $dfh "$server:$cmd\n"; |
print $dfh "$cmd\n"; |
} |
} |
} |
} |
sleep 2; |
sleep 2; |
Line 135 sub critical {
|
Line 117 sub critical {
|
} |
} |
} |
} |
chomp($wcmd); |
chomp($wcmd); |
if ($wcmd eq "$server:$cmd") { |
if ($wcmd eq $cmd) { |
&logthis("Connection buffer $dfilename: $cmd"); |
&logthis("Connection buffer $dfilename: $cmd"); |
&logperm("D:$server:$cmd"); |
&logperm("D:$server:$cmd"); |
return 'con_delayed'; |
return 'con_delayed'; |
Line 149 sub critical {
|
Line 131 sub critical {
|
return $answer; |
return $answer; |
} |
} |
|
|
|
# ---------------------------------------------------------- Append Environment |
|
|
|
sub appenv { |
|
my %newenv=@_; |
|
my @oldenv; |
|
{ |
|
my $fh; |
|
unless ($fh=Apache::File->new("$ENV{'user.environment'}")) { |
|
return 'error'; |
|
} |
|
@oldenv=<$fh>; |
|
} |
|
for (my $i=0; $i<=$#oldenv; $i++) { |
|
chomp($oldenv[$i]); |
|
if ($oldenv[$i] ne '') { |
|
my ($name,$value)=split(/=/,$oldenv[$i]); |
|
$newenv{$name}=$value; |
|
} |
|
} |
|
{ |
|
my $fh; |
|
unless ($fh=Apache::File->new(">$ENV{'user.environment'}")) { |
|
return 'error'; |
|
} |
|
my $newname; |
|
foreach $newname (keys %newenv) { |
|
print $fh "$newname=$newenv{$newname}\n"; |
|
} |
|
} |
|
return 'ok'; |
|
} |
|
|
# ------------------------------ Find server with least workload from spare.tab |
# ------------------------------ Find server with least workload from spare.tab |
|
|
sub spareserver { |
sub spareserver { |
my $tryserver; |
my $tryserver; |
my $spareserver=''; |
my $spareserver=''; |
Line 166 sub spareserver {
|
Line 180 sub spareserver {
|
} |
} |
|
|
# --------- Try to authenticate user from domain's lib servers (first this one) |
# --------- Try to authenticate user from domain's lib servers (first this one) |
|
|
sub authenticate { |
sub authenticate { |
my ($uname,$upass,$udom)=@_; |
my ($uname,$upass,$udom)=@_; |
|
|
Line 173 sub authenticate {
|
Line 188 sub authenticate {
|
($udom eq $perlvar{'lonDefDomain'})) { |
($udom eq $perlvar{'lonDefDomain'})) { |
my $answer=reply("encrypt:auth:$udom:$uname:$upass",$perlvar{'lonHostID'}); |
my $answer=reply("encrypt:auth:$udom:$uname:$upass",$perlvar{'lonHostID'}); |
if ($answer =~ /authorized/) { |
if ($answer =~ /authorized/) { |
if ($answer eq 'authorized') { return $perlvar{'lonHostID'}; } |
if ($answer eq 'authorized') { |
if ($answer eq 'non_authorized') { return 'no_host'; } |
&logthis("User $uname at $udom authorized by local server"); |
|
return $perlvar{'lonHostID'}; |
|
} |
|
if ($answer eq 'non_authorized') { |
|
&logthis("User $uname at $udom rejected by local server"); |
|
return 'no_host'; |
|
} |
} |
} |
} |
} |
|
|
my $tryserver; |
my $tryserver; |
foreach $tryserver (keys %libserv) { |
foreach $tryserver (keys %libserv) { |
if ($hostdom{$tryserver} eq $udom) { |
if ($hostdom{$tryserver} eq $udom) { |
my $answer=reply("enc:auth:$udom:$uname:$upass",$tryserver); |
my $answer=reply("encrypt:auth:$udom:$uname:$upass",$tryserver); |
if ($answer =~ /authorized/) { |
if ($answer =~ /authorized/) { |
if ($answer eq 'authorized') { return $tryserver; } |
if ($answer eq 'authorized') { |
|
&logthis("User $uname at $udom authorized by $tryserver"); |
|
return $tryserver; |
|
} |
|
if ($answer eq 'non_authorized') { |
|
&logthis("User $uname at $udom rejected by $tryserver"); |
|
return 'no_host'; |
|
} |
} |
} |
} |
} |
} |
} |
|
&logthis("User $uname at $udom could not be authenticated"); |
return 'no_host'; |
return 'no_host'; |
} |
} |
|
|
# ---------------------- Find the homebase for a user from domain's lib servers |
# ---------------------- Find the homebase for a user from domain's lib servers |
|
|
sub homeserver { |
sub homeserver { |
my ($uname,$udom)=@_; |
my ($uname,$udom)=@_; |
|
|
Line 211 sub homeserver {
|
Line 241 sub homeserver {
|
} |
} |
|
|
# ----------------------------- Subscribe to a resource, return URL if possible |
# ----------------------------- Subscribe to a resource, return URL if possible |
|
|
sub subscribe { |
sub subscribe { |
my $fname=shift; |
my $fname=shift; |
&logthis($fname); |
|
my $author=$fname; |
my $author=$fname; |
$author=~s/\/home\/httpd\/html\/res\/([^\/]*)\/([^\/]*).*/$1\/$2/; |
$author=~s/\/home\/httpd\/html\/res\/([^\/]*)\/([^\/]*).*/$1\/$2/; |
my ($udom,$uname)=split(/\//,$author); |
my ($udom,$uname)=split(/\//,$author); |
my $home=homeserver($uname,$udom); |
my $home=homeserver($uname,$udom); |
&logthis("$home $udom $uname"); |
|
if (($home eq 'no_host') || ($home eq $perlvar{'lonHostID'})) { |
if (($home eq 'no_host') || ($home eq $perlvar{'lonHostID'})) { |
return 'not_found'; |
return 'not_found'; |
} |
} |
Line 226 sub subscribe {
|
Line 255 sub subscribe {
|
return $answer; |
return $answer; |
} |
} |
|
|
|
# -------------------------------------------------------------- Replicate file |
|
|
|
sub repcopy { |
|
my $filename=shift; |
|
my $transname="$filename.in.transfer"; |
|
my $remoteurl=subscribe($filename); |
|
if ($remoteurl eq 'con_lost') { |
|
&logthis("Subscribe returned con_lost: $filename"); |
|
return HTTP_SERVICE_UNAVAILABLE; |
|
} elsif ($remoteurl eq 'not_found') { |
|
&logthis("Subscribe returned not_found: $filename"); |
|
return HTTP_NOT_FOUND; |
|
} elsif ($remoteurl eq 'forbidden') { |
|
&logthis("Subscribe returned forbidden: $filename"); |
|
return FORBIDDEN; |
|
} else { |
|
my @parts=split(/\//,$filename); |
|
my $path="/$parts[1]/$parts[2]/$parts[3]/$parts[4]"; |
|
if ($path ne "$perlvar{'lonDocRoot'}/res") { |
|
&logthis("Malconfiguration for replication: $filename"); |
|
return HTTP_BAD_REQUEST; |
|
} |
|
my $count; |
|
for ($count=5;$count<$#parts;$count++) { |
|
$path.="/$parts[$count]"; |
|
if ((-e $path)!=1) { |
|
mkdir($path,0777); |
|
} |
|
} |
|
my $ua=new LWP::UserAgent; |
|
my $request=new HTTP::Request('GET',"$remoteurl"); |
|
my $response=$ua->request($request,$transname); |
|
if ($response->is_error()) { |
|
unlink($transname); |
|
my $message=$response->status_line; |
|
&logthis("LWP GET: $message: $filename"); |
|
return HTTP_SERVICE_UNAVAILABLE; |
|
} else { |
|
rename($transname,$filename); |
|
return OK; |
|
} |
|
} |
|
} |
|
|
|
# ----------------------------------------------------------------------- Store |
|
|
|
sub store { |
|
my %storehash=shift; |
|
my $command="store:$ENV{'user.domain'}:$ENV{'user.name'}:" |
|
."$ENV{'user.class'}:$ENV{'request.filename'}:"; |
|
} |
|
|
|
# --------------------------------------------------------------------- Restore |
|
|
|
sub restore { |
|
my $command="restore:$ENV{'user.domain'}:$ENV{'user.name'}:" |
|
."$ENV{'user.class'}:$ENV{'request.filename'}:"; |
|
} |
|
|
|
# -------------------------------------------------------- Get user priviledges |
|
|
|
sub rolesinit { |
|
my ($domain,$username,$authhost)=@_; |
|
my $rolesdump=reply("dump:$domain:$username:roles",$authhost); |
|
my %allroles=(); |
|
my %thesepriv=(); |
|
my $userroles=''; |
|
my $now=time; |
|
my $thesestr; |
|
|
|
&logthis("$domain, $username, $authhost, $rolesdump"); |
|
|
|
if ($rolesdump ne '') { |
|
map { |
|
my ($area,$role)=split(/=/,$_); |
|
my ($trole,$tend,$tstart)=split(/_/,$role); |
|
if ($tend!=0) { |
|
if ($tend<$now) { |
|
$trole=''; |
|
} |
|
} |
|
if ($tstart!=0) { |
|
if ($tstart>$now) { |
|
$trole=''; |
|
} |
|
} |
|
if (($area ne '') && ($trole ne '')) { |
|
$userroles.='user.role.'.$trole.'='.$area."\n"; |
|
my ($tdummy,$tdomain,$trest)=split(/\//,$area); |
|
$allroles{'/'}.=':'.$pr{$trole.':s'}; |
|
if ($tdomain ne '') { |
|
$allroles{'/'.$tdomain.'/'}.=':'.$pr{$trole.':d'}; |
|
if ($trest ne '') { |
|
$allroles{$area}.=':'.$pr{$trole.':c'}; |
|
} |
|
} |
|
} |
|
} split(/&/,$rolesdump); |
|
map { |
|
%thesepriv=(); |
|
map { |
|
if ($_ ne '') { |
|
my ($priviledge,$restrictions)=split(/&/,$_); |
|
if ($restrictions eq '') { |
|
$thesepriv{$priviledge}='F'; |
|
} else { |
|
if ($thesepriv{$priviledge} ne 'F') { |
|
$thesepriv{$priviledge}.=$restrictions; |
|
} |
|
} |
|
} |
|
} split(/:/,$allroles{$_}); |
|
$thesestr=''; |
|
map { $thesestr.=':'.$_.'&'.$thesepriv{$_}; } keys %thesepriv; |
|
$userroles.='user.priv.'.$_.'='.$thesestr."\n"; |
|
} keys %allroles; |
|
} |
|
return $userroles; |
|
} |
|
|
|
|
# ================================================================ Main Program |
# ================================================================ Main Program |
|
|
Line 238 if ($readit ne 'done') {
|
Line 387 if ($readit ne 'done') {
|
while (my $configline=<$config>) { |
while (my $configline=<$config>) { |
if ($configline =~ /PerlSetVar/) { |
if ($configline =~ /PerlSetVar/) { |
my ($dummy,$varname,$varvalue)=split(/\s+/,$configline); |
my ($dummy,$varname,$varvalue)=split(/\s+/,$configline); |
|
chomp($varvalue); |
$perlvar{$varname}=$varvalue; |
$perlvar{$varname}=$varvalue; |
} |
} |
} |
} |
Line 266 if ($readit ne 'done') {
|
Line 416 if ($readit ne 'done') {
|
} |
} |
} |
} |
} |
} |
|
# ------------------------------------------------------------ Read permissions |
|
{ |
|
my $config=Apache::File->new("$perlvar{'lonTabDir'}/roles.tab"); |
|
|
|
while (my $configline=<$config>) { |
|
chomp($configline); |
|
my ($role,$perm)=split(/ /,$configline); |
|
if ($perm ne '') { $pr{$role}=$perm; } |
|
} |
|
} |
|
|
|
# -------------------------------------------- Read plain texts for permissions |
|
{ |
|
my $config=Apache::File->new("$perlvar{'lonTabDir'}/rolesplain.tab"); |
|
|
|
while (my $configline=<$config>) { |
|
chomp($configline); |
|
my ($short,$plain)=split(/:/,$configline); |
|
if ($plain ne '') { $prp{$short}=$plain; } |
|
} |
|
} |
|
|
$readit='done'; |
$readit='done'; |
&logthis('Read configuration'); |
&logthis('Read configuration'); |
} |
} |
Line 274 $readit='done';
|
Line 446 $readit='done';
|
|
|
|
|
|
|
|
|