| version 1.12, 2009/11/23 21:52:53 |
version 1.18, 2011/12/27 02:12:38 |
|
|
| #!/usr/bin/perl -T |
#!/usr/bin/perl -T |
| # $RedRiver: check_bioctl,v 1.11 2009/11/23 21:45:58 andrew Exp $ |
# $RedRiver: check_bioctl,v 1.15 2009/11/23 22:24:45 andrew Exp $ |
| ######################################################################## |
######################################################################## |
| # check_bioctl *** A nagios check for OpenBSD bioctl |
# check_bioctl *** A nagios check for OpenBSD bioctl |
| # |
# |
|
|
| Invalid => 'CRITICAL', |
Invalid => 'CRITICAL', |
| ); |
); |
| |
|
| my $state = 'UNKNOWN'; # tells whether the it is warning, critical, or OK |
|
| my @devices; |
my @devices; |
| my $opt_h; |
my $opt_h; |
| my $opt_V; |
my $opt_V; |
|
|
| my %STATES = check_status( \%VOLUMES ); |
my %STATES = check_status( \%VOLUMES ); |
| |
|
| my $have_results = 0; |
my $have_results = 0; |
| $state = 'OK'; |
my $state = 'OK'; |
| foreach my $error ( sort { $ERRORS{$b} <=> $ERRORS{$a} } keys %ERRORS ) { |
foreach my $error ( sort { $ERRORS{$b} <=> $ERRORS{$a} } keys %ERRORS ) { |
| if ( exists $STATES{$error} ) { |
if ( exists $STATES{$error} ) { |
| $have_results++; |
$have_results++; |
|
|
| foreach my $d ( @{$devices} ) { |
foreach my $d ( @{$devices} ) { |
| open my $bioctl, q{-|}, $BIOCTL, $d |
open my $bioctl, q{-|}, $BIOCTL, $d |
| or die "Couldn't open bioctl: $!\n"; |
or die "Couldn't open bioctl: $!\n"; |
| while ( my $line = <$bioctl> ) { |
LINE: while ( my $line = <$bioctl> ) { |
| my ( $i, $item ) = parse_bioctl_line($line); |
my ( $i, $item ) = parse_bioctl_line($line); |
| next unless defined $i; |
next LINE if !defined $i; |
| $volumes{$d}{$i} = $item; |
$volumes{$d}{$i} = $item; |
| } |
} |
| ## no critic 'die' |
## no critic 'die' |
|
|
| |
|
| { |
{ |
| my $vid; |
my $vid; |
| sub parse_bioctl_line { |
my $controller; |
| my ($line) = @_; |
|
| chomp $line; |
|
| |
|
| # Do these by columns cuZ that is the easiest for now |
sub parse_bioctl_line { |
| my @o = unpack( "A6 A1 A11 A15 A7 A9 A*", $line ); |
($_) = @_; |
| return if $o[0] eq 'Volume'; |
chomp; |
| |
|
| foreach (@o) { |
my @o = map { s/^\s+|\s+$//g; $_ } split; |
| s/^\s+//xms; |
return if $o[0] eq 'Volume'; |
| s/\s+$//xms; |
|
| } |
|
| |
|
| my ( $controller, $id, $status, $size, $dev, $details, $name ) = @o; |
$vid ||= ''; |
| my $index = $id; |
|
| if ($controller) { |
|
| $vid = $id; |
|
| } |
|
| else { |
|
| $index = "$vid.$id"; |
|
| } |
|
| |
|
| my %item = ( |
my $index = "$vid.$o[0]"; |
| type => 'volume', |
if ( $o[0] !~ /^\d+$/ ) { |
| controller => $controller, |
$controller = shift @o; |
| id => $id, |
$vid = $o[0]; |
| status => $status, |
$index = $vid; |
| size => $size, |
} |
| device => $dev, |
|
| details => $details, |
|
| name => $name, |
|
| volume_id => $vid, |
|
| ); |
|
| |
|
| return $index, \%item; |
return $index, |
| |
{ |
| |
controller => $controller, |
| |
volume_id => $vid, |
| |
id => shift @o, |
| |
status => shift @o, |
| |
size => shift @o, |
| |
device => shift @o, |
| |
name => shift @o, |
| |
description => join ' ', |
| |
@o, |
| |
}; |
| |
} |
| } |
} |
| } |
|
| |
|
| sub check_status { |
sub check_status { |
| my ($volumes) = @_; |
my ($volumes) = @_; |
| |
|
| my %states; |
my %states; |
| foreach my $device ( sort keys %{$volumes} ) { |
foreach my $d ( sort keys %{$volumes} ) { |
| foreach my $index ( sort keys %{ $volumes->{$device} } ) { |
foreach my $i ( sort { $a <=> $b } keys %{ $volumes->{$d} } ) { |
| my $cur_volume = $volumes->{$device}->{$index}; |
my $volume = $volumes->{$d}->{$i}; |
| my $cur_state = $Status_Map{ $cur_volume->{'status'} } |
my $state = $Status_Map{ $volume->{'status'} } || 'UNKNOWN'; |
| || 'UNKNOWN'; |
|
| |
|
| if ( $cur_volume->{'device'} =~ /^\d+:\d/xms ) { |
push @{ $states{$state} }, |
| push @{ $states{$cur_state} }, |
sprintf( |
| sprintf( |
"%5s %-7s %-11s %s", |
| "%5s %-7s %-11s %s", |
$volume->{'controller'}, $volume->{'device'}, |
| $cur_volume->{'volume'}{'controller'}, |
$volume->{'status'}, $volume->{'name'} |
| $cur_volume->{'device'}, |
); |
| $cur_volume->{'status'}, |
|
| $cur_volume->{'name'} |
|
| ); |
|
| } |
|
| else { |
|
| push @{ $states{$cur_state} }, |
|
| sprintf( "%5s %-7s %s", |
|
| $cur_volume->{'controller'}, |
|
| $cur_volume->{'device'}, |
|
| $cur_volume->{'status'} ); |
|
| } |
|
| } |
} |
| } |
} |
| return %states; |
return %states; |