commit cac05445c8ae32d651ba563d80ae44da06d6e403 Author: neingeist Date: Wed Jul 17 17:00:57 2013 +0200 initial commit diff --git a/check_lvm_thinpools b/check_lvm_thinpools new file mode 100755 index 0000000..d80c357 --- /dev/null +++ b/check_lvm_thinpools @@ -0,0 +1,88 @@ +#!/usr/bin/perl +use strict; +use warnings; + +my $warn = 92.0; +my $crit = 96.0; + +sub get_thinpools { + my @lvsoutput = `lvs --noheadings --separator : -o lv_attr,lv_name,data_percent,metadata_percent`; + my @thinpools; + + for my $lvsline (@lvsoutput) { + if ($lvsline =~ m#^(?:\s+)?(.*):(.*):(.*):(.*)#x) { + my $lv = { + 'lv_attr' => $1, + 'lv_name' => $2, + 'data_percent' => $3, + 'metadata_percent' => $4, + }; + + if ($lv->{lv_attr} =~ m#^t#x) { + push @thinpools, $lv; + } + } + } + + return @thinpools; +} + +sub check_thinpools { + for my $thinpool (get_thinpools()) { + # Check metadata usage + if ($thinpool->{metadata_percent} > $crit) { + add_error(2, "CRITICAL: Meta% of $thinpool->{lv_name} is $thinpool->{metadata_percent}") + } elsif ($thinpool->{metadata_percent} > $warn) { + add_error(1, "WARNING: Meta% of $thinpool->{lv_name} is $thinpool->{metadata_percent}") + } + + # Check data usage + if ($thinpool->{data_percent} > $crit) { + add_error(2, "CRITICAL: Data% of $thinpool->{lv_name} is $thinpool->{data_percent}") + } elsif ($thinpool->{data_percent} > $warn) { + add_error(1, "WARNING: Data% of $thinpool->{lv_name} is $thinpool->{data_percent}") + } + } + + return; +} + +my @errors; + +sub add_error { + my ($exit_code, $message) = @_; + + push @errors, { + 'exit_code' => $exit_code, + 'message' => $message, + }; + + return; +} + +sub aggregate_errors { + # Sort errors, highest exit code first + my @sorted_errors = sort { $b->{exit_code} cmp $a->{exit_code} } @errors; + if (scalar @sorted_errors != 0) { + for my $error (@sorted_errors) { + print $error->{message}, "\n"; + } + exit $sorted_errors[0]->{exit_code}; + } + + return; +} + +my @thinpools = get_thinpools(); + +# No thinpool found? +if (scalar @thinpools == 0) { + print "UNKNOWN: No thinpools found.\n"; + exit 3; +} else { + check_thinpools(); + aggregate_errors(); +} + +print "OK - All thinpools OK\n"; +exit 0;