Sébastien Faton
9 months ago
1 changed files with 140 additions and 0 deletions
@ -0,0 +1,140 @@ |
|||||
|
#!/usr/bin/perl -w |
||||
|
|
||||
|
# check_ro_mounts.pl Copyright (c) 2008 Valentin Vidic <vvidic@carnet.hr> |
||||
|
# |
||||
|
# Checks the mount table for read-only mounts - these are usually a sign of |
||||
|
# trouble (broken filesystem etc.) |
||||
|
# |
||||
|
# |
||||
|
# This program is free software; you can redistribute it and/or |
||||
|
# modify it under the terms of the GNU General Public License |
||||
|
# as published by the Free Software Foundation; either version 2 |
||||
|
# of the License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty |
||||
|
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU General Public License for more details. |
||||
|
# |
||||
|
# you should have received a copy of the GNU General Public License |
||||
|
# along with this program (or with Nagios); if not, write to the |
||||
|
# Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||
|
# Boston, MA 02111-1307, USA |
||||
|
|
||||
|
use strict; |
||||
|
use Getopt::Long; |
||||
|
use lib "/usr/lib/nagios/plugins"; |
||||
|
use utils qw (%ERRORS &support); |
||||
|
|
||||
|
my $name = 'RO_MOUNTS'; |
||||
|
my $mtab = '/proc/mounts'; |
||||
|
my @includes = (); |
||||
|
my @excludes = (); |
||||
|
my @excluded_types = (); |
||||
|
my @ro_mounts = (); |
||||
|
my $want_help = 0; |
||||
|
|
||||
|
Getopt::Long::Configure(qw(no_ignore_case)); |
||||
|
my $res = GetOptions( |
||||
|
"help|h" => \$want_help, |
||||
|
"mtab|m=s" => \$mtab, |
||||
|
"path|p=s" => \@includes, |
||||
|
"partition=s" => \@includes, |
||||
|
"exclude|x=s" => \@excludes, |
||||
|
"exclude-type|X=s" => \@excluded_types, |
||||
|
); |
||||
|
|
||||
|
if ($want_help or !$res) { |
||||
|
print_help(); |
||||
|
exit $ERRORS{$res ? 'OK' : 'UNKNOWN'}; |
||||
|
} |
||||
|
|
||||
|
my $includes_re = globs2re(@includes); |
||||
|
my $excludes_re = globs2re(@excludes); |
||||
|
my $excluded_types_re = globs2re(@excluded_types); |
||||
|
|
||||
|
open(MTAB, $mtab) or nagios_exit(UNKNOWN => "Can't open $mtab: $!"); |
||||
|
MOUNT: while (<MTAB>) { |
||||
|
# parse mtab lines |
||||
|
my ($dev, $dir, $fs, $opt) = split; |
||||
|
my @opts = split(',', $opt); |
||||
|
|
||||
|
# check includes/excludes |
||||
|
if ($includes_re) { |
||||
|
next MOUNT unless $dev =~ qr/$includes_re/ |
||||
|
or $dir =~ qr/$includes_re/; |
||||
|
} |
||||
|
if ($excludes_re) { |
||||
|
next MOUNT if $dev =~ qr/$excludes_re/ |
||||
|
or $dir =~ qr/$excludes_re/; |
||||
|
} |
||||
|
if ($excluded_types_re) { |
||||
|
next MOUNT if $fs =~ qr/$excluded_types_re/; |
||||
|
} |
||||
|
|
||||
|
# check for ro option |
||||
|
if (grep /^ro$/, @opts) { |
||||
|
push @ro_mounts, $dir; |
||||
|
} |
||||
|
} |
||||
|
nagios_exit(UNKNOWN => "Read failed on $mtab: $!") if $!; |
||||
|
close(MTAB) or nagios_exit(UNKNOWN => "Can't close $mtab: $!"); |
||||
|
|
||||
|
# report findings |
||||
|
if (@ro_mounts) { |
||||
|
nagios_exit(CRITICAL => "Found ro mounts: @ro_mounts"); |
||||
|
} else { |
||||
|
nagios_exit(OK => "No ro mounts found"); |
||||
|
} |
||||
|
|
||||
|
# convert glob patterns to a RE (undef if no patterns) |
||||
|
sub globs2re { |
||||
|
my(@patterns) = @_; |
||||
|
|
||||
|
@patterns or return undef; |
||||
|
foreach (@patterns) { |
||||
|
s/ \\(.) / sprintf('\x%02X', ord($1)) /egx; |
||||
|
s/ ([^\\*?\w]) / sprintf('\x%02X', ord($1)) /egx; |
||||
|
s/\*/.*/g; |
||||
|
s/\?/./g; |
||||
|
} |
||||
|
return '\A(?:' . join('|', @patterns) . ')\z'; |
||||
|
} |
||||
|
|
||||
|
# output the result and exit plugin style |
||||
|
sub nagios_exit { |
||||
|
my ($result, $msg) = @_; |
||||
|
|
||||
|
print "$name $result: $msg\n"; |
||||
|
exit $ERRORS{$result}; |
||||
|
} |
||||
|
|
||||
|
sub print_help { |
||||
|
print <<EOH; |
||||
|
check_ro_mounts 0.1 |
||||
|
Copyright (c) 2008 Valentin Vidic <vvidic\@carnet.hr> |
||||
|
|
||||
|
This plugin checks the mount table for read-only mounts. |
||||
|
|
||||
|
|
||||
|
Usage: |
||||
|
check_ro_mounts [-m mtab] [-p path] [-x path] [-X type] |
||||
|
|
||||
|
Options: |
||||
|
-h, --help |
||||
|
Print detailed help screen |
||||
|
-m, --mtab=FILE |
||||
|
Use this mtab instead (default is /proc/mounts) |
||||
|
-p, --path=PATH, --partition=PARTITION |
||||
|
Glob pattern of path or partition to check (may be repeated) |
||||
|
-x, --exclude=PATH <STRING> |
||||
|
Glob pattern of path or partition to ignore (only works if -p unspecified) |
||||
|
-X, --exclude-type=TYPE <STRING> |
||||
|
Ignore all filesystems of indicated type (may be repeated) |
||||
|
|
||||
|
EOH |
||||
|
|
||||
|
support(); |
||||
|
} |
||||
|
|
||||
|
# vim:sw=4:ts=4:et |
Write
Preview
Loading…
Cancel
Save
Reference in new issue