check_junos_vc: Added 'version' check.
… which checks the version of all physically connected members to be equal.
This commit is contained in:
parent
a2c2f4844e
commit
6db7b3357f
|
@ -46,7 +46,7 @@ use JUNOS::Device;
|
|||
|
||||
binmode STDOUT, ":utf8";
|
||||
|
||||
my $valid_checks = "members_count|master|backup|interfaces";
|
||||
my $valid_checks = "members_count|master|backup|interfaces|version";
|
||||
|
||||
my $plugin = Nagios::Plugin->new(
|
||||
plugin => 'check_junos_vc',
|
||||
|
@ -85,6 +85,8 @@ The following checks are available:
|
|||
thresholds have been specified, also check the number of VCP interfaces
|
||||
against the thresholds.
|
||||
|
||||
* version: Check the version of all physically connected members.
|
||||
|
||||
Warning and critical thresholds may be specified in the format documented at
|
||||
http://nagiosplug.sourceforge.net/developer-guidelines.html#THRESHOLDFORMAT.",
|
||||
);
|
||||
|
@ -399,6 +401,63 @@ foreach my $check (@{$conf{'checks'}}) {
|
|||
threshold => undef,
|
||||
);
|
||||
}
|
||||
elsif ($check->{'name'} eq 'version') {
|
||||
my %versions = get_versions($junos);
|
||||
my @v_keys = keys %versions;
|
||||
|
||||
my $first = undef;
|
||||
|
||||
my @base_mismatch = ();
|
||||
my %mismatches = ();
|
||||
|
||||
foreach my $k (@v_keys) {
|
||||
my $base = $versions{$k}->{'base'};
|
||||
my $other = $versions{$k}->{'other'};
|
||||
|
||||
foreach my $o (keys %$other) {
|
||||
if ($other->{$o} ne $base) {
|
||||
$mismatches{$k}->{$base} = 1;
|
||||
$mismatches{$k}->{$other->{$o}} = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$first = shift @v_keys;
|
||||
$first = $versions{$first};
|
||||
foreach my $k (@v_keys) {
|
||||
if ($first->{'base'} ne $versions{$k}->{'base'}) {
|
||||
push @base_mismatch, $k;
|
||||
}
|
||||
}
|
||||
|
||||
if (scalar @base_mismatch) {
|
||||
my @first_match = grep {
|
||||
$versions{$_}->{'base'} eq $first->{'base'}
|
||||
} keys %versions;
|
||||
my %mismatches = ();
|
||||
|
||||
foreach my $m (@base_mismatch) {
|
||||
push @{$mismatches{$versions{$m}->{'base'}}}, $m;
|
||||
}
|
||||
|
||||
$plugin->add_message(CRITICAL, "version mismatch detected: "
|
||||
. $first->{'base'} . " @ ("
|
||||
. join(", ", @first_match) . ") != "
|
||||
. join(" != ", map {
|
||||
$_ . " @ (" . join(", ", @{$mismatches{$_}}) . ")"
|
||||
} keys %mismatches));
|
||||
}
|
||||
elsif (scalar(keys %mismatches)) {
|
||||
$plugin->add_message(WARNING, "version mismatches detected: "
|
||||
. join(" / ", map {
|
||||
"$_: " . join(" != ", keys %{$mismatches{$_}})
|
||||
} keys %mismatches));
|
||||
}
|
||||
else {
|
||||
$plugin->add_message(OK, "all members at version "
|
||||
. $first->{'base'});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# add total numbers to perfdata to ease graphing stuff
|
||||
|
@ -534,6 +593,47 @@ sub get_vc_interfaces
|
|||
return @ifaces;
|
||||
}
|
||||
|
||||
sub get_versions
|
||||
{
|
||||
my $device = shift;
|
||||
my %versions = ();
|
||||
|
||||
my $cmd = "show version";
|
||||
my $res = send_command($device, $cmd);
|
||||
|
||||
my @v = ();
|
||||
|
||||
if (! ref $res) {
|
||||
$plugin->die($res);
|
||||
}
|
||||
|
||||
@v = $res->getElementsByTagName('multi-routing-engine-item');
|
||||
|
||||
foreach my $i (@v) {
|
||||
my $name = get_obj_element($i, 're-name');
|
||||
my @infos = $i->getElementsByTagName('software-information');
|
||||
|
||||
@infos = $infos[0]->getElementsByTagName('package-information');
|
||||
|
||||
foreach my $j (@infos) {
|
||||
my $comment = get_obj_element($j, 'comment');
|
||||
my ($desc, $version);
|
||||
|
||||
$comment =~ m/^(.*) \[([^]]+)\]$/;
|
||||
$desc = $1;
|
||||
$version = $2;
|
||||
|
||||
if ($desc eq "JUNOS Base OS boot") {
|
||||
$versions{$name}->{'base'} = $version;
|
||||
}
|
||||
else {
|
||||
$versions{$name}->{'other'}->{$desc} = $version;
|
||||
}
|
||||
}
|
||||
}
|
||||
return %versions;
|
||||
}
|
||||
|
||||
sub add_arg
|
||||
{
|
||||
my $plugin = shift;
|
||||
|
|
Loading…
Reference in a new issue