#!/usr/bin/perl
#############################
# rrdload - Measure CPU Load
# Mike Schilli, 2004
# (m@perlmeister.com)
#############################
use warnings;
use strict;

use RRDs;
use Getopt::Std;

getopts("ug", \my %opts);

my $DB     = "/tmp/load.rrd";
my $SERVER = "/www/htdocs";
my $UPTIME = "uptime";

if(! -f $DB) {
  RRDs::create($DB, 
    "--step=300",
    "DS:load:GAUGE:330:U:U", 
    "RRA:MAX:0.5:1:288",
    "RRA:MAX:0.5:12:168",
    "RRA:MAX:0.5:288:365",
  ) or die "Create error: " .
           "($RRDs::error)";
}

if(exists $opts{u}) {
  my $uptime = `$UPTIME`;
  my ($load) = 
    ($uptime =~ /(\d\.\d+)/);

  RRDs::update($DB, 
    time() . ":$load") or
      die "Update error: " .
          "($RRDs::error)";
}

if(exists $opts{g}) {
  RRDs::graph(
   "$SERVER/load.png",
   "--vertical-label=" .
     "Load perlmeister.com",
   "--start=" . 
     rrd_start_time(),
   "--end=" . time(), 
   "DEF:myload=$DB:load:MAX",
   "LINE2:myload#FF0000") or
     die "graph failed " .
         "($RRDs::error)";
}

#############################
sub rrd_start_time {
#############################
  my ($start, $step, $names,
      $data) = 
     RRDs::fetch($DB, "MAX");

  foreach my $line (@$data) {
    if(!defined $line->[0]) {
      $start += $step;
      next;
    }
    return $start;
  }
}