#!/usr/bin/perl
# -*-  perl -*-
#
#
##############################################################################
#
#
# This munin plugin watches the sizes of the given directories.
# @author Kevin Fischer
# @version 2010/08/05
# @website http://kevin-fischer.de
#
# Copy this to your node's config file (default: plugin-conf.d/munin-node):
#  [dirsizes]
#  user root
#  env.watchdirs /var/www,/tmp
#
# Change the env.watchdirs-variable according to your wishes.
# DON'T FORGET TO RUN AS ROOT!
#
# You can test this plugin by calling it with params "test" and your  watchdirs:
# ./dirsizes test /dir1,/tmp/dir2
#
#
##############################################################################
#

use strict;
use Munin::Plugin;
my @watchdirs;

if ( exists $ARGV[0] and $ARGV[0] eq "test" ) {

    # Split the watchdirs string
    @watchdirs = split( ",", $ARGV[1] );
}
else {

    # If no dirs are given, exit.
    if ( !defined( $ENV{"watchdirs"} ) ) {
        die "No directories given! See the manual at top of this plugin file.";
    }

    # Split the watchdirs string
    @watchdirs = split( ",", $ENV{"watchdirs"} );
}

# Config or read request?
if ( exists $ARGV[0] and $ARGV[0] eq "config" ) {

    # Munin basic info
    print "graph_title Directory sizes\n";
    print "graph_args --base 1024 --lower-limit 0\n";
    print "graph_vlabel directory size\n";
    print "graph_info Displays the sizes of all configured directories.\n";
    print "graph_category disk\n";
    print "graph_total Total\n";

    # All available directories
    foreach my $dir (@watchdirs) {

        # Remove illegal characters
        my $label = clean_fieldname($dir);

        # Print name
        print "dir", $label, ".label ", $dir, "\n";
    }
}

# Read request, output the directory sizes
else {

    # All available directories
    foreach my $dir (@watchdirs) {
        # Remove illegal characters
        my $label = clean_fieldname($dir);

        # Get the dirsize
        my $dirsize = getSize($dir);

        # Print name
        print "dir", $label, ".value ", $dirsize, ".0\n";
    }
}

# Function: getSize($dir)
sub getSize {
    my ($dir) = @_;

    # Get the size via `du`
    my @dirsize = split( ' ', `du -cb $dir | grep "total" |  tail -1 ` );
    return @dirsize[0];
}

exit 0;

