#!/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 # # The directories can contain wildcards that are automatically expanded. # # ############################################################################## # 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"} ); } # Glob all of the watchdirs. my @globbed_watchdirs; foreach my $watchdir ( @watchdirs ) { foreach my $expanded_dir ( glob( $watchdir ) ) { push @globbed_watchdirs, $expanded_dir; } } @watchdirs = @globbed_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;