check_snmp_crc.pl 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/usr/bin/perl
  2. use lib "/etc/nagios4/scripts/plugins";
  3. use snmp;
  4. use Net::SNMP;
  5. use Config::Tiny;
  6. use File::Path qw( mkpath );
  7. use strict;
  8. my $TIMEOUT = 30;
  9. $SIG{ALRM} = sub { print "ERROR: No response\n"; exit 3; };
  10. alarm($TIMEOUT);
  11. ### return codes
  12. my $RET_OK=0;
  13. my $RET_WARNING=1;
  14. my $RET_UNKNOWN=3;
  15. my $RET_CRITICAL=2;
  16. my $time_cache = 1800;
  17. my $err_step = 100;
  18. if (scalar @ARGV <= 2) {
  19. print "Usage: $0 <host> <snmp_string> <port> <32|64> [warning] [critical]\n";
  20. print "<snmp_string> => community::version::user::auth::priv\n";
  21. print "for version 3: community = password\n";
  22. exit $RET_OK;
  23. }
  24. my $host = shift @ARGV;
  25. my $snmp_str = shift @ARGV;
  26. my ($community,$version,$user,$auth,$priv) = split(/\:\:/,$snmp_str);
  27. my $snmp;
  28. $snmp->{version} = $version || '2';
  29. $snmp->{timeout} = 30;
  30. $snmp->{community} = $community || 'public';
  31. $snmp->{user} = $user || 'public';
  32. $snmp->{auth} = $auth || 'sha1';
  33. $snmp->{priv} = $priv || 'aes';
  34. my $port = shift @ARGV;
  35. sub get_snmp_crc {
  36. my $CRC_OID = ".1.3.6.1.2.1.2.2.1.14";
  37. my $session = init_snmp($host,$snmp);
  38. my $result = $session->get_table($CRC_OID);
  39. $session->close;
  40. my %port_crc;
  41. foreach my $row (keys (%$result)) {
  42. next if ($row !~ /$CRC_OID/);
  43. my $crc_value = $result->{$row};
  44. $row =~ s/$CRC_OID//;
  45. $row =~ s/^(\.*)//;
  46. $port_crc{$row}=$crc_value;
  47. }
  48. return \%port_crc;
  49. }
  50. my $time_cache_min = int($time_cache/60);
  51. my $start_time = time();
  52. my $host_spool_dir = "/var/spool/nagios4/plugins/crc/";
  53. if (!-e "$host_spool_dir") { mkpath( $host_spool_dir, 0, 0770 ); }
  54. my $host_data = $host_spool_dir.$host;
  55. my $old_crc_info;
  56. my $cur_crc_info;
  57. my $need_rescan = 0;
  58. if (-e "$host_data") {
  59. my $host_spool = Config::Tiny->new;
  60. $host_spool = Config::Tiny->read($host_data, 'utf8' );
  61. my $old_time=$host_spool->{_}->{timestamp};
  62. foreach my $port (keys %{$host_spool->{crc_data}}) { $old_crc_info->{$port} = $host_spool->{crc_data}->{$port}; }
  63. if (($start_time - $old_time) >=$time_cache) { $need_rescan = 1; } else { $need_rescan = 0; }
  64. } else { $need_rescan = 1; }
  65. if (!$old_crc_info->{$port}) { $old_crc_info->{$port}=0; }
  66. if ($need_rescan) {
  67. $cur_crc_info=get_snmp_crc;
  68. my $host_spool = Config::Tiny->new;
  69. $host_spool->{_}->{timestamp}=$start_time;
  70. $host_spool->{crc_data} = $cur_crc_info;
  71. $host_spool->write($host_data);
  72. } else { $cur_crc_info = $old_crc_info; }
  73. my $diff_crc = $cur_crc_info->{$port} - $old_crc_info->{$port};
  74. my $perf="ErrSpeed=%s;0;0;0;10000000;";
  75. if ($diff_crc >0 and $diff_crc >= $err_step) {
  76. my $speed_crc = int($diff_crc/$time_cache_min);
  77. printf("CRIT: CRC error found! Speedup $speed_crc by minute!|".$perf."\n",$speed_crc);
  78. exit $RET_CRITICAL;
  79. }
  80. printf("OK: Errors not found. |".$perf."\n",0);
  81. exit $RET_OK;