Annotation of loncom/cgi/quotacheck.pl, revision 1.1
1.1 ! raeburn 1: #!/usr/bin/perl
! 2: $|=1;
! 3: # Display quotas for uploaded course content, current disk usage and
! 4: # percent usage for courses and communities for requested domain.
! 5: # Requester should either be an active domain coordinator in
! 6: # requested domain, or current server should belong to requested
! 7: # domain.
! 8: #
! 9: # $Id: quotacheck.pl,v 1.1 2014/03/10 17:44:01 raeburn Exp $
! 10: #
! 11: # Copyright Michigan State University Board of Trustees
! 12: #
! 13: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
! 14: #
! 15: # LON-CAPA is free software; you can redistribute it and/or modify
! 16: # it under the terms of the GNU General Public License as published by
! 17: # the Free Software Foundation; either version 2 of the License, or
! 18: # (at your option) any later version.
! 19: #
! 20: # LON-CAPA is distributed in the hope that it will be useful,
! 21: # but WITHOUT ANY WARRANTY; without even the implied warranty of
! 22: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 23: # GNU General Public License for more details.
! 24: #
! 25: # You should have received a copy of the GNU General Public License
! 26: # along with LON-CAPA; if not, write to the Free Software
! 27: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! 28: #
! 29: # /home/httpd/html/adm/gpl.txt
! 30: #
! 31: # http://www.lon-capa.org/
! 32: #
! 33:
! 34: use strict;
! 35:
! 36: use lib '/home/httpd/lib/perl/';
! 37: use Apache::lonnet();
! 38: use Apache::loncommon();
! 39: use Apache::lonlocal();
! 40: use LONCAPA::Configuration();
! 41: use LONCAPA::loncgi();
! 42: use LONCAPA::lonauthcgi();
! 43: use File::Find;
! 44: use CGI qw(:standard);
! 45: use LONCAPA;
! 46:
! 47: my $perlvar=&LONCAPA::Configuration::read_conf('loncapa.conf');
! 48: my $lonhost;
! 49: if (ref($perlvar) eq 'HASH') {
! 50: $lonhost = $perlvar->{'lonHostID'};
! 51: }
! 52: undef($perlvar);
! 53:
! 54: print &LONCAPA::loncgi::cgi_header('text/html',1);
! 55: &main($lonhost);
! 56:
! 57: sub main {
! 58: my ($lonhost) = @_;
! 59: if ($lonhost eq '') {
! 60: &Apache::lonlocal::get_language_handle();
! 61: &Apache::lonhtmlcommon::add_breadcrumb
! 62: ({href=>"/cgi-bin/quotacheck.pl",
! 63: text=>"Content disk usage"});
! 64: print(&Apache::loncommon::start_page('Course/Community disk usage and quotas').
! 65: &Apache::lonhtmlcommon::breadcrumbs('Course/Community status').
! 66: '<p class="LC_error">'.
! 67: &Apache::lonlocal::mt("Error: could not determine server's LON-CAPA hostID.").
! 68: '</p>'
! 69: &Apache::loncommon::end_page());
! 70: return;
! 71: }
! 72: if (&LONCAPA::lonauthcgi::check_ipbased_access('diskusage')) {
! 73: &LONCAPA::loncgi::check_cookie_and_load_env();
! 74: } else {
! 75: if (!&LONCAPA::loncgi::check_cookie_and_load_env()) {
! 76: &Apache::lonlocal::get_language_handle();
! 77: print(&LONCAPA::loncgi::missing_cookie_msg());
! 78: return;
! 79: }
! 80: if (!&LONCAPA::lonauthcgi::can_view('diskusage')) {
! 81: &Apache::lonlocal::get_language_handle();
! 82: print(&LONCAPA::lonauthcgi::unauthorized_msg('diskusage'));
! 83: return;
! 84: }
! 85: }
! 86: my (%gets,%posted,$reqdom,$crstype,%params);
! 87:
! 88: #
! 89: # Get domain -- if this is for an authenticated user (i.e., not IP-based access)
! 90: # Set domain in the order (a) value of fixeddom form element, if submitted
! 91: # (b) value of domain item in query string
! 92: # (c) default login domain for current server
! 93: #
! 94:
! 95: if (($Apache::lonnet::env{'user.name'}) && ($Apache::lonnet::env{'user.domain'})) {
! 96: my $q = CGI->new;
! 97: %params = $q->Vars;
! 98: $crstype = 'Course';
! 99: if ($params{'type'} eq 'Community') {
! 100: $crstype = $params{'type'};
! 101: }
! 102: if ($params{'fixeddom'}) {
! 103: $reqdom = $params{'fixeddom'};
! 104: }
! 105: }
! 106: if (($reqdom eq '') && ($ENV{'QUERY_STRING'})) {
! 107: &LONCAPA::loncgi::cgi_getitems($ENV{'QUERY_STRING'},\%gets);
! 108: if (ref($gets{'domain'}) eq 'ARRAY') {
! 109: $gets{'domain'}->[0] =~ s/^\s+|\s+$//g;
! 110: if ($gets{'domain'}->[0] =~ /^$LONCAPA::match_domain$/) {
! 111: my $domdesc = &Apache::lonnet::domain($gets{'domain'}->[0]);
! 112: unless ($domdesc eq '') {
! 113: $reqdom = $gets{'domain'}->[0];
! 114: }
! 115: }
! 116: }
! 117: }
! 118: if ($reqdom eq '') {
! 119: $reqdom = &Apache::lonnet::default_login_domain();
! 120: }
! 121:
! 122: &Apache::lonlocal::get_language_handle();
! 123: &Apache::lonhtmlcommon::add_breadcrumb
! 124: ({href=>"/cgi-bin/quotacheck.pl?domain=$reqdom",
! 125: text=>"Content disk usage"});
! 126: if ($params{'gosearch'}) {
! 127: &Apache::lonhtmlcommon::add_breadcrumb
! 128: ({href=>"/cgi-bin/quotacheck.pl?domain=$reqdom",
! 129: text=>"Result"});
! 130: }
! 131: my $domdesc = &Apache::lonnet::domain($reqdom,'description');
! 132: print(&Apache::loncommon::start_page('Course/Community disk usage and quotas').
! 133: &Apache::lonhtmlcommon::breadcrumbs('Course/Community status').
! 134: '<h2>'.&Apache::lonlocal::mt('Quotas for uploaded course content').'</h2>'.
! 135: '<h3>'.$domdesc.'</h3>');
! 136:
! 137: #
! 138: # If this is for an authenticated user (i.e., not IP-based access)
! 139: # create display to choose filters to restrict courses/communities displayed
! 140: # (e.g., recent activity, recently created, institutional code, course owner etc.)
! 141: #
! 142:
! 143: if (($Apache::lonnet::env{'user.name'}) && ($Apache::lonnet::env{'user.domain'})) {
! 144: my ($numtitles,@codetitles);
! 145: print(&Apache::loncommon::js_changer());
! 146: my ($filterlist,$filter) = &get_filters($reqdom,\%params);
! 147: $Apache::lonnet::env{'form.official'} = $params{'official'};
! 148: if ($params{'official'}) {
! 149: my @standardnames = &Apache::loncommon::get_standard_codeitems();
! 150: pop(@standardnames);
! 151: foreach my $item (@standardnames) {
! 152: if ($params{'official'} eq 'on') {
! 153: $Apache::lonnet::env{'form.'.$item} = $params{$item};
! 154: } else {
! 155: $Apache::lonnet::env{'form.'.$item} = 0;
! 156: }
! 157: }
! 158: $Apache::lonnet::env{'form.state'} = $params{'state'};
! 159: }
! 160: print(&Apache::loncommon::build_filters($filterlist,$crstype,undef,undef,$filter,
! 161: '/cgi-bin/quotacheck.pl',\$numtitles,
! 162: 'quotacheck',undef,undef,undef,
! 163: \@codetitles,$reqdom,'quotacheck',$reqdom));
! 164: if ($params{'gosearch'}) {
! 165: if ($params{'official'} eq 'on') {
! 166: $Apache::lonnet::env{'form.state'} = $params{'state'};
! 167: }
! 168: my %courses = &Apache::loncommon::search_courses($reqdom,$crstype,$filter,$numtitles,
! 169: undef,undef,undef,\@codetitles);
! 170: my @showcourses = keys(%courses);
! 171: &print_usage($lonhost,$reqdom,\@showcourses);
! 172: }
! 173: print(&Apache::loncommon::end_page());
! 174: return;
! 175: }
! 176: &print_usage($lonhost,$reqdom);
! 177: print(&Apache::loncommon::end_page());
! 178: return;
! 179: }
! 180:
! 181: sub print_usage {
! 182: my ($lonhost,$dom,$courses) = @_;
! 183: my @domains = &Apache::lonnet::current_machine_domains();
! 184: my @ids=&Apache::lonnet::current_machine_ids();
! 185: my $domain = &Apache::lonnet::host_domain($lonhost);
! 186:
! 187: #
! 188: # If user's current role is domain coordinator, domain of courses/communities
! 189: # to be shown needs to be domain being coordinated.
! 190: #
! 191: if ($Apache::lonnet::env{'request.role'} =~ m{^dc\./}) {
! 192: $domain = $Apache::lonnet::env{'request.role.domain'};
! 193: unless ($dom eq $domain) {
! 194: my $otherdomdesc = &Apache::lonnet::domain($domain,'description');
! 195: print('<p class="LC_error">'.
! 196: &Apache::lonlocal::mt('Requested domain does not match domain being coordinated.').
! 197: '</p>'."\n".
! 198: '<p class="LC_info">'.
! 199: &Apache::lonlocal::mt('Show quotas for the domain being coordinated: [_1]',
! 200: '<a href="/cgi-bin/quotacheck.pl?domain='.$domain.'">'.
! 201: $otherdomdesc.'</a>').
! 202: '</p>');
! 203: return;
! 204: }
! 205: } else {
! 206: unless (grep(/^\Q$dom\E/,@domains)) {
! 207: print('<p class="LC_error">'.
! 208: &Apache::lonlocal::mt('Requested domain is not hosted on this server.').
! 209: '</p>');
! 210: return;
! 211: }
! 212: }
! 213: my %domdefs = &Apache::lonnet::get_domain_defaults($dom);
! 214: my @showcourses;
! 215: if (ref($courses) eq 'ARRAY') {
! 216: @showcourses = @{$courses};
! 217: } else {
! 218: my %courseshash = &Apache::lonnet::courseiddump($dom,'.',1,'.','.','.',undef,undef,'.');
! 219: if (keys(%courseshash)) {
! 220: @showcourses = keys(%courseshash);
! 221: }
! 222: }
! 223: if (@showcourses) {
! 224: print(&Apache::loncommon::start_data_table().
! 225: &Apache::loncommon::start_data_table_header_row().
! 226: '<th>'.&Apache::lonlocal::mt('Course Type').'</th>'.
! 227: '<th>'.&Apache::lonlocal::mt('Course Title').'</th>'.
! 228: '<th>'.&Apache::lonlocal::mt('Institutional Code').'</th>'.
! 229: '<th>'.&Apache::lonlocal::mt('Quota (MB)').'</th>'.
! 230: '<th>'.&Apache::lonlocal::mt('Usage (MB)').'</th>'.
! 231: '<th>'.&Apache::lonlocal::mt('Percent usage').'</th>'.
! 232: &Apache::loncommon::end_data_table_header_row());
! 233: foreach my $cid (@showcourses) {
! 234: my %courseinfo=&Apache::lonnet::coursedescription($cid,{'one_time' => '1'});
! 235: my $cdesc = $courseinfo{'description'};
! 236: my $cnum = $courseinfo{'num'};
! 237: my $chome = $courseinfo{'home'};
! 238: my $crstype = $courseinfo{'type'};
! 239: if ($crstype eq '') {
! 240: if ($cnum =~ /^$LONCAPA::match_community$/) {
! 241: $crstype = 'Community';
! 242: } else {
! 243: $crstype = 'Course';
! 244: }
! 245: }
! 246: my $instcode = $courseinfo{'internal.coursecode'};
! 247: my $quota = $courseinfo{'internal.uploadquota'};
! 248: $quota =~ s/[^\d\.]+//g;
! 249: my $quotatype = 'unofficial';
! 250: if ($crstype eq 'Community') {
! 251: $quotatype = 'community';
! 252: } elsif ($courseinfo{'internal.coursecode'}) {
! 253: $quotatype = 'official';
! 254: } elsif ($courseinfo{'internal.textbook'}) {
! 255: $quotatype = 'textbook';
! 256: }
! 257: if ($quota eq '') {
! 258: $quota = $domdefs{$crstype.'quota'};
! 259: }
! 260: $quota =~ s/[^\d\.]+//g;
! 261: if ($quota eq '') {
! 262: $quota = 500;
! 263: }
! 264: my $current_disk_usage = 0;
! 265: if (grep(/^\Q$chome\E$/,@ids)) {
! 266: my $dir = &propath($dom,$cnum).'/userfiles/';
! 267: foreach my $subdir ('docs','supplemental') {
! 268: my $ududir = "$dir/$subdir";
! 269: my $total_size=0;
! 270: my $code=sub {
! 271: if (-d $_) { return;}
! 272: $total_size+=(stat($_))[7];
! 273: };
! 274: chdir($ududir);
! 275: find($code,$ududir);
! 276: $total_size=int($total_size/(1024*1024));
! 277: $current_disk_usage += $total_size;
! 278: }
! 279: } else {
! 280: foreach my $subdir ('docs','supplemental') {
! 281: $current_disk_usage += &Apache::lonnet::diskusage($dom,$cnum,"userfiles/$subdir",1);
! 282: }
! 283: }
! 284: my $percent;
! 285: if (($quota == 0) || ($quota =~ /[^\d\.]/)) {
! 286: $percent = 100.0;
! 287: } else {
! 288: $percent = 100*($current_disk_usage/$quota);
! 289: }
! 290: $current_disk_usage = sprintf("%.0f",$current_disk_usage);
! 291: $quota = sprintf("%.0f",$quota);
! 292: $percent = sprintf("%.0f",$percent);
! 293: print(&Apache::loncommon::start_data_table_row().
! 294: '<td>'.$quotatype.'</td>'.
! 295: '<td>'.$cdesc.'</td>'.
! 296: '<td>'.$instcode.'</td>'.
! 297: '<td>'.$quota.'</td>'.
! 298: '<td>'.$current_disk_usage.'</td>'.
! 299: '<td>'.$percent.'</td>'.
! 300: &Apache::loncommon::end_data_table_row()
! 301: );
! 302: }
! 303: print(&Apache::loncommon::end_data_table().'<br /><br />');
! 304: } else {
! 305: print(&Apache::lonlocal::mt('No courses match search criteria.'));
! 306: }
! 307: return;
! 308: }
! 309:
! 310: sub get_filters {
! 311: my ($dom,$params) = @_;
! 312: my @filterlist = ('descriptfilter','instcodefilter','ownerfilter',
! 313: 'ownerdomfilter','coursefilter','sincefilter');
! 314: # created filter
! 315: my $loncaparev = &Apache::lonnet::get_server_loncaparev($dom);
! 316: if ($loncaparev ne 'unknown_cmd') {
! 317: push(@filterlist,'createdfilter');
! 318: }
! 319: my %filter;
! 320: foreach my $item (@filterlist) {
! 321: $filter{$item} = '';
! 322: }
! 323: if (ref($params) eq 'HASH') {
! 324: foreach my $item (@filterlist) {
! 325: $filter{$item} = $params->{$item};
! 326: }
! 327: }
! 328: return (\@filterlist,\%filter);
! 329: }
! 330:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>