check_maxchannels.pl 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #!/usr/bin/perl -w
  2. #
  3. # check_maxchannels.pl - nagios plugin
  4. #
  5. #
  6. # Copyright (C) 2000 Christoph Kron
  7. #
  8. # This program is free software; you can redistribute it and/or
  9. # modify it under the terms of the GNU General Public License
  10. # as published by the Free Software Foundation; either version 2
  11. # of the License, or (at your option) any later version.
  12. #
  13. # This program is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. # GNU General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU General Public License
  19. # along with this program; if not, write to the Free Software
  20. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21. #
  22. #
  23. # Report bugs to: ck@zet.net
  24. #
  25. # 11.01.2000 Version 1.0
  26. use strict;
  27. use Net::SNMP;
  28. use Getopt::Long;
  29. &Getopt::Long::config('auto_abbrev');
  30. my $status;
  31. my $TIMEOUT = 15;
  32. my %ERRORS = ('UNKNOWN' , '-1',
  33. 'OK' , '0',
  34. 'WARNING', '1',
  35. 'CRITICAL', '2');
  36. my $state = "UNKNOWN";
  37. my $answer = "";
  38. my $snmpkey;
  39. my $snmpoid;
  40. my $key;
  41. my $community = "public";
  42. my $port = 161;
  43. my @snmpoids;
  44. # free channels
  45. my $snmpWanAvailableChannels = '1.3.6.1.4.1.529.4.23.0';
  46. # maximum channels
  47. my $snmpWanSwitchedChannels = '1.3.6.1.4.1.529.4.24.0';
  48. my $snmpWanDisabledChannels = '1.3.6.1.4.1.529.4.25.0';
  49. my $snmpWanActiveChannels = '1.3.6.1.4.1.529.4.26.0';
  50. my $snmpWanNailedChannels = '1.3.6.1.4.1.529.4.27.0';
  51. my $snmpWanOutOfServiceChannels = '1.3.6.1.4.1.529.4.28.0';
  52. my $snmpEventCurrentActiveSessions = '1.3.6.1.4.1.529.10.6.0';
  53. # since startup
  54. my $snmpEventTotalNoModems = '1.3.6.1.4.1.529.10.15.0';
  55. # lan modem
  56. my $snmpDeadLanModem = '1.3.6.1.4.1.529.15.7.0';
  57. my $snmpDisabledLanModem = '1.3.6.1.4.1.529.15.5.0';
  58. my $snmpSuspectLanModem = '1.3.6.1.4.1.529.15.3.0';
  59. my $snmpAvailLanModem = '1.3.6.1.4.1.529.15.1.0';
  60. my $snmpBusyLanModem = '1.3.6.1.4.1.529.15.9.0';
  61. # max modems
  62. my $snmpMdmNumber = '1.3.6.1.2.1.38.1.1.0';
  63. my $hostname;
  64. my $session;
  65. my $error;
  66. my $response;
  67. my %wanStatus;
  68. my $WanAvailableChannels;
  69. my $WanSwitchedChannels;
  70. my $WanDisabledChannels;
  71. my $WanActiveChannels;
  72. my $WanNailedChannels;
  73. my $WanOutOfServiceChannels;
  74. my $EventCurrentActiveSessions;
  75. my $EventTotalNoModems;
  76. my $DeadLanModem;
  77. my $DisabledLanModem;
  78. my $SuspectLanModem;
  79. my $AvailLanModem;
  80. my $BusyLanModem;
  81. my $MdmNumber;
  82. sub usage {
  83. printf "\nMissing arguments!\n";
  84. printf "\n";
  85. printf "Perl Check maxchannels plugin for Nagios\n";
  86. printf "monitors ISDN lines and modems on Ascend MAX 2000/4000/6000/TNT\n";
  87. printf "usage: \n";
  88. printf "check_maxchannel.pl -c <READCOMMUNITY> -p <PORT> <HOSTNAME>\n";
  89. printf "Copyright (C) 2000 Christoph Kron\n";
  90. printf "check_maxchannels.pl comes with ABSOLUTELY NO WARRANTY\n";
  91. printf "This programm is licensed under the terms of the ";
  92. printf "GNU General Public License\n(check source code for details)\n";
  93. printf "\n\n";
  94. exit $ERRORS{"UNKNOWN"};
  95. }
  96. # Just in case of problems, let's not hang Nagios
  97. $SIG{'ALRM'} = sub {
  98. print ("ERROR: No snmp response from $hostname (alarm)\n");
  99. exit $ERRORS{"UNKNOWN"};
  100. };
  101. alarm($TIMEOUT);
  102. $status = GetOptions("community=s",\$community,
  103. "port=i",\$port);
  104. if ($status == 0)
  105. {
  106. &usage;
  107. }
  108. #shift;
  109. $hostname = shift || &usage;
  110. push(@snmpoids,$snmpWanAvailableChannels);
  111. push(@snmpoids,$snmpWanSwitchedChannels);
  112. push(@snmpoids,$snmpWanDisabledChannels);
  113. push(@snmpoids,$snmpWanActiveChannels);
  114. push(@snmpoids,$snmpWanNailedChannels);
  115. push(@snmpoids,$snmpWanOutOfServiceChannels);
  116. push(@snmpoids,$snmpEventCurrentActiveSessions);
  117. push(@snmpoids,$snmpEventTotalNoModems);
  118. push(@snmpoids,$snmpDeadLanModem);
  119. push(@snmpoids,$snmpDisabledLanModem);
  120. push(@snmpoids,$snmpSuspectLanModem);
  121. push(@snmpoids,$snmpAvailLanModem);
  122. push(@snmpoids,$snmpBusyLanModem);
  123. push(@snmpoids,$snmpMdmNumber);
  124. ($session, $error) = Net::SNMP->session(
  125. -hostname => $hostname,
  126. -community => $community,
  127. -port => $port
  128. );
  129. if (!defined($session)) {
  130. $state='UNKNOWN';
  131. $answer=$error;
  132. print ("$state: $answer");
  133. exit $ERRORS{$state};
  134. }
  135. if (!defined($response = $session->get_request(@snmpoids))) {
  136. $answer=$session->error;
  137. $session->close;
  138. $state = 'CRITICAL';
  139. print ("$state: $answer,$community");
  140. exit $ERRORS{$state};
  141. }
  142. $WanAvailableChannels = $response->{$snmpWanAvailableChannels};
  143. $WanSwitchedChannels = $response->{$snmpWanSwitchedChannels};
  144. $WanDisabledChannels = $response->{$snmpWanDisabledChannels};
  145. $WanActiveChannels = $response->{$snmpWanActiveChannels};
  146. $WanNailedChannels = $response->{$snmpWanNailedChannels};
  147. $WanOutOfServiceChannels = $response->{$snmpWanOutOfServiceChannels};
  148. $EventCurrentActiveSessions = $response->{$snmpEventCurrentActiveSessions};
  149. $EventTotalNoModems = $response->{$snmpEventTotalNoModems};
  150. $DeadLanModem = $response->{$snmpDeadLanModem};
  151. $DisabledLanModem = $response->{$snmpDisabledLanModem};
  152. $SuspectLanModem = $response->{$snmpSuspectLanModem};
  153. $AvailLanModem = $response->{$snmpAvailLanModem};
  154. $BusyLanModem = $response->{$snmpBusyLanModem};
  155. $MdmNumber = $response->{$snmpMdmNumber};
  156. # less than 50% -> WARNING
  157. if ( 0 < $WanOutOfServiceChannels
  158. && $WanOutOfServiceChannels < ($snmpWanSwitchedChannels * 0.5) ) {
  159. $state = 'WARNING';
  160. }
  161. elsif ($WanOutOfServiceChannels > 0) {
  162. $state = 'CRITICAL';
  163. }
  164. elsif ($DeadLanModem > 0) {
  165. $state = 'CRITICAL';
  166. }
  167. elsif ($SuspectLanModem > 0) {
  168. $state = 'WARNING';
  169. }
  170. elsif ($AvailLanModem == 0) {
  171. $state = 'WARNING';
  172. }
  173. else {
  174. $state = 'OK';
  175. }
  176. $answer = sprintf("active sessions: %d (%d), active modems: %d (%d)<BR>",
  177. $EventCurrentActiveSessions,
  178. $WanSwitchedChannels,
  179. $BusyLanModem,
  180. $MdmNumber);
  181. $answer .= sprintf("channels available: %d, disabled: %d",
  182. $WanAvailableChannels,
  183. $WanDisabledChannels);
  184. $answer .= sprintf(", out of service: %d, nailed: %d<BR>",
  185. $WanOutOfServiceChannels,
  186. $WanNailedChannels);
  187. $answer .= sprintf("modems avail.: %d, disabled: %d, suspect: %d, dead: %d<BR>",
  188. $AvailLanModem,
  189. $DisabledLanModem,
  190. $SuspectLanModem,
  191. $DeadLanModem);
  192. $answer .= sprintf("unserviced modem calls: %d (since startup)\n",
  193. $EventTotalNoModems);
  194. $session->close;
  195. print ("$state: $answer");
  196. exit $ERRORS{$state};