--- loncom/interface/domainprefs.pm 2011/08/09 12:16:41 1.151 +++ loncom/interface/domainprefs.pm 2011/08/10 14:54:42 1.152 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.151 2011/08/09 12:16:41 raeburn Exp $ +# $Id: domainprefs.pm,v 1.152 2011/08/10 14:54:42 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -375,7 +375,6 @@ sub handler { ], }, ); - my $js; if (keys(%servers) > 1) { $prefs{'login'} = { text => 'Log-in page options', help => 'Domain_Configuration_Login_Page', @@ -384,10 +383,6 @@ sub handler { {col1 => 'Log-in Page Items', col2 => ''}], }; - my ($othertitle,$usertypes,$types) = - &Apache::loncommon::sorted_inst_types($dom); - - $js = &lonbalance_targets_js($dom,$types,\%servers); } my @roles = ('student','coordinator','author','admin'); my @actions = &Apache::loncommon::get_env_multiple('form.actions'); @@ -398,6 +393,14 @@ sub handler { if ($phase eq 'process') { &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles); } elsif ($phase eq 'display') { + my $js; + if (keys(%servers) > 1) { + my ($othertitle,$usertypes,$types) = + &Apache::loncommon::sorted_inst_types($dom); + $js = &lonbalance_targets_js($dom,$types,\%servers). + &new_spares_js(). + &common_domprefs_js(); + } &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js); } else { if (keys(%domconfig) == 0) { @@ -2336,13 +2339,14 @@ sub print_usersessions { &build_location_hashes(\@intdoms,\%by_ip,\%by_location); my @alldoms = &Apache::lonnet::all_domains(); - my %uniques = &Apache::lonnet::get_unique_servers(\@alldoms); + my %serverhomes = %Apache::lonnet::serverhomeIDs; my %servers = &Apache::lonnet::internet_dom_servers($dom); + my %altids = &id_for_thisdom(%servers); my $itemcount = 1; if ($position eq 'top') { - if (keys(%uniques) > 1) { + if (keys(%serverhomes) > 1) { my %spareid = ¤t_offloads_to($dom,$settings,\%servers); - $datatable .= &spares_row(\%servers,\%spareid,\%uniques,$rowtotal); + $datatable .= &spares_row($dom,\%servers,\%spareid,\%serverhomes,\%altids,$rowtotal); } else { $datatable .= ''. &mt('Nothing to set here, as the cluster to which this domain belongs only contains one server.'); @@ -2515,14 +2519,16 @@ sub build_location_hashes { sub current_offloads_to { my ($dom,$settings,$servers) = @_; my (%spareid,%otherdomconfigs); - if ((ref($settings) eq 'HASH') && (ref($servers) eq 'HASH')) { + if (ref($servers) eq 'HASH') { foreach my $lonhost (sort(keys(%{$servers}))) { my $gotspares; - if (ref($settings->{'spares'}) eq 'HASH') { - if (ref($settings->{'spares'}{$lonhost}) eq 'HASH') { - $spareid{$lonhost}{'primary'} = $settings->{'spares'}{$lonhost}{'primary'}; - $spareid{$lonhost}{'default'} = $settings->{'spares'}{$lonhost}{'default'}; - $gotspares = 1; + if (ref($settings) eq 'HASH') { + if (ref($settings->{'spares'}) eq 'HASH') { + if (ref($settings->{'spares'}{$lonhost}) eq 'HASH') { + $spareid{$lonhost}{'primary'} = $settings->{'spares'}{$lonhost}{'primary'}; + $spareid{$lonhost}{'default'} = $settings->{'spares'}{$lonhost}{'default'}; + $gotspares = 1; + } } } unless ($gotspares) { @@ -2590,63 +2596,101 @@ sub current_offloads_to { } sub spares_row { - my ($servers,$spareid,$uniques,$rowtotal) = @_; + my ($dom,$servers,$spareid,$serverhomes,$altids,$rowtotal) = @_; my $css_class; my $numinrow = 4; my $itemcount = 1; my $datatable; - if ((ref($servers) eq 'HASH') && (ref($spareid) eq 'HASH')) { + my %typetitles = &sparestype_titles(); + if ((ref($servers) eq 'HASH') && (ref($spareid) eq 'HASH') && (ref($altids) eq 'HASH')) { foreach my $server (sort(keys(%{$servers}))) { + my $serverhome = &Apache::lonnet::get_server_homeID($servers->{$server}); + my ($othercontrol,$serverdom); + if ($serverhome ne $server) { + $serverdom = &Apache::lonnet::host_domain($serverhome); + $othercontrol = &mt('Session offloading controlled by domain: [_1]',''.$serverdom.''); + } else { + $serverdom = &Apache::lonnet::host_domain($server); + if ($serverdom ne $dom) { + $othercontrol = &mt('Session offloading controlled by domain: [_1]',''.$serverdom.''); + } + } + next unless (ref($spareid->{$server}) eq 'HASH'); $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; $datatable .= ' - '.$server.' when busy, offloads to:'; + '.$server.' when busy, offloads to:'."\n"; my (%current,%canselect); - if (ref($spareid->{$server}) eq 'HASH') { - foreach my $type ('primary','default') { + my @choices = + &possible_newspares($server,$spareid->{$server},$serverhomes,$altids); + foreach my $type ('primary','default') { + if (ref($spareid->{$server}) eq 'HASH') { if (ref($spareid->{$server}{$type}) eq 'ARRAY') { my @spares = @{$spareid->{$server}{$type}}; if (@spares > 0) { - $current{$type} .= ''; - for (my $i=0; $i<@spares; $i++) { - my $rem = $i%($numinrow); - if ($rem == 0) { - if ($i > 0) { - $current{$type} .= ''; + if ($othercontrol) { + $current{$type} = join(', ',@spares); + } else { + $current{$type} .= '
'; + my $numspares = scalar(@spares); + for (my $i=0; $i<@spares; $i++) { + my $rem = $i%($numinrow); + if ($rem == 0) { + if ($i > 0) { + $current{$type} .= ''; + } + $current{$type} .= ''; } - $current{$type} .= ''; + $current{$type} .= ''."\n"; + } + my $rem = @spares%($numinrow); + my $colsleft = $numinrow - $rem; + if ($colsleft > 1 ) { + $current{$type} .= ''; + } elsif ($colsleft == 1) { + $current{$type} .= ''."\n"; } - $current{$type} .= ''; - } - my $rem = @spares%($numinrow); - my $colsleft = $numinrow - $rem; - if ($colsleft > 1 ) { - $current{$type} .= ''; - } elsif ($colsleft == 1) { - $current{$type} .= ''; + $current{$type} .= '
'. + '  '. - '  
'; } } - $current{$type} .= ''; } if ($current{$type} eq '') { $current{$type} = &mt('None specified'); } - $canselect{$type} = - &newspare_select($server,$type,$spareid->{$server}{$type},$uniques); + if ($othercontrol) { + if ($type eq 'primary') { + $canselect{$type} = $othercontrol; + } + } else { + $canselect{$type} = + &mt('Add new [_1]'.$type.'[_2]:','','').' '. + ''."\n"; + } + } else { + $current{$type} = &mt('Could not be determined'); + if ($type eq 'primary') { + $canselect{$type} = $othercontrol; + } } + if ($type eq 'default') { + $datatable .= ''; + } + $datatable .= ''.$typetitles{$type}.''."\n". + ''.$current{$type}.''."\n". + ''.$canselect{$type}.''."\n"; } - $datatable .= ''.&mt('primary').''.$current{'primary'}.''. - ''.&mt('Add new [_1]primary[_2]:','','').' '. - $canselect{'primary'}.''. - ''. - ''.&mt('default').''. - ''.$current{'default'}.''. - ''.&mt('Add new [_1]default[_2]:','','').' '. - $canselect{'default'}.''; $itemcount ++; } } @@ -2654,26 +2698,42 @@ sub spares_row { return $datatable; } -sub newspare_select { - my ($server,$type,$currspares,$uniques) = @_; - my $output; - if (ref($uniques) eq 'HASH') { - if (keys(%{$uniques}) > 1) { - $output = ''; } } - return $output; + my @choices; + if ((ref($serverhomes) eq 'HASH') && (ref($altids) eq 'HASH')) { + if (keys(%{$serverhomes}) > 1) { + foreach my $name (sort(keys(%{$serverhomes}))) { + unless ($excluded{$name}) { + if (exists($altids->{$serverhomes->{$name}})) { + push(@choices,$altids->{$serverhomes->{$name}}); + } else { + push(@choices,$serverhomes->{$name}); + } + } + } + } + } + return sort(@choices); } sub print_loadbalancing { @@ -7342,7 +7402,6 @@ sub modify_usersessions { } my @alldoms = &Apache::lonnet::all_domains(); - my %uniques = &Apache::lonnet::get_unique_servers(\@alldoms); my %servers = &Apache::lonnet::internet_dom_servers($dom); my %spareid = ¤t_offloads_to($dom,$domconfig{'usersessions'},\%servers); my $savespares; @@ -7350,34 +7409,26 @@ sub modify_usersessions { foreach my $lonhost (sort(keys(%servers))) { my $serverhomeID = &Apache::lonnet::get_server_homeID($servers{$lonhost}); + my $serverhostname = &Apache::lonnet::hostname($lonhost); $defaultshash{'usersessions'}{'spares'}{$lonhost} = {}; my %spareschg; foreach my $type (@{$types{'spares'}}) { my @okspares; my @checked = &Apache::loncommon::get_env_multiple('form.spare_'.$type.'_'.$lonhost); foreach my $server (@checked) { - unless (($server eq $lonhost) || ($server eq $serverhomeID)) { - if ($uniques{$server}) { - push(@okspares,$server); + if (&Apache::lonnet::hostname($server) ne '') { + unless (&Apache::lonnet::hostname($server) eq $serverhostname) { + unless (grep(/^\Q$server\E$/,@okspares)) { + push(@okspares,$server); + } } } } my $new = $env{'form.newspare_'.$type.'_'.$lonhost}; my $newspare; - if (($new ne '') && ($uniques{$new})) { - unless (($new eq $lonhost) || ($new eq $serverhomeID)) { + if (($new ne '') && (&Apache::lonnet::hostname($new))) { + unless (&Apache::lonnet::hostname($new) eq $serverhostname) { $newspare = $new; - $spareschg{$type} = 1; - } - } - if (ref($spareid{$lonhost}) eq 'HASH') { - if (ref($spareid{$lonhost}{$type}) eq 'ARRAY') { - my @diffs = &Apache::loncommon::compare_arrays($domconfig{'usersessions'}{'spares'}{$lonhost}{$type},\@okspares); - if (@diffs > 0) { - $spareschg{$type} = 1; - } elsif ($new ne '') { - $spareschg{$type} = 1; - } } } my @spares; @@ -7387,6 +7438,14 @@ sub modify_usersessions { @spares = sort(@okspares); } $defaultshash{'usersessions'}{'spares'}{$lonhost}{$type} = \@spares; + if (ref($spareid{$lonhost}) eq 'HASH') { + if (ref($spareid{$lonhost}{$type}) eq 'ARRAY') { + my @diffs = &Apache::loncommon::compare_arrays($spareid{$lonhost}{$type},\@spares); + if (@diffs > 0) { + $spareschg{$type} = 1; + } + } + } } if (keys(%spareschg) > 0) { $changes{'spares'}{$lonhost} = \%spareschg; @@ -7813,6 +7872,18 @@ sub usersession_titles { ); } +sub id_for_thisdom { + my (%servers) = @_; + my %altids; + foreach my $server (keys(%servers)) { + my $serverhome = &Apache::lonnet::get_server_homeID($servers{$server}); + if ($serverhome ne $server) { + $altids{$serverhome} = $server; + } + } + return %altids; +} + sub count_servers { my ($currbalancer,%servers) = @_; my (@spares,$numspares); @@ -7875,7 +7946,7 @@ function showSpares(balancer,ishomedom) document.getElementById('loadbalancing_targets').style.display='block'; document.getElementById('loadbalancing_disabled').style.display='none'; - + for (var i=0; i + + +END +} + +sub new_spares_js { + my @sparestypes = ('primary','default'); + my $types = join("','",@sparestypes); + my $select = &mt('Select'); + return <<"END"; + + + +END + +} + +sub common_domprefs_js { + return <<"END"; + + END + } 1;