check_snmp_db_crc.pl 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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 snmp;
  9. use Nag::mysql;
  10. use Data::Dumper;
  11. use DateTime;
  12. my $TIMEOUT = 30;
  13. $SIG{ALRM} = sub { print "ERROR: No response\n"; exit 3; };
  14. alarm($TIMEOUT);
  15. ### return codes
  16. my $RET_OK=0;
  17. my $RET_WARNING=1;
  18. my $RET_UNKNOWN=3;
  19. my $RET_CRITICAL=2;
  20. if (scalar @ARGV <= 2) {
  21. print "Usage: $0 <host> <snmp_string> <port> [warning] [critical]\n";
  22. print "<snmp_string> => community::version::user::auth::priv\n";
  23. print "for version 3: community = password\n";
  24. exit $RET_OK;
  25. }
  26. my $host = shift @ARGV;
  27. my $snmp_str = shift @ARGV;
  28. my ($community,$version,$user,$auth,$priv) = split(/\:\:/,$snmp_str);
  29. my $snmp;
  30. $snmp->{version} = $version || '2';
  31. $snmp->{timeout} = 30;
  32. $snmp->{community} = $community || 'public';
  33. $snmp->{user} = $user || 'public';
  34. $snmp->{auth} = $auth || 'sha1';
  35. $snmp->{priv} = $priv || 'aes';
  36. my $port = shift @ARGV;
  37. #minimal sporadic value
  38. my $err_step = 100;
  39. ##########################################################################
  40. sub get_snmp_crc {
  41. my $port = shift;
  42. my $CRC_OID = ".1.3.6.1.2.1.2.2.1.14.".$port;
  43. my $session = init_snmp($host,$snmp);
  44. my $result_crc = $session->get_request( -varbindlist => [$CRC_OID]);
  45. $session->close;
  46. my $result = $result_crc->{$CRC_OID} || 0;
  47. return $result;
  48. }
  49. ###########################################################################
  50. my $start = DateTime->now(time_zone => 'local');
  51. my $start_time = $start->epoch;
  52. my $clean_start = 0;
  53. my $dbh = init_db();
  54. if (!$dbh) {
  55. print("ERROR connect to database\n");
  56. exit $RET_UNKNOWN;
  57. }
  58. my $ip_aton = StrToIp($host);
  59. #data_type = 1 for crc
  60. my $old_crc_info = get_record_sql($dbh,"SELECT * FROM netdevices WHERE ip=".$ip_aton." AND data_type=1 AND data_id=".$port);
  61. if (!$old_crc_info) { $clean_start=1; }
  62. my $cur_crc_info;
  63. if (!$old_crc_info or !defined $old_crc_info->{data_value1}) { $old_crc_info->{data_value1}=0; }
  64. if (!$old_crc_info or !defined $old_crc_info->{data_id}) { $old_crc_info->{data_id}=$port; }
  65. if (!$old_crc_info or !defined $old_crc_info->{data_type}) { $old_crc_info->{data_type}=1; }
  66. if (!$old_crc_info or !$old_crc_info->{changed}) { $old_crc_info->{changed} = $start_time - 600; }
  67. if (!$old_crc_info or !$old_crc_info->{ip}) { $old_crc_info->{ip}=$ip_aton; }
  68. if ($clean_start) { insert_record($dbh,"netdevices",$old_crc_info); }
  69. $cur_crc_info->{data_id} = $port;
  70. $cur_crc_info->{ip} = $ip_aton;
  71. $cur_crc_info->{data_type} = 1;
  72. $cur_crc_info->{changed} = $start_time;
  73. $cur_crc_info->{data_value1} =get_snmp_crc($port);
  74. update_record($dbh,"netdevices",$cur_crc_info,"ip=".$ip_aton." AND data_type=1 AND data_id=".$port);
  75. $dbh->disconnect;
  76. my $diff_crc = $cur_crc_info->{data_value1} - $old_crc_info->{data_value1};
  77. my $time_diff = $cur_crc_info->{changed} - $old_crc_info->{changed};
  78. if (!$time_diff) { $time_diff = 600; }
  79. my $perf="ErrSpeed=%s;0;0;0;10000000;";
  80. my $speed_crc = int($diff_crc/$time_diff/60);
  81. if ($speed_crc>0 and $diff_crc >0 and $diff_crc >= $err_step) {
  82. printf("CRIT: CRC error found! Speedup $speed_crc by minute!|".$perf."\n",$speed_crc);
  83. exit $RET_CRITICAL;
  84. }
  85. printf("OK: Errors not found. |".$perf."\n",0);
  86. exit $RET_OK;