version 1.1126, 2011/08/09 00:28:51
|
version 1.1133, 2011/10/06 11:01:55
|
Line 348 sub get_remote_globals {
|
Line 348 sub get_remote_globals {
|
|
|
sub remote_devalidate_cache { |
sub remote_devalidate_cache { |
my ($lonhost,$name,$id) = @_; |
my ($lonhost,$name,$id) = @_; |
my $response = &reply('devalidatecache',&escape($name).':'.&escape($id),$lonhost); |
my $response = &reply('devalidatecache:'.&escape($name).':'.&escape($id),$lonhost); |
return $response; |
return $response; |
} |
} |
|
|
Line 1185 sub spares_for_offload {
|
Line 1185 sub spares_for_offload {
|
return; |
return; |
} |
} |
|
|
|
sub get_lonbalancer_config { |
|
my ($servers) = @_; |
|
my ($currbalancer,$currtargets); |
|
if (ref($servers) eq 'HASH') { |
|
foreach my $server (keys(%{$servers})) { |
|
my %what = ( |
|
spareid => 1, |
|
perlvar => 1, |
|
); |
|
my ($result,$returnhash) = &get_remote_globals($server,\%what); |
|
if ($result eq 'ok') { |
|
if (ref($returnhash) eq 'HASH') { |
|
if (ref($returnhash->{'perlvar'}) eq 'HASH') { |
|
if ($returnhash->{'perlvar'}->{'lonBalancer'} eq 'yes') { |
|
$currbalancer = $server; |
|
$currtargets = {}; |
|
if (ref($returnhash->{'spareid'}) eq 'HASH') { |
|
if (ref($returnhash->{'spareid'}->{'primary'}) eq 'ARRAY') { |
|
$currtargets->{'primary'} = $returnhash->{'spareid'}->{'primary'}; |
|
} |
|
if (ref($returnhash->{'spareid'}->{'default'}) eq 'ARRAY') { |
|
$currtargets->{'default'} = $returnhash->{'spareid'}->{'default'}; |
|
} |
|
} |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return ($currbalancer,$currtargets); |
|
} |
|
|
|
sub check_loadbalancing { |
|
my ($uname,$udom) = @_; |
|
my ($is_balancer,$dom_in_use,$homeintdom,$rule_in_effect, |
|
$offloadto,$otherserver); |
|
my $lonhost = $perlvar{'lonHostID'}; |
|
my $uprimary_id = &Apache::lonnet::domain($udom,'primary'); |
|
my $uintdom = &Apache::lonnet::internet_dom($uprimary_id); |
|
my $intdom = &Apache::lonnet::internet_dom($lonhost); |
|
my $serverhomedom = &host_domain($lonhost); |
|
|
|
my $cachetime = 60*60*24; |
|
|
|
if (($uintdom ne '') && ($uintdom eq $intdom)) { |
|
$dom_in_use = $udom; |
|
$homeintdom = 1; |
|
} else { |
|
$dom_in_use = $serverhomedom; |
|
} |
|
my ($result,$cached)=&is_cached_new('loadbalancing',$dom_in_use); |
|
unless (defined($cached)) { |
|
my %domconfig = |
|
&Apache::lonnet::get_dom('configuration',['loadbalancing'],$dom_in_use); |
|
if (ref($domconfig{'loadbalancing'}) eq 'HASH') { |
|
$result = &do_cache_new('loadbalancing',$dom_in_use,$domconfig{'loadbalancing'},$cachetime); |
|
} |
|
} |
|
if (ref($result) eq 'HASH') { |
|
my $currbalancer = $result->{'lonhost'}; |
|
my $currtargets = $result->{'targets'}; |
|
my $currrules = $result->{'rules'}; |
|
if ($currbalancer ne '') { |
|
my @hosts = ¤t_machine_ids(); |
|
if (grep(/^\Q$currbalancer\E$/,@hosts)) { |
|
$is_balancer = 1; |
|
} |
|
} |
|
if ($is_balancer) { |
|
if (ref($currrules) eq 'HASH') { |
|
if ($homeintdom) { |
|
if ($uname ne '') { |
|
if (($currrules->{'_LC_adv'} ne '') || ($currrules->{'_LC_author'} ne '')) { |
|
my ($is_adv,$is_author) = &is_advanced_user($udom,$uname); |
|
if (($currrules->{'_LC_author'} ne '') && ($is_author)) { |
|
$rule_in_effect = $currrules->{'_LC_author'}; |
|
} elsif (($currrules->{'_LC_adv'} ne '') && ($is_adv)) { |
|
$rule_in_effect = $currrules->{'_LC_adv'} |
|
} |
|
} |
|
if ($rule_in_effect eq '') { |
|
my %userenv = &userenvironment($udom,$uname,'inststatus'); |
|
if ($userenv{'inststatus'} ne '') { |
|
my @statuses = map { &unescape($_); } split(/:/,$userenv{'inststatus'}); |
|
my ($othertitle,$usertypes,$types) = |
|
&Apache::loncommon::sorted_inst_types($udom); |
|
if (ref($types) eq 'ARRAY') { |
|
foreach my $type (@{$types}) { |
|
if (grep(/^\Q$type\E$/,@statuses)) { |
|
if (exists($currrules->{$type})) { |
|
$rule_in_effect = $currrules->{$type}; |
|
} |
|
} |
|
} |
|
} |
|
} else { |
|
if (exists($currrules->{'default'})) { |
|
$rule_in_effect = $currrules->{'default'}; |
|
} |
|
} |
|
} |
|
} else { |
|
if (exists($currrules->{'default'})) { |
|
$rule_in_effect = $currrules->{'default'}; |
|
} |
|
} |
|
} else { |
|
if ($currrules->{'_LC_external'} ne '') { |
|
$rule_in_effect = $currrules->{'_LC_external'}; |
|
} |
|
} |
|
$offloadto = &get_loadbalancer_targets($rule_in_effect,$currtargets, |
|
$uname,$udom); |
|
} |
|
} |
|
} elsif (($homeintdom) && ($udom ne $serverhomedom)) { |
|
my ($result,$cached)=&is_cached_new('loadbalancing',$serverhomedom); |
|
unless (defined($cached)) { |
|
my %domconfig = |
|
&Apache::lonnet::get_dom('configuration',['loadbalancing'],$serverhomedom); |
|
if (ref($domconfig{'loadbalancing'}) eq 'HASH') { |
|
$result = &do_cache_new('loadbalancing',$dom_in_use,$domconfig{'loadbalancing'},$cachetime); |
|
} |
|
} |
|
if (ref($result) eq 'HASH') { |
|
my $currbalancer = $result->{'lonhost'}; |
|
my $currtargets = $result->{'targets'}; |
|
my $currrules = $result->{'rules'}; |
|
|
|
if ($currbalancer eq $lonhost) { |
|
$is_balancer = 1; |
|
if (ref($currrules) eq 'HASH') { |
|
if ($currrules->{'_LC_internetdom'} ne '') { |
|
$rule_in_effect = $currrules->{'_LC_internetdom'}; |
|
} |
|
} |
|
$offloadto = &get_loadbalancer_targets($rule_in_effect,$currtargets, |
|
$uname,$udom); |
|
} |
|
} else { |
|
if ($perlvar{'lonBalancer'} eq 'yes') { |
|
$is_balancer = 1; |
|
$offloadto = &this_host_spares($dom_in_use); |
|
} |
|
} |
|
} else { |
|
if ($perlvar{'lonBalancer'} eq 'yes') { |
|
$is_balancer = 1; |
|
$offloadto = &this_host_spares($dom_in_use); |
|
} |
|
} |
|
my $lowest_load = 30000; |
|
if (ref($offloadto) eq 'HASH') { |
|
if (ref($offloadto->{'primary'}) eq 'ARRAY') { |
|
foreach my $try_server (@{$offloadto->{'primary'}}) { |
|
($otherserver,$lowest_load) = |
|
&compare_server_load($try_server,$otherserver,$lowest_load); |
|
} |
|
} |
|
my $found_server = ($otherserver ne '' && $lowest_load < 100); |
|
|
|
if (!$found_server) { |
|
if (ref($offloadto->{'default'}) eq 'ARRAY') { |
|
foreach my $try_server (@{$offloadto->{'default'}}) { |
|
($otherserver,$lowest_load) = |
|
&compare_server_load($try_server,$otherserver,$lowest_load); |
|
} |
|
} |
|
} |
|
} elsif (ref($offloadto) eq 'ARRAY') { |
|
if (@{$offloadto} == 1) { |
|
$otherserver = $offloadto->[0]; |
|
} elsif (@{$offloadto} > 1) { |
|
foreach my $try_server (@{$offloadto}) { |
|
($otherserver,$lowest_load) = |
|
&compare_server_load($try_server,$otherserver,$lowest_load); |
|
} |
|
} |
|
} |
|
return ($is_balancer,$otherserver); |
|
} |
|
|
|
sub get_loadbalancer_targets { |
|
my ($rule_in_effect,$currtargets,$uname,$udom) = @_; |
|
my $offloadto; |
|
if ($rule_in_effect eq '') { |
|
$offloadto = $currtargets; |
|
} else { |
|
if ($rule_in_effect eq 'homeserver') { |
|
my $homeserver = &homeserver($uname,$udom); |
|
if ($homeserver ne 'no_host') { |
|
$offloadto = [$homeserver]; |
|
} |
|
} elsif ($rule_in_effect eq 'externalbalancer') { |
|
my %domconfig = |
|
&Apache::lonnet::get_dom('configuration',['loadbalancing'],$udom); |
|
if (ref($domconfig{'loadbalancing'}) eq 'HASH') { |
|
if ($domconfig{'loadbalancing'}{'lonhost'} ne '') { |
|
if (&hostname($domconfig{'loadbalancing'}{'lonhost'}) ne '') { |
|
$offloadto = [$domconfig{'loadbalancing'}{'lonhost'}]; |
|
} |
|
} |
|
} else { |
|
my %servers = &dom_servers($udom); |
|
my ($remotebalancer,$remotetargets) = &get_lonbalancer_config(\%servers); |
|
if (&hostname($remotebalancer) ne '') { |
|
$offloadto = [$remotebalancer]; |
|
} |
|
} |
|
} elsif (&hostname($rule_in_effect) ne '') { |
|
$offloadto = [$rule_in_effect]; |
|
} |
|
} |
|
return $offloadto; |
|
} |
|
|
|
sub internet_dom_servers { |
|
my ($dom) = @_; |
|
my (%uniqservers,%servers); |
|
my $primaryserver = &hostname(&domain($dom,'primary')); |
|
my @machinedoms = &machine_domains($primaryserver); |
|
foreach my $mdom (@machinedoms) { |
|
my %currservers = %servers; |
|
my %server = &get_servers($mdom); |
|
%servers = (%currservers,%server); |
|
} |
|
my %by_hostname; |
|
foreach my $id (keys(%servers)) { |
|
push(@{$by_hostname{$servers{$id}}},$id); |
|
} |
|
foreach my $hostname (sort(keys(%by_hostname))) { |
|
if (@{$by_hostname{$hostname}} > 1) { |
|
my $match = 0; |
|
foreach my $id (@{$by_hostname{$hostname}}) { |
|
if (&host_domain($id) eq $dom) { |
|
$uniqservers{$id} = $hostname; |
|
$match = 1; |
|
} |
|
} |
|
unless ($match) { |
|
$uniqservers{$by_hostname{$hostname}[0]} = $hostname; |
|
} |
|
} else { |
|
$uniqservers{$by_hostname{$hostname}[0]} = $hostname; |
|
} |
|
} |
|
return %uniqservers; |
|
} |
|
|
# ---------------------- Find the homebase for a user from domain's lib servers |
# ---------------------- Find the homebase for a user from domain's lib servers |
|
|
my %homecache; |
my %homecache; |
Line 1961 sub is_cached_new {
|
Line 2212 sub is_cached_new {
|
my ($name,$id,$debug) = @_; |
my ($name,$id,$debug) = @_; |
$id=&make_key($name,$id); |
$id=&make_key($name,$id); |
if (exists($remembered{$id})) { |
if (exists($remembered{$id})) { |
if ($debug) { &Apache::lonnet::logthis("Earyl return $id of $remembered{$id} "); } |
if ($debug) { &Apache::lonnet::logthis("Early return $id of $remembered{$id} "); } |
$accessed{$id}=[&gettimeofday()]; |
$accessed{$id}=[&gettimeofday()]; |
$hits++; |
$hits++; |
return ($remembered{$id},1); |
return ($remembered{$id},1); |
Line 3735 sub hashref2str {
|
Line 3986 sub hashref2str {
|
$result.='='; |
$result.='='; |
#print("Got a ref of ".(ref($key))." skipping."); |
#print("Got a ref of ".(ref($key))." skipping."); |
} else { |
} else { |
if ($key) {$result.=&escape($key).'=';} else { last; } |
if (defined($key)) {$result.=&escape($key).'=';} else { last; } |
} |
} |
|
|
if(ref($hashref->{$key}) eq 'ARRAY') { |
if(ref($hashref->{$key}) eq 'ARRAY') { |
Line 5345 sub is_advanced_user {
|
Line 5596 sub is_advanced_user {
|
my ($udom,$uname) = @_; |
my ($udom,$uname) = @_; |
if ($udom ne '' && $uname ne '') { |
if ($udom ne '' && $uname ne '') { |
if (($udom eq $env{'user.domain'}) && ($uname eq $env{'user.name'})) { |
if (($udom eq $env{'user.domain'}) && ($uname eq $env{'user.name'})) { |
return $env{'user.adv'}; |
if (wantarray) { |
|
return ($env{'user.adv'},$env{'user.author'}); |
|
} else { |
|
return $env{'user.adv'}; |
|
} |
} |
} |
} |
} |
my %roleshash = &get_my_roles($uname,$udom,'userroles',undef,undef,undef,1); |
my %roleshash = &get_my_roles($uname,$udom,'userroles',undef,undef,undef,1); |
my %allroles; |
my %allroles; |
my $is_adv; |
my ($is_adv,$is_author); |
foreach my $role (keys(%roleshash)) { |
foreach my $role (keys(%roleshash)) { |
my ($trest,$tdomain,$trole,$sec) = split(/:/,$role); |
my ($trest,$tdomain,$trole,$sec) = split(/:/,$role); |
my $area = '/'.$tdomain.'/'.$trest; |
my $area = '/'.$tdomain.'/'.$trest; |
Line 5364 sub is_advanced_user {
|
Line 5619 sub is_advanced_user {
|
} elsif ($trole ne 'gr') { |
} elsif ($trole ne 'gr') { |
&standard_roleprivs(\%allroles,$trole,$tdomain,$spec,$trest,$area); |
&standard_roleprivs(\%allroles,$trole,$tdomain,$spec,$trest,$area); |
} |
} |
|
if ($trole eq 'au') { |
|
$is_author = 1; |
|
} |
} |
} |
} |
} |
foreach my $role (keys(%allroles)) { |
foreach my $role (keys(%allroles)) { |
Line 5378 sub is_advanced_user {
|
Line 5636 sub is_advanced_user {
|
} |
} |
} |
} |
} |
} |
|
if (wantarray) { |
|
return ($is_adv,$is_author); |
|
} |
return $is_adv; |
return $is_adv; |
} |
} |
|
|
Line 5918 sub allowed {
|
Line 6179 sub allowed {
|
} |
} |
return 'F'; |
return 'F'; |
} |
} |
|
# |
|
# Removes the versino from a URI and |
|
# splits it in to its filename and path to the filename. |
|
# Seems like File::Basename could have done this more clearly. |
|
# Parameters: |
|
# $uri - input URI |
|
# Returns: |
|
# Two element list consisting of |
|
# $pathname - the URI up to and excluding the trailing / |
|
# $filename - The part of the URI following the last / |
|
# NOTE: |
|
# Another realization of this is simply: |
|
# use File::Basename; |
|
# ... |
|
# $uri = shift; |
|
# $filename = basename($uri); |
|
# $path = dirname($uri); |
|
# return ($filename, $path); |
|
# |
|
# The implementation below is probably faster however. |
|
# |
sub split_uri_for_cond { |
sub split_uri_for_cond { |
my $uri=&deversion(&declutter(shift)); |
my $uri=&deversion(&declutter(shift)); |
my @uriparts=split(/\//,$uri); |
my @uriparts=split(/\//,$uri); |
Line 6814 sub assignrole {
|
Line 7095 sub assignrole {
|
return 'refused'; |
return 'refused'; |
} |
} |
} |
} |
|
} elsif ($role eq 'au') { |
|
if ($url ne '/'.$udom.'/') { |
|
&logthis('Attempt by '.$env{'user.name'}.':'.$env{'user.domain'}. |
|
' to assign author role for '.$uname.':'.$udom. |
|
' in domain: '.$url.' refused (wrong domain).'); |
|
return 'refused'; |
|
} |
} |
} |
$mrole=$role; |
$mrole=$role; |
} |
} |
Line 9425 sub getCODE {
|
Line 9713 sub getCODE {
|
} |
} |
return undef; |
return undef; |
} |
} |
|
# |
|
# Determines the random seed for a specific context: |
|
# |
|
# parameters: |
|
# symb - in course context the symb for the seed. |
|
# course_id - The course id of the form domain_coursenum. |
|
# domain - Domain for the user. |
|
# course - Course for the user. |
|
# cenv - environment of the course. |
|
# |
|
# NOTE: |
|
# All parameters are picked out of the environment if missing |
|
# or not defined. |
|
# If a symb cannot be determined the current time is used instead. |
|
# |
|
# For a given well defined symb, courside, domain, username, |
|
# and course environment, the seed is reproducible. |
|
# |
sub rndseed { |
sub rndseed { |
my ($symb,$courseid,$domain,$username)=@_; |
my ($symb,$courseid,$domain,$username, $cenv)=@_; |
my ($wsymb,$wcourseid,$wdomain,$wusername)=&whichuser(); |
my ($wsymb,$wcourseid,$wdomain,$wusername)=&whichuser(); |
if (!defined($symb)) { |
if (!defined($symb)) { |
unless ($symb=$wsymb) { return time; } |
unless ($symb=$wsymb) { return time; } |
Line 9435 sub rndseed {
|
Line 9740 sub rndseed {
|
if (!$courseid) { $courseid=$wcourseid; } |
if (!$courseid) { $courseid=$wcourseid; } |
if (!$domain) { $domain=$wdomain; } |
if (!$domain) { $domain=$wdomain; } |
if (!$username) { $username=$wusername } |
if (!$username) { $username=$wusername } |
my $which=&get_rand_alg(); |
|
|
my $which; |
|
if (defined($cenv->{'rndseed'})) { |
|
$which = $cenv->{'rndseed'}; |
|
} else { |
|
$which =&get_rand_alg($courseid); |
|
} |
|
|
if (defined(&getCODE())) { |
if (defined(&getCODE())) { |
|
|
if ($which eq '64bit5') { |
if ($which eq '64bit5') { |
return &rndseed_CODE_64bit5($symb,$courseid,$domain,$username); |
return &rndseed_CODE_64bit5($symb,$courseid,$domain,$username); |
} elsif ($which eq '64bit4') { |
} elsif ($which eq '64bit4') { |