#!/usr/bin/perl -w

=head1 NAME

bdf - Munin plugin to monitor disk space usage on an HP-UX machine

=head1 APPLICABLE SYSTEMS

Any HP-UX system with commands '/usr/bin/bdf' and '/usr/sbin/fstyp'

=head1 CONFIGURATION

The plugin must be run as the root user to be able to determine
the filesystem type (VXFS, HFS, etc.):

  [bdf*]
    user root

=head1 INTERPRETATION

The plugin shows disk space usage on HP-UX systems as reported by
the command 'bdf'.

Only locally mounted VXFS or HFS filesystems are reported.

The plugin aims to be a functional equivalent to the Linux df plugin.

=head1 MAGIC MARKERS

  #%# family=auto
  #%# capabilities=autoconf

=head1 BUGS

None known

=head1 AUTHOR

Chris Gardner

=head1 LICENSE

GPLv2

=cut

use Munin::Plugin;
use strict;
$ENV{'PATH'} = '/bin:/usr/bin:/sbin:/usr/sbin';

if(defined($ARGV[0]) and $ARGV[0] eq "autoconf") {
    if(-x '/usr/bin/bdf' && -x '/sbin/fstyp') {
	print "yes\n";
	exit 0;
    } else {
	print "no (no bdf and/or fstyp executables\n";
	exit 0;
    }
}

# `bdf -i` --> [0]=Filesystem, [1]=kbytes, [2]=used, [3]=avail, [4]=%used, [5]=iused, [6]=ifree, [7]=%iuse, [8]=Mounted on
# Just 1 round of `bdf` is simpler but picks up CDFS cruft. bdf can't accept multiple FS types in 1 command.

my @bdf_hfs = `/usr/bin/bdf -ilt hfs`;
shift(@bdf_hfs);
my @bdf_vxfs = `/usr/bin/bdf -ilt vxfs`;
shift(@bdf_vxfs);
push(my @bdf, (@bdf_hfs, @bdf_vxfs)); # Recombine `bdf` for each FS type                                                                .
my $i = 0;
foreach(@bdf) {
    chomp;
    my @cols = split(/\s+/);
    if($#cols == 0) { # `bdf` line wraps if device name > 18 chars. This restores 1 array element per filesystem.
	chomp($_ .= $bdf[$i+1]);
	splice(@bdf, $i+1, 1);
    }
    $i++;
}

my $maxlabel = 20;

if(defined($ARGV[0]) and $ARGV[0] eq "config") {
    print "graph_title Disk usage in percent\n";
    print "graph_args --upper-limit 100 -l 0\n";
    print "graph_vlabel %\n";
    print "graph_category disk\n";
    print "graph_info This graph shows disk usage on the machine.\n";
    foreach(@bdf) {
	(my $fs, my $mount) = (split(/\s+/))[0,8]; # See top comment for array slice description.
	chomp(my $fs_type = `/sbin/fstyp $fs`);
	(my $name = $fs) =~ s|/|_|g;
	print "$name.label ";
	if(length($mount) > $maxlabel) {
	    print "..." . substr($mount, -$maxlabel+3) . "\n";
	} else {
	    print "$mount\n";
	}
	print "$name.info $mount ($fs_type) -> $fs\n";
	print "$name.warning 92\n";
	print "$name.critical 98\n";
    }
    exit 0;
}

foreach(@bdf) {
    (my $fs, my $pct_used) = (split(/\s+/))[0,4];
    (my $name = $fs) =~ s|/|_|g;
    $pct_used =~ s/%//g;
    print "$name.value $pct_used\n";
}
