#!/usr/bin/perl

use strict;

my($waittime) = shift;
if (!defined($waittime)) {
    die "sar: can't open /var/adm/sa/sa13\nNo such file or directory\n";
}
my($jiffy) = 100;
print "\n" . `uname -a` . "\n";

my($start_user,$start_nice,$start_sys,$start_idle) = proc_stat();
Print_Values('%usr','%sys','%wio','%idle');
sleep $waittime;
my($user,$nice,$sys,$idle) = proc_stat();
# Subtract starting value
$user -= $start_user;
$nice -= $start_nice;
$sys -= $start_sys;
$idle -= $start_idle;
# Adjust time by number of cpus
my($num_cpus) = num_cpus();
$user /= $num_cpus;
$nice /= $num_cpus;
$sys /= $num_cpus;
$idle /= $num_cpus;
# user + nice_user = total user
$user += $nice;
# Calculate total
my($total) = ($waittime * $jiffy);
# Calculate IO Wait as total time - other used time
my($iow) = $total - ($user + $sys + $idle);
# Calculate percentages
my($puser) = int( $user * 100 / $total);
my($psys) = int( $sys * 100 / $total);
my($piow) = int( $iow * 100 / $total);
my($pidle) = int( $idle * 100 / $total);
Print_Values($puser,$psys,$piow,$pidle);

sub Print_Values {
    my($user,$sys,$wio,$idle) = @_;
    my($mday, $mon, $year);
    my($sec, $min, $hour, $mday, $mon, $year) = localtime(time());
    $mon++;
    my($time) = sprintf("%2.2d:%2.2d:%2.2d",$hour,$min,$sec);
    print sprintf("%s %7s %7s %7s %7s\n",$time,$user,$sys,$wio,$idle);
}

sub num_cpus {
    my($cpunum);
    my($maxcpu);
    open(PROCSTAT,"/proc/stat");
    while(<PROCSTAT>) {
	if (/^cpu\d+\s+/) {
	    ($cpunum) = /^cpu(\d+)\s+/;
	    if ($cpunum > $maxcpu) {
		$maxcpu = $cpunum
	    }
	}
    }
    close(PROCSTAT);
    return ++$maxcpu;
}

sub proc_stat {
    my($user,$nice,$sys,$iow,$idle);
    open(PROCSTAT,"/proc/stat");
    while(<PROCSTAT>) {
	if (/^cpu\s+/) {
	    ($user, $nice, $sys, $idle) =
		/^cpu\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/;
	}
    }
    close(PROCSTAT);
    return ($user, $nice, $sys, $idle);
}
