#!/usr/bin/perl use warnings; use strict; my $devs = {}; my @errs; my @warn; my @ok; my @cmd = ('sudo', 'megactl', '-Hv', '2>&1'); my @output = `@cmd`; if ($? != 0) { print "WARNING: Exec failed!\n"; exit 2; } for my $line (@output) { if ($line =~ /^(\w+)\s+/) { my $dev = $1; my @line = split /\s+/, $line; $devs->{$dev}->{'header'} = \@line; next; } } sub check_controller { my $dev = shift; my ($err, $warn, $ok) = undef; $ok .= "$dev->{'header'}->[0]: "; for my $stat (@{$dev->{'header'}}) { if ($stat =~ /batt:(.*)/) { if ($1 ne 'good') { $warn .= "$dev->{'header'}->[0]: " unless $warn; $warn .= "Battery: $1 "; } } } $ok = "$dev->{'header'}->[0]: ok "; return ($ok, $err, $warn); } sub check_ld { my $dev = shift; my ($err, $warn, $ok) = undef; if ($dev->{'header'}->[5] ne 'online') { $err .= "$dev->{'header'}->[0]: $dev->{'header'}->[5]"; return ($ok, $err, $warn); } $ok = "$dev->{'header'}->[0]: ok "; return ($ok, $err, $warn); } sub check_pd { my $dev = shift; my ($err, $warn, $ok) = undef; if ($dev->{'header'}->[5] ne 'online') { $err .= "$dev->{'header'}->[0]: $dev->{'header'}->[5]"; return ($ok, $err, $warn); } for my $stat (@{$dev->{'header'}}) { if ($stat =~ /(^errs|media|other):/) { $warn .= "$dev->{'header'}->[0]: " unless $warn; $warn .= $stat . " "; } } $ok = "$dev->{'header'}->[0]: ok "; return ($ok, $err, $warn); } for my $dev (sort keys %$devs) { if ($dev =~ /^\w\d$/) { my ($ok, $err, $warn) = check_controller($devs->{$dev}); push @errs, $err if $err; push @warn, $warn if $warn; push @ok, $ok if $ok; } elsif ($dev =~ /^\w\d\w\d$/) { my ($ok, $err, $warn) = check_ld($devs->{$dev}); push @errs, $err if $err; push @warn, $warn if $warn; push @ok, $ok if $ok; } elsif ($dev =~ /^\w+\d+\w+\d+\w+\d+/) { my ($ok, $err, $warn) = check_pd($devs->{$dev}); push @errs, $err if $err; push @warn, $warn if $warn; push @ok, $ok if $ok; } } if (@errs) { print "CRITICAL: "; print @errs; print "\n"; exit 2; } elsif (@warn) { print "WARNING: "; print @warn; print "\n"; exit 1; } unless (@ok) { push @ok, "All devices OK"; } print "OK: "; print @ok; print "\n"; exit 0;