Diff for /loncom/interface/domainprefs.pm between versions 1.151 and 1.160.6.4

version 1.151, 2011/08/09 12:16:41 version 1.160.6.4, 2012/06/01 12:15:23
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 203  sub handler { Line 210  sub handler {
                 'quotas','autoenroll','autoupdate','autocreate',                  'quotas','autoenroll','autoupdate','autocreate',
                 'directorysrch','usercreation','usermodification',                  'directorysrch','usercreation','usermodification',
                 'contacts','defaults','scantron','coursecategories',                  'contacts','defaults','scantron','coursecategories',
                 'serverstatuses','requestcourses','helpsettings',                  'serverstatuses','requestcourses','usersessions',
                 'coursedefaults','usersessions','loadbalancing'],$dom);                  'loadbalancing'],$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','coursecategories','serverstatuses',
                        'coursedefaults','usersessions');                         'usersessions');
     if (keys(%servers) > 1) {      if (keys(%servers) > 1) {
         push(@prefs_order,'loadbalancing');          push(@prefs_order,'loadbalancing');
     }      }
Line 240  sub handler { Line 247  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 333  sub handler { Line 340  sub handler {
                               col3 => 'Specific IPs',                                col3 => 'Specific IPs',
                             }],                              }],
                  },                   },
         'helpsettings' =>  
                  {text   => 'Help page settings',  
                   help   => 'Domain_Configuration_Help_Settings',  
                   header => [{col1 => 'Authenticated Help Settings',  
                               col2 => ''},  
                              {col1 => 'Unauthenticated Help Settings',  
                               col2 => ''}],  
                  },  
         'coursedefaults' =>   
                  {text => 'Course/Community defaults',  
                   help => 'Domain_Configuration_Course_Defaults',  
                   header => [{col1 => 'Defaults which can be overridden in each course by a CC',  
                               col2 => 'Value',},  
                              {col1 => 'Defaults which can be overridden for each course by a DC',  
                               col2 => 'Value',},],  
                  },  
         'privacy' =>   
                  {text   => 'User Privacy',  
                   help   => 'Domain_Configuration_User_Privacy',  
                   header => [{col1 => 'Setting',  
                               col2 => 'Value',}],  
                  },  
         'usersessions' =>          'usersessions' =>
                  {text  => 'User session hosting/offloading',                   {text  => 'User session hosting/offloading',
                   help  => 'Domain_Configuration_User_Sessions',                    help  => 'Domain_Configuration_User_Sessions',
Line 375  sub handler { Line 360  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 368  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 378  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 465  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 'helpsettings') {  
         $output = &modify_helpsettings($r,$dom,$confname,%domconfig);  
     } elsif ($action eq 'coursedefaults') {  
         $output = &modify_coursedefaults($dom,%domconfig);  
     } elsif ($action eq 'usersessions') {      } elsif ($action eq 'usersessions') {
         $output = &modify_usersessions($dom,%domconfig);          $output = &modify_usersessions($dom,%domconfig);
     } elsif ($action eq 'loadbalancing') {      } elsif ($action eq 'loadbalancing') {
Line 538  sub print_config_box { Line 523  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 'helpsettings') {  
             $output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal);  
         } elsif ($action eq 'usersessions') {          } elsif ($action eq 'usersessions') {
             $output .= &print_usersessions('top',$dom,$settings,\$rowtotal);               $output .= &print_usersessions('top',$dom,$settings,\$rowtotal); 
         } elsif ($action eq 'rolecolors') {          } elsif ($action eq 'rolecolors') {
             $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);              $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'coursedefaults') {  
             $output .= &print_coursedefaults('top',$dom,$settings,\$rowtotal);  
         }          }
         $output .= '          $output .= '
            </table>             </table>
Line 1047  sub print_rolecolors { Line 1028  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 1106  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 1118  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 1365  sub print_quotas { Line 1347  sub print_quotas {
         %validations = &Apache::lonnet::auto_courserequest_checks($dom);          %validations = &Apache::lonnet::auto_courserequest_checks($dom);
         %titles = &courserequest_titles();          %titles = &courserequest_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') {
Line 2336  sub print_usersessions { Line 2318  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 = &current_offloads_to($dom,$settings,\%servers);              my %spareid = &current_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 2498  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 2575  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'".');" />&nbsp;'.
                                                          $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">'.
                                                          '&nbsp;</td>';
                                   } elsif ($colsleft == 1) {
                                       $current{$type} .= '<td class="LC_left_item">&nbsp;</td>'."\n";
                                 }                                  }
                                 $current{$type} .= '<td><label><input type="checkbox" name="spare_'.$type.'_'.$server.'" checked="checked" value="'.$spareid->{$server}{$type}[$i].'" />&nbsp;'.                                  $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">'.  
                                                    '&nbsp;</td>';  
                             } elsif ($colsleft == 1) {  
                                 $current{$type} .= '<td class="LC_left_item">&nbsp;</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>').'&nbsp;'.
                               '<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>').'&nbsp;'.  
                           $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>').'&nbsp;'.  
                           $canselect{'default'}.'</td></tr>';  
             $itemcount ++;              $itemcount ++;
         }          }
     }      }
Line 2654  sub spares_row { Line 2677  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 2741  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 2814  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 2838  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 2876  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 2884  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 2941  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 2973  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 3798  sub print_serverstatuses { Line 3840  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 4908  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 4986  $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' => [\&notifysubscribed,@{$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 5012  $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' => [\&notifysubscribed,@{$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 5085  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 5087  sub modify_quotas { Line 5192  sub modify_quotas {
         $toolregexp = join('|',@usertools);          $toolregexp = join('|',@usertools);
         %conditions = &courserequest_conditions();          %conditions = &courserequest_conditions();
     } 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 7342  sub modify_usersessions { Line 7447  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 = &current_offloads_to($dom,$domconfig{'usersessions'},\%servers);      my %spareid = &current_offloads_to($dom,$domconfig{'usersessions'},\%servers);
     my $savespares;      my $savespares;
Line 7350  sub modify_usersessions { Line 7454  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 7483  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 7906  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 7990  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 8113  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;

Removed from v.1.151  
changed lines
  Added in v.1.160.6.4


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>