#! /usr/bin/perl
# Show disk data transfers from FreeBSD gstat program
# anders@fupp.net, 2007-09-23

$ENV{PATH} = "/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin";

$gstatcmd="gstat -b";
if ($< != 0) {
	$gstatcmd = "sudo " . $gstatcmd;
}

if ($ARGV[0] eq "autoconf") {
	print "yes\n";
} elsif ($ARGV[0] eq "config") {
	print "graph_title Disk transfer rate\n";
	print "graph_vlabel kBps\n";
	print "graph_category disk\n";
	print "graph_info This graph shows the transfer rate for reads and writes, per 30 seconds with data from gstat (GEOM stat) in FreeBSD\n";
	print "graph_args --base 1000 -l 0\n";

	@parts = ();
	foreach $gline (`$gstatcmd`) {
		chomp($gline);
		if ($gline =~ /\s+\d+\s+\d+\s+\d+\s+(\d+)\s+[0-9\.]+\s+\d+\s+(\d+)\s+[0-9\.]+\s+[0-9\.]+\|\s+(\w+)/) {
			$part = $3;

			# Do not show c labels
			next if ($part =~ /c$/);
			# Only show real labels
			next if ($part !~ /[a-z]+\d+(s\d+|)[abcdefgh]/);

			push(@parts, $part);
		}
	}

	print "graph_order";
	foreach $part (sort(@parts)) {
		print " " . $part . "_kBpsR";
		print " " . $part . "_kBpsW";
	}
	print "\n";

	foreach $part (sort(@parts)) {
		print $part . "_kBpsR.label $part (read)\n";
		print $part . "_kBpsR.type GAUGE\n";
		print $part . "_kBpsR.graph yes\n";
		print $part . "_kBpsW.label $part (write)\n";
		print $part . "_kBpsW.type GAUGE\n";
		print $part . "_kBpsW.graph yes\n";
	}
} else {
	foreach $gline (`cat /var/tmp/gstat.dat`) {
		chomp($gline);
		if ($gline =~ /\s+\d+\s+\d+\s+\d+\s+(\d+)\s+[0-9\.]+\s+\d+\s+(\d+)\s+[0-9\.]+\s+[0-9\.]+\|\s+(\w+)/) {
			$kBpsR = $1;
			$kBpsW = $2;
			$part = $3;

			# Do not show c labels
			next if ($part =~ /c$/);
			# Only show real labels
			next if ($part !~ /[a-z]+\d+(s\d+|)[abcdefgh]/);

			print $part . "_kBpsR.value $kBpsR\n";
			print $part . "_kBpsW.value $kBpsW\n";
		}
	}
}
