1. #!/usr/bin/perl
  2.  
  3. #-----------------------------------------------------------------
  4. # Copyright 2007 Sebastiaan Oostlander <sebastiaan@oostlander.com>
  5. #
  6. # GroupWise Internet Agent check script
  7. #-----------------------------------------------------------------
  8.  
  9. use Net::SNMP;
  10. use Getopt::Std;
  11. use Getopt::Long;
  12. &Getopt::Long::config('bundling');
  13. use strict;
  14.  
  15. my $script_name = "check_gwia";
  16. my $script_version = "1.0";
  17.  
  18. ## CONNECTION STUFF ##
  19. my $ipaddress = ""; # there is not default ip address, sorry
  20. my $version = 1; # SNMP version, old UM_LINK hw works with version 1!!.
  21. my $timeout = 2; # SNMP query timeout
  22. my $defaultcommunity = "public"; # Default community string
  23. my $opt_h;
  24.  
  25. ### Warn levels ###
  26. my $warn_queuemsg = 10000; # nr of messages in queue
  27. my $warn_queuedefer = 500; # nr of defer messages in queue
  28. my $warn_intmsg = 1000; # nr of messages in interval
  29. my $warn_interr = 100; # nr of error messages in interval
  30.  
  31. ## FETCHING ARGS STUFF ##
  32. my $status = GetOptions(
  33. "h" => \$opt_h,
  34. "H=s" => \$ipaddress,
  35. "C=s" => \$defaultcommunity
  36. );
  37.  
  38. if ( $status == 0 ) {
  39. print "\nERROR: Too few arguments\n";
  40. usage();
  41. exit(0);
  42. }
  43.  
  44. if ($opt_h)
  45. {
  46. usage();
  47. exit(0);
  48. }
  49.  
  50.  
  51. ### OID ###
  52. my $oid_gwianame = ".1.3.6.1.4.1.23.2.70.1.1.0"; # GWIA name
  53. my $oid_gwmsgout = ".1.3.6.1.4.1.23.2.70.1.7.0"; # Out messages
  54. my $oid_gwmsgin = ".1.3.6.1.4.1.23.2.70.1.8.0"; # In messages
  55. my $oid_gwqsend = ".1.3.6.1.4.1.23.2.70.1.62.0"; # Queue send
  56. my $oid_gwqrecv = ".1.3.6.1.4.1.23.2.70.1.63.0"; # Queue receive
  57. my $oid_gwqdefer = ".1.3.6.1.4.1.23.2.70.1.64.0"; # Queue defer
  58. my $oid_gwintmsgin = ".1.3.6.1.4.1.23.2.70.1.20.0"; # Interval messages in
  59. my $oid_gwintmsgout = ".1.3.6.1.4.1.23.2.70.1.19.0"; # Interval messages out
  60. my $oid_gwinterrin = ".1.3.6.1.4.1.23.2.70.1.24.0"; # Interval error in
  61. my $oid_gwinterrout = ".1.3.6.1.4.1.23.2.70.1.23.0"; # Interval error out
  62. my $oid_gwintstatin = ".1.3.6.1.4.1.23.2.70.1.22.0"; # Interval status in
  63. my $oid_gwintstatout = ".1.3.6.1.4.1.23.2.70.1.21.0"; # Interval status out
  64. my $oid_generic = ".1.3.6.1.2.1.1.5.0";
  65.  
  66. ### Results ###
  67. my $result_gwianame = "";
  68. my $result_gwmsgout = 0;
  69. my $result_gwmsgin = 0;
  70. my $result_gwqsend = 0;
  71. my $result_gwqrecv = 0;
  72. my $result_gwqdefer = 0;
  73. my $result_gwintmsgin = 0;
  74. my $result_gwintmsgout = 0;
  75. my $result_gwinterrin = 0;
  76. my $result_gwinterrout = 0;
  77. my $result_gwintstatin = 0;
  78. my $result_gwintstatout = 0;
  79. my $result_generic = 0;
  80.  
  81. ## INTERESTING DEFINES ##
  82. my $OK = 0;
  83. my $WARNING = 1;
  84. my $CRITICAL = 2;
  85.  
  86. ## RETURN INFO VARIABLES ##
  87. my $status = $OK;
  88. my $returnstring = "";
  89. my $statusstring = "";
  90. my $prefdata = "";
  91.  
  92. ## MAKING SNMP CONNECTION ##
  93. my ($s, $e) = Net::SNMP->session(
  94. -community => $defaultcommunity,
  95. -hostname => $ipaddress,
  96. -version => $version,
  97. -timeout => $timeout,
  98. );
  99.  
  100. ## TESTING SNMP CONNECTION WITH A GENERIC QUERY ##
  101. if (!defined($s->get_request($oid_generic)))
  102. {
  103. $returnstring = "- SNMP server not responding, host down?";
  104. $status = $CRITICAL;
  105. }
  106. else
  107. {
  108. ## DOING ALL WORK ##
  109. main();
  110. }
  111.  
  112. ## CONNECTION TO /DEV/NULL ##
  113. $s->close();
  114.  
  115. ## STUDYING THE OUTPUT ##
  116. $prefdata = "| msgtotin=$result_gwmsgin msgtotout=$result_gwmsgout msgintin=$result_gwintmsgin msgintout=$result_gwintmsgout";
  117.  
  118. if ($status == $OK)
  119. {
  120. $statusstring = "- Messages in/out Last interval $result_gwintmsgin\/$result_gwintmsgout Total $result_gwmsgin\/$result_gwmsgout";
  121. print "Internet Agent $result_gwianame is OK $statusstring $prefdata\n";
  122. }
  123. elsif ($status == $WARNING)
  124. {
  125. print "Internet Agent $result_gwianame is WARNING $returnstring $prefdata\n";
  126. }
  127. elsif ($status == $CRITICAL)
  128. {
  129. print "Internet Agent $result_gwianame is CRITICAL $returnstring $prefdata\n";
  130. }
  131.  
  132. ## GOOD BYE ##
  133. exit $status;
  134.  
  135. ##
  136. ## getinfo: make a snmp query with OID (arg0) and put it in arg1.
  137.  
  138. sub getinfo
  139. {
  140. if(!defined($s->get_request(@_[0])))
  141. {
  142. # print "OID ";
  143. # print @_[0];
  144. # print " not exists, and can't be checked, skipping\n";
  145. $_[1] = undef;
  146. return;
  147. }
  148.  
  149. foreach ($s->var_bind_names()) {
  150. $_[1] = $s->var_bind_list()->{$_};
  151. }
  152. }
  153.  
  154. ##
  155. ## main: all queries and sets
  156.  
  157. sub main
  158. {
  159. ## GETTING DATA ##
  160. getinfo($oid_gwianame, $result_gwianame);
  161. getinfo($oid_gwmsgout, $result_gwmsgout);
  162. getinfo($oid_gwmsgin, $result_gwmsgin);
  163. getinfo($oid_gwqsend, $result_gwqsend);
  164. getinfo($oid_gwqrecv, $result_gwqrecv);
  165. getinfo($oid_gwqdefer, $result_gwqdefer);
  166. getinfo($oid_gwintmsgin, $result_gwintmsgin);
  167. getinfo($oid_gwintmsgout, $result_gwintmsgout);
  168. getinfo($oid_gwinterrin, $result_gwinterrin);
  169. getinfo($oid_gwinterrout, $result_gwinterrout);
  170. getinfo($oid_gwintstatin, $result_gwintstatin);
  171. getinfo($oid_gwintstatout, $result_gwintstatout);
  172.  
  173. # Checking
  174. if (length($result_gwianame) == 0)
  175. {
  176. # Error not loadded
  177. $status = $CRITICAL;
  178. $returnstring .= "- Internet Agent not loaded ";
  179. }
  180. else
  181. {
  182. if ($result_gwqsend >= $warn_queuemsg)
  183. {
  184. $status = $WARNING;
  185. $returnstring .= "- $result_gwqsend messages in the send queue ";
  186. }
  187. if ($result_gwqrecv >= $warn_queuemsg)
  188. {
  189. $status = $WARNING;
  190. $returnstring .= "- $result_gwqrecv messages in the receive queue ";
  191. }
  192. if ($result_gwqdefer >= $warn_queuedefer)
  193. {
  194. $status = $WARNING;
  195. $returnstring .= "- $result_gwqdefer messages in the defer queue ";
  196. }
  197.  
  198. if ($result_gwintmsgin >= $warn_intmsg)
  199. {
  200. $status = $WARNING;
  201. $returnstring .= "- $result_gwintmsgin inbound messages in the last interval ";
  202. }
  203. if ($result_gwintmsgout >= $warn_intmsg)
  204. {
  205. $status = $WARNING;
  206. $returnstring .= "- $result_gwintmsgout outbound messages in the last interval ";
  207. }
  208.  
  209. if ($result_gwinterrin >= $warn_interr)
  210. {
  211. $status = $WARNING;
  212. $returnstring .= "- $result_gwinterrin inbound error messages in the last interval ";
  213. }
  214. if ($result_gwinterrout >= $warn_interr)
  215. {
  216. $status = $WARNING;
  217. $returnstring .= "- $result_gwinterrout outbound error messages in the last interval ";
  218. }
  219. if ($result_gwintstatin >= $warn_interr)
  220. {
  221. $status = $WARNING;
  222. $returnstring .= "- $result_gwintstatin inbound status messages in the last interval ";
  223. }
  224. if ($result_gwintstatout >= $warn_interr)
  225. {
  226. $status = $WARNING;
  227. $returnstring .= "- $result_gwintstatout outbound status messages in the last interval ";
  228. }
  229. }
  230. }
  231.  
  232. sub usage
  233. {
  234. print << "USAGE";
  235.  
  236. -----------------------------------------------------------------
  237. $script_name v$script_version
  238.  
  239. Monitors GroupWise Internet Agent via SNMP.
  240.  
  241. Usage: $script_name -H <hostname> [-C <community>]
  242.  
  243. Options: -H Hostname or IP address
  244. -C Community (default is public)
  245.  
  246. -----------------------------------------------------------------
  247. Copyright 2007 Sebastiaan Oostlander <sebastiaan\@oostlander.com>
  248.  
  249. Thanks to the plugin from Ignacio Barrientos <chipi\@criptonita.com>
  250.  
  251. This program is free software; you can redistribute it or modify
  252. it under the terms of the GNU General Public License
  253. -----------------------------------------------------------------
  254.  
  255. USAGE
  256. exit 1;
  257. }