version 1.151, 2011/08/09 12:16:41
|
version 1.163, 2012/08/14 15:45:06
|
Line 86 $dom,$settings,$rowtotal,$action.
|
Line 86 $dom,$settings,$rowtotal,$action.
|
|
|
$dom is the domain, $settings is a reference to a hash of current settings for |
$dom is the domain, $settings is a reference to a hash of current settings for |
the current context, $rowtotal is a reference to the scalar used to record the |
the current context, $rowtotal is a reference to the scalar used to record the |
number of rows displayed on the page, and $action is the context (either quotas |
number of rows displayed on the page, and $action is the context (quotas, |
or requestcourses). |
requestcourses or requestauthor). |
|
|
The print_quotas routine was orginally created to display/store information |
The print_quotas routine was orginally created to display/store information |
about default quota sizes for portfolio spaces for the different types of |
about default quota sizes for portfolio spaces for the different types of |
Line 171 use Locale::Language;
|
Line 171 use Locale::Language;
|
use DateTime::TimeZone; |
use DateTime::TimeZone; |
use DateTime::Locale; |
use DateTime::Locale; |
|
|
|
my $registered_cleanup; |
|
my $modified_urls; |
|
|
sub handler { |
sub handler { |
my $r=shift; |
my $r=shift; |
if ($r->header_only) { |
if ($r->header_only) { |
Line 190 sub handler {
|
Line 193 sub handler {
|
"/adm/domainprefs:mau:0:0:Cannot modify domain settings"; |
"/adm/domainprefs:mau:0:0:Cannot modify domain settings"; |
return HTTP_NOT_ACCEPTABLE; |
return HTTP_NOT_ACCEPTABLE; |
} |
} |
|
|
|
$registered_cleanup=0; |
|
@{$modified_urls}=(); |
|
|
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['phase','actions']); |
['phase','actions']); |
Line 204 sub handler {
|
Line 211 sub handler {
|
'directorysrch','usercreation','usermodification', |
'directorysrch','usercreation','usermodification', |
'contacts','defaults','scantron','coursecategories', |
'contacts','defaults','scantron','coursecategories', |
'serverstatuses','requestcourses','helpsettings', |
'serverstatuses','requestcourses','helpsettings', |
'coursedefaults','usersessions','loadbalancing'],$dom); |
'coursedefaults','usersessions','loadbalancing', |
|
'requestauthor'],$dom); |
my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll', |
my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll', |
'autoupdate','autocreate','directorysrch','contacts', |
'autoupdate','autocreate','directorysrch','contacts', |
'usercreation','usermodification','scantron', |
'usercreation','usermodification','scantron', |
'requestcourses','coursecategories','serverstatuses','helpsettings', |
'requestcourses','requestauthor','coursecategories', |
|
'serverstatuses','helpsettings', |
'coursedefaults','usersessions'); |
'coursedefaults','usersessions'); |
if (keys(%servers) > 1) { |
if (keys(%servers) > 1) { |
push(@prefs_order,'loadbalancing'); |
push(@prefs_order,'loadbalancing'); |
Line 240 sub handler {
|
Line 249 sub handler {
|
col2 => 'Value'}], |
col2 => 'Value'}], |
}, |
}, |
'quotas' => |
'quotas' => |
{ text => 'User blogs, personal information pages, portfolios', |
{ text => 'Blogs, personal web pages, webDAV, portfolios', |
help => 'Domain_Configuration_Quotas', |
help => 'Domain_Configuration_Quotas', |
header => [{col1 => 'User affiliation', |
header => [{col1 => 'User affiliation', |
col2 => 'Available tools', |
col2 => 'Available tools', |
Line 316 sub handler {
|
Line 325 sub handler {
|
{col1 => 'Setting', |
{col1 => 'Setting', |
col2 => 'Value'}], |
col2 => 'Value'}], |
}, |
}, |
|
'requestauthor' => |
|
{text => 'Request authoring space', |
|
help => 'Domain_Configuration_Request_Author', |
|
header => [{col1 => 'User affiliation', |
|
col2 => 'Availability/Processing of requests',}, |
|
{col1 => 'Setting', |
|
col2 => 'Value'}], |
|
}, |
'coursecategories' => |
'coursecategories' => |
{ text => 'Cataloging of courses/communities', |
{ text => 'Cataloging of courses/communities', |
help => 'Domain_Configuration_Cataloging_Courses', |
help => 'Domain_Configuration_Cataloging_Courses', |
Line 375 sub handler {
|
Line 392 sub handler {
|
], |
], |
}, |
}, |
); |
); |
my $js; |
|
if (keys(%servers) > 1) { |
if (keys(%servers) > 1) { |
$prefs{'login'} = { text => 'Log-in page options', |
$prefs{'login'} = { text => 'Log-in page options', |
help => 'Domain_Configuration_Login_Page', |
help => 'Domain_Configuration_Login_Page', |
Line 384 sub handler {
|
Line 400 sub handler {
|
{col1 => 'Log-in Page Items', |
{col1 => 'Log-in Page Items', |
col2 => ''}], |
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 @roles = ('student','coordinator','author','admin'); |
my @actions = &Apache::loncommon::get_env_multiple('form.actions'); |
my @actions = &Apache::loncommon::get_env_multiple('form.actions'); |
Line 398 sub handler {
|
Line 410 sub handler {
|
if ($phase eq 'process') { |
if ($phase eq 'process') { |
&Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles); |
&Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles); |
} elsif ($phase eq 'display') { |
} 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::loncommon::javascript_array_indexof(); |
|
} |
&Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js); |
&Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js); |
} else { |
} else { |
if (keys(%domconfig) == 0) { |
if (keys(%domconfig) == 0) { |
Line 476 sub process_changes {
|
Line 497 sub process_changes {
|
$output = &modify_serverstatuses($dom,%domconfig); |
$output = &modify_serverstatuses($dom,%domconfig); |
} elsif ($action eq 'requestcourses') { |
} elsif ($action eq 'requestcourses') { |
$output = &modify_quotas($dom,$action,%domconfig); |
$output = &modify_quotas($dom,$action,%domconfig); |
|
} elsif ($action eq 'requestauthor') { |
|
$output = &modify_quotas($dom,$action,%domconfig); |
} elsif ($action eq 'helpsettings') { |
} elsif ($action eq 'helpsettings') { |
$output = &modify_helpsettings($r,$dom,$confname,%domconfig); |
$output = &modify_helpsettings($r,$dom,$confname,%domconfig); |
} elsif ($action eq 'coursedefaults') { |
} elsif ($action eq 'coursedefaults') { |
Line 538 sub print_config_box {
|
Line 561 sub print_config_box {
|
$colspan = ' colspan="2"'; |
$colspan = ' colspan="2"'; |
} elsif ($action eq 'requestcourses') { |
} elsif ($action eq 'requestcourses') { |
$output .= &print_quotas($dom,$settings,\$rowtotal,$action); |
$output .= &print_quotas($dom,$settings,\$rowtotal,$action); |
|
} elsif ($action eq 'requestauthor') { |
|
$output .= &print_quotas($dom,$settings,\$rowtotal,$action); |
} elsif ($action eq 'helpsettings') { |
} elsif ($action eq 'helpsettings') { |
$output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal); |
$output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal); |
} elsif ($action eq 'usersessions') { |
} elsif ($action eq 'usersessions') { |
Line 604 sub print_config_box {
|
Line 629 sub print_config_box {
|
} elsif ($action eq 'login') { |
} elsif ($action eq 'login') { |
$output .= &print_login('bottom',$dom,$confname,$phase,$settings,\$rowtotal); |
$output .= &print_login('bottom',$dom,$confname,$phase,$settings,\$rowtotal); |
} elsif ($action eq 'requestcourses') { |
} elsif ($action eq 'requestcourses') { |
$output .= &print_courserequestmail($dom,$settings,\$rowtotal); |
$output .= &print_requestmail($dom,$action,$settings,\$rowtotal); |
|
} elsif ($action eq 'requestauthor') { |
|
$output .= &print_requestmail($dom,$action,$settings,\$rowtotal); |
} elsif ($action eq 'helpsettings') { |
} elsif ($action eq 'helpsettings') { |
$output .= &print_helpsettings('bottom',$dom,$confname,$settings,\$rowtotal); |
$output .= &print_helpsettings('bottom',$dom,$confname,$settings,\$rowtotal); |
} elsif ($action eq 'usersessions') { |
} elsif ($action eq 'usersessions') { |
Line 1047 sub print_rolecolors {
|
Line 1074 sub print_rolecolors {
|
sub display_color_options { |
sub display_color_options { |
my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs, |
my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs, |
$images,$bgs,$links,$alt_text,$rowtotal,$logintext) = @_; |
$images,$bgs,$links,$alt_text,$rowtotal,$logintext) = @_; |
|
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
my $css_class = $itemcount%2?' class="LC_odd_row"':''; |
my $css_class = $itemcount%2?' class="LC_odd_row"':''; |
my $datatable = '<tr'.$css_class.'>'. |
my $datatable = '<tr'.$css_class.'>'. |
'<td>'.$choices->{'font'}.'</td>'; |
'<td>'.$choices->{'font'}.'</td>'; |
Line 1124 sub display_color_options {
|
Line 1152 sub display_color_options {
|
$showfile = $imgfile; |
$showfile = $imgfile; |
my $imgdir = $1; |
my $imgdir = $1; |
my $filename = $2; |
my $filename = $2; |
if (-e "/home/httpd/html/$imgdir/tn-".$filename) { |
if (-e "$londocroot/$imgdir/tn-".$filename) { |
$showfile = "/$imgdir/tn-".$filename; |
$showfile = "/$imgdir/tn-".$filename; |
} else { |
} else { |
my $input = "/home/httpd/html".$imgfile; |
my $input = $londocroot.$imgfile; |
my $output = '/home/httpd/html/'.$imgdir.'/tn-'.$filename; |
my $output = "$londocroot/$imgdir/tn-".$filename; |
if (!-e $output) { |
if (!-e $output) { |
my ($width,$height) = &thumb_dimensions(); |
my ($width,$height) = &thumb_dimensions(); |
my ($fullwidth,$fullheight) = &check_dimensions($input); |
my ($fullwidth,$fullheight) = &check_dimensions($input); |
Line 1136 sub display_color_options {
|
Line 1164 sub display_color_options {
|
if ($fullwidth > $width && $fullheight > $height) { |
if ($fullwidth > $width && $fullheight > $height) { |
my $size = $width.'x'.$height; |
my $size = $width.'x'.$height; |
system("convert -sample $size $input $output"); |
system("convert -sample $size $input $output"); |
$showfile = '/'.$imgdir.'/tn-'.$filename; |
$showfile = "/$imgdir/tn-".$filename; |
} |
} |
} |
} |
} |
} |
Line 1364 sub print_quotas {
|
Line 1392 sub print_quotas {
|
@options =('norequest','approval','validate','autolimit'); |
@options =('norequest','approval','validate','autolimit'); |
%validations = &Apache::lonnet::auto_courserequest_checks($dom); |
%validations = &Apache::lonnet::auto_courserequest_checks($dom); |
%titles = &courserequest_titles(); |
%titles = &courserequest_titles(); |
|
} elsif ($context eq 'requestauthor') { |
|
@usertools = ('author'); |
|
@options = ('norequest','approval','automatic'); |
|
%titles = &authorrequest_titles(); |
} else { |
} else { |
@usertools = ('aboutme','blog','portfolio'); |
@usertools = ('aboutme','blog','webdav','portfolio'); |
%titles = &tool_titles(); |
%titles = &tool_titles(); |
} |
} |
if (ref($types) eq 'ARRAY') { |
if (ref($types) eq 'ARRAY') { |
foreach my $type (@{$types}) { |
foreach my $type (@{$types}) { |
my $currdefquota; |
my $currdefquota; |
unless ($context eq 'requestcourses') { |
unless (($context eq 'requestcourses') || |
|
($context eq 'requestauthor')) { |
if (ref($settings) eq 'HASH') { |
if (ref($settings) eq 'HASH') { |
if (ref($settings->{defaultquota}) eq 'HASH') { |
if (ref($settings->{defaultquota}) eq 'HASH') { |
$currdefquota = $settings->{defaultquota}->{$type}; |
$currdefquota = $settings->{defaultquota}->{$type}; |
Line 1441 sub print_quotas {
|
Line 1474 sub print_quotas {
|
$cell{$item} .= $titles{'unlimited'}; |
$cell{$item} .= $titles{'unlimited'}; |
} |
} |
} |
} |
|
} elsif ($context eq 'requestauthor') { |
|
my $curroption; |
|
if (ref($settings) eq 'HASH') { |
|
$curroption = $settings->{$type}; |
|
} |
|
if (!$curroption) { |
|
$curroption = 'norequest'; |
|
} |
|
foreach my $option (@options) { |
|
my $val = $option; |
|
if ($option eq 'norequest') { |
|
$val = 0; |
|
} |
|
my $checked = ''; |
|
if ($option eq $curroption) { |
|
$checked = ' checked="checked"'; |
|
} |
|
$datatable .= '<span class="LC_nobreak"><label>'. |
|
'<input type="radio" name="authorreq_'.$type. |
|
'" value="'.$val.'"'.$checked.' />'. |
|
$titles{$option}.'</label></span> '; |
|
} |
} else { |
} else { |
my $checked = 'checked="checked" '; |
my $checked = 'checked="checked" '; |
if (ref($settings) eq 'HASH') { |
if (ref($settings) eq 'HASH') { |
Line 1466 sub print_quotas {
|
Line 1521 sub print_quotas {
|
$datatable .= '</tr></table>'; |
$datatable .= '</tr></table>'; |
} |
} |
$datatable .= '</td>'; |
$datatable .= '</td>'; |
unless ($context eq 'requestcourses') { |
unless (($context eq 'requestcourses') || |
|
($context eq 'requestauthor')) { |
$datatable .= |
$datatable .= |
'<td class="LC_right_item"><span class="LC_nobreak">'. |
'<td class="LC_right_item"><span class="LC_nobreak">'. |
'<input type="text" name="quota_'.$type. |
'<input type="text" name="quota_'.$type. |
Line 1477 sub print_quotas {
|
Line 1533 sub print_quotas {
|
} |
} |
} |
} |
} |
} |
unless ($context eq 'requestcourses') { |
unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) { |
$defaultquota = '20'; |
$defaultquota = '20'; |
if (ref($settings) eq 'HASH') { |
if (ref($settings) eq 'HASH') { |
if (ref($settings->{'defaultquota'}) eq 'HASH') { |
if (ref($settings->{'defaultquota'}) eq 'HASH') { |
Line 1547 sub print_quotas {
|
Line 1603 sub print_quotas {
|
$defcell{$item} .= $titles{'unlimited'}; |
$defcell{$item} .= $titles{'unlimited'}; |
} |
} |
} |
} |
|
} elsif ($context eq 'requestauthor') { |
|
my $curroption; |
|
if (ref($settings) eq 'HASH') { |
|
if (ref($settings->{'requestauthor'}) eq 'HASH') { |
|
$curroption = $settings->{'requestauthor'}; |
|
} |
|
} |
|
if (!$curroption) { |
|
$curroption = 'norequest'; |
|
} |
|
foreach my $option (@options) { |
|
my $val = $option; |
|
if ($option eq 'norequest') { |
|
$val = 0; |
|
} |
|
my $checked = ''; |
|
if ($option eq $curroption) { |
|
$checked = ' checked="checked"'; |
|
} |
|
$datatable .= '<span class="LC_nobreak"><label>'. |
|
'<input type="radio" name="authorreq_default"'. |
|
' value="'.$val.'"'.$checked.' />'. |
|
$titles{$option}.'</label></span> '; |
|
} |
} else { |
} else { |
my $checked = 'checked="checked" '; |
my $checked = 'checked="checked" '; |
if (ref($settings) eq 'HASH') { |
if (ref($settings) eq 'HASH') { |
Line 1572 sub print_quotas {
|
Line 1652 sub print_quotas {
|
$datatable .= '</tr></table>'; |
$datatable .= '</tr></table>'; |
} |
} |
$datatable .= '</td>'; |
$datatable .= '</td>'; |
unless ($context eq 'requestcourses') { |
unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) { |
$datatable .= '<td class="LC_right_item"><span class="LC_nobreak">'. |
$datatable .= '<td class="LC_right_item"><span class="LC_nobreak">'. |
'<input type="text" name="defaultquota" value="'. |
'<input type="text" name="defaultquota" value="'. |
$defaultquota.'" size="5" /> Mb</span></td>'; |
$defaultquota.'" size="5" /> Mb</span></td>'; |
Line 1650 sub print_quotas {
|
Line 1730 sub print_quotas {
|
$advcell{$item} .= $titles{'unlimited'}; |
$advcell{$item} .= $titles{'unlimited'}; |
} |
} |
} |
} |
|
} elsif ($context eq 'requestauthor') { |
|
my $curroption; |
|
if (ref($settings) eq 'HASH') { |
|
$curroption = $settings->{'_LC_adv'}; |
|
} |
|
my $checked = ''; |
|
if ($curroption eq '') { |
|
$checked = ' checked="checked"'; |
|
} |
|
$datatable .= '<span class="LC_nobreak"><label>'. |
|
'<input type="radio" name="authorreq__LC_adv"'. |
|
' value=""'.$checked.' />'. |
|
&mt('No override set').'</label></span> '; |
|
foreach my $option (@options) { |
|
my $val = $option; |
|
if ($option eq 'norequest') { |
|
$val = 0; |
|
} |
|
my $checked = ''; |
|
if ($val eq $curroption) { |
|
$checked = ' checked="checked"'; |
|
} |
|
$datatable .= '<span class="LC_nobreak"><label>'. |
|
'<input type="radio" name="crsreq_'.$item. |
|
'__LC_adv" value="'.$val.'"'.$checked.' />'. |
|
$titles{$option}.'</label></span> '; |
|
} |
} else { |
} else { |
my $checked = 'checked="checked" '; |
my $checked = 'checked="checked" '; |
if (ref($settings) eq 'HASH') { |
if (ref($settings) eq 'HASH') { |
Line 1679 sub print_quotas {
|
Line 1786 sub print_quotas {
|
return $datatable; |
return $datatable; |
} |
} |
|
|
sub print_courserequestmail { |
sub print_requestmail { |
my ($dom,$settings,$rowtotal) = @_; |
my ($dom,$action,$settings,$rowtotal) = @_; |
my ($now,$datatable,%dompersonnel,@domcoord,@currapproval,$rows); |
my ($now,$datatable,%dompersonnel,@domcoord,@currapproval,$rows); |
$now = time; |
$now = time; |
$rows = 0; |
$rows = 0; |
Line 1711 sub print_courserequestmail {
|
Line 1818 sub print_courserequestmail {
|
my $numinrow = 4; |
my $numinrow = 4; |
my $numdc = @domcoord; |
my $numdc = @domcoord; |
my $css_class = 'class="LC_odd_row"'; |
my $css_class = 'class="LC_odd_row"'; |
$datatable = '<tr'.$css_class.'>'. |
my $text; |
' <td>'.&mt('Receive notification of course requests requiring approval.'). |
if ($action eq 'requestcourses') { |
' </td>'. |
$text = &mt('Receive notification of course requests requiring approval'); |
|
} else { |
|
$text = &mt('Receive notification of authoring space requests requiring approval') |
|
} |
|
$datatable = '<tr '.$css_class.'>'. |
|
' <td>'.$text.'</td>'. |
' <td class="LC_left_item">'; |
' <td class="LC_left_item">'; |
if (@domcoord > 0) { |
if (@domcoord > 0) { |
$datatable .= '<table>'; |
$datatable .= '<table>'; |
Line 2336 sub print_usersessions {
|
Line 2448 sub print_usersessions {
|
&build_location_hashes(\@intdoms,\%by_ip,\%by_location); |
&build_location_hashes(\@intdoms,\%by_ip,\%by_location); |
|
|
my @alldoms = &Apache::lonnet::all_domains(); |
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 %servers = &Apache::lonnet::internet_dom_servers($dom); |
|
my %altids = &id_for_thisdom(%servers); |
my $itemcount = 1; |
my $itemcount = 1; |
if ($position eq 'top') { |
if ($position eq 'top') { |
if (keys(%uniques) > 1) { |
if (keys(%serverhomes) > 1) { |
my %spareid = ¤t_offloads_to($dom,$settings,\%servers); |
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 { |
} else { |
$datatable .= '<tr'.$css_class.'><td colspan="2">'. |
$datatable .= '<tr'.$css_class.'><td colspan="2">'. |
&mt('Nothing to set here, as the cluster to which this domain belongs only contains one server.'); |
&mt('Nothing to set here, as the cluster to which this domain belongs only contains one server.'); |
Line 2515 sub build_location_hashes {
|
Line 2628 sub build_location_hashes {
|
sub current_offloads_to { |
sub current_offloads_to { |
my ($dom,$settings,$servers) = @_; |
my ($dom,$settings,$servers) = @_; |
my (%spareid,%otherdomconfigs); |
my (%spareid,%otherdomconfigs); |
if ((ref($settings) eq 'HASH') && (ref($servers) eq 'HASH')) { |
if (ref($servers) eq 'HASH') { |
foreach my $lonhost (sort(keys(%{$servers}))) { |
foreach my $lonhost (sort(keys(%{$servers}))) { |
my $gotspares; |
my $gotspares; |
if (ref($settings->{'spares'}) eq 'HASH') { |
if (ref($settings) eq 'HASH') { |
if (ref($settings->{'spares'}{$lonhost}) eq 'HASH') { |
if (ref($settings->{'spares'}) eq 'HASH') { |
$spareid{$lonhost}{'primary'} = $settings->{'spares'}{$lonhost}{'primary'}; |
if (ref($settings->{'spares'}{$lonhost}) eq 'HASH') { |
$spareid{$lonhost}{'default'} = $settings->{'spares'}{$lonhost}{'default'}; |
$spareid{$lonhost}{'primary'} = $settings->{'spares'}{$lonhost}{'primary'}; |
$gotspares = 1; |
$spareid{$lonhost}{'default'} = $settings->{'spares'}{$lonhost}{'default'}; |
|
$gotspares = 1; |
|
} |
} |
} |
} |
} |
unless ($gotspares) { |
unless ($gotspares) { |
Line 2590 sub current_offloads_to {
|
Line 2705 sub current_offloads_to {
|
} |
} |
|
|
sub spares_row { |
sub spares_row { |
my ($servers,$spareid,$uniques,$rowtotal) = @_; |
my ($dom,$servers,$spareid,$serverhomes,$altids,$rowtotal) = @_; |
my $css_class; |
my $css_class; |
my $numinrow = 4; |
my $numinrow = 4; |
my $itemcount = 1; |
my $itemcount = 1; |
my $datatable; |
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}))) { |
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]','<b>'.$serverdom.'</b>'); |
|
} else { |
|
$serverdom = &Apache::lonnet::host_domain($server); |
|
if ($serverdom ne $dom) { |
|
$othercontrol = &mt('Session offloading controlled by domain: [_1]','<b>'.$serverdom.'</b>'); |
|
} |
|
} |
|
next unless (ref($spareid->{$server}) eq 'HASH'); |
$css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; |
$css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; |
$datatable .= '<tr'.$css_class.'> |
$datatable .= '<tr'.$css_class.'> |
<td rowspan="2"> |
<td rowspan="2"> |
<span class="LC_nobreak"><b>'.$server.'</b> when busy, offloads to:</span></td>'; |
<span class="LC_nobreak"><b>'.$server.'</b> when busy, offloads to:</span></td>'."\n"; |
my (%current,%canselect); |
my (%current,%canselect); |
if (ref($spareid->{$server}) eq 'HASH') { |
my @choices = |
foreach my $type ('primary','default') { |
&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') { |
if (ref($spareid->{$server}{$type}) eq 'ARRAY') { |
my @spares = @{$spareid->{$server}{$type}}; |
my @spares = @{$spareid->{$server}{$type}}; |
if (@spares > 0) { |
if (@spares > 0) { |
$current{$type} .= '<table>'; |
if ($othercontrol) { |
for (my $i=0; $i<@spares; $i++) { |
$current{$type} = join(', ',@spares); |
my $rem = $i%($numinrow); |
} else { |
if ($rem == 0) { |
$current{$type} .= '<table>'; |
if ($i > 0) { |
my $numspares = scalar(@spares); |
$current{$type} .= '</tr>'; |
for (my $i=0; $i<@spares; $i++) { |
|
my $rem = $i%($numinrow); |
|
if ($rem == 0) { |
|
if ($i > 0) { |
|
$current{$type} .= '</tr>'; |
|
} |
|
$current{$type} .= '<tr>'; |
} |
} |
$current{$type} .= '<tr>'; |
$current{$type} .= '<td><label><input type="checkbox" name="spare_'.$type.'_'.$server.'" id="spare_'.$type.'_'.$server.'_'.$i.'" checked="checked" value="'.$spareid->{$server}{$type}[$i].'" onclick="updateNewSpares(this.form,'."'$server'".');" /> '. |
|
$spareid->{$server}{$type}[$i]. |
|
'</label></td>'."\n"; |
|
} |
|
my $rem = @spares%($numinrow); |
|
my $colsleft = $numinrow - $rem; |
|
if ($colsleft > 1 ) { |
|
$current{$type} .= '<td colspan="'.$colsleft. |
|
'" class="LC_left_item">'. |
|
' </td>'; |
|
} elsif ($colsleft == 1) { |
|
$current{$type} .= '<td class="LC_left_item"> </td>'."\n"; |
} |
} |
$current{$type} .= '<td><label><input type="checkbox" name="spare_'.$type.'_'.$server.'" checked="checked" value="'.$spareid->{$server}{$type}[$i].'" /> '. |
$current{$type} .= '</tr></table>'; |
$spareid->{$server}{$type}[$i]. |
|
'</label></td>'; |
|
} |
|
my $rem = @spares%($numinrow); |
|
my $colsleft = $numinrow - $rem; |
|
if ($colsleft > 1 ) { |
|
$current{$type} .= '<td colspan="'.$colsleft. |
|
'" class="LC_left_item">'. |
|
' </td>'; |
|
} elsif ($colsleft == 1) { |
|
$current{$type} .= '<td class="LC_left_item"> </td>'; |
|
} |
} |
} |
} |
$current{$type} .= '</tr></table>'; |
|
} |
} |
if ($current{$type} eq '') { |
if ($current{$type} eq '') { |
$current{$type} = &mt('None specified'); |
$current{$type} = &mt('None specified'); |
} |
} |
$canselect{$type} = |
if ($othercontrol) { |
&newspare_select($server,$type,$spareid->{$server}{$type},$uniques); |
if ($type eq 'primary') { |
|
$canselect{$type} = $othercontrol; |
|
} |
|
} else { |
|
$canselect{$type} = |
|
&mt('Add new [_1]'.$type.'[_2]:','<i>','</i>').' '. |
|
'<select name="newspare_'.$type.'_'.$server.'" '. |
|
'id="newspare_'.$type.'_'.$server.'" onchange="checkNewSpares('."'$server','$type'".');">'."\n". |
|
'<option value="" selected ="selected">'.&mt('Select').'</option>'."\n"; |
|
if (@choices > 0) { |
|
foreach my $lonhost (@choices) { |
|
$canselect{$type} .= '<option value="'.$lonhost.'">'.$lonhost.'</option>'."\n"; |
|
} |
|
} |
|
$canselect{$type} .= '</select>'."\n"; |
|
} |
|
} else { |
|
$current{$type} = &mt('Could not be determined'); |
|
if ($type eq 'primary') { |
|
$canselect{$type} = $othercontrol; |
|
} |
} |
} |
|
if ($type eq 'default') { |
|
$datatable .= '<tr'.$css_class.'>'; |
|
} |
|
$datatable .= '<td><i>'.$typetitles{$type}.'</i></td>'."\n". |
|
'<td>'.$current{$type}.'</td>'."\n". |
|
'<td>'.$canselect{$type}.'</td></tr>'."\n"; |
} |
} |
$datatable .= '<td><i>'.&mt('primary').'</i><td>'.$current{'primary'}.'</td>'. |
|
'<td>'.&mt('Add new [_1]primary[_2]:','<i>','</i>').' '. |
|
$canselect{'primary'}.'</td></tr>'. |
|
'<tr'.$css_class.'>'. |
|
'<td><i>'.&mt('default').'</i></td>'. |
|
'<td>'.$current{'default'}.'</td>'. |
|
'<td>'.&mt('Add new [_1]default[_2]:','<i>','</i>').' '. |
|
$canselect{'default'}.'</td></tr>'; |
|
$itemcount ++; |
$itemcount ++; |
} |
} |
} |
} |
Line 2654 sub spares_row {
|
Line 2807 sub spares_row {
|
return $datatable; |
return $datatable; |
} |
} |
|
|
sub newspare_select { |
sub possible_newspares { |
my ($server,$type,$currspares,$uniques) = @_; |
my ($server,$currspares,$serverhomes,$altids) = @_; |
my $output; |
my $serverhostname = &Apache::lonnet::hostname($server); |
if (ref($uniques) eq 'HASH') { |
my %excluded; |
if (keys(%{$uniques}) > 1) { |
if ($serverhostname ne '') { |
$output = '<select name="newspare_'.$type.'_'.$server.'">'."\n". |
%excluded = ( |
'<option value="" selected ="selected">'.&mt('Select').'</option>'."\n"; |
$serverhostname => 1, |
foreach my $lonhost (sort(keys(%{$uniques}))) { |
); |
next if ($lonhost eq $server); |
} |
if (ref($currspares) eq 'ARRAY') { |
if (ref($currspares) eq 'HASH') { |
if (@{$currspares} > 0) { |
foreach my $type (keys(%{$currspares})) { |
next if (grep(/^\Q$lonhost\E$/,@{$currspares})); |
if (ref($currspares->{$type}) eq 'ARRAY') { |
|
if (@{$currspares->{$type}} > 0) { |
|
foreach my $curr (@{$currspares->{$type}}) { |
|
my $hostname = &Apache::lonnet::hostname($curr); |
|
$excluded{$hostname} = 1; |
} |
} |
} |
} |
$output .= '<option value="'.$lonhost.'">'.$lonhost.'</option>'."\n"; |
|
} |
} |
$output .= '<select>'; |
|
} |
} |
} |
} |
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 { |
sub print_loadbalancing { |
Line 2702 sub print_loadbalancing {
|
Line 2871 sub print_loadbalancing {
|
if (ref($types) eq 'ARRAY') { |
if (ref($types) eq 'ARRAY') { |
$rownum += scalar(@{$types}); |
$rownum += scalar(@{$types}); |
} |
} |
my $css_class = 'class="LC_odd_row"'; |
my $css_class = ' class="LC_odd_row"'; |
my $targets_div_style = 'display: none'; |
my $targets_div_style = 'display: none'; |
my $disabled_div_style = 'display: block'; |
my $disabled_div_style = 'display: block'; |
my $homedom_div_style = 'display: none'; |
my $homedom_div_style = 'display: none'; |
Line 2775 sub print_loadbalancing {
|
Line 2944 sub print_loadbalancing {
|
$datatable .= '</div></td></tr>'. |
$datatable .= '</div></td></tr>'. |
&loadbalancing_rules($dom,$intdom,$currrules,$othertitle, |
&loadbalancing_rules($dom,$intdom,$currrules,$othertitle, |
$usertypes,$types,\%servers,$currbalancer, |
$usertypes,$types,\%servers,$currbalancer, |
$targets_div_style,$homedom_div_style); |
$targets_div_style,$homedom_div_style,$css_class); |
$$rowtotal += $rownum; |
$$rowtotal += $rownum; |
return $datatable; |
return $datatable; |
} |
} |
|
|
sub loadbalancing_rules { |
sub loadbalancing_rules { |
my ($dom,$intdom,$currrules,$othertitle,$usertypes,$types,$servers, |
my ($dom,$intdom,$currrules,$othertitle,$usertypes,$types,$servers, |
$currbalancer,$targets_div_style,$homedom_div_style) = @_; |
$currbalancer,$targets_div_style,$homedom_div_style,$css_class) = @_; |
my $output; |
my $output; |
my ($alltypes,$othertypes,$titles) = |
my ($alltypes,$othertypes,$titles) = |
&loadbalancing_titles($dom,$intdom,$usertypes,$types); |
&loadbalancing_titles($dom,$intdom,$usertypes,$types); |
Line 2799 sub loadbalancing_rules {
|
Line 2968 sub loadbalancing_rules {
|
} |
} |
$output .= &loadbalance_rule_row($type,$titles->{$type},$current, |
$output .= &loadbalance_rule_row($type,$titles->{$type},$current, |
$servers,$currbalancer,$dom, |
$servers,$currbalancer,$dom, |
$targets_div_style,$homedom_div_style); |
$targets_div_style,$homedom_div_style,$css_class); |
} |
} |
} |
} |
return $output; |
return $output; |
Line 2837 sub loadbalancing_titles {
|
Line 3006 sub loadbalancing_titles {
|
|
|
sub loadbalance_rule_row { |
sub loadbalance_rule_row { |
my ($type,$title,$current,$servers,$currbalancer,$dom,$targets_div_style, |
my ($type,$title,$current,$servers,$currbalancer,$dom,$targets_div_style, |
$homedom_div_style) = @_; |
$homedom_div_style,$css_class) = @_; |
my @rulenames = ('default','homeserver'); |
my @rulenames = ('default','homeserver'); |
my %ruletitles = &offloadtype_text(); |
my %ruletitles = &offloadtype_text(); |
if ($type eq '_LC_external') { |
if ($type eq '_LC_external') { |
Line 2845 sub loadbalance_rule_row {
|
Line 3014 sub loadbalance_rule_row {
|
} else { |
} else { |
push(@rulenames,'specific'); |
push(@rulenames,'specific'); |
} |
} |
|
push(@rulenames,'none'); |
my $style = $targets_div_style; |
my $style = $targets_div_style; |
if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) { |
if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) { |
$style = $homedom_div_style; |
$style = $homedom_div_style; |
} |
} |
my $output = |
my $output = |
'<tr><td valign="top"><div id="balanceruletitle_'.$type.'" style="'.$style.'">'.$title.'</div></td>'."\n". |
'<tr'.$css_class.'><td valign="top"><div id="balanceruletitle_'.$type.'" style="'.$style.'">'.$title.'</div></td>'."\n". |
'<td><div id="balancerule_'.$type.'" style="'.$style.'">'."\n"; |
'<td><div id="balancerule_'.$type.'" style="'.$style.'">'."\n"; |
for (my $i=0; $i<@rulenames; $i++) { |
for (my $i=0; $i<@rulenames; $i++) { |
my $rule = $rulenames[$i]; |
my $rule = $rulenames[$i]; |
Line 2901 sub offloadtype_text {
|
Line 3071 sub offloadtype_text {
|
'homeserver' => "Offloads to user's home server", |
'homeserver' => "Offloads to user's home server", |
'externalbalancer' => "Offloads to Load Balancer in user's domain", |
'externalbalancer' => "Offloads to Load Balancer in user's domain", |
'specific' => 'Offloads to specific server', |
'specific' => 'Offloads to specific server', |
|
'none' => 'No offload', |
); |
); |
return %ruletitles; |
return %ruletitles; |
} |
} |
Line 2932 sub contact_titles {
|
Line 3103 sub contact_titles {
|
|
|
sub tool_titles { |
sub tool_titles { |
my %titles = &Apache::lonlocal::texthash ( |
my %titles = &Apache::lonlocal::texthash ( |
aboutme => 'Personal Information Page', |
aboutme => 'Personal web page', |
blog => 'Blog', |
blog => 'Blog', |
|
webdav => 'WebDAV', |
portfolio => 'Portfolio', |
portfolio => 'Portfolio', |
official => 'Official courses (with institutional codes)', |
official => 'Official courses (with institutional codes)', |
unofficial => 'Unofficial courses', |
unofficial => 'Unofficial courses', |
Line 2956 sub courserequest_titles {
|
Line 3128 sub courserequest_titles {
|
return %titles; |
return %titles; |
} |
} |
|
|
|
sub authorrequest_titles { |
|
my %titles = &Apache::lonlocal::texthash ( |
|
norequest => 'Not allowed', |
|
approval => 'Approval by Dom. Coord.', |
|
automatic => 'Automatic approval', |
|
); |
|
return %titles; |
|
} |
|
|
sub courserequest_conditions { |
sub courserequest_conditions { |
my %conditions = &Apache::lonlocal::texthash ( |
my %conditions = &Apache::lonlocal::texthash ( |
approval => '(Processing of request subject to approval by Domain Coordinator).', |
approval => '(Processing of request subject to approval by Domain Coordinator).', |
Line 3798 sub print_serverstatuses {
|
Line 3979 sub print_serverstatuses {
|
sub serverstatus_pages { |
sub serverstatus_pages { |
return ('userstatus','lonstatus','loncron','server-status','codeversions', |
return ('userstatus','lonstatus','loncron','server-status','codeversions', |
'clusterstatus','metadata_keywords','metadata_harvest', |
'clusterstatus','metadata_keywords','metadata_harvest', |
'takeoffline','takeonline','showenv','toggledebug'); |
'takeoffline','takeonline','showenv','toggledebug','ping','domconf'); |
} |
} |
|
|
sub coursecategories_javascript { |
sub coursecategories_javascript { |
Line 4866 sub publishlogo {
|
Line 5047 sub publishlogo {
|
# See if there is anything left |
# See if there is anything left |
unless ($fname) { return ('error: no uploaded file'); } |
unless ($fname) { return ('error: no uploaded file'); } |
$fname="$subdir/$fname"; |
$fname="$subdir/$fname"; |
my $filepath='/home/'.$confname.'/public_html'; |
my $filepath=$r->dir_config('lonDocRoot')."/priv/$dom/$confname"; |
my ($fnamepath,$file,$fetchthumb); |
my ($fnamepath,$file,$fetchthumb); |
$file=$fname; |
$file=$fname; |
if ($fname=~m|/|) { |
if ($fname=~m|/|) { |
Line 4944 $env{'user.name'}.':'.$env{'user.domain'
|
Line 5125 $env{'user.name'}.':'.$env{'user.domain'
|
if (copy($source,$copyfile)) { |
if (copy($source,$copyfile)) { |
print $logfile "\nCopied original source to ".$copyfile."\n"; |
print $logfile "\nCopied original source to ".$copyfile."\n"; |
$output = 'ok'; |
$output = 'ok'; |
&write_metadata($dom,$confname,$formname,$targetdir,$file,$logfile); |
|
$logourl = '/res/'.$dom.'/'.$confname.'/'.$fname; |
$logourl = '/res/'.$dom.'/'.$confname.'/'.$fname; |
|
push(@{$modified_urls},[$copyfile,$source]); |
|
my $metaoutput = |
|
&write_metadata($dom,$confname,$formname,$targetdir,$file,$logfile); |
|
unless ($registered_cleanup) { |
|
my $handlers = $r->get_handlers('PerlCleanupHandler'); |
|
$r->set_handlers('PerlCleanupHandler' => [\¬ifysubscribed,@{$handlers}]); |
|
$registered_cleanup=1; |
|
} |
} else { |
} else { |
print $logfile "\nUnable to write ".$copyfile.':'.$!."\n"; |
print $logfile "\nUnable to write ".$copyfile.':'.$!."\n"; |
$output = &mt('Failed to copy file to RES space').", $!"; |
$output = &mt('Failed to copy file to RES space').", $!"; |
Line 4963 $env{'user.name'}.':'.$env{'user.domain'
|
Line 5151 $env{'user.name'}.':'.$env{'user.domain'
|
my $copyfile=$targetdir.'/tn-'.$file; |
my $copyfile=$targetdir.'/tn-'.$file; |
if (copy($outfile,$copyfile)) { |
if (copy($outfile,$copyfile)) { |
print $logfile "\nCopied source to ".$copyfile."\n"; |
print $logfile "\nCopied source to ".$copyfile."\n"; |
&write_metadata($dom,$confname,$formname, |
my $thumb_metaoutput = |
$targetdir,'tn-'.$file,$logfile); |
&write_metadata($dom,$confname,$formname, |
|
$targetdir,'tn-'.$file,$logfile); |
|
push(@{$modified_urls},[$copyfile,$outfile]); |
|
unless ($registered_cleanup) { |
|
my $handlers = $r->get_handlers('PerlCleanupHandler'); |
|
$r->set_handlers('PerlCleanupHandler' => [\¬ifysubscribed,@{$handlers}]); |
|
$registered_cleanup=1; |
|
} |
} else { |
} else { |
print $logfile "\nUnable to write ".$copyfile. |
print $logfile "\nUnable to write ".$copyfile. |
':'.$!."\n"; |
':'.$!."\n"; |
Line 5029 sub write_metadata {
|
Line 5224 sub write_metadata {
|
{ |
{ |
print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file; |
print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file; |
my $mfh; |
my $mfh; |
unless (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) { |
if (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) { |
|
foreach (sort keys %metadatafields) { |
|
unless ($_=~/\./) { |
|
my $unikey=$_; |
|
$unikey=~/^([A-Za-z]+)/; |
|
my $tag=$1; |
|
$tag=~tr/A-Z/a-z/; |
|
print $mfh "\n\<$tag"; |
|
foreach (split(/\,/,$metadatakeys{$unikey})) { |
|
my $value=$metadatafields{$unikey.'.'.$_}; |
|
$value=~s/\"/\'\'/g; |
|
print $mfh ' '.$_.'="'.$value.'"'; |
|
} |
|
print $mfh '>'. |
|
&HTML::Entities::encode($metadatafields{$unikey},'<>&"') |
|
.'</'.$tag.'>'; |
|
} |
|
} |
|
$output = 'ok'; |
|
print $logfile "\nWrote metadata"; |
|
close($mfh); |
|
} else { |
|
print $logfile "\nFailed to open metadata file"; |
$output = &mt('Could not write metadata'); |
$output = &mt('Could not write metadata'); |
} |
} |
foreach (sort keys %metadatafields) { |
|
unless ($_=~/\./) { |
|
my $unikey=$_; |
|
$unikey=~/^([A-Za-z]+)/; |
|
my $tag=$1; |
|
$tag=~tr/A-Z/a-z/; |
|
print $mfh "\n\<$tag"; |
|
foreach (split(/\,/,$metadatakeys{$unikey})) { |
|
my $value=$metadatafields{$unikey.'.'.$_}; |
|
$value=~s/\"/\'\'/g; |
|
print $mfh ' '.$_.'="'.$value.'"'; |
|
} |
|
print $mfh '>'. |
|
&HTML::Entities::encode($metadatafields{$unikey},'<>&"') |
|
.'</'.$tag.'>'; |
|
} |
|
} |
|
$output = 'ok'; |
|
print $logfile "\nWrote metadata"; |
|
close($mfh); |
|
} |
} |
|
return $output; |
|
} |
|
|
|
sub notifysubscribed { |
|
foreach my $targetsource (@{$modified_urls}){ |
|
next unless (ref($targetsource) eq 'ARRAY'); |
|
my ($target,$source)=@{$targetsource}; |
|
if ($source ne '') { |
|
if (open(my $logfh,'>>'.$source.'.log')) { |
|
print $logfh "\nCleanup phase: Notifications\n"; |
|
my @subscribed=&subscribed_hosts($target); |
|
foreach my $subhost (@subscribed) { |
|
print $logfh "\nNotifying host ".$subhost.':'; |
|
my $reply=&Apache::lonnet::critical('update:'.$target,$subhost); |
|
print $logfh $reply; |
|
} |
|
my @subscribedmeta=&subscribed_hosts("$target.meta"); |
|
foreach my $subhost (@subscribedmeta) { |
|
print $logfh "\nNotifying host for metadata only ".$subhost.':'; |
|
my $reply=&Apache::lonnet::critical('update:'.$target.'.meta', |
|
$subhost); |
|
print $logfh $reply; |
|
} |
|
print $logfh "\n============ Done ============\n"; |
|
close($logfh); |
|
} |
|
} |
|
} |
|
return OK; |
|
} |
|
|
|
sub subscribed_hosts { |
|
my ($target) = @_; |
|
my @subscribed; |
|
if (open(my $fh,"<$target.subscription")) { |
|
while (my $subline=<$fh>) { |
|
if ($subline =~ /^($match_lonid):/) { |
|
my $host = $1; |
|
if ($host ne $Apache::lonnet::perlvar{'lonHostID'}) { |
|
unless (grep(/^\Q$host\E$/,@subscribed)) { |
|
push(@subscribed,$host); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return @subscribed; |
} |
} |
|
|
sub check_switchserver { |
sub check_switchserver { |
Line 5076 sub modify_quotas {
|
Line 5320 sub modify_quotas {
|
%limithash,$toolregexp,%conditions,$resulttext,%changes); |
%limithash,$toolregexp,%conditions,$resulttext,%changes); |
if ($action eq 'quotas') { |
if ($action eq 'quotas') { |
$context = 'tools'; |
$context = 'tools'; |
} else { |
} else { |
$context = $action; |
$context = $action; |
} |
} |
if ($context eq 'requestcourses') { |
if ($context eq 'requestcourses') { |
Line 5086 sub modify_quotas {
|
Line 5330 sub modify_quotas {
|
%titles = &courserequest_titles(); |
%titles = &courserequest_titles(); |
$toolregexp = join('|',@usertools); |
$toolregexp = join('|',@usertools); |
%conditions = &courserequest_conditions(); |
%conditions = &courserequest_conditions(); |
|
} elsif ($context eq 'requestauthor') { |
|
@usertools = ('author'); |
|
%titles = &authorrequest_titles(); |
} else { |
} else { |
@usertools = ('aboutme','blog','portfolio'); |
@usertools = ('aboutme','blog','webdav','portfolio'); |
%titles = &tool_titles(); |
%titles = &tool_titles(); |
} |
} |
my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); |
my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); |
Line 5103 sub modify_quotas {
|
Line 5350 sub modify_quotas {
|
$confhash{$item}{$type} = $env{$key}; |
$confhash{$item}{$type} = $env{$key}; |
} |
} |
} |
} |
|
} elsif ($context eq 'requestauthor') { |
|
if ($key =~ /^\Qform.authorreq_\E(.+)$/) { |
|
$confhash{$1} = $env{$key}; |
|
} |
} else { |
} else { |
if ($key =~ /^form\.quota_(.+)$/) { |
if ($key =~ /^form\.quota_(.+)$/) { |
$confhash{'defaultquota'}{$1} = $env{$key}; |
$confhash{'defaultquota'}{$1} = $env{$key}; |
Line 5112 sub modify_quotas {
|
Line 5363 sub modify_quotas {
|
} |
} |
} |
} |
} |
} |
if ($context eq 'requestcourses') { |
if (($context eq 'requestcourses') || ($context eq 'requestauthor')) { |
my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify'); |
my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify'); |
@approvalnotify = sort(@approvalnotify); |
@approvalnotify = sort(@approvalnotify); |
$confhash{'notify'}{'approval'} = join(',',@approvalnotify); |
$confhash{'notify'}{'approval'} = join(',',@approvalnotify); |
Line 5148 sub modify_quotas {
|
Line 5399 sub modify_quotas {
|
$confhash{$item}{$type} .= $limithash{$item}{$type}; |
$confhash{$item}{$type} .= $limithash{$item}{$type}; |
} |
} |
} |
} |
|
} elsif ($context eq 'requestauthor') { |
|
$unset = '0'; |
|
if ($type eq '_LC_adv') { |
|
$unset = ''; |
|
} |
} else { |
} else { |
if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) { |
if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) { |
$confhash{$item}{$type} = 1; |
$confhash{$item}{$type} = 1; |
Line 5156 sub modify_quotas {
|
Line 5412 sub modify_quotas {
|
} |
} |
} |
} |
if (ref($domconfig{$action}) eq 'HASH') { |
if (ref($domconfig{$action}) eq 'HASH') { |
if (ref($domconfig{$action}{$item}) eq 'HASH') { |
if ($action eq 'requestauthor') { |
|
if ($domconfig{$action}{$type} ne $confhash{$type}) { |
|
$changes{$type} = 1; |
|
} |
|
} elsif (ref($domconfig{$action}{$item}) eq 'HASH') { |
if ($domconfig{$action}{$item}{$type} ne $confhash{$item}{$type}) { |
if ($domconfig{$action}{$item}{$type} ne $confhash{$item}{$type}) { |
$changes{$item}{$type} = 1; |
$changes{$item}{$type} = 1; |
} |
} |
Line 5176 sub modify_quotas {
|
Line 5436 sub modify_quotas {
|
if ($confhash{$item}{$type} ne $unset) { |
if ($confhash{$item}{$type} ne $unset) { |
$changes{$item}{$type} = 1; |
$changes{$item}{$type} = 1; |
} |
} |
|
} elsif ($context eq 'requestauthor') { |
|
if ($confhash{$type} ne $unset) { |
|
$changes{$type} = 1; |
|
} |
} else { |
} else { |
if (!$confhash{$item}{$type}) { |
if (!$confhash{$item}{$type}) { |
$changes{$item}{$type} = 1; |
$changes{$item}{$type} = 1; |
Line 5184 sub modify_quotas {
|
Line 5448 sub modify_quotas {
|
} |
} |
} |
} |
} |
} |
unless ($context eq 'requestcourses') { |
unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) { |
if (ref($domconfig{'quotas'}) eq 'HASH') { |
if (ref($domconfig{'quotas'}) eq 'HASH') { |
if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') { |
if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') { |
foreach my $key (keys(%{$domconfig{'quotas'}{'defaultquota'}})) { |
foreach my $key (keys(%{$domconfig{'quotas'}{'defaultquota'}})) { |
Line 5227 sub modify_quotas {
|
Line 5491 sub modify_quotas {
|
} |
} |
} |
} |
|
|
foreach my $key (keys(%confhash)) { |
if ($context eq 'requestauthor') { |
$domdefaults{$key} = $confhash{$key}; |
$domdefaults{'requestauthor'} = \%confhash; |
|
} else { |
|
foreach my $key (keys(%confhash)) { |
|
$domdefaults{$key} = $confhash{$key}; |
|
} |
} |
} |
|
|
my %quotahash = ( |
my %quotahash = ( |
$action => { %confhash } |
$action => { %confhash } |
); |
); |
Line 5242 sub modify_quotas {
|
Line 5510 sub modify_quotas {
|
&Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime); |
&Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime); |
|
|
$resulttext = &mt('Changes made:').'<ul>'; |
$resulttext = &mt('Changes made:').'<ul>'; |
unless ($context eq 'requestcourses') { |
unless (($context eq 'requestcourses') || |
|
($context eq 'requestauthor')) { |
if (ref($changes{'defaultquota'}) eq 'HASH') { |
if (ref($changes{'defaultquota'}) eq 'HASH') { |
$resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>'; |
$resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>'; |
foreach my $type (@{$types},'default') { |
foreach my $type (@{$types},'default') { |
Line 5259 sub modify_quotas {
|
Line 5528 sub modify_quotas {
|
} |
} |
my %newenv; |
my %newenv; |
foreach my $item (@usertools) { |
foreach my $item (@usertools) { |
if (ref($changes{$item}) eq 'HASH') { |
my (%haschgs,%inconf); |
|
if ($context eq 'requestauthor') { |
|
%haschgs = %changes; |
|
%inconf = %confhash; |
|
} else { |
|
if (ref($changes{$item}) eq 'HASH') { |
|
%haschgs = %{$changes{$item}}; |
|
} |
|
if (ref($confhash{$item}) eq 'HASH') { |
|
%inconf = %{$confhash{$item}}; |
|
} |
|
} |
|
if (keys(%haschgs) > 0) { |
my $newacc = |
my $newacc = |
&Apache::lonnet::usertools_access($env{'user.name'}, |
&Apache::lonnet::usertools_access($env{'user.name'}, |
$env{'user.domain'}, |
$env{'user.domain'}, |
$item,'reload',$context); |
$item,'reload',$context); |
if ($context eq 'requestcourses') { |
if (($context eq 'requestcourses') || |
|
($context eq 'requestauthor')) { |
if ($env{'environment.canrequest.'.$item} ne $newacc) { |
if ($env{'environment.canrequest.'.$item} ne $newacc) { |
$newenv{'environment.canrequest.'.$item} = $newacc; |
$newenv{'environment.canrequest.'.$item} = $newacc; |
} |
} |
Line 5273 sub modify_quotas {
|
Line 5555 sub modify_quotas {
|
$newenv{'environment.availabletools.'.$item} = $newacc; |
$newenv{'environment.availabletools.'.$item} = $newacc; |
} |
} |
} |
} |
$resulttext .= '<li>'.$titles{$item}.'<ul>'; |
unless ($context eq 'requestauthor') { |
|
$resulttext .= '<li>'.$titles{$item}.'<ul>'; |
|
} |
foreach my $type (@{$types},'default','_LC_adv') { |
foreach my $type (@{$types},'default','_LC_adv') { |
if ($changes{$item}{$type}) { |
if ($haschgs{$type}) { |
my $typetitle = $usertypes->{$type}; |
my $typetitle = $usertypes->{$type}; |
if ($type eq 'default') { |
if ($type eq 'default') { |
$typetitle = $othertitle; |
$typetitle = $othertitle; |
} elsif ($type eq '_LC_adv') { |
} elsif ($type eq '_LC_adv') { |
$typetitle = 'LON-CAPA Advanced Users'; |
$typetitle = 'LON-CAPA Advanced Users'; |
} |
} |
if ($confhash{$item}{$type}) { |
if ($inconf{$type}) { |
if ($context eq 'requestcourses') { |
if ($context eq 'requestcourses') { |
my $cond; |
my $cond; |
if ($confhash{$item}{$type} =~ /^autolimit=(\d*)$/) { |
if ($inconf{$type} =~ /^autolimit=(\d*)$/) { |
if ($1 eq '') { |
if ($1 eq '') { |
$cond = &mt('(Automatic processing of any request).'); |
$cond = &mt('(Automatic processing of any request).'); |
} else { |
} else { |
$cond = &mt('(Automatic processing of requests up to limit of [quant,_1,request] per user).',$1); |
$cond = &mt('(Automatic processing of requests up to limit of [quant,_1,request] per user).',$1); |
} |
} |
} else { |
} else { |
$cond = $conditions{$confhash{$item}{$type}}; |
$cond = $conditions{$inconf{$type}}; |
} |
} |
$resulttext .= '<li>'.&mt('Set to be available to [_1].',$typetitle).' '.$cond.'</li>'; |
$resulttext .= '<li>'.&mt('Set to be available to [_1].',$typetitle).' '.$cond.'</li>'; |
} else { |
} else { |
Line 5300 sub modify_quotas {
|
Line 5584 sub modify_quotas {
|
} |
} |
} else { |
} else { |
if ($type eq '_LC_adv') { |
if ($type eq '_LC_adv') { |
if ($confhash{$item}{$type} eq '0') { |
if ($inconf{$type} eq '0') { |
$resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>'; |
$resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>'; |
} else { |
} else { |
$resulttext .= '<li>'.&mt('No override set for [_1]',$typetitle).'</li>'; |
$resulttext .= '<li>'.&mt('No override set for [_1]',$typetitle).'</li>'; |
Line 5311 sub modify_quotas {
|
Line 5595 sub modify_quotas {
|
} |
} |
} |
} |
} |
} |
$resulttext .= '</ul></li>'; |
unless ($context eq 'requestauthor') { |
|
$resulttext .= '</ul></li>'; |
|
} |
} |
} |
} |
} |
if ($action eq 'requestcourses') { |
if (($action eq 'requestcourses') || ($action eq 'requestauthor')) { |
if (ref($changes{'notify'}) eq 'HASH') { |
if (ref($changes{'notify'}) eq 'HASH') { |
if ($changes{'notify'}{'approval'}) { |
if ($changes{'notify'}{'approval'}) { |
if (ref($confhash{'notify'}) eq 'HASH') { |
if (ref($confhash{'notify'}) eq 'HASH') { |
if ($confhash{'notify'}{'approval'}) { |
if ($confhash{'notify'}{'approval'}) { |
$resulttext .= '<li>'.&mt('Notification of requests requiring approval will be sent to: ').$confhash{'notify'}{'approval'}.'</li>'; |
$resulttext .= '<li>'.&mt('Notification of requests requiring approval will be sent to: ').$confhash{'notify'}{'approval'}.'</li>'; |
} else { |
} else { |
$resulttext .= '<li>'.&mt('No Domain Coordinators will receive notification of course requests requiring approval.').'</li>'; |
$resulttext .= '<li>'.&mt('No Domain Coordinators will receive notification of requests requiring approval.').'</li>'; |
} |
} |
} |
} |
} |
} |
Line 5334 sub modify_quotas {
|
Line 5620 sub modify_quotas {
|
} else { |
} else { |
if ($context eq 'requestcourses') { |
if ($context eq 'requestcourses') { |
$resulttext = &mt('No changes made to rights to request creation of courses.'); |
$resulttext = &mt('No changes made to rights to request creation of courses.'); |
|
} elsif ($context eq 'requestauthor') { |
|
$resulttext = &mt('No changes made to rights to request author space.'); |
} else { |
} else { |
$resulttext = &mt('No changes made to availability of personal information pages, blogs, portfolios or default quotas'); |
$resulttext = &mt('No changes made to availability of personal information pages, blogs, portfolios or default quotas'); |
} |
} |
Line 7342 sub modify_usersessions {
|
Line 7630 sub modify_usersessions {
|
} |
} |
|
|
my @alldoms = &Apache::lonnet::all_domains(); |
my @alldoms = &Apache::lonnet::all_domains(); |
my %uniques = &Apache::lonnet::get_unique_servers(\@alldoms); |
|
my %servers = &Apache::lonnet::internet_dom_servers($dom); |
my %servers = &Apache::lonnet::internet_dom_servers($dom); |
my %spareid = ¤t_offloads_to($dom,$domconfig{'usersessions'},\%servers); |
my %spareid = ¤t_offloads_to($dom,$domconfig{'usersessions'},\%servers); |
my $savespares; |
my $savespares; |
Line 7350 sub modify_usersessions {
|
Line 7637 sub modify_usersessions {
|
foreach my $lonhost (sort(keys(%servers))) { |
foreach my $lonhost (sort(keys(%servers))) { |
my $serverhomeID = |
my $serverhomeID = |
&Apache::lonnet::get_server_homeID($servers{$lonhost}); |
&Apache::lonnet::get_server_homeID($servers{$lonhost}); |
|
my $serverhostname = &Apache::lonnet::hostname($lonhost); |
$defaultshash{'usersessions'}{'spares'}{$lonhost} = {}; |
$defaultshash{'usersessions'}{'spares'}{$lonhost} = {}; |
my %spareschg; |
my %spareschg; |
foreach my $type (@{$types{'spares'}}) { |
foreach my $type (@{$types{'spares'}}) { |
my @okspares; |
my @okspares; |
my @checked = &Apache::loncommon::get_env_multiple('form.spare_'.$type.'_'.$lonhost); |
my @checked = &Apache::loncommon::get_env_multiple('form.spare_'.$type.'_'.$lonhost); |
foreach my $server (@checked) { |
foreach my $server (@checked) { |
unless (($server eq $lonhost) || ($server eq $serverhomeID)) { |
if (&Apache::lonnet::hostname($server) ne '') { |
if ($uniques{$server}) { |
unless (&Apache::lonnet::hostname($server) eq $serverhostname) { |
push(@okspares,$server); |
unless (grep(/^\Q$server\E$/,@okspares)) { |
|
push(@okspares,$server); |
|
} |
} |
} |
} |
} |
} |
} |
my $new = $env{'form.newspare_'.$type.'_'.$lonhost}; |
my $new = $env{'form.newspare_'.$type.'_'.$lonhost}; |
my $newspare; |
my $newspare; |
if (($new ne '') && ($uniques{$new})) { |
if (($new ne '') && (&Apache::lonnet::hostname($new))) { |
unless (($new eq $lonhost) || ($new eq $serverhomeID)) { |
unless (&Apache::lonnet::hostname($new) eq $serverhostname) { |
$newspare = $new; |
$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; |
my @spares; |
Line 7387 sub modify_usersessions {
|
Line 7666 sub modify_usersessions {
|
@spares = sort(@okspares); |
@spares = sort(@okspares); |
} |
} |
$defaultshash{'usersessions'}{'spares'}{$lonhost}{$type} = \@spares; |
$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) { |
if (keys(%spareschg) > 0) { |
$changes{'spares'}{$lonhost} = \%spareschg; |
$changes{'spares'}{$lonhost} = \%spareschg; |
Line 7802 sub active_dc_picker {
|
Line 8089 sub active_dc_picker {
|
sub usersession_titles { |
sub usersession_titles { |
return &Apache::lonlocal::texthash( |
return &Apache::lonlocal::texthash( |
hosted => 'Hosting of sessions for users from other domains on servers in this domain', |
hosted => 'Hosting of sessions for users from other domains on servers in this domain', |
|
|
remote => 'Hosting of sessions for users in this domain on servers in other domains', |
remote => 'Hosting of sessions for users in this domain on servers in other domains', |
spares => 'Servers offloaded to, when busy', |
spares => 'Servers offloaded to, when busy', |
version => 'LON-CAPA version requirement', |
version => 'LON-CAPA version requirement', |
excludedomain => 'Allow all, but exclude specific domains', |
excludedomain => 'Allow all, but exclude specific domains', |
includedomain => 'Deny all, but include specific domains', |
includedomain => 'Deny all, but include specific domains', |
primary => 'Primary (checked first)', |
primary => 'Primary (checked first)', |
default => 'Default', |
default => 'Default', |
); |
); |
} |
} |
|
|
|
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 { |
sub count_servers { |
my ($currbalancer,%servers) = @_; |
my ($currbalancer,%servers) = @_; |
my (@spares,$numspares); |
my (@spares,$numspares); |
Line 7875 function showSpares(balancer,ishomedom)
|
Line 8173 function showSpares(balancer,ishomedom)
|
|
|
document.getElementById('loadbalancing_targets').style.display='block'; |
document.getElementById('loadbalancing_targets').style.display='block'; |
document.getElementById('loadbalancing_disabled').style.display='none'; |
document.getElementById('loadbalancing_disabled').style.display='none'; |
|
|
for (var i=0; i<offloadtypes.length; i++) { |
for (var i=0; i<offloadtypes.length; i++) { |
var count = 0; |
var count = 0; |
for (var j=0; j<alltargets.length; j++) { |
for (var j=0; j<alltargets.length; j++) { |
Line 7998 function balanceruleChange(formname,type
|
Line 8296 function balanceruleChange(formname,type
|
return; |
return; |
} |
} |
|
|
|
// ]]> |
|
</script> |
|
|
|
END |
|
} |
|
|
|
sub new_spares_js { |
|
my @sparestypes = ('primary','default'); |
|
my $types = join("','",@sparestypes); |
|
my $select = &mt('Select'); |
|
return <<"END"; |
|
|
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
|
|
function updateNewSpares(formname,lonhost) { |
|
var types = new Array('$types'); |
|
var include = new Array(); |
|
var exclude = new Array(); |
|
for (var i=0; i<types.length; i++) { |
|
var spareboxes = getIndicesByName(formname,'spare_'+types[i]+'_'+lonhost); |
|
for (var j=0; j<spareboxes.length; j++) { |
|
if (formname.elements[spareboxes[j]].checked) { |
|
exclude.push(formname.elements[spareboxes[j]].value); |
|
} else { |
|
include.push(formname.elements[spareboxes[j]].value); |
|
} |
|
} |
|
} |
|
for (var i=0; i<types.length; i++) { |
|
var newSpare = document.getElementById('newspare_'+types[i]+'_'+lonhost); |
|
var selIdx = newSpare.selectedIndex; |
|
var currnew = newSpare.options[selIdx].value; |
|
var okSpares = new Array(); |
|
for (var j=0; j<newSpare.options.length; j++) { |
|
var possible = newSpare.options[j].value; |
|
if (possible != '') { |
|
if (exclude.indexOf(possible) == -1) { |
|
okSpares.push(possible); |
|
} else { |
|
if (currnew == possible) { |
|
selIdx = 0; |
|
} |
|
} |
|
} |
|
} |
|
for (var k=0; k<include.length; k++) { |
|
if (okSpares.indexOf(include[k]) == -1) { |
|
okSpares.push(include[k]); |
|
} |
|
} |
|
okSpares.sort(); |
|
newSpare.options.length = 0; |
|
if (selIdx == 0) { |
|
newSpare.options[0] = new Option("$select","",true,true); |
|
} else { |
|
newSpare.options[0] = new Option("$select","",false,false); |
|
} |
|
for (var m=0; m<okSpares.length; m++) { |
|
var idx = m+1; |
|
var selThis = 0; |
|
if (selIdx != 0) { |
|
if (okSpares[m] == currnew) { |
|
selThis = 1; |
|
} |
|
} |
|
if (selThis == 1) { |
|
newSpare.options[idx] = new Option(okSpares[m],okSpares[m],true,true); |
|
} else { |
|
newSpare.options[idx] = new Option(okSpares[m],okSpares[m],false,false); |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
function checkNewSpares(lonhost,type) { |
|
var newSpare = document.getElementById('newspare_'+type+'_'+lonhost); |
|
var chosen = newSpare.options[newSpare.selectedIndex].value; |
|
if (chosen != '') { |
|
var othertype; |
|
var othernewSpare; |
|
if (type == 'primary') { |
|
othernewSpare = document.getElementById('newspare_default_'+lonhost); |
|
} |
|
if (type == 'default') { |
|
othernewSpare = document.getElementById('newspare_primary_'+lonhost); |
|
} |
|
if (othernewSpare.options[othernewSpare.selectedIndex].value == chosen) { |
|
othernewSpare.selectedIndex = 0; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
// ]]> |
|
</script> |
|
|
|
END |
|
|
|
} |
|
|
|
sub common_domprefs_js { |
|
return <<"END"; |
|
|
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
|
function getIndicesByName(formname,item) { |
function getIndicesByName(formname,item) { |
var radiogroup = new Array(); |
var group = new Array(); |
for (var i=0;i<formname.elements.length;i++) { |
for (var i=0;i<formname.elements.length;i++) { |
if (formname.elements[i].name == item) { |
if (formname.elements[i].name == item) { |
radiogroup.push(formname.elements[i].id); |
group.push(formname.elements[i].id); |
} |
} |
} |
} |
return radiogroup; |
return group; |
} |
} |
|
|
// ]]> |
// ]]> |
</script> |
</script> |
|
|
END |
END |
|
|
} |
} |
|
|
1; |
1; |