CPU Statistics

A little script written in perl, which displays the current cpu usage in a bar graph format

#!/usr/bin/perl -w
#################################################################################################
#              			     CPU Status Graph     					#
#			------------------------------------------------			#
#	DESCRIPTION: 	Shows current cpu loads in percent for user, system, nice, and idle     #
#			also shows a colored bar graph. See screenshots or try it :) 		#
#												#
#################################################################################################


IRC::register("CPU Status Plugin", "1.0.0", "", "by: Jaguar");
IRC::add_command_handler("cpustat", "cpu_info");


$cL = "\00300";                    		 # Letter
$cI = "\00307";                   		 # Information
$cS = "\00314";                   		 # Separator
$cT = "\00304";                    		 # Title

$SEP = "|";					 # Seperator

$c[0] = "\00300";		
$c[1] = "\00301";		
$c[2] = "\00302";		
$c[3] = "\00303";		
$c[4] = "\00304";		
$c[5] = "\00305";		
$c[6] = "\00306";		
$c[7] = "\00307";		
$c[8] = "\00308";		
$c[9] = "\00309";		
$c[10] = "\00310";		
$c[11] = "\00311";		
$c[12] = "\00312";		
$c[13] = "\00313";
$c[14] = "\00314";		
$c[15] = "\00315";


sub cpu_info {

    # Calculate cpu usage percentage from /proc/stat
    open(STAT, "</proc/stat");
    my ($junk, $cpu_user1, $cpu_nice1, $cpu_sys1, $cpu_idle1) = split(/\s+/, <STAT>);
    close(STAT);
    my $cpu_total1 = $cpu_user1 + $cpu_nice1 + $cpu_sys1 + $cpu_idle1;
    my $cpu_load1 = $cpu_user1 + $cpu_nice1 + $cpu_sys1;
    sleep 2;
    open(STAT, "</proc/stat");
    ($junk, $cpu_user2, $cpu_nice2, $cpu_sys2, $cpu_idle2) = split(/\s+/, <STAT>);
    close(STAT);
    my $cpu_total2 = $cpu_user2 + $cpu_nice2 + $cpu_sys2 + $cpu_idle2;
    my $cpu_load2 = $cpu_user2 + $cpu_nice2 + $cpu_sys2;

    $CPU_USAGE = int((1000 * ($cpu_load2 - $cpu_load1)) / ($cpu_total2 - $cpu_total1))/10;
    $CPU_USER = int((1000 * ($cpu_user2 - $cpu_user1)) / ($cpu_total2 - $cpu_total1))/10;
    $CPU_NICE = int((1000 * ($cpu_nice2 - $cpu_nice1)) / ($cpu_total2 - $cpu_total1))/10;
    $CPU_SYS = int((1000 * ($cpu_sys2 - $cpu_sys1)) / ($cpu_total2 - $cpu_total1))/10;
    $CPU_IDLE = int((1000 * ($cpu_idle2 - $cpu_idle1)) / ($cpu_total2 - $cpu_total1))/10;

     %CPU = ("USER", $CPU_USER,
         "NICE", $CPU_NICE,
         "SYS", $CPU_SYS,
         "IDLE", $CPU_IDLE);

     # Sorted associative array (sorted by value)
     @CPU_VALS = sort by_values (keys (%CPU));

     # Split array into seperate words
     ($one, $two, $three, $four) =  @CPU_VALS;
     
     ($one_txt, $two_txt, $three_txt, $four_txt) =  @CPU_VALS;
     
     # Determine value from key eg. USER, SYS, NICE, IDLE
     $one   = $CPU{$one};    # Smallest value
     $two   = $CPU{$two};  
     $three = $CPU{$three}; 
     $four  = $CPU{$four};   # Largest value

    $CPU_PERCENT = $CPU_USAGE;	
    $CPU_FREEBAR = int($CPU_USAGE/10);
     
    $SCALE = 30; 
    
    $one = ($one/100)*$SCALE;
    $two = ($two/100)*$SCALE;
    $three = ($three/100)*$SCALE;
    $four = ($four/100)*$SCALE;
    
    $one = sprintf("%d", $one);
    $two = sprintf("%d", $two);
    $three = sprintf("%d", $three);
    $four = sprintf("%d", $four);
    
    $CPU_BAR = "$c[14]\[$c[4]";
    
    for ($x = 0; $x < $one; $x++) 
    {
   	$CPU_BAR = $CPU_BAR . cpu_bar_color($one_txt). "\|";
    }
    
    for ($x = 0; $x < $two; $x++) 
    {
   	$CPU_BAR = $CPU_BAR . cpu_bar_color($two_txt). "\|";
    }
    

    for ($x = 0; $x < $three; $x++) 
    {
   	$CPU_BAR = $CPU_BAR . cpu_bar_color($three_txt). "\|";
    }
    
    for ($x = 0; $x < $four; $x++) 
    {
   	$CPU_BAR = $CPU_BAR . cpu_bar_color($four_txt). "\|";
    }
 
    $CPU_BAR = "$CPU_BAR$c[14]\]$c[0]";
    
	IRC::command("$cS\($cT CPU Stats $cS\) $c[15]\[ $c[3]$CPU_USER\% user $c[4] $CPU_SYS\% sys $c[8] $CPU_NICE\% nice $c[0]$CPU_IDLE\% idle $cS$SEP$cL $CPU_BAR $cL\($cI $CPU_PERCENT\% $cL\) $c[15]\]");
	
	return 1;
}


sub by_values
{
     ($CPU{$a} <=> $CPU{$b});
}

sub cpu_bar_color {
  
  my $line = shift(@_);
  
  if ($line =~ /USER/) { 
  	return "$c[3]";
  }
  
  if ($line =~ /SYS/) { 
  	return "$c[4]";
  }
  
  if ($line =~ /NICE/) { 
  	return "$c[8]";
  }
  
  if ($line =~ /IDLE/) { 
  	return "$c[0]";
  }

  return;
  
}