--- loncom/interface/domainprefs.pm 2010/07/17 20:02:07 1.137 +++ loncom/interface/domainprefs.pm 2010/07/20 02:42:40 1.138 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.137 2010/07/17 20:02:07 raeburn Exp $ +# $Id: domainprefs.pm,v 1.138 2010/07/20 02:42:40 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -2270,10 +2270,12 @@ sub print_usersessions { } else { $prefix = 'remote'; @types = ('version','excludedomain','includedomain'); - } + } my (%current,%checkedon,%checkedoff); my @lcversions = &Apache::lonnet::all_loncaparevs(); - my @alldoms = sort(&Apache::lonnet::all_domains()); + my (%by_ip,%by_location,@intdoms); + &build_location_hashes(\@intdoms,\%by_ip,\%by_location); + my @locations = sort(keys(%by_location)); foreach my $type (@types) { $checkedon{$type} = ''; $checkedoff{$type} = ' checked="checked"'; @@ -2322,12 +2324,21 @@ sub print_usersessions { "\n". '
'; my $rem; - for (my $i=0; $i<@alldoms; $i++) { - next if ($alldoms[$i] eq $dom); - my $checkedtype; - if (ref($current{$type}) eq 'ARRAY') { - if (grep(/^\Q$alldoms[$i]\E$/,@{$current{$type}})) { - $checkedtype = ' checked="checked"'; + for (my $i=0; $i<@locations; $i++) { + my ($showloc,$value,$checkedtype); + if (ref($by_location{$locations[$i]}) eq 'ARRAY') { + my $ip = $by_location{$locations[$i]}->[0]; + if (ref($by_ip{$ip}) eq 'ARRAY') { + $value = join(':',@{$by_ip{$ip}}); + $showloc = join(', ',@{$by_ip{$ip}}); + if (ref($current{$type}) eq 'ARRAY') { + foreach my $loc (@{$by_ip{$ip}}) { + if (grep(/^\Q$loc\E$/,@{$current{$type}})) { + $checkedtype = ' checked="checked"'; + last; + } + } + } } } $rem = $i%($numinrow); @@ -2340,10 +2351,10 @@ sub print_usersessions { $datatable .= ''; } - $rem = @alldoms%($numinrow); + $rem = @locations%($numinrow); my $colsleft = $numinrow - $rem; if ($colsleft > 1 ) { $datatable .= '
'. ''. @@ -2360,6 +2371,54 @@ sub print_usersessions { return $datatable; } +sub build_location_hashes { + my ($intdoms,$by_ip,$by_location) = @_; + return unless((ref($intdoms) eq 'ARRAY') && (ref($by_ip) eq 'HASH') && + (ref($by_location) eq 'HASH')); + my %iphost = &Apache::lonnet::get_iphost(); + my $primary_id = &Apache::lonnet::domain($env{'request.role.domain'},'primary'); + my $primary_ip = &Apache::lonnet::get_host_ip($primary_id); + if (ref($iphost{$primary_ip}) eq 'ARRAY') { + foreach my $id (@{$iphost{$primary_ip}}) { + my $intdom = &Apache::lonnet::internet_dom($id); + unless(grep(/^\Q$intdom\E$/,@{$intdoms})) { + push(@{$intdoms},$intdom); + } + } + } + foreach my $ip (keys(%iphost)) { + if (ref($iphost{$ip}) eq 'ARRAY') { + foreach my $id (@{$iphost{$ip}}) { + my $location = &Apache::lonnet::internet_dom($id); + if ($location) { + next if (grep(/^\Q$location\E$/,@{$intdoms})); + if (ref($by_ip->{$ip}) eq 'ARRAY') { + unless(grep(/^\Q$location\E$/,@{$by_ip->{$ip}})) { + push(@{$by_ip->{$ip}},$location); + } + } else { + $by_ip->{$ip} = [$location]; + } + } + } + } + } + foreach my $ip (sort(keys(%{$by_ip}))) { + if (ref($by_ip->{$ip}) eq 'ARRAY') { + @{$by_ip->{$ip}} = sort(@{$by_ip->{$ip}}); + my $first = $by_ip->{$ip}->[0]; + if (ref($by_location->{$first}) eq 'ARRAY') { + unless (grep(/^\Q$ip\E$/,@{$by_location->{$first}})) { + push(@{$by_location->{$first}},$ip); + } + } else { + $by_location->{$first} = [$ip]; + } + } + } + return; +} + sub contact_titles { my %titles = &Apache::lonlocal::texthash ( 'supportemail' => 'Support E-mail address', @@ -6642,12 +6701,16 @@ sub modify_usersessions { my @types = ('version','excludedomain','includedomain'); my @prefixes = ('remote','hosted'); my @lcversions = &Apache::lonnet::all_loncaparevs(); + my (%by_ip,%by_location,@intdoms); + &build_location_hashes(\@intdoms,\%by_ip,\%by_location); + my @locations = sort(keys(%by_location)); my (%defaultshash,%changes); foreach my $prefix (@prefixes) { $defaultshash{'usersessions'}{$prefix} = {}; } my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); my $resulttext; + my %iphost = &Apache::lonnet::get_iphost(); foreach my $prefix (@prefixes) { foreach my $type (@types) { my $inuse = $env{'form.'.$prefix.'_'.$type.'_inuse'}; @@ -6694,8 +6757,17 @@ sub modify_usersessions { my @vals = &Apache::loncommon::get_env_multiple('form.'.$prefix.'_'.$type); my @okvals; foreach my $val (@vals) { - if (&Apache::lonnet::domain($val) ne '') { - push(@okvals,$val); + if ($val =~ /:/) { + my @items = split(/:/,$val); + foreach my $item (@items) { + if (ref($by_location{$item}) eq 'ARRAY') { + push(@okvals,$item); + } + } + } else { + if (ref($by_location{$val}) eq 'ARRAY') { + push(@okvals,$val); + } } } @okvals = sort(@okvals); @@ -6942,8 +7014,8 @@ sub usersession_titles { remote => 'Hosting of sessions for users in this domain on servers in other domains', version => 'LON-CAPA version requirement', - excludedomain => 'Specific domains excluded', - includedomain => 'Specific domains included', + excludedomain => 'Allow all, but exclude specific domains', + includedomain => 'Deny all, but include specific domains', ); }