#!/usr/bin/perl -w
if ($#ARGV < 0)
	{ $ARGV[0] = `hostname`; }
open(TOP, "rsh $ARGV[0] /usr/bin/mpstat '|' /usr/ucb/wc -l ';' /usr/cs/bin/top -Sb -d1 all |");
@topresults = <TOP>;
close(TOP);

$numcpus = @topresults[0]-1;
if ($numcpus <= 0)
	{ printf("Total CPU usage, Load, Number CPUs: 0%% :0   :0\n\n\nOops! $ARGV[0] is dead!\n") && exit; }
$_ = @topresults[1];
$topresults[1] =~ s/.*averages:([^,]*),.*/$1/;
$load = $topresults[1];

shift(@topresults); shift(@topresults); shift(@topresults);
shift(@topresults); shift(@topresults); shift(@topresults);
shift(@topresults); shift(@topresults); pop(@topresults);

$totcpu = 0;
%usercpu = %usermem = %userjob = ();
foreach $line (@topresults)
{
	$_ = $line;
	s/^\s*//;
	($pid, $username, $pri, $nice, $size, $res, $state, $time, $wcpu, $cpu, $command) = split;
	if ($username ne "an4m" || $command !~ /^top/)
	{
		$userjob{$username}++;
		$usercpu{$username} += $cpu;
		$totcpu += $cpu;
		if (chop($res) eq 'M') { $res *= 1024; };
		$usermem{$username} += $res;
	}
}

printf("Total CPU usage, Load, Number CPUs: %7.2f%% :%6.2f   :%d\n\n", $totcpu, $load, $numcpus);
@users = sort { $usercpu{$a} < $usercpu{$b} } keys(%usercpu);
printf("     User  #Jobs   %%CPU   Memory\n");
foreach $user (@users)
{
	if ($usercpu{$user} > 1)
	{
		$memory = $usermem{$user}; $magn = "K";
		if ($memory > 1024) { $memory /= 1024; $magn = "M"; }
		if ($memory > 1024) { $memory /= 1024; $magn = "G"; }
		if ($memory > 1024) { $memory /= 1024; $magn = "T"; }
		printf("%10s %5d %7.2f%%   %3d%s\n",
			$user, $userjob{$user}, $usercpu{$user}, $memory, $magn);
	}
}
