#!/usr/bin/perl use strict; use FileHandle; use RRDs; use Glib; my $outfile = "/var/www/apps/cpustats/loke.rrd"; unless( -e $outfile) { &create($outfile); } if( -e $outfile) { my $loop = Glib::MainLoop->new; my $timer = Glib::Timeout -> add(10000, \&update); $loop -> run; } sub create { RRDs::create( "$outfile", "-s 10", 'DS:user:COUNTER:30:0:U', 'DS:nice:COUNTER:30:0:U', 'DS:system:COUNTER:30:0:U', 'DS:idle:COUNTER:30:0:U', 'DS:iowait:COUNTER:30:0:U', 'DS:irq:COUNTER:30:0:U', 'DS:softirq:COUNTER:30:0:U', 'DS:loadavg1:GAUGE:30:0:U', 'DS:loadavg5:GAUGE:30:0:U', 'DS:loadavg15:GAUGE:30:0:U', 'RRA:AVERAGE:0.5:1:360', 'RRA:AVERAGE:0.5:6:1440', 'RRA:AVERAGE:0.5:30:2014', 'RRA:AVERAGE:0.5:360:672', 'RRA:AVERAGE:0.5:8640:365', ); &errorcheck; `chmod 640 "$outfile"`; `chown admin:www-data "$outfile"`; } sub update { if(defined($outfile)) { my ($u,$n,$s,$i,$io,$irq,$sirq,$l1,$l5,$l15) = split(',',&gather); my $now = time; RRDs::update( "$outfile", "$now:$u:$n:$s:$i:$io:$irq:$sirq:$l1:$l5:$l15" ); &errorcheck; } return 1; } sub gather { my ($u,$n,$s,$i,$io,$irq,$sirq,$l1,$l5,$l15,$unknown); my @result; open(IN,"/proc/stat"); ($unknown,$unknown,$u,$n,$s,$i,$io,$irq,$sirq,$unknown) = split(/ /,); close(IN); open(LOAD,"/proc/loadavg"); ($l1,$l5,$l15) = split(/ /,); close(LOAD); return "$u,$n,$s,$i,$io,$irq,$sirq,$l1,$l5,$l15"; } sub errorcheck { my $ERR = RRDs::error; print "$ERR\n" if defined($ERR); }