Annotation of loncom/cgi/userstatus.pl, revision 1.14

1.1       www         1: #!/usr/bin/perl
                      2: $|=1;
                      3: # User Status
1.14    ! albertel    4: # $Id: userstatus.pl,v 1.13 2006/06/02 21:36:21 albertel Exp $
1.7       albertel    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
                     28: 
1.1       www        29: 
1.5       albertel   30: use strict;
1.1       www        31: use lib '/home/httpd/lib/perl/';
                     32: use LONCAPA::Configuration;
1.13      albertel   33: use LONCAPA;
1.1       www        34: use HTTP::Headers;
                     35: use IO::File;
                     36: 
1.5       albertel   37: 
                     38: my %usercount;
                     39: my @actl=('Active','Moderately Active','Inactive');
                     40: 
1.1       www        41:  
1.3       www        42: print "Content-type: text/html\n\n";
                     43:       
1.1       www        44: # -------------------- Read loncapa.conf (and by default, loncapa_apache.conf).
1.5       albertel   45: &main();
                     46: 
                     47: sub analyze_time {
                     48:     my ($since)=@_;
                     49:     my $color="#000000";
                     50:     my $userclass=$actl[0];
1.14    ! albertel   51:     if ($since>300) { $color="#222222"; $userclass=$actl[1]; }
1.5       albertel   52:     if ($since>600) { $color="#444444"; }
1.14    ! albertel   53:     if ($since>1800) { $color="#666666"; }
1.5       albertel   54:     if ($since>7200) { $color="#888888"; }
                     55:     if ($since>21600) { $color="#AAAAAA"; $userclass=$actl[2]; }
                     56:     return ($color,$userclass);
                     57: }
                     58: 
                     59: sub add_count {
                     60:     my ($cat,$scope,$class)=@_;
                     61:     if (!defined($usercount{$cat})) {
                     62: 	$usercount{$cat}={};
                     63:     }
                     64:     if (!defined($usercount{$cat}{$scope})) {
                     65: 	$usercount{$cat}{$scope}={};
1.1       www        66:     }
1.5       albertel   67:     $usercount{$cat}{$scope}{$class}++;
1.1       www        68: }
1.5       albertel   69: 
                     70: sub main {
                     71:     my $perlvar=LONCAPA::Configuration::read_conf('loncapa.conf');
                     72:     delete $$perlvar{'lonReceipt'}; # remove since sensitive and not needed
                     73:     delete $$perlvar{'lonSqlAccess'}; # remove since sensitive and not needed
                     74: 
                     75:     my $oneline=($ENV{'QUERY_STRING'} eq 'simple');
                     76:     my $justsummary=($ENV{'QUERY_STRING'} eq 'summary');
                     77:     unless ($oneline) { print "<html><body bgcolor=#FFFFFF>\n<h1>User Status ".localtime()."</h1>"; }
                     78: 
                     79:     opendir(DIR,$$perlvar{'lonIDsDir'});
                     80:     my @allfiles=(sort(readdir(DIR)));
1.14    ! albertel   81:     my %users;
1.5       albertel   82:     foreach my $filename (@allfiles) {
                     83: 	if ($filename=~/^\./) { next; }
1.12      albertel   84: 	if ($filename=~/^publicuser_/) { next; }
1.5       albertel   85: 	my ($dev,$ino,$mode,$nlink,
                     86: 	    $uid,$gid,$rdev,$size,
                     87: 	    $atime,$mtime,$ctime,
                     88: 	    $blksize,$blocks)=stat($$perlvar{'lonIDsDir'}.'/'.$filename);
                     89: 	my $now=time;
                     90: 	my $since=$now-$mtime;
                     91: 	my $sinceacc=$now-$atime;
1.14    ! albertel   92: 	#unless ($oneline || $justsummary) { print ("\n\n<hr />"); }
1.5       albertel   93: 	my %userinfo;
1.11      albertel   94: 	($userinfo{'user.name'},undef,$userinfo{'user.domain'})=
                     95: 	    split('_',$filename);
1.5       albertel   96: 	my ($color,$userclass)=&analyze_time($since);
                     97: 	&add_count('Overall','all',$userclass);
                     98: 	&add_count('Domain',$userinfo{'user.domain'},$userclass);
                     99: 	
                    100: 	unless ($oneline) {
1.11      albertel  101: 	    my $fh=IO::File->new($$perlvar{'lonIDsDir'}.'/'.$filename);
                    102: 	    while (my $line=<$fh>) {
                    103: 		chomp($line);
                    104: 		my ($name,$value)=split(/\=/,$line);
1.13      albertel  105: 		$name = &unescape($name);
                    106: 		$value = &unescape($value);
1.11      albertel  107: 		$userinfo{$name}=$value;
                    108: 	    }
                    109: 	    $fh->close();
1.5       albertel  110: 	    if (!$justsummary) {
1.14    ! albertel  111: 		$users{$userclass}{$filename} .=
        !           112: 		    '<font color="'.$color.'">'.
        !           113: 		    '<h3>'.$userinfo{'environment.lastname'}.', '.
1.5       albertel  114: 		    $userinfo{'environment.firstname'}.' '.
                    115: 		    $userinfo{'environment.middlename'}.' '.
                    116: 		    $userinfo{'environment.generation'}." (".
                    117: 		    $userinfo{'user.name'}."\@".$userinfo{'user.domain'}.
                    118: 		    ")</h3>\n<b>Login time:</b> ".
                    119: 		    localtime($userinfo{'user.login.time'}).
1.9       albertel  120: 		    ' <b>Browser</b>: '.$userinfo{'browser.type'}.
                    121: 		    " on ".$userinfo{'browser.os'}."<b>Client:</b> ".
1.5       albertel  122: 		    $userinfo{'request.host'}."<br />\n<b>Role: </b>".
                    123: 		    $userinfo{'request.role'}." ";
                    124: 	    }
                    125: 	    &add_count('Browser',$userinfo{'browser.type'},$userinfo{'browser.version'});
1.10      albertel  126: 	    &add_count('OS',$userinfo{'browser.os'},$userinfo{'browser.type'});
1.5       albertel  127: 	    if ($userinfo{'request.course.id'}) {
                    128: 		my $cid=$userinfo{'request.course.id'};
                    129: 		my $coursename= $userinfo{'course.'.$cid.'.description'}.
                    130: 		    ' ('.$cid.')';
1.14    ! albertel  131: 		if (!$justsummary) { 
        !           132: 		    $users{$userclass}{$filename} .= 
        !           133: 			"<b>Course:</b> ".$coursename; 
        !           134: 		}
1.5       albertel  135: 		&add_count('Course',$coursename,$userclass);
                    136: 	    } else {
1.14    ! albertel  137: 		if (!$justsummary) {
        !           138: 		    $users{$userclass}{$filename} .= 
        !           139: 			"Not in a course.";
        !           140: 		}
1.5       albertel  141: 		&add_count('Course','No Course',$userclass);
                    142: 	    }
                    143: 	    if (!$justsummary) {
1.14    ! albertel  144: 		$users{$userclass}{$filename} .=
        !           145: 		    "<br /><b>Last Transaction:</b> ".localtime($mtime).
1.5       albertel  146: 		    " (".$since." secs ago) <br /><b>Last Access:</b> ".
1.14    ! albertel  147: 		    localtime($atime)." (".$sinceacc." secs ago)".
        !           148: 		    "</font>";
        !           149: 	    }
        !           150: 	}
        !           151:     }
        !           152:     if (!$oneline && !$justsummary) {
        !           153:        	foreach my $class (@actl) {
        !           154: 	    print("\n\n<hr /><h1>$class</h1>");    
        !           155: 	    foreach my $filename (sort(keys(%{$users{$class}}))) {
        !           156: 		print("\n\n".$users{$class}{$filename}."\n\n<hr />");    
1.5       albertel  157: 	    }
                    158: 	}
                    159:     }
1.14    ! albertel  160: 
1.5       albertel  161:     closedir(DIR);
                    162:     open (LOADAVGH,"/proc/loadavg");
                    163:     my $loadavg=<LOADAVGH>;
                    164:     close(LOADAVGH);
                    165:     unless ($oneline) { 
                    166: 	print "<hr /><h2>User Counts</h2>";
                    167: #	print "<pre>\n";
                    168: 	&showact('Overall',%usercount);
                    169: 	&showact('Domain',%usercount);
                    170: 	&showact('Course',%usercount);
                    171: 	&show('Browser',%usercount);
1.9       albertel  172: 	&show('OS',%usercount);
1.5       albertel  173: 
                    174: #	print "\n</pre>";
                    175: 	print "<b>Load Average:<b> ".$loadavg;
                    176: 	print "</body></html>";
                    177:     } else {
1.6       albertel  178: 	foreach my $l1 (sort keys %usercount) {
                    179: 	    foreach my $l2 (sort keys %{$usercount{$l1}}) {
                    180: 		foreach my $l3 (sort keys %{$usercount{$l1}{$l2}}) {
                    181: 		    print $l1.'_'.$l2.'_'.$l3.'='.$usercount{$l1}{$l2}{$l3}.'&';
                    182: 		}
                    183: 	    }
                    184: 	}
                    185: 	#clusterstatus values
                    186: 	foreach my $act (@actl) {
                    187: 	    print "$act=".$usercount{'Overall'}{'all'}{$act}.'&';
1.5       albertel  188: 	}
                    189: 	print 'loadavg='.$loadavg;
                    190:     }
1.1       www       191: }
1.5       albertel  192: 
                    193: sub show {
                    194:     my ($cat,%usercount)=@_;
                    195:     print("<h3>$cat</h3>\n");
                    196:     foreach my $type (sort(keys(%{$usercount{$cat}}))) {
                    197: 	print("<table border='1'><tr><th>$type</th><th>");
                    198: 	print(join("</th><th>",sort(keys(%{$usercount{$cat}{$type}}))));
                    199: 	my $temp;
                    200: 	my $count=0;
                    201: 	foreach my $version (sort(keys(%{$usercount{$cat}{$type}}))) {
                    202: 	    $temp.="<td>".$usercount{$cat}{$type}{$version}.
                    203: 		"</td>";
                    204: 	    $count+=$usercount{$cat}{$type}{$version};
                    205: 	}
                    206: 	print("</th></tr><tr><td>$count</td>");
                    207: 	print($temp."</tr></table>\n");
                    208:     }    
1.3       www       209: }
1.5       albertel  210: 
                    211: sub showact {
                    212:     my ($cat,%usercount)=@_;
                    213:     print("<h3>$cat</h3>\n");
                    214:     
                    215:     print("<table border='1'><tr><th></th><th>");
                    216:     print(join("</th><th>",('Any',@actl)));
                    217:     print("</th></tr>");
                    218:     foreach my $type (sort(keys(%{$usercount{$cat}}))) {
                    219: 	print("<tr><td>$type</td>");
                    220: 	my $temp;
                    221: 	my $count=0;
                    222: 	foreach my $activity (@actl) {
                    223: 	    $temp.="<td>&nbsp;".$usercount{$cat}{$type}{$activity}."</td>";
                    224: 	    $count+=$usercount{$cat}{$type}{$activity};
                    225: 	}
                    226: 	print("<td>$count</td>");
                    227: 	print($temp);
                    228:     }    
                    229:     print("</tr></table>\n");
1.3       www       230: }
1.5       albertel  231: 

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