#!/usr/bin/perl -wT
#
# check_maxwanstate.pl - nagios plugin 
# 
#
# Copyright (C) 2000 Christoph Kron
#
# 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; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
#
# Report bugs to: ck@zet.net
#
# 11.01.2000 Version 1.0

require 5.004;
use strict;
use lib utils.pm ;
use Plugin;
use Plugin::Parameter qw(:DEFAULT :snmp);

use Net::SNMP;

use vars qw($opt_H $opt_C $opt_p $opt_t $PROGNAME);

use utils qw(%ERRORS);

$p_opt->default(161);
my $plugin = new Plugin(-revision => '$Revision: 1.1.1.1 $',
			-copyright => "2000 Christoph Kron, 2004 Howard Wilkinson <howard\@cohtech.com>",
			-shortcomment => "Perl Check maxwanstate plugin for Nagios. Monitors E1/T1 interface status on Ascend MAX 2000/4000/6000/TNT",
			-parameterlists => [ [ $H_opt, $C_opt, $p_opt, $t_opt ], $h_opts, $V_opts ]);

$plugin->init();

my %wanLineState = (1 => 'ls-unknown',
		    2 => 'ls-does-not-exist',
		    3 => 'ls-disabled',
		    4 => 'ls-no-physical',
		    5 => 'ls-no-logical',
		    6 => 'ls-point-to-point',
		    7 => 'ls-multipoint-1',
		    8 => 'ls-multipoint-2',
		    9 => 'ls-loss-of-sync',
		    10 => 'ls-yellow-alarm',
		    11 => 'ls-ais-receive',
		    12 => 'ls-no-d-channel',
		    13 => 'ls-active',
		    14 => 'ls-maintenance');

my %wanLineType = ('1.3.6.1.4.1.529.4.1' => 'Any',
		   '1.3.6.1.4.1.529.4.2' => 'T1',
		   '1.3.6.1.4.1.529.4.3' => 'E1',
		   '1.3.6.1.4.1.529.4.4' => 'Dpnss',
		   '1.3.6.1.4.1.529.4.5' => 'Bri',
		   '1.3.6.1.4.1.529.4.6' => 'S562',
		   '1.3.6.1.4.1.529.4.7' => 'S564',
		   '1.3.6.1.4.1.529.4.8' => 'Sdsl',
		   '1.3.6.1.4.1.529.4.9' => 'AdslCap');
	
my $snmpWanLineName = '1.3.6.1.4.1.529.4.21.1.2';
my $snmpWanLineType = '1.3.6.1.4.1.529.4.21.1.3';
my $snmpWanLineState = '1.3.6.1.4.1.529.4.21.1.5';
my $snmpWanLineUsage = '1.3.6.1.4.1.529.4.21.1.8';
my @snmpoids = ($snmpWanLineUsage,
		$snmpWanLineState,
		$snmpWanLineName,
		$snmpWanLineType);

my %wanStatus;
my $ifup =0 ;
my $ifdown =0;
my $ifdormant = 0;
my $ifmessage;

my $state = "UNKNOWN";
my $answer = "";

foreach my $snmpoid (@snmpoids) {
  my ($session, $error) = Net::SNMP->session(-hostname  => $opt_H,
					     -community => $opt_C,
					     -port      => $opt_p,
					     -timeout   => $opt_t
					    );
  if (!defined($session)) {
    $state='UNKNOWN';
    $answer=$error;
    print ("$PROGNAME $state: $answer");
    exit $ERRORS{$state};
  }

  my $response = $session->get_table($snmpoid);
  if (!defined $response) {
    $answer=$session->error;
    $session->close;
    $state = 'CRITICAL';
    print ("$PROGNAME $state: $answer, $opt_C, $snmpoid");
    exit $ERRORS{$state};
  }

  foreach my $snmpkey (keys %{$response}) {
    $snmpkey =~ /.*\.(\d+)$/;
    my $key = $1;
    $wanStatus{$key}{$snmpoid} = $response->{$snmpkey};
  }
  $session->close;
}

foreach my $key (keys %wanStatus) {
  # look only at active Interfaces lu-trunk(5)
  if ($wanStatus{$key}{$snmpWanLineUsage} == 5 ) {

    # 13 -> active
    if ($wanStatus{$key}{$snmpWanLineState} == 13 ) {
      $ifup++;
    } else {
      $ifdown++ ;
      $ifmessage .= sprintf("%s interface status : %s (%s)<BR>",
			    $wanLineType{$wanStatus{$key}{$snmpWanLineType}},
			    $wanLineState{$wanStatus{$key}{$snmpWanLineState}},
			    $wanStatus{$key}{$snmpWanLineName});
    }
  }
}
if ($ifdown > 0) {
  $state = 'CRITICAL';
  $answer = sprintf("host '%s', interfaces up: %d, down: %d<BR>",
		    $opt_H,
		    $ifup,
		    $ifdown);
  $answer = $answer . $ifmessage . "\n";
} else {
  $state = 'OK';
  $answer = sprintf("host '%s', interfaces up: %d, down: %d\n",
		    $opt_H,
		    $ifup,
		    $ifdown);
}

print ("$state: $answer");
exit $ERRORS{$state};

