#!/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.
# DONT 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;

my @watchdirs;

# Normal mode or test mode?
if(exists $ARGV[0] and $ARGV[0] ne "test")
{
	# 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"});
}
# Test mode
elsif(exists $ARGV[0] and $ARGV[0] eq "test")
{
	# Split the watchdirs string
	@watchdirs = split(",", $ARGV[1]);
}

# 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 = $dir;
		$label =~ s@[\/-]@_@g;
		
		# 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 = $dir;
		$label =~ s@[\/-]@_@g;
		
		# Get the dirsize
		my $dirsize = getSize($dir);
		
		# Get the label
		my $label = niceLabelname($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"`);
	return @dirsize[0];
}
# Remove illegal characters
sub niceLabelname
{
	my($label) = @_;
	
	$label =~ s@[\/-]@_@g;
	return $label;
}

exit 0;