--- loncom/interface/domainprefs.pm 2011/08/09 00:54:43 1.149
+++ loncom/interface/domainprefs.pm 2011/08/09 01:35:18 1.150
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set domain-wide configuration settings
#
-# $Id: domainprefs.pm,v 1.149 2011/08/09 00:54:43 raeburn Exp $
+# $Id: domainprefs.pm,v 1.150 2011/08/09 01:35:18 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -197,18 +197,22 @@ sub handler {
if ( exists($env{'form.phase'}) ) {
$phase = $env{'form.phase'};
}
+ my %servers = &Apache::lonnet::internet_dom_servers($dom);
my %domconfig =
&Apache::lonnet::get_dom('configuration',['login','rolecolors',
'quotas','autoenroll','autoupdate','autocreate',
'directorysrch','usercreation','usermodification',
'contacts','defaults','scantron','coursecategories',
'serverstatuses','requestcourses','helpsettings',
- 'coursedefaults','usersessions'],$dom);
+ 'coursedefaults','usersessions','loadbalancing'],$dom);
my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',
'autoupdate','autocreate','directorysrch','contacts',
'usercreation','usermodification','scantron',
'requestcourses','coursecategories','serverstatuses','helpsettings',
'coursedefaults','usersessions');
+ if (keys(%servers) > 1) {
+ push(@prefs_order,'loadbalancing');
+ }
my %prefs = (
'rolecolors' =>
{ text => 'Default color schemes',
@@ -361,8 +365,17 @@ sub handler {
{col1 => "Hosting domain's own users elsewhere",
col2 => 'Rules'}],
},
+ 'loadbalancing' =>
+ {text => 'Dedicated Load Balancer',
+ help => 'Domain_Configuration_Load_Balancing',
+ header => [{col1 => 'Server',
+ col2 => 'Default destinations',
+ col3 => 'User affliation',
+ col4 => 'Overrides'},
+ ],
+ },
);
- my %servers = &Apache::lonnet::internet_dom_servers($dom);
+ my $js;
if (keys(%servers) > 1) {
$prefs{'login'} = { text => 'Log-in page options',
help => 'Domain_Configuration_Login_Page',
@@ -371,6 +384,10 @@ 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');
@@ -381,7 +398,7 @@ sub handler {
if ($phase eq 'process') {
&Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles);
} elsif ($phase eq 'display') {
- &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname);
+ &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);
} else {
if (keys(%domconfig) == 0) {
my $primarylibserv = &Apache::lonnet::domain($dom,'primary');
@@ -465,6 +482,8 @@ sub process_changes {
$output = &modify_coursedefaults($dom,%domconfig);
} elsif ($action eq 'usersessions') {
$output = &modify_usersessions($dom,%domconfig);
+ } elsif ($action eq 'loadbalancing') {
+ $output = &modify_loadbalancing($dom,%domconfig);
}
return $output;
}
@@ -661,13 +680,22 @@ sub print_config_box {
}
$output .= '';
if ($item->{'header'}->[0]->{'col3'}) {
- $output .= '
'.
- &mt($item->{'header'}->[0]->{'col3'});
+ if (defined($item->{'header'}->[0]->{'col4'})) {
+ $output .= ' '.
+ &mt($item->{'header'}->[0]->{'col3'});
+ } else {
+ $output .= ' '.
+ &mt($item->{'header'}->[0]->{'col3'});
+ }
if ($action eq 'serverstatuses') {
$output .= ' ('.&mt('IP1,IP2 etc.').' )';
}
$output .= ' ';
}
+ if ($item->{'header'}->[0]->{'col4'}) {
+ $output .= ''.
+ &mt($item->{'header'}->[0]->{'col4'});
+ }
$output .= '';
$rowtotal ++;
if ($action eq 'login') {
@@ -691,6 +719,8 @@ sub print_config_box {
$output .= &print_serverstatuses($dom,$settings,\$rowtotal);
} elsif ($action eq 'helpsettings') {
$output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal);
+ } elsif ($action eq 'loadbalancing') {
+ $output .= &print_loadbalancing($dom,$settings,\$rowtotal);
}
}
$output .= '
@@ -2315,12 +2345,12 @@ sub print_usersessions {
$datatable .= &spares_row(\%servers,\%spareid,\%uniques,$rowtotal);
} else {
$datatable .= ' '.
- &mt('Nothing to set here, as the cluster to which this domain belongs only contains this server.');
+ &mt('Nothing to set here, as the cluster to which this domain belongs only contains one server.');
}
} else {
if (keys(%by_location) == 0) {
$datatable .= ' '.
- &mt('Nothing to set here, as the cluster to which this domain belongs only contains this institution.');
+ &mt('Nothing to set here, as the cluster to which this domain belongs only contains one institution.');
} else {
my %lt = &usersession_titles();
my $numinrow = 5;
@@ -2538,13 +2568,18 @@ sub current_offloads_to {
$spareid{$lonhost}{'primary'} = $Apache::lonnet::spareid{'primary'};
$spareid{$lonhost}{'default'} = $Apache::lonnet::spareid{'default'};
} else {
- my %requested;
- $requested{'spareid'} = 'HASH';
- my %returnhash = &Apache::lonnet::get_remote_globals($lonhost,\%requested);
- my $spareshash = $returnhash{'spareid'};
- if (ref($spareshash) eq 'HASH') {
- $spareid{$lonhost}{'primary'} = $spareshash->{'primary'};
- $spareid{$lonhost}{'default'} = $spareshash->{'default'};
+ my %what = (
+ spareid => 1,
+ );
+ my ($result,$returnhash) =
+ &Apache::lonnet::get_remote_globals($lonhost,\%what);
+ if ($result eq 'ok') {
+ if (ref($returnhash) eq 'HASH') {
+ if (ref($returnhash->{'spareid'}) eq 'HASH') {
+ $spareid{$lonhost}{'primary'} = $returnhash->{'spareid'}->{'primary'};
+ $spareid{$lonhost}{'default'} = $returnhash->{'spareid'}->{'default'};
+ }
+ }
}
}
}
@@ -2585,8 +2620,17 @@ sub spares_row {
$spareid->{$server}{$type}[$i].
' ';
}
- $current{$type} .= ' ';
+ my $rem = @spares%($numinrow);
+ my $colsleft = $numinrow - $rem;
+ if ($colsleft > 1 ) {
+ $current{$type} .= ''.
+ ' ';
+ } elsif ($colsleft == 1) {
+ $current{$type} .= ' ';
+ }
}
+ $current{$type} .= '';
}
if ($current{$type} eq '') {
$current{$type} = &mt('None specified');
@@ -2632,6 +2676,243 @@ sub newspare_select {
return $output;
}
+sub print_loadbalancing {
+ my ($dom,$settings,$rowtotal) = @_;
+ my $primary_id = &Apache::lonnet::domain($dom,'primary');
+ my $intdom = &Apache::lonnet::internet_dom($primary_id);
+ my $numinrow = 1;
+ my $datatable;
+ my %servers = &Apache::lonnet::internet_dom_servers($dom);
+ my ($currbalancer,$currtargets,$currrules);
+ if (keys(%servers) > 1) {
+ if (ref($settings) eq 'HASH') {
+ $currbalancer = $settings->{'lonhost'};
+ $currtargets = $settings->{'targets'};
+ $currrules = $settings->{'rules'};
+ } else {
+ ($currbalancer,$currtargets) =
+ &Apache::lonnet::get_lonbalancer_config(\%servers);
+ }
+ } else {
+ return;
+ }
+ my ($othertitle,$usertypes,$types) =
+ &Apache::loncommon::sorted_inst_types($dom);
+ my $rownum = 6;
+ if (ref($types) eq 'ARRAY') {
+ $rownum += scalar(@{$types});
+ }
+ my $css_class = 'class="LC_odd_row"';
+ my $targets_div_style = 'display: none';
+ my $disabled_div_style = 'display: block';
+ my $homedom_div_style = 'display: none';
+ $datatable = ''.
+ ''.
+ ''."\n".
+ ''."\n";
+ foreach my $lonhost (sort(keys(%servers))) {
+ my $selected;
+ if ($lonhost eq $currbalancer) {
+ $selected .= ' selected="selected"';
+ }
+ $datatable .= ' '.$lonhost.' '."\n";
+ }
+ $datatable .= '
'.
+ ''.&mt('No dedicated Load Balancer').'
'."\n".
+ ''.&mt('Offloads to:').' ';
+ my ($numspares,@spares) = &count_servers($currbalancer,%servers);
+ my @sparestypes = ('primary','default');
+ my %typetitles = &sparestype_titles();
+ foreach my $sparetype (@sparestypes) {
+ my $targettable;
+ for (my $i=0; $i<$numspares; $i++) {
+ my $checked;
+ if (ref($currtargets) eq 'HASH') {
+ if (ref($currtargets->{$sparetype}) eq 'ARRAY') {
+ if (grep(/^\Q$spares[$i]\E$/,@{$currtargets->{$sparetype}})) {
+ $checked = ' checked="checked"';
+ }
+ }
+ }
+ my $chkboxval;
+ if (($currbalancer ne '') && (grep((/^\Q$currbalancer\E$/,keys(%servers))))) {
+ $chkboxval = $spares[$i];
+ }
+ $targettable .= '
'.$chkboxval.
+ ' ';
+ my $rem = $i%($numinrow);
+ if ($rem == 0) {
+ if ($i > 0) {
+ $targettable .= ' ';
+ }
+ $targettable .= '';
+ }
+ }
+ if ($targettable ne '') {
+ my $rem = $numspares%($numinrow);
+ my $colsleft = $numinrow - $rem;
+ if ($colsleft > 1 ) {
+ $targettable .= ''.
+ ' ';
+ } elsif ($colsleft == 1) {
+ $targettable .= ' ';
+ }
+ $datatable .= ''.$typetitles{$sparetype}.' '.
+ ' ';
+ }
+ }
+ $datatable .= ' '.
+ &loadbalancing_rules($dom,$intdom,$currrules,$othertitle,
+ $usertypes,$types,\%servers,$currbalancer,
+ $targets_div_style,$homedom_div_style);
+ $$rowtotal += $rownum;
+ return $datatable;
+}
+
+sub loadbalancing_rules {
+ my ($dom,$intdom,$currrules,$othertitle,$usertypes,$types,$servers,
+ $currbalancer,$targets_div_style,$homedom_div_style) = @_;
+ my $output;
+ my ($alltypes,$othertypes,$titles) =
+ &loadbalancing_titles($dom,$intdom,$usertypes,$types);
+ if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH')) {
+ foreach my $type (@{$alltypes}) {
+ my $current;
+ if (ref($currrules) eq 'HASH') {
+ $current = $currrules->{$type};
+ }
+ if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {
+ if ($dom ne &Apache::lonnet::host_domain($currbalancer)) {
+ $current = '';
+ }
+ }
+ $output .= &loadbalance_rule_row($type,$titles->{$type},$current,
+ $servers,$currbalancer,$dom,
+ $targets_div_style,$homedom_div_style);
+ }
+ }
+ return $output;
+}
+
+sub loadbalancing_titles {
+ my ($dom,$intdom,$usertypes,$types) = @_;
+ my %othertypes = (
+ '_LC_adv' => &mt('Advanced users from [_1]',$dom),
+ '_LC_author' => &mt('Users from [_1] with author role',$dom),
+ '_LC_internetdom' => &mt('Users not from [_1], but from [_2]',$dom,$intdom),
+ '_LC_external' => &mt('Users not from [_1]',$intdom),
+ );
+ my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external');
+ if (ref($types) eq 'ARRAY') {
+ unshift(@alltypes,@{$types},'default');
+ }
+ my %titles;
+ foreach my $type (@alltypes) {
+ if ($type =~ /^_LC_/) {
+ $titles{$type} = $othertypes{$type};
+ } elsif ($type eq 'default') {
+ $titles{$type} = &mt('All users from [_1]',$dom);
+ if (ref($types) eq 'ARRAY') {
+ if (@{$types} > 0) {
+ $titles{$type} = &mt('Other users from [_1]',$dom);
+ }
+ }
+ } elsif (ref($usertypes) eq 'HASH') {
+ $titles{$type} = $usertypes->{$type};
+ }
+ }
+ return (\@alltypes,\%othertypes,\%titles);
+}
+
+sub loadbalance_rule_row {
+ my ($type,$title,$current,$servers,$currbalancer,$dom,$targets_div_style,
+ $homedom_div_style) = @_;
+ my @rulenames = ('default','homeserver');
+ my %ruletitles = &offloadtype_text();
+ if ($type eq '_LC_external') {
+ push(@rulenames,'externalbalancer');
+ } else {
+ push(@rulenames,'specific');
+ }
+ my $style = $targets_div_style;
+ if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {
+ $style = $homedom_div_style;
+ }
+ my $output =
+ ''.$title.'
'."\n".
+ ''."\n";
+ for (my $i=0; $i<@rulenames; $i++) {
+ my $rule = $rulenames[$i];
+ my ($checked,$extra);
+ if ($rulenames[$i] eq 'default') {
+ $rule = '';
+ }
+ if ($rulenames[$i] eq 'specific') {
+ if (ref($servers) eq 'HASH') {
+ my $default;
+ if (($current ne '') && (exists($servers->{$current}))) {
+ $checked = ' checked="checked"';
+ }
+ unless ($checked) {
+ $default = ' selected="selected"';
+ }
+ $extra = ': '."\n".
+ ' '."\n";
+ foreach my $lonhost (sort(keys(%{$servers}))) {
+ next if ($lonhost eq $currbalancer);
+ my $selected;
+ if ($lonhost eq $current) {
+ $selected = ' selected="selected"';
+ }
+ $extra .= ''.$lonhost.' ';
+ }
+ $extra .= ' ';
+ }
+ } elsif ($rule eq $current) {
+ $checked = ' checked="checked"';
+ }
+ $output .= ''.
+ ' '.$ruletitles{$rulenames[$i]}.
+ ' '.$extra.' '."\n";
+ }
+ $output .= '
'."\n";
+ return $output;
+}
+
+sub offloadtype_text {
+ my %ruletitles = &Apache::lonlocal::texthash (
+ 'default' => 'Offloads to default destinations',
+ 'homeserver' => "Offloads to user's home server",
+ 'externalbalancer' => "Offloads to Load Balancer in user's domain",
+ 'specific' => 'Offloads to specific server',
+ );
+ return %ruletitles;
+}
+
+sub sparestype_titles {
+ my %typestitles = &Apache::lonlocal::texthash (
+ 'primary' => 'primary',
+ 'default' => 'default',
+ );
+ return %typestitles;
+}
+
sub contact_titles {
my %titles = &Apache::lonlocal::texthash (
'supportemail' => 'Support E-mail address',
@@ -7214,6 +7495,200 @@ sub modify_usersessions {
return $resulttext;
}
+sub modify_loadbalancing {
+ my ($dom,%domconfig) = @_;
+ my $primary_id = &Apache::lonnet::domain($dom,'primary');
+ my $intdom = &Apache::lonnet::internet_dom($primary_id);
+ my ($othertitle,$usertypes,$types) =
+ &Apache::loncommon::sorted_inst_types($dom);
+ my %servers = &Apache::lonnet::internet_dom_servers($dom);
+ my @sparestypes = ('primary','default');
+ my %typetitles = &sparestype_titles();
+ my $resulttext;
+ if (keys(%servers) > 1) {
+ my ($currbalancer,$currtargets,$currrules);
+ if (ref($domconfig{'loadbalancing'}) eq 'HASH') {
+ $currbalancer = $domconfig{'loadbalancing'}{'lonhost'};
+ $currtargets = $domconfig{'loadbalancing'}{'targets'};
+ $currrules = $domconfig{'loadbalancing'}{'rules'};
+ } else {
+ ($currbalancer,$currtargets) =
+ &Apache::lonnet::get_lonbalancer_config(\%servers);
+ }
+ my ($saveloadbalancing,%defaultshash,%changes);
+ my ($alltypes,$othertypes,$titles) =
+ &loadbalancing_titles($dom,$intdom,$usertypes,$types);
+ my %ruletitles = &offloadtype_text();
+ my $balancer = $env{'form.loadbalancing_lonhost'};
+ if (!$servers{$balancer}) {
+ undef($balancer);
+ }
+ if ($currbalancer ne $balancer) {
+ $changes{'lonhost'} = 1;
+ }
+ $defaultshash{'loadbalancing'}{'lonhost'} = $balancer;
+ if ($balancer ne '') {
+ unless (ref($domconfig{'loadbalancing'}) eq 'HASH') {
+ $saveloadbalancing = 1;
+ }
+ foreach my $sparetype (@sparestypes) {
+ my @targets = &Apache::loncommon::get_env_multiple('form.loadbalancing_target_'.$sparetype);
+ foreach my $target (@targets) {
+ my @offloadto;
+ if (($servers{$target}) && ($target ne $balancer)) {
+ if ($sparetype eq 'default') {
+ if (ref($defaultshash{'loadbalancing'}{'targets'}{'primary'}) eq 'ARRAY') {
+ next if (grep(/^\Q$target\E$/,@{$defaultshash{'loadbalancing'}{'targets'}{'primary'}}));
+ }
+ }
+ unless(grep(/^\Q$target\E$/,@offloadto)) {
+ push(@offloadto,$target);
+ }
+ }
+ $defaultshash{'loadbalancing'}{'targets'}{$sparetype} = \@offloadto;
+ }
+ }
+ } else {
+ foreach my $sparetype (@sparestypes) {
+ $defaultshash{'loadbalancing'}{'targets'}{$sparetype} = [];
+ }
+ }
+ if (ref($currtargets) eq 'HASH') {
+ foreach my $sparetype (@sparestypes) {
+ if (ref($currtargets->{$sparetype}) eq 'ARRAY') {
+ my @targetdiffs = &Apache::loncommon::compare_arrays($currtargets->{$sparetype},$defaultshash{'loadbalancing'}{'targets'}{$sparetype});
+ if (@targetdiffs > 0) {
+ $changes{'targets'} = 1;
+ }
+ } elsif (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
+ if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
+ $changes{'targets'} = 1;
+ }
+ }
+ }
+ } else {
+ foreach my $sparetype (@sparestypes) {
+ if (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
+ if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
+ $changes{'targets'} = 1;
+ }
+ }
+ }
+ }
+ my $ishomedom;
+ if ($balancer ne '') {
+ if (&Apache::lonnet::host_domain($balancer) eq $dom) {
+ $ishomedom = 1;
+ }
+ }
+ if (ref($alltypes) eq 'ARRAY') {
+ foreach my $type (@{$alltypes}) {
+ my $rule;
+ if ($balancer ne '') {
+ unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) &&
+ (!$ishomedom)) {
+ $rule = $env{'form.loadbalancing_rules_'.$type};
+ }
+ if ($rule eq 'specific') {
+ $rule = $env{'form.loadbalancing_singleserver_'.$type};
+ }
+ }
+ $defaultshash{'loadbalancing'}{'rules'}{$type} = $rule;
+ if (ref($currrules) eq 'HASH') {
+ if ($rule ne $currrules->{$type}) {
+ $changes{'rules'}{$type} = 1;
+ }
+ } elsif ($rule ne '') {
+ $changes{'rules'}{$type} = 1;
+ }
+ }
+ }
+ my $nochgmsg = &mt('No changes made to Load Balancer settings.');
+ if ((keys(%changes) > 0) || ($saveloadbalancing)) {
+ my $putresult = &Apache::lonnet::put_dom('configuration',
+ \%defaultshash,$dom);
+ if ($putresult eq 'ok') {
+ if (keys(%changes) > 0) {
+ if ($changes{'lonhost'}) {
+ if ($currbalancer ne '') {
+ &Apache::lonnet::remote_devalidate_cache($currbalancer,'loadbalancing',$dom);
+ }
+ if ($balancer eq '') {
+ $resulttext .= ''.&mt('Load Balancing with dedicated server discontinued').' ';
+ } else {
+ &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
+ $resulttext .= ''.&mt('Dedicated Load Balancer server set to [_1]',$balancer);
+ }
+ } else {
+ &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
+ }
+ if (($changes{'targets'}) && ($balancer ne '')) {
+ my %offloadstr;
+ foreach my $sparetype (@sparestypes) {
+ if (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
+ if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
+ $offloadstr{$sparetype} = join(', ',@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}});
+ }
+ }
+ }
+ if (keys(%offloadstr) == 0) {
+ $resulttext .= ' '.&mt("Servers to which Load Balance server offloads set to 'None', by default").' ';
+ } else {
+ my $showoffload;
+ foreach my $sparetype (@sparestypes) {
+ $showoffload .= ''.$typetitles{$sparetype}.' : ';
+ if (defined($offloadstr{$sparetype})) {
+ $showoffload .= $offloadstr{$sparetype};
+ } else {
+ $showoffload .= &mt('None');
+ }
+ $showoffload .= (' 'x3);
+ }
+ $resulttext .= ''.&mt('By default, Load Balancer server set to offload to: [_1]',$showoffload).' ';
+ }
+ }
+ if ((ref($changes{'rules'}) eq 'HASH') && ($balancer ne '')) {
+ if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH')) {
+ foreach my $type (@{$alltypes}) {
+ if ($changes{'rules'}{$type}) {
+ my $rule = $defaultshash{'loadbalancing'}{'rules'}{$type};
+ my $balancetext;
+ if ($rule eq '') {
+ $balancetext = $ruletitles{'default'};
+ } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer')) {
+ $balancetext = $ruletitles{$rule};
+ } else {
+ $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{'rules'}{$type});
+ }
+ $resulttext .= ''.&mt('Load Balancing for [_1] set to: [_2]',$titles->{$type},$balancetext).' ';
+ }
+ }
+ }
+ }
+ if ($resulttext ne '') {
+ $resulttext = &mt('Changes made:').'';
+ } else {
+ $resulttext = $nochgmsg;
+ }
+ } else {
+ $resulttext = $nochgmsg;
+ if ($balancer ne '') {
+ &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
+ }
+ }
+ } else {
+ $resulttext = ''.
+ &mt('An error occurred: [_1]',$putresult).' ';
+ }
+ } else {
+ $resulttext = $nochgmsg;
+ }
+ } else {
+ $resulttext = &mt('Load Balancing unavailable as this domain only has one server.');
+ }
+ return $resulttext;
+}
+
sub recurse_check {
my ($chkcats,$categories,$depth,$name) = @_;
if (ref($chkcats->[$depth]{$name}) eq 'ARRAY') {
@@ -7338,4 +7813,201 @@ sub usersession_titles {
);
}
+sub count_servers {
+ my ($currbalancer,%servers) = @_;
+ my (@spares,$numspares);
+ foreach my $lonhost (sort(keys(%servers))) {
+ next if ($currbalancer eq $lonhost);
+ push(@spares,$lonhost);
+ }
+ if ($currbalancer) {
+ $numspares = scalar(@spares);
+ } else {
+ $numspares = scalar(@spares) - 1;
+ }
+ return ($numspares,@spares);
+}
+
+sub lonbalance_targets_js {
+ my ($dom,$types,$servers) = @_;
+ my $select = &mt('Select');
+ my ($alltargets,$allishome,$allinsttypes,@alltypes);
+ if (ref($servers) eq 'HASH') {
+ $alltargets = join("','",sort(keys(%{$servers})));
+ my @homedoms;
+ foreach my $server (sort(keys(%{$servers}))) {
+ if (&Apache::lonnet::host_domain($server) eq $dom) {
+ push(@homedoms,'1');
+ } else {
+ push(@homedoms,'0');
+ }
+ }
+ $allishome = join("','",@homedoms);
+ }
+ if (ref($types) eq 'ARRAY') {
+ if (@{$types} > 0) {
+ @alltypes = @{$types};
+ }
+ }
+ push(@alltypes,'default','_LC_adv','_LC_author','_LC_internetdom','_LC_external');
+ $allinsttypes = join("','",@alltypes);
+ return <<"END";
+
+
+
+END
+}
+
1;