diff --git a/check_emc_clariion/trunk/capacity.cli b/check_emc_clariion/trunk/capacity.cli new file mode 100644 index 0000000..9c23adf --- /dev/null +++ b/check_emc_clariion/trunk/capacity.cli @@ -0,0 +1,2 @@ +show pool capacity +quit diff --git a/check_emc_clariion/trunk/check_emc_centera.pl b/check_emc_clariion/trunk/check_emc_centera.pl new file mode 100644 index 0000000..f7b284f --- /dev/null +++ b/check_emc_clariion/trunk/check_emc_centera.pl @@ -0,0 +1,305 @@ +#!/usr/bin/perl -w + +# ------------------------------------------------------------------------------ +# check_emc_centera.pl - checks the EMC CENTERA storage devices +# Copyright (C) 2008 NETWAYS GmbH, www.netways.de +# Author: Michael Streb +# +# 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. +# $Id: check_emc.pl 1725 2007-07-31 13:11:06Z mstreb $ +# ------------------------------------------------------------------------------ + +# basic requirements +use strict; +use Getopt::Long; +use File::Basename; +use Pod::Usage; +use POSIX; + +# predeclared subs +use subs qw/print_help check_value bool_state trim/; + +# predeclared vars +use vars qw ( + $PROGNAME + $VERSION + $JAVA + $CENTERA_VIEWER + + %state_names + $state + + $opt_host + $opt_user + $opt_pass + $opt_node + $opt_pool + $node_name + $opt_verbose + $opt_help + $opt_checktype + $opt_script + $opt_man + + $output + +); + +my $dummy; + +# Main values +$PROGNAME = basename($0); +$VERSION = '1.1'; +$JAVA = '/usr/bin/java'; +$CENTERA_VIEWER = "/usr/local/nagios/libexec/EMC/CenteraViewer\.jar"; + +# Nagios exit states +our %states = ( + OK => 0, + WARNING => 1, + CRITICAL => 2, + UNKNOWN => 3 +); + +# Nagios state names +%state_names = ( + 0 => 'OK', + 1 => 'WARNING', + 2 => 'CRITICAL', + 3 => 'UNKNOWN' +); + +# Get the options from cl +Getopt::Long::Configure('bundling'); +GetOptions( + 'h' => \$opt_help, + 'H=s' => \$opt_host, + 'u=s' => \$opt_user, + 'p=s' => \$opt_pass, + 'node=s' => \$opt_node, + 'pool=s' => \$opt_pool, + 't=s', => \$opt_checktype, + 'script=s', => \$opt_script, + 'man', => \$opt_man + ) + || print_help( 1, 'Please check your options!' ); + +# If somebody wants to the help ... +if ($opt_help) { + print_help(1); +} +elsif ($opt_man) { + print_help(99); +} + +# Check if all needed options present. +if ( $opt_host && $opt_checktype && $opt_user && $opt_pass && $opt_script) { + # do the work + if ($opt_checktype eq "node_status" && $opt_node ne "") { + check_node_status(); + } + if ($opt_checktype eq "capacity" && $opt_pool ne "") { + check_pool_capacity(); + } + print_help(1, 'Wrong parameters specified!'); +} +else { + + print_help( 1, 'Too few options!' ); +} + +# ------------------------- +# THE SUBS: +# ------------------------- + +# check_node_status(); +# checks the node status of the centera devices +sub check_node_status { + open (VIEWEROUT ,"$JAVA -cp $CENTERA_VIEWER com.filepool.remote.cli.CLI -u $opt_user -p $opt_pass -ip $opt_host -script $opt_script |"); + my $node_line = 0; + my $error_count = 0; + my $access_node = 0; + while () { + chomp $_; + if ($_ =~ m/Node\s+($opt_node)/ ) { + # got an DPE line + $node_line = 1; + $node_name = $1; + $access_node = 0; + next; + } + if ($node_line == 1) { + my $status; + my $roles; + if ($_ =~ m/^\s+Status:\s+(\w+)$/) { + $status = $1; + if ($status =~ m/on/) { + $output = "$node_name: Status $status; "; + } else { + $output = "$node_name: Status $status; "; + $error_count++; + } + } + if ($_ =~ m/Roles:\s+(.*)/) { + $roles = $1; + if ($roles =~ m/access/) { + $output .= "Roles $roles"; + $access_node = 1; + } else { + $output .= "Roles $roles"; + $node_line = 0; + } + if ($access_node) {; + $output .= "; "; + } + } + + if ($access_node) { + if ($_ =~ m/Hardware\sFailures\/Exceptions:\s+\w+:connected/) { + $output .= "access node connected"; + $node_line = 0; + } elsif ($_ =~ m/Hardware\sFailures\/Exceptions:\s+\w+/) { + $output .= "access node NOT connected"; + $node_line = 0; + $error_count++; + } + } + } + } + close (VIEWEROUT); + + if ($error_count == 0 && $output ne "") { + $state = 'OK'; + } elsif ($output eq "" ) { + $output = "UNKNOWN: node $opt_node not found"; + $state = 'UNKNOWN'; + } else { + $state = 'CRITICAL'; + } + print $output."\n"; + exit $states{$state}; + +} + +# check_pool_capacity(); +# checks the node status of the centera devices +sub check_pool_capacity { + open (VIEWEROUT ,"$JAVA -cp $CENTERA_VIEWER com.filepool.remote.cli.CLI -u $opt_user -p $opt_pass -ip $opt_host -script $opt_script |"); + my @values; + while () { + chomp $_; + if ($_ =~ m/^$opt_pool/ ) { + @values = split(/\s+/, $_); + } + } + close (VIEWEROUT); + + # strip out the seperator + $values[1] =~ s/,//g; + $values[3] =~ s/,//g; + $values[5] =~ s/,//g; + + $output = "Pool $opt_pool: Size: $values[1] $values[2], Used: $values[3] $values[4] , Free: $values[5] $values[6]"; + print $output."\n"; + exit $states{'OK'}; + +} + +# print_help($level, $msg); +# prints some message and the POD DOC +sub print_help { + my ( $level, $msg ) = @_; + $level = 0 unless ($level); + pod2usage( + { + -message => $msg, + -verbose => $level + } + ); + + exit( $states{UNKNOWN} ); +} + +1; + +__END__ + +=head1 NAME + +check_emc.pl - Checks EMC SAN devies for NAGIOS. + +=head1 SYNOPSIS + +check_emc.pl -h + +check_emc.pl --man + +check_emc.pl -H -t + +=head1 DESCRIPTION + +B recieves the data from the emc devices via navicli. + +=head1 OPTIONS + +=over 8 + +=item B<-h> + +Display this helpmessage. + +=item B<-H> + +The hostname or ipaddress of the emc centera device. + +=item B<-t> + +The check type to execute: + +the following checks are currently available + +node_status - checks the status of the centera nodes + +capacity - check the drive usage + +=item B<-u> + +administrative user used for the cli connection + +=item B<-p> + +administrative password used for the cli connection + +=item B<--node> + +the cluster node to check (ony used with check type node_status) + +=item B<--script> + +cli script with commands executed on the centera command line + +=cut + +=head1 VERSION + +$Id: check_emc.pl 1725 2008-04-16 13:11:06Z mstreb $ + +=head1 AUTHOR + +NETWAYS GmbH, 2008, http://www.netways.de. + +Written by Michael Streb . + +Please report bugs through the contact of Nagios Exchange, http://www.nagiosexchange.org. diff --git a/check_emc_clariion/trunk/check_emc_clariion.pl b/check_emc_clariion/trunk/check_emc_clariion.pl new file mode 100644 index 0000000..6a063e8 --- /dev/null +++ b/check_emc_clariion/trunk/check_emc_clariion.pl @@ -0,0 +1,679 @@ +#!/usr/bin/perl -w + +# nagios: -epn +# ------------------------------------------------------------------------------ +# check_emc_clariion.pl - checks the EMC CLARIION SAN devices +# Copyright (C) 2005 NETWAYS GmbH, www.netways.de +# Author: Michael Streb +# +# 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. +# $Id$ +# ------------------------------------------------------------------------------ +# + +# basic requirements +use strict; +use Getopt::Long; +use File::Basename; +use Pod::Usage; + +# predeclared subs +use subs qw/print_help check_sp check_disk check_portstate check_hbastate check_cache check_faults/; + +# predeclared vars +use vars qw ( + $PROGNAME + $VERSION + $NAVICLI + $NAVISECCLI + + %state_names + $state + + $opt_host + $opt_sp + $opt_verbose + $opt_help + $opt_checktype + $opt_pathcount + $opt_node + $opt_user + $opt_password + + $output + + $secure + +); + +my $output; + +### add some declaration in order to manage the --port option for check_portstate(); +my $opt_port; +$opt_port=-1; + +# a variable in order to manage the secure mode of Navicli +my $secure; +$secure=0; + +# Main values +$PROGNAME = basename($0); +$VERSION = '1.0'; +$NAVICLI = '/opt/Navisphere/bin/navicli'; +$NAVISECCLI = '/opt/Navisphere/bin/naviseccli'; + +# Nagios exit states +our %states = ( + OK => 0, + WARNING => 1, + CRITICAL => 2, + UNKNOWN => 3 +); + +# Nagios state names +%state_names = ( + 0 => 'OK', + 1 => 'WARNING', + 2 => 'CRITICAL', + 3 => 'UNKNOWN' +); + +# Get the options from cl +Getopt::Long::Configure('bundling'); +GetOptions( + 'h' => \$opt_help, + 'help' => \$opt_help, + 'H=s' => \$opt_host, + 'node=s' => \$opt_node, + 'sp=s' => \$opt_sp, + 't=s' => \$opt_checktype, + 'u=s' => \$opt_user, + 'p=s' => \$opt_password, + 'port=s' => \$opt_port, + 'paths=s' => \$opt_pathcount + ) || print_help(2); + +# If somebody wants to the help ... +if ($opt_help) { + print_help(2); +} +# check if user and password for Naviseccli is given +# If it is providen, then it passes in secure mode for the command to the array. +# else we are staying in navicli mode +if ( $opt_user && $opt_password ) { + $secure = 1; +} + +# Check if all needed options present. +if ( $opt_host && $opt_checktype ) { + # do the work + if ($opt_checktype eq "sp" && $opt_sp ne "") { + check_sp(); + } + if ($opt_checktype eq "disk") { + check_disk(); + } + if ($opt_checktype eq "cache") { + check_cache(); + } + if ($opt_checktype eq "faults") { + check_faults(); + } + if ($opt_checktype eq "portstate" && $opt_sp ne "") { + check_portstate(); + } + if ($opt_checktype eq "hbastate" && $opt_pathcount ne "" && $opt_node ne "") { + check_hbastate(); + } + print_help(1, 'Wrong parameters specified!'); +} +else { + print_help(2); +} + +# ------------------------- +# THE SUBS: +# ------------------------- + +# check_sp(); +# check state of the storage processors +sub check_sp { + if ($secure eq 0 ) { + open (NAVICLIOUT ,"$NAVICLI -h $opt_host getcrus |"); + } + if ($secure eq 1 ) { + open (NAVICLIOUT ,"$NAVISECCLI -User $opt_user -Password $opt_password -Scope 0 -h $opt_host getcrus |"); + } + my $sp_line = 0; + my $error_count = 0; + while () { + if ($_ =~ m/^DPE|^SPE|^DAE/ ) { + # got an DPE line + $sp_line=1; + } + if ($sp_line == 1) { + # check for SP lines + if( $_ =~ m/^SP\s$opt_sp\s\w+:\s+(\w+)/) { + if ($1 =~ m/(Present|Valid)/) { + $output .= "SP $opt_sp $1,"; + } else { + $output .= "SP $opt_sp failed,"; + $error_count++; + } + } + # check for Enclosure lines + if( $_ =~ m/Enclosure\s(\d+|\w+)\s(\w+)\s$opt_sp\d?\s\w+:\s+(.*)/) { + my $check = $2; + if ($3 =~ m/Present|Valid|N\/A|255.255/) { + $output .= "$check ok,"; + } else { + $output .= "$check failed,"; + $error_count++; + } + } + # check for Cabling lines + if( $_ =~ m/Enclosure\s(\d+|\w+)\s\w+\s$opt_sp\s(\w+)\s\w+:\s+(.*)/) { + my $check = $2; + if ($3 =~ m/Present|Valid|N\/A|255.255/) { + $output .= "$check ok,"; + } else { + $output .= "$check failed,"; + $error_count++; + } + } + # end of section + if ( $_ =~ m/^\s*$/) { + $sp_line=0; + } + } + } + close (NAVICLIOUT); + if ($error_count == 0 && $output ne "") { + $state = 'OK'; + } elsif ($output eq "") { + $output = "UNKNOWN: No output from $NAVICLI"; + $state = 'UNKNOWN'; + } else { + $state = 'CRITICAL'; + } + print $output."\n"; + exit $states{$state}; + +} + +# check_disk(); +# check state of the disks +sub check_disk { + my $disk_line = 0; + my $crit_count = 0; + my $warn_count = 0; + my $hotspare_count = 0; + my $disk_ok_count = 0; + my ($bus,$enclosure,$disk) = 0; + $state = 'UNKNOWN'; + if ($secure eq 0 ) { + open (NAVICLIOUT ,"$NAVICLI -h $opt_host getdisk -state |"); + } + if ($secure eq 1 ) { + open (NAVICLIOUT ,"$NAVISECCLI -User $opt_user -Password $opt_password -Scope 0 -h $opt_host getdisk -state |"); + } + while () { + # check for disk lines + if( $_ =~ m/^Bus\s(\d+)\s\w+\s(\d+)\s+\w+\s+(\d+)/) { + $bus = $1; + $enclosure = $2; + $disk = $3; + $disk_line=1; + } + + if ($disk_line == 1) { + # check for States lines + if( $_ =~ m/^State:\s+(.*)$/) { + my $status = $1; + if ($status =~ m/Hot Spare Ready/) { + $hotspare_count++; + $disk_ok_count++; + } elsif ($status =~ m/Binding|Empty|Enabled|Expanding|Unbound|Powering Up|Ready|Transitioning/) { + $disk_ok_count++; + } elsif ($status =~ m/Equalizing|Rebuilding/) { + $warn_count++; + $output .= "Bus $bus, Enclosure $enclosure, Disk $disk is replaced or is being rebuilt, "; + } else { + $crit_count++; + $output .= "Bus $bus, Enclosure $enclosure, Disk $disk is critical, "; + } + } + } + + # end of section + if ( $_ =~ m/^\s*$/) { + $disk_line=0; + } + } + close (NAVICLIOUT); + if ($disk_ok_count eq 0) { + print "No disk were founded !\n"; + $state = 'UNKNOWN'; + } elsif ($crit_count > 0) { + $state='CRITICAL'; + } elsif ($warn_count > 0 || $hotspare_count eq 0) { + $state='WARNING'; + } else { + $state='OK'; + } + $output .= $disk_ok_count." physical disks are OK. ".$hotspare_count." Hotspares are ready."; + print $output."\n"; + exit $states{$state}; +} + +# check_cache(); +# check state of the read and write cache +sub check_cache { + my $read_state = 0; + my $write_state = 0; + my $write_mirrored_state = 0; + my $crit_count = 0; + my $warn_count = 0; + $state = 'UNKNOWN'; + if ($secure eq 0 ) { + open (NAVICLIOUT ,"$NAVICLI -h $opt_host getcache |"); + } + if ($secure eq 1 ) { + open (NAVICLIOUT ,"$NAVISECCLI -User $opt_user -Password $opt_password -Scope 0 -h $opt_host getcache |"); + } + while () { + # check for cache + if( $_ =~ m/^SP Read Cache State\s+(\w+)/) { + $read_state = $1; + if ($read_state =~ m/Enabled/) { + $output .= "Read cache is enable, "; + } else { + $output .= "Read cache is not enable ! "; + $warn_count++; + } + } elsif ( $_ =~ m/^SP Write Cache State\s+(\w+)/) { + $write_state = $1; + if ($write_state =~ m/Enabled/) { + $output .= "Write cache is enable, "; + } else { + $output .= "Write cache is not enable ! "; + $crit_count++; + } + } elsif ( $_ =~ m/^Write Cache Mirrored\:\s+(\w+)/) { + $write_mirrored_state = $1; + if ($write_mirrored_state =~ m/YES/) { + $output .= "Write cache mirroring is enable."; + } else { + $output .= "The Write cache mirroring is not enable !"; + $crit_count++; + } + } + } + close (NAVICLIOUT); + if ( !defined($output) ) { + print "No output from the command getcache !\n"; + $state = 'UNKNOWN'; + exit $states{$state}; + } elsif ($crit_count > 0) { + $state='CRITICAL'; + } elsif ($warn_count > 0 ) { + $state='WARNING'; + } else { + $state='OK'; + } + print $output."\n"; + exit $states{$state}; +} + +# check_faults(); +# check state of the different faults +# only works with naviseccli +sub check_faults { + $state = 'UNKNOWN'; + if ($secure eq 0 ) { + print "The check of the faults only works with Naviseccli. Please provide user and password with -u and -p options !\n"; + exit $states{$state}; + } + if ($secure eq 1 ) { + open (NAVICLIOUT ,"$NAVISECCLI -User $opt_user -Password $opt_password -Scope 0 -h $opt_host Faults -list |"); + } + while () { + # check for faults on the array + if( $_ =~ m/^The array is operating normally/) { + $state='OK'; + $output .= $_ ; + close (NAVICLIOUT); + print $output."\n"; + exit $states{$state}; + } else { + $state='CRITICAL'; + $output .= $_ ; + } + } + close (NAVICLIOUT); + if ( !defined($output) ) { + print "No output from the command Faults -list !\n"; + $state = 'UNKNOWN'; + exit $states{$state}; + } + print $output."\n"; + exit $states{$state}; +} + +# check_portstate(); +# check port state of the sp`s +sub check_portstate { + my $sp_section = 0; + my $sp_line = 0; + my $portstate_line = 0; + my $error_count = -1; + my ($port_id,$enclosure,$disk) = 0; + $state = 'UNKNOWN'; + if ($secure eq 0 ) { + open (NAVICLIOUT ,"$NAVICLI -h $opt_host getall -hba |"); + } + if ($secure eq 1 ) { + open (NAVICLIOUT ,"$NAVISECCLI -User $opt_user -Password $opt_password -Scope 0 -h $opt_host getall -hba |"); + } + while () { + # check for port lines + if ($_ =~ m/SPPORT/ ) { + $sp_section = 1; + } + # check for requested SP + if( $_ =~ m/^SP\sName:\s+SP\s$opt_sp/ ) { + $sp_line = 1; + } + # check for requested port id + if ($opt_port >=0) { + if( $_ =~ m/^SP\sPort\sID:\s+($opt_port)$/) { + $port_id = $1; + $portstate_line = 1; + $error_count = 0; + } + } else { + + ### if( $_ =~ m/^SP\sPort\sID:\s+($opt_port)$/) { + if( $_ =~ m/^SP\sPort\sID:\s+(\d+)$/) { + $port_id = $1; + $portstate_line = 1; + $error_count = 0; + } + } + + if ($sp_section == 1 && $sp_line == 1 && $portstate_line == 1) { + # check for Link line + if( $_ =~ m/^Link\sStatus:\s+(.*)$/) { + my $status = $1; + if ($status =~ m/Up/) { + $output .= "SP $opt_sp Port: $port_id, Link: $status, "; + } else { + $output .= "SP $opt_sp Port: $port_id, Link: $status, "; + $error_count++; + } + } + # check for Link line + ### check for Port line + if( $_ =~ m/^Port\sStatus:\s+(.*)$/) { + my $status = $1; + if ($status =~ m/Online/) { + $output .= "State: $status, "; + } else { + $output .= "State: $status, "; + $error_count++; + } + } + # check for Connection Type + if( $_ =~ m/^Connection\sType:\s+(.*)$/) { + my $type = $1; + $output .= "Connection Type: $type. "; + } + # end of section + if ( $_ =~ m/^\s*$/) { + $portstate_line = 0; + ### $sp_section = 0; + if ($opt_port >=0 ) { + $sp_section = 0; + } + $sp_line = 0; + } + } + } + close (NAVICLIOUT); + if ($error_count == 0) { + $state='OK'; + } elsif ($error_count == -1) { + $state='UNKNOWN'; + $output = 'UNKNOWN: specified port not found '.$opt_port; + } else { + $state='CRITICAL'; + } + + print $output."\n"; + exit $states{$state}; +} + +# check_hbastate(); +# check hba and path states for specific client +sub check_hbastate { + $state = 'UNKNOWN'; + my $hba_node; + my $hba_node_line = 0; + my $hba_section = 0; + my $hba_port_section = 0; + my $hba_port_count = 0; + my $hba_uid = ""; + my $error_count = 0; + my $output = ""; + if ($secure eq 0 ) { + open (NAVICLIOUT ,"$NAVICLI -h $opt_host getall -hba |"); + } + if ($secure eq 1 ) { + open (NAVICLIOUT ,"$NAVISECCLI -User $opt_user -Password $opt_password -Scope 0 -h $opt_host getall -hba |"); + } + while () { + if ($_ =~ m/Information\sabout\seach\sHBA/) { + $hba_section = 1; + $hba_port_section = 0; + $hba_node_line = 0; + } + if ($hba_section == 1) { + if ($_ =~ m/^HBA\sUID:\s+((\w+:?)+)/i) { + $hba_uid=$1; + } + if ($_ =~ m/^Server\sName:\s+($opt_node)/i) { + $hba_node = $1; + $hba_node_line = 1; + } + if ($_ =~ m/Information\sabout\seach\sport\sof\sthis\sHBA/) { + $hba_section = 0; + $hba_port_section = 1; + } + } + + + if ($hba_port_section && $hba_node_line) { + if ($_ =~ m/SP\sName:\s+(\w+\s+\w+)/) { + $output .= "$hba_uid connected to: $1, "; + } + if ($_ =~ m/SP\sPort\sID:\s+(\d+)/) { + $output .= "port: $1, "; + } + if ($_ =~ m/Logged\sIn:\s+(YES)/) { + $output .= "Logged in: $1; "; + $hba_port_count++; + } elsif ($_ =~ m/Logged\sIn:\s+(\w+)/) { + $output .= "Logged in: $1;
"; + $error_count++; + } + } + } + close (NAVICLIOUT); + + + if ($error_count == 0 && $hba_port_count == $opt_pathcount) { + $state='OK'; + } elsif (lc($opt_node) ne lc($hba_node) ) { + $state='UNKNOWN'; + $output = 'UNKNOWN: specified node not found '.$opt_node; + } elsif ($hba_port_count != $opt_pathcount) { + $output .= " error in pathcount from client to SAN: suggested $opt_pathcount detected $hba_port_count"; + $state='CRITICAL'; + } elsif ($error_count != 0 && $hba_port_count == $opt_pathcount) { + $output .= " Error in Configuration, one path not connected !"; + $state='CRITICAL'; + } + + print $opt_node."
".$output."\n"; + exit $states{$state}; +} + +# print_help($level, $msg); +# prints some message and the POD DOC +sub print_help { + my ( $level, $msg ) = @_; + $level = 0 unless ($level); + pod2usage( + { + -message => $msg, + -verbose => $level, + -noperldoc => 1 + } + ); + + exit( $states{UNKNOWN} ); +} + +1; + +__END__ + +=head1 NAME + +check_emc_clariion.pl - Checks EMC SAN devices for NAGIOS. + + +=head1 SYNOPSIS + +check_emc_clariion.pl -h | --help + +check_emc_clariion.pl -H -t + +check_emc_clariion.pl -H -u -p -t + + +=head1 DESCRIPTION + +B receives the data from the emc devices via Navicli or Naviseccli if user and password are provided. + + +=head1 OPTIONS + +=over 8 + +=item B<-h> + +Display this helpmessage. + +=item B<-H> + +The hostname or ipaddress of the emc storage processor device. + +=item B<-u> + +The user used to connect to the emc storage processor device with Naviseccli. +You must use this option with -password ! + +=item B<-p> + +The password of the user used to connect to the emc storage processor device with Naviseccli. + +=item B<-t> + +The check type to execute: + +=back + +=head2 TYPES + +the following checks are currently available + +sp - check the status of the storage processors + +disk - check the status of the physical disks attached in the DAE`s + +cache - check the status of the read and write cache + +faults - Report the different faults on the array + +portstate - check the status of the FC ports in the SP`s + +hbastate - check the connection state of the specified node + +=head3 TYPE OPTIONS + +=head4 sp + +=over 8 + +=item B<--sp> + +The storageprocessor to check e.g. A or B + +=back + +=head4 portstate + +=over 8 + +=item B<--sp> + +The storageprocessor to check e.g. A or B + +=item B<--port> + +The port ID to check e.g. 0 or 1 or 0, 1, 2 or 3 for Clariion CX3-80 + +- if not specified, all ports are checked + +=back + +=head4 hbastate + +=over 8 + +=item B<--node> + +The node name to check out of navisphere + +=item B<--paths> + +The number of available FC Paths from the client to the SAN Infrastructure e.g. 2 + +=cut + +=back + +=head1 VERSION + +$Id$ + +=head1 AUTHOR + +NETWAYS GmbH, 2008, http://www.netways.de. + +Written by Michael Streb . + +Please report bugs through the contact of Nagios Exchange, http://www.nagiosexchange.org. diff --git a/check_emc_clariion/trunk/checkcommands.cfg b/check_emc_clariion/trunk/checkcommands.cfg new file mode 100644 index 0000000..c021e54 --- /dev/null +++ b/check_emc_clariion/trunk/checkcommands.cfg @@ -0,0 +1,12 @@ +define command{ + command_name check_emc_sp + command_line $USER1$/check_emc_clariion.pl -H $HOSTADDRESS$ -t sp --sp $ARG1$ +} +define command{ + command_name check_emc_disk + command_line $USER1$/check_emc_clariion.pl -H $HOSTADDRESS$ -t disk +} +define command{ + command_name check_emc_port + command_line $USER1$/check_emc_clariion.pl -H $HOSTADDRESS$ -t portstate --port $ARG1$ +} diff --git a/check_emc_clariion/trunk/status.cli b/check_emc_clariion/trunk/status.cli new file mode 100644 index 0000000..d106552 --- /dev/null +++ b/check_emc_clariion/trunk/status.cli @@ -0,0 +1,4 @@ +show node detail all +yes +yes +quit diff --git a/check_snmp_interfaces/trunk/check_snmp_cisco_ifstatus b/check_snmp_interfaces/trunk/check_snmp_cisco_ifstatus new file mode 100755 index 0000000..76428b1 --- /dev/null +++ b/check_snmp_interfaces/trunk/check_snmp_cisco_ifstatus @@ -0,0 +1,778 @@ +#!/usr/bin/perl +# +# +# AUTHORS: +# Copyright (C) 2003-2010 Opsera Limited. All rights reserved +# +# This file is part of Opsview +# +# Opsview 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. +# +# Opsview 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 Opsview; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +use lib qw ( /usr/local/nagios/perl/lib ); +use Net::SNMP; +use Getopt::Std; + +$script = "check_snmp_cisco_ifstatus"; +$script_version = "2.1.0"; + +# SNMP options +$version = "2c"; +$timeout = 2; + +$number_of_interfaces = 0; +$target_interface_index = 0; + +@list_interfaces=undef; # List of inappropriate interfaces; + +$oid_base = ".1.3.6.1.2.1.2.2.1.1."; +$oid_sysdescr = ".1.3.6.1.2.1.1.1.0"; +$oid_ifnumber = ".1.3.6.1.2.1.2.1.0"; # number of interfaces on device +$oid_ifdescr = ".1.3.6.1.2.1.2.2.1.2."; # need to append integer for specific interface +$oid_iftype = ".1.3.6.1.2.1.2.2.1.3."; # need to append integer for specific interface +$oid_ifmtu = ".1.3.6.1.2.1.2.2.1.4."; # need to append integer for specific interface +$oid_ifspeed = ".1.3.6.1.2.1.2.2.1.5."; # need to append integer for specific interface +$oid_ifphysaddress = ".1.3.6.1.2.1.2.2.1.6."; # need to append integer for specific interface +$oid_ifadminstatus = ".1.3.6.1.2.1.2.2.1.7."; # need to append integer for specific interface +$oid_ifoperstatus = ".1.3.6.1.2.1.2.2.1.8."; # need to append integer for specific interface +$oid_iflastchange = ".1.3.6.1.2.1.2.2.1.9."; # need to append integer for specific interface +$oid_ifinerrors = ".1.3.6.1.2.1.2.2.1.14."; # need to append integer for specific interface +$oid_ifouterrors = ".1.3.6.1.2.1.2.2.1.20."; # need to append integer for specific interface +$oid_ifoutqlen = ".1.3.6.1.2.1.2.2.1.21."; # need to append integer for specific interface +my $realbitssec; # Perf data is always in bps, save this data here + +# Cisco Specific + +$oid_locIfIntBitsSec = "1.3.6.1.4.1.9.2.2.1.1.6."; # need to append integer for specific interface +$oid_locIfOutBitsSec = "1.3.6.1.4.1.9.2.2.1.1.8."; # need to append integer for specific interface + +$ifdescr = "n/a"; +$iftype = "n/a"; +$ifmtu = "n/a"; +$ifspeed = "n/a"; +$ifphysaddress = "n/a"; +$ifadminstatus = "n/a"; +$ifoperstatus = "n/a"; +$iflastchange = "n/a"; +$ifinerrors = "n/a"; +$ifouterrors = "n/a"; +$ifoutqlen = "n/a"; +$ifoutbitssec = "n/a"; + +$warning = 100000000; # Warning threshold +$critical = 100000000; # Critical threshold + +$hostname = "192.168.10.21"; + +#$hostname = "212.113.28.134"; +$returnstring = ""; + +$community = "public"; # Default community string +$configfilepath = "/usr/local/nagios/etc"; + +# Do we have enough information? +if ( @ARGV < 1 ) { + print "Too few arguments\n"; + usage(); +} + +getopts("hH:C:i:w:c:"); +if ($opt_h) { + usage(); + exit(0); +} +if ($opt_H) { + $hostname = $opt_H; + + # print "Hostname $opt_H\n"; +} +else { + print "No hostname specified\n"; + usage(); + exit(0); +} +if ($opt_C) { + $community = $opt_C; +} +if ($opt_i) { + $target_interface = $opt_i; +} +if ($opt_w) { + $warning = $opt_w; +} +if ($opt_c) { + $critical = $opt_c; +} +else { + + # print "Using community $community\n"; +} + +# Create the SNMP session + +$oid_sysDescr = ".1.3.6.1.2.1.1.1.0"; # Used to check whether SNMP is actually responding + +$version = "1"; +( $s, $e ) = Net::SNMP->session( + -community => $community, + -hostname => $hostname, + -version => $version, + -timeout => $timeout, +); + +if ( !defined( $s->get_request($oid_sysDescr) ) ) { + + # If we can't connect using SNMPv1 lets try as SNMPv2 + $s->close(); + sleep 0.5; + $version = "2c"; + ( $s, $e ) = Net::SNMP->session( + -community => $community, + -hostname => $hostname, + -version => $version, + -timeout => $timeout, + ); + if ( !defined( $s->get_request($oid_sysDescr) ) ) { + print "Agent not responding, tried SNMP v1 and v2\n"; + exit(1); + } +} + +if ( find_match() == 0 ) { + probe_interface(); +} +else { + $status = 2; + print "Interface $target_interface not found on device $hostname\n"; + exit $status; +} + +# Close the session +$s->close(); + +if ( $status == 0 ) { + print "Status is OK - $returnstring\n"; + exit $status; +} +elsif ( $status == 1 ) { + print "Status is a Warning Level - $returnstring\n"; + exit $status; +} +elsif ( $status == 2 ) { + print "Status is CRITICAL - $returnstring\n"; + exit $status; +} +else { + print "Plugin error! SNMP status unknown\n"; + exit $status; +} + +exit 2; + +################################################# +# Finds match for supplied interface name +################################################# + +sub find_match { + +my $resultat = $s->get_table($oid_base); + +if (!defined($resultat)) { + printf("ERROR: NHR table : %s.\n", $s->error); + $s->close; + exit 3; +} + +my @keys=undef; +my $oidindex=0; +foreach my $key ( keys %$resultat) { + #verb("OID : $key, Desc : $$resultat{$key}" ); + #print $$resultat{$key} + "\n"; + $key =~ s/$oid_base//; + push(@keys, $key); + #print "$key \n"; +} + +#print $resultat ; +#exit 0; + + + if ( !defined( $s->get_request($oid_ifnumber) ) ) { + if ( !defined( $s->get_request($oid_sysdescr) ) ) { + print "Status is a Warning Level - SNMP agent not responding\n"; + exit 1; + } + else { + print "Status is a Warning Level - SNMP OID does not exist\n"; + exit 1; + } + } + else { + foreach ( $s->var_bind_names() ) { + $number_of_interfaces = $s->var_bind_list()->{$_}; + if ( $number_of_interfaces == 0 ) { + return 1; + } + } + } + + #$index = 1; + #while ( $index <= $number_of_interfaces ) { + foreach $index ( @keys ) { + my $target_interface_index = $index; + $oid_temp = $oid_ifdescr . $index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $temp_interface_descr = $s->var_bind_list()->{$_}; + } + if ( lc($temp_interface_descr) eq lc($target_interface) ) { + $target_interface_index = $index; + } + } + + ############################ + $oid_temp = $oid_ifadminstatus . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $ifadminstatus = $s->var_bind_list()->{$_}; + } + } + ############################ + + $oid_temp = $oid_ifoperstatus . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $ifoperstatus = $s->var_bind_list()->{$_}; + } + } + ############################ + if ( $ifoperstatus != $ifadminstatus ) { + push(@list_interfaces, $temp_interface_descr); + #print ": $temp_interface_descr: $ifoperstatus / $ifadminstatus \n"; + } + + + + # $index++; + } + my $list_interfaces = @list_interfaces; + my $keys = @keys; + if ($list_interfaces > 0) { + print "$list_interfaces out of $keys in inappropriate state: @list_interfaces \n"; + exit 1 + } + else { + print "All $keys interfaces in appropriate state\n"; + exit 0 + } + print "@list_interfaces \n"; + if ( $target_interface_index == 0 ) { + return 1; + } + else { + return 0; + } +} + +#################################################################### +# Gathers data about target interface # +#################################################################### + +sub probe_interface { + + $oid_temp = $oid_ifdescr . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $ifdescr = $s->var_bind_list()->{$_}; + } + } + ############################ + + $oid_temp = $oid_iftype . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $iftype = $s->var_bind_list()->{$_}; + } + } + ############################ + + $oid_temp = $oid_ifmtu . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $ifmtu = $s->var_bind_list()->{$_}; + } + } + ############################ + + $oid_temp = $oid_ifspeed . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $ifspeed = $s->var_bind_list()->{$_}; + } + } + ############################ + + $oid_temp = $oid_ifadminstatus . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $ifadminstatus = $s->var_bind_list()->{$_}; + } + } + ############################ + + $oid_temp = $oid_ifoperstatus . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $ifoperstatus = $s->var_bind_list()->{$_}; + } + } + ############################ + + $oid_temp = $oid_iflastchange . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $iflastchange = $s->var_bind_list()->{$_}; + } + } + ############################ + + $oid_temp = $oid_ifinerrors . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $ifinerrors = $s->var_bind_list()->{$_}; + } + } + ############################ + + $oid_temp = $oid_ifouterrors . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $ifouterrors = $s->var_bind_list()->{$_}; + } + } + ############################ + + $oid_temp = $oid_ifoutqlen . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + } + else { + foreach ( $s->var_bind_names() ) { + $ifoutqlen = $s->var_bind_list()->{$_}; + } + } + ############################ + + $oid_temp = $oid_locIfOutBitsSec . $target_interface_index; + if ( !defined( $s->get_request($oid_temp) ) ) { + $ifoutbitssec = -1; + } + else { + foreach ( $s->var_bind_names() ) { + $ifoutbitssec = $s->var_bind_list()->{$_}; + } + } + ############################ + + $errorstring = ""; + + # Sets warning / critical levels if interface down + + if ( $ifadminstatus eq "1" ) { + } + else { + $status = 1; + $errorstring = "INTERFACE ADMINISTRATIVELY DOWN:"; + } + + if ( $ifoperstatus eq "1" ) { + } + else { + $status = 2; + $errorstring = "INTERFACE DOWN:"; + } + + # Sets warning / critical levels if ifoutbitssec exceeds threshold + + if ( $status < 1 ) { + + # Don't bother is status is down + if ( $ifoutbitssec > $critical ) { + $errorstring = "HIGH THROUGHPUT:"; + $status = 2; + } + elsif ( $ifoutbitssec > $warning ) { + $errorstring = "HIGH THROUGHPUT:"; + $status = 1; + } + } + + # Mangles interface speed + + my $mbps = $ifspeed / 1000000; + if ( $mbps < 1 ) { + $ifspeed = $ifspeed / 1000; + $ifspeed = "$ifspeed Kbps"; + } + else { + $ifspeed = "$mbps Mbps"; + } + + $realbitssec = $ifoutbitssec; + + # Mangles IfOutBitsSec stat to bits / kbits + if ( $ifoutbitssec > 0 ) { + my $mbps = $ifoutbitssec / 1000000; + if ( $mbps < 1 ) { + $ifoutbitssec = $ifoutbitssec / 1000; + $ifoutbitssec = "$ifoutbitssec Kbps"; + } + else { + $ifoutbitssec = "$mbps Mbps"; + } + } + elsif ( $ifoutbitssec < 0 ) { + $ifoutbitssec = "N/A"; + } + else { + $ifoutbitssec = "0 bps"; + } + + # Returns string relating to interface media + my $iftype_string = return_interfacetype($iftype); + + if ( $status == 0 ) { + $temp = sprintf "$ifdescr ($iftype_string) - Current: $ifoutbitssec, Limit: $ifspeed, MTU: $ifmtu, Last change: $iflastchange, STATS:(in errors: $ifinerrors, out errors: $ifouterrors, queue length: $ifoutqlen)"; + append($temp); + } + else { + $temp = sprintf "$errorstring $ifdescr ($iftype_string) - Current: $ifoutbitssec, Limit: $ifspeed, MTU: $ifmtu, Last change: $iflastchange, STATS:(in errors: $ifinerrors, out errors: $ifouterrors, queue length: $ifoutqlen)"; + append($temp); + } + $perfinfo = sprintf "|bits/sec=$realbitssec"; + append($perfinfo); +} + +#################################################################### +# help and usage information # +#################################################################### + +sub usage { + print << "USAGE"; +-------------------------------------------------------------------- +$script v$script_version + +Monitors status of specific Ethernet interface. + +Usage: $script -H -c [...] + +Options: -H Hostname or IP address + -C Community (default is public) + -i Target interface name + Eg: Serial0/0, FastEthernet0/12 + -w Warning threshold - Out bits / sec + -c Critical threshold - Out bits / sec + +-------------------------------------------------------------------- +Copyright (C) 2003-2010 Opsera Limited. All rights reserved + +This program is free software; you can redistribute it or modify +it under the terms of the GNU General Public License +-------------------------------------------------------------------- + +USAGE + exit 1; +} + +#################################################################### +# Appends string to existing $returnstring # +#################################################################### + +sub append { + my $appendstring = @_[0]; + $returnstring = "$returnstring$appendstring"; +} + +#################################################################### +# Returns the interface type for given IANA metric # +#################################################################### + +sub return_interfacetype { + my $iftype_int = @_[0]; + my @iana = (); + my $returnstring = $iftype_int; + + $iana[0] = ""; + $iana[1] = "other"; + $iana[2] = "regular1822"; + $iana[3] = "hdh1822"; + $iana[4] = "ddnX25"; + $iana[5] = "rfc877x25"; + $iana[6] = "ethernet"; + $iana[7] = ""; + $iana[8] = "TokenBus"; + $iana[9] = "TokenRing"; + $iana[10] = "iso88026Man"; + $iana[11] = "starLan"; + $iana[12] = "proteon10Mbit"; + $iana[13] = "proteon80Mbit"; + $iana[14] = "hyperchannel"; + $iana[15] = "fddi"; + $iana[16] = "lapb"; + $iana[17] = "sdlc"; + $iana[18] = "DSL"; + $iana[19] = "E1"; + $iana[20] = "basicISDN"; + $iana[21] = "primaryISDN"; + $iana[22] = "propritory PointToPointSerial"; + $iana[23] = "PPP"; + $iana[24] = "softwareLoopback"; + $iana[25] = "CLNP over IP "; + $iana[26] = "ethernet3Mbit"; + $iana[27] = "XNS over IP"; + $iana[28] = "SLIP"; + $iana[29] = "ultra"; + $iana[30] = "DS3"; + $iana[31] = "SMDS"; + $iana[32] = "frameRelay DTE"; + $iana[33] = "RS232"; + $iana[34] = "Parallel port"; + $iana[35] = "arcnet"; + $iana[36] = "arcnetPlus"; + $iana[37] = "ATM"; + $iana[38] = "miox25"; + $iana[39] = "SONET / SDH "; + $iana[40] = "X25PLE"; + $iana[41] = "iso88022llc"; + $iana[42] = "localTalk"; + $iana[43] = "SMDSDxi"; + $iana[44] = "frameRelayService"; + $iana[45] = "v35"; + $iana[46] = "hssi"; + $iana[47] = "hippi"; + $iana[48] = "Generic MODEM"; + $iana[49] = ""; + $iana[50] = "sonetPath"; + $iana[51] = "sonetVT"; + $iana[52] = "SMDSIcip"; + $iana[53] = "propVirtual"; + $iana[54] = "propMultiplexor"; + $iana[55] = "ieee80212 100BaseVG"; + $iana[56] = "fibreChannel"; + $iana[57] = "HIPPI interface"; + $iana[58] = ""; + $iana[59] = "ATM Emulated LAN for 802.3"; + $iana[60] = "ATM Emulated LAN for 802.5"; + $iana[61] = "ATM Emulated circuit "; + $iana[62] = ""; + $iana[63] = "ISDN / X.25 "; + $iana[64] = "CCITT V.11/X.21 "; + $iana[65] = "CCITT V.36 "; + $iana[66] = "CCITT G703 at 64Kbps"; + $iana[67] = "G703 at 2Mb"; + $iana[68] = "SNA QLLC "; + $iana[69] = ""; + $iana[70] = "channel "; + $iana[71] = "ieee80211 radio spread spectrum "; + $iana[72] = "IBM System 360/370 OEMI Channel"; + $iana[73] = "IBM Enterprise Systems Connection"; + $iana[74] = "Data Link Switching"; + $iana[75] = "ISDN S/T interface"; + $iana[76] = "ISDN U interface"; + $iana[77] = "Link Access Protocol D"; + $iana[78] = "IP Switching Objects"; + $iana[79] = "Remote Source Route Bridging"; + $iana[80] = "ATM Logical Port"; + $iana[81] = "Digital Signal Level 0"; + $iana[82] = "ds0 Bundle (group of ds0s on the same ds1)"; + $iana[83] = "Bisynchronous Protocol"; + $iana[84] = "Asynchronous Protocol"; + $iana[85] = "Combat Net Radio"; + $iana[86] = "ISO 802.5r DTR"; + $iana[87] = "Ext Pos Loc Report Sys"; + $iana[88] = "Appletalk Remote Access Protocol"; + $iana[89] = "Proprietary Connectionless Protocol"; + $iana[90] = "CCITT-ITU X.29 PAD Protocol"; + $iana[91] = "CCITT-ITU X.3 PAD Facility"; + $iana[92] = "frameRelay MPI"; + $iana[93] = "CCITT-ITU X213"; + $iana[94] = "ADSL"; + $iana[95] = "Rate-Adapt. DSL"; + $iana[96] = "SDSL"; + $iana[97] = "Very High-Speed DSL"; + $iana[98] = "ISO 802.5 CRFP"; + $iana[99] = "Myricom Myrinet"; + $iana[100] = "voiceEM voice recEive and transMit"; + $iana[101] = "voiceFXO voice Foreign Exchange Office"; + $iana[102] = "voiceFXS voice Foreign Exchange Station"; + $iana[103] = "voiceEncap voice encapsulation"; + $iana[104] = "VoIP"; + $iana[105] = "ATM DXI"; + $iana[106] = "ATM FUNI"; + $iana[107] = "ATM IMA"; + $iana[108] = "PPP Multilink Bundle"; + $iana[109] = "IBM ipOverCdlc"; + $iana[110] = "IBM Common Link Access to Workstn"; + $iana[111] = "IBM stackToStack"; + $iana[112] = "IBM VIPA"; + $iana[113] = "IBM multi-protocol channel support"; + $iana[114] = "IBM IP over ATM"; + $iana[115] = "ISO 802.5j Fiber Token Ring"; + $iana[116] = "IBM twinaxial data link control"; + $iana[117] = ""; + $iana[118] = "HDLC"; + $iana[119] = "LAP F"; + $iana[120] = "V.37"; + $iana[121] = "X25 Multi-Link Protocol"; + $iana[122] = "X25 Hunt Group"; + $iana[123] = "Transp HDLC"; + $iana[124] = "Interleave channel"; + $iana[125] = "Fast channel"; + $iana[126] = "IP (for APPN HPR in IP networks)"; + $iana[127] = "CATV Mac Layer"; + $iana[128] = "CATV Downstream interface"; + $iana[129] = "CATV Upstream interface"; + $iana[130] = "Avalon Parallel Processor"; + $iana[131] = "Encapsulation interface"; + $iana[132] = "Coffee pot (no, really)"; + $iana[133] = "Circuit Emulation Service"; + $iana[134] = "ATM Sub Interface"; + $iana[135] = "Layer 2 Virtual LAN using 802.1Q"; + $iana[136] = "Layer 3 Virtual LAN using IP"; + $iana[137] = "Layer 3 Virtual LAN using IPX"; + $iana[138] = "IP over Power Lines"; + $iana[139] = "Multimedia Mail over IP"; + $iana[140] = "Dynamic Synchronous Transfer Mode"; + $iana[141] = "Data Communications Network"; + $iana[142] = "IP Forwarding Interface"; + $iana[143] = "Multi-rate Symmetric DSL"; + $iana[144] = "IEEE1394 High Performance Serial Bus"; + $iana[145] = "HIPPI-6400 "; + $iana[146] = "DVB-RCC MAC Layer"; + $iana[147] = "DVB-RCC Downstream Channel"; + $iana[148] = "DVB-RCC Upstream Channel"; + $iana[149] = "ATM Virtual Interface"; + $iana[150] = "MPLS Tunnel Virtual Interface"; + $iana[151] = "Spatial Reuse Protocol"; + $iana[152] = "Voice Over ATM"; + $iana[153] = "Voice Over Frame Relay "; + $iana[154] = "Digital Subscriber Loop over ISDN"; + $iana[155] = "Avici Composite Link Interface"; + $iana[156] = "SS7 Signaling Link "; + $iana[157] = "Prop. P2P wireless interface"; + $iana[158] = "Frame Forward Interface"; + $iana[159] = "Multiprotocol over ATM AAL5"; + $iana[160] = "USB Interface"; + $iana[161] = "IEEE 802.3ad Link Aggregate"; + $iana[162] = "BGP Policy Accounting"; + $iana[163] = "FRF .16 Multilink Frame Relay "; + $iana[164] = "H323 Gatekeeper"; + $iana[165] = "H323 Voice and Video Proxy"; + $iana[166] = "MPLS"; + $iana[167] = "Multi-frequency signaling link"; + $iana[168] = "High Bit-Rate DSL - 2nd generation"; + $iana[169] = "Multirate HDSL2"; + $iana[170] = "Facility Data Link 4Kbps on a DS1"; + $iana[171] = "Packet over SONET/SDH Interface"; + $iana[172] = "DVB-ASI Input"; + $iana[173] = "DVB-ASI Output "; + $iana[174] = "Power Line Communtications"; + $iana[175] = "Non Facility Associated Signaling"; + $iana[176] = "TR008"; + $iana[177] = "Remote Digital Terminal"; + $iana[178] = "Integrated Digital Terminal"; + $iana[179] = "ISUP"; + $iana[180] = "Cisco proprietary MAC layer"; + $iana[181] = "Cisco proprietary Downstream"; + $iana[182] = "Cisco proprietary Upstream"; + $iana[183] = "HIPERLAN Type 2 Radio Interface"; + $iana[184] = "PropBroadbandWirelessAccesspt2multipt"; + $iana[185] = "SONET Overhead Channel"; + $iana[186] = "Digital Wrapper"; + $iana[187] = "ATM adaptation layer 2"; + $iana[188] = "MAC layer over radio links"; + $iana[189] = "ATM over radio links "; + $iana[190] = "Inter Machine Trunks"; + $iana[191] = "Multiple Virtual Lines DSL"; + $iana[192] = "Long Reach DSL"; + $iana[193] = "Frame Relay DLCI End Point"; + $iana[194] = "ATM VCI End Point"; + $iana[195] = "Optical Channel"; + $iana[196] = "Optical Transport"; + $iana[197] = "Proprietary ATM "; + $iana[198] = "Voice Over Cable Interface"; + $iana[199] = "Infiniband"; + $iana[200] = "TE Link"; + $iana[201] = "Q.2931"; + $iana[202] = "Virtual Trunk Group"; + $iana[203] = "SIP Trunk Group"; + $iana[204] = "SIP Signaling "; + $iana[205] = "CATV Upstream Channel"; + $iana[206] = "Acorn Econet"; + $iana[207] = "FSAN 155Mb Symetrical PON interface"; + $iana[208] = "FSAN622Mb Symetrical PON interface"; + $iana[209] = "Transparent bridge interface"; + $iana[210] = "Interface common to multiple lines"; + $iana[211] = "voice E&M Feature Group D"; + $iana[212] = "voice FGD Exchange Access North American"; + $iana[213] = "voice Direct Inward Dialing"; + $iana[214] = "MPEG transport interface"; + $iana[215] = "6to4 interface"; + $iana[216] = "GTP (GPRS Tunneling Protocol)"; + $iana[217] = "Paradyne EtherLoop 1"; + $iana[218] = "Paradyne EtherLoop 2"; + $iana[219] = "Optical Channel Group"; + $iana[220] = "HomePNA ITU-T G.989"; + $iana[221] = "Generic Framing Procedure (GFP)"; + $iana[222] = "Layer 2 Virtual LAN using Cisco ISL"; + $iana[223] = "Acteleis proprietary MetaLOOP High Speed Link "; + $iana[224] = "FCIP Link "; + $iana[225] = "Resilient Packet Ring Interface Type"; + $iana[226] = "RF Qam Interface"; + $iana[227] = "Link Management Protocol"; + + if ( $iftype_int > 227 ) { + $returnstring = "$iftype_int"; + } + else { + $returnstring = $iana[$iftype_int]; + } + + return ($returnstring); + +}