check_snmp_db_bandwidth.pl 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #!/usr/bin/perl
  2. use FindBin;
  3. use Net::SNMP;
  4. use POSIX;
  5. use strict;
  6. use lib "$FindBin::/etc/nagios4/scripts/";
  7. use lib "/etc/nagios4/scripts/plugins";
  8. use Nag::mysql;
  9. use Data::Dumper;
  10. use DateTime;
  11. use snmp;
  12. my $TIMEOUT = 30;
  13. $SIG{ALRM} = sub { print "ERROR: No response\n"; exit 3; };
  14. alarm($TIMEOUT);
  15. my $ifSpeed = '.1.3.6.1.2.1.2.2.1.5';
  16. my $ifInOctets = '.1.3.6.1.2.1.2.2.1.10';
  17. my $ifOutOctets = '.1.3.6.1.2.1.2.2.1.16';
  18. my $ifHighSpeed = '.1.3.6.1.2.1.31.1.1.1.15';
  19. my $ifHCInOctets = '.1.3.6.1.2.1.31.1.1.1.6';
  20. my $ifHCOutOctets = '.1.3.6.1.2.1.31.1.1.1.10';
  21. ### return codes
  22. my $RET_OK=0;
  23. my $RET_WARNING=1;
  24. my $RET_UNKNOWN=3;
  25. my $RET_CRITICAL=2;
  26. if (scalar @ARGV <= 2) {
  27. print "Run: ".join(';',@ARGV)."\n";
  28. print "Usage: $0 <host> <snmp_string> <port> <32|64> [warning] [critical]\n";
  29. print "<snmp_string> => community::version::user::auth::priv\n";
  30. print "for version 3: community = password\n";
  31. exit $RET_OK;
  32. }
  33. my $host = shift @ARGV;
  34. my $snmp_str = shift @ARGV;
  35. my ($community,$version,$user,$auth,$priv) = split(/\:\:/,$snmp_str);
  36. my $snmp;
  37. $snmp->{version} = $version || '2';
  38. $snmp->{timeout} = 30;
  39. $snmp->{community} = $community || 'public';
  40. $snmp->{user} = $user || 'public';
  41. $snmp->{auth} = $auth || 'sha1';
  42. $snmp->{priv} = $priv || 'aes';
  43. my $port = shift @ARGV;
  44. my $counter = shift @ARGV || 64;
  45. my $warning = shift (@ARGV) || 80;
  46. my $critical = shift (@ARGV) || 90;
  47. ###################################################
  48. sub get_snmp_band {
  49. my $port = shift;
  50. my $counter = shift;
  51. my $IN_OID = $ifHCInOctets.".".$port;
  52. my $OUT_OID = $ifHCOutOctets.".".$port;
  53. my $SPEED_OID = $ifHighSpeed.".".$port;
  54. if ($counter eq 32) {
  55. $IN_OID = $ifInOctets.".".$port;
  56. $OUT_OID = $ifOutOctets.".".$port;
  57. $SPEED_OID = $ifSpeed.".".$port;
  58. }
  59. my $session = init_snmp($host,$snmp);
  60. my $result_in = $session->get_request( -varbindlist => [$IN_OID]);
  61. my $result_out = $session->get_request( -varbindlist => [$OUT_OID]);
  62. my $result_speed = $session->get_request( -varbindlist => [$SPEED_OID]);
  63. $session->close;
  64. my $port_speed;
  65. $port_speed->{data_value4} = $counter;
  66. $port_speed->{data_value1} = $result_in->{$IN_OID} || 0;
  67. $port_speed->{data_value2} = $result_out->{$OUT_OID} || 0;
  68. $port_speed->{data_value3} = $result_speed->{$SPEED_OID} || 10000000;
  69. return $port_speed;
  70. }
  71. ###################################################
  72. my $start = DateTime->now(time_zone => 'local');
  73. my $start_time = $start->epoch;
  74. my $old_info;
  75. my $cur_info;
  76. my $clean_start = 0;
  77. my $dbh = init_db();
  78. if (!$dbh) {
  79. print("ERROR connect to database\n");
  80. exit $RET_UNKNOWN;
  81. }
  82. my $ip_aton = StrToIp($host);
  83. my $old_info = get_record_sql($dbh,"SELECT * FROM netdevices WHERE ip=".$ip_aton." AND data_type=0 AND data_id=".$port);
  84. #data_value1 - in
  85. #data_value2 - out
  86. #data_value3 - speed
  87. if (!$old_info) { $clean_start=1; }
  88. if (!$old_info or !defined $old_info->{data_value1}) { $old_info->{data_value1}=0; }
  89. if (!$old_info or !defined $old_info->{data_value2}) { $old_info->{data_value2}=0; }
  90. if (!$old_info or !defined $old_info->{data_value3}) { $old_info->{data_value3} = 10000000; }
  91. if (!$old_info or !defined $old_info->{data_value4}) { $old_info->{data_value4} = 64; }
  92. if (!$old_info or !defined $old_info->{data_id}) { $old_info->{data_id}=$port; }
  93. if (!$old_info or !defined $old_info->{data_type}) { $old_info->{data_type}=0; }
  94. if (!$old_info or !$old_info->{changed}) { $old_info->{changed} = $start_time - 600; }
  95. if (!$old_info or !$old_info->{ip}) { $old_info->{ip}=$ip_aton; }
  96. if ($clean_start) { insert_record($dbh,"netdevices",$old_info); }
  97. $cur_info=get_snmp_band($port,$counter);
  98. #add record info
  99. $cur_info->{data_id} = $port;
  100. $cur_info->{ip} = $ip_aton;
  101. $cur_info->{data_type} = 0;
  102. $cur_info->{changed} = $start_time;
  103. #speed patch for x64 counter
  104. if ($counter eq 64) { $cur_info->{data_value3}=$cur_info->{data_value3}*1000; }
  105. #extreme patch
  106. if ($cur_info->{data_value3} eq 4294967295) { $cur_info->{data_value3}=10000000; }
  107. update_record($dbh,"netdevices",$cur_info,"ip=".$ip_aton." AND data_type=0 AND data_id=".$port);
  108. $dbh->disconnect;
  109. my $perf="IN=%s%%;$warning;$critical OUT=%s%%;$warning;$critical";
  110. if ($clean_start or $cur_info->{data_value3} <= 1) {
  111. printf("OK: Bandwidth in=%s%% out=%s%% |".$perf."\n",0,0,0,0);
  112. exit $RET_OK;
  113. }
  114. my $deltaIn = $cur_info->{data_value1} - $old_info->{data_value1};
  115. my $deltaOut = $cur_info->{data_value2} - $old_info->{data_value2};
  116. my $deltaTime = $cur_info->{changed} - $old_info->{changed};
  117. if (!$deltaTime) { $deltaTime = 600; }
  118. my $counter_div = 10;
  119. if ($counter eq 32) { $counter_div = 1; }
  120. my $band_in = ceil((($deltaIn * 8) / $deltaTime) / $cur_info->{data_value3} / $counter_div);
  121. my $band_out = ceil((($deltaOut * 8) / $deltaTime) / $cur_info->{data_value3} / $counter_div);
  122. if ($band_in >100) { $band_in = 1; }
  123. if ($band_out >100) { $band_out = 1; }
  124. if ($band_in <$warning and $band_out<$warning) {
  125. printf("OK: Bandwidth in=%s%% out=%s%%|".$perf."\n",$band_in,$band_out,$band_in,$band_out);
  126. exit $RET_OK;
  127. }
  128. if ($band_in >=$critical or $band_out>=$critical) {
  129. printf("CRIT: Bandwidth in=%s%% out=%s%%|".$perf."\n",$band_in,$band_out,$band_in,$band_out);
  130. exit $RET_CRITICAL;
  131. }
  132. if ($band_in >=$warning and $band_in<$critical) {
  133. printf("WARN: Bandwidth in=%s%% out=%s%%|".$perf."\n",$band_in,$band_out,$band_in,$band_out);
  134. exit $RET_WARNING;
  135. }
  136. if ($band_out >=$warning and $band_out<$critical) {
  137. printf("WARN: Bandwidth in=%s%% out=%s%%|".$perf."\n",$band_in,$band_out,$band_in,$band_out);
  138. exit $RET_WARNING;
  139. }
  140. printf("OK: You don't see this! in=%s%% out=%s%% |".$perf."\n",$band_in,$band_out);
  141. exit $RET_OK;