diff --git a/check_junos.pl b/check_junos.pl index dda5a72..6615ef9 100755 --- a/check_junos.pl +++ b/check_junos.pl @@ -199,6 +199,11 @@ foreach my $check (@{$conf{'checks'}}) { my $down_count = 0; my @down_ifaces = (); + my $phys_down_count = 0; + my @phys_down_ifaces = (); + + my $have_lag_ifaces = 0; + foreach my $iface (@interfaces) { my $name = get_iface_name($iface); my $status = check_interface($iface, @targets); @@ -217,13 +222,53 @@ foreach my $check (@{$conf{'checks'}}) { next; } - # XXX: check physical interfaces of the aggregate + $have_lag_ifaces = 1; + + my @markers = get_liface_marker(get_iface_first_logical($iface)); + if (! @markers) { + next; + } + + foreach my $marker (@markers) { + my $phy_name = get_iface_name($marker); + $phy_name =~ s/\.\d+$//; + + verbose(3, "Quering physical interface '$phy_name' " + . "for $name."); + + my @phy_interfaces = get_interfaces($junos, $phy_name); + foreach my $phy_iface (@phy_interfaces) { + if (check_interface($phy_iface, $phy_name) == 0) { + ++$phys_down_count; + push @phys_down_ifaces, "$name -> $phy_name"; + } + } + } } if ($down_count > 0) { $plugin->add_message(CRITICAL, $down_count . " interfaces down (" . join(", ", @down_ifaces) . ")"); } + + if ($phys_down_count > 0) { + $plugin->add_message(WARNING, $phys_down_count + . " LAG member interfaces down (" + . join(", ", @phys_down_ifaces) . ")"); + } + + if ((! $down_count) && (! $phys_down_count)) { + if (! scalar(@targets)) { + $plugin->add_message(OK, "all interfaces up"); + } + else { + $plugin->add_message(OK, "interface" + . (scalar(@targets) == 1 ? " " : "s ") + . join(", ", @targets) . " up" + . ($have_lag_ifaces + ? " (including all LAG member interfaces)" : "")); + } + } } elsif ($check->{'name'} eq 'chassis_environment') { # XXX @@ -286,7 +331,7 @@ sub check_interface { } $plugin->add_perfdata( - label => "$name-input-bytes", + label => "'$name-input-bytes'", value => get_iface_traffic($iface, "input"), min => 0, max => undef, @@ -294,7 +339,7 @@ sub check_interface { threshold => undef, ); $plugin->add_perfdata( - label => "$name-output-bytes", + label => "'$name-output-bytes'", value => get_iface_traffic($iface, "output"), min => 0, max => undef, @@ -379,6 +424,26 @@ sub get_iface_traffic return get_obj_element($iface, "$type-bytes"); } +sub get_iface_first_logical +{ + my $iface = shift; + return $iface->getElementsByTagName('logical-interface')->item(0); +} + +sub get_liface_marker +{ + my $liface = shift; + + my $lag_stats = $liface->getElementsByTagName('lag-traffic-statistics')->item(0); + if (! $lag_stats) { + print STDERR "Cannot get marker for non-LACP interfaces yet!\n"; + return; + } + + my @markers = $lag_stats->getElementsByTagName('lag-marker'); + return @markers; +} + sub add_arg { my $plugin = shift;