scan_ipcam.pl 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #!/usr/bin/perl
  2. use utf8;
  3. use warnings;
  4. use Encode;
  5. use open qw(:std :encoding(UTF-8));
  6. no warnings 'utf8';
  7. use FindBin '$Bin';
  8. use lib "/opt/Eye/scripts";
  9. use DBI;
  10. use File::Basename;
  11. use File::Find;
  12. use File::stat qw(:FIELDS);
  13. use File::Spec::Functions;
  14. use Sys::Hostname;
  15. use DirHandle;
  16. use Time::localtime;
  17. use Fcntl;
  18. use Tie::File;
  19. use Data::Dumper;
  20. use Net::Ping;
  21. use Net::SNMP qw(ticks_to_time TRANSLATE_NONE);
  22. use eyelib::config;
  23. use eyelib::main;
  24. use eyelib::database;
  25. use eyelib::logconfig;
  26. use eyelib::common;
  27. use Fcntl qw(:flock);
  28. open(SELF,"<",$0) or die "Cannot open $0 - $!";
  29. flock(SELF, LOCK_EX|LOCK_NB) or exit 1;
  30. my %hik_snmp_oids=(
  31. '.1.3.6.1.4.1.39165.1.1.0'=>'Model',
  32. '.1.3.6.1.4.1.39165.1.3.0'=>'Firmware',
  33. '.1.3.6.1.4.1.39165.1.5.0'=>'Number',
  34. '.1.3.6.1.4.1.39165.1.6.0'=>'Vendor',
  35. );
  36. my @hik_oids=();
  37. foreach my $oid (keys %hik_snmp_oids) {
  38. push (@hik_oids,$oid);
  39. }
  40. sub scan_ipcam {
  41. my $ip = shift;
  42. my $community = shift;
  43. my $version = shift;
  44. my $result;
  45. #print "$ip $community $version\n";
  46. eval {
  47. my ($session, $error) = Net::SNMP->session(
  48. -hostname => $ip,
  49. -community => $community,
  50. -port => 161,
  51. -version => $version
  52. );
  53. $session->translate(TRANSLATE_NONE);
  54. my $ret = $session->get_request( -varbindlist => [@hik_oids] );
  55. $result->{text} = 'ip: '.$ip;
  56. foreach my $oid (keys %hik_snmp_oids) {
  57. $result->{text} = $result->{text}." ".$hik_snmp_oids{$oid}.": ".$ret->{$oid};
  58. if ($hik_snmp_oids{$oid}=~/Model/i) { $result->{model_name}=$ret->{$oid}; }
  59. if ($hik_snmp_oids{$oid}=~/Firmware/i) { $result->{firmware}=$ret->{$oid}; }
  60. }
  61. $result->{text} = trim($result->{text});
  62. };
  63. return $result;
  64. }
  65. my @auth_list=get_records_sql($dbh,'SELECT * FROM user_auth WHERE deleted=0 and nagios=1');
  66. ##################################### User auth analyze ################################################
  67. if (scalar(@auth_list)>0) {
  68. foreach my $auth (@auth_list) {
  69. next if (!$auth);
  70. my $ip = $auth->{'ip'};
  71. $ip =~s/\/\d+$//g;
  72. #get user
  73. my $login = get_record_sql($dbh,"SELECT * FROM user_list WHERE id=".$auth->{'user_id'});
  74. next if ($login->{ou_id} ne 5);
  75. my $cam_dev = get_record_sql($dbh,"SELECT * FROM devices WHERE user_id=".$auth->{'user_id'});
  76. my $d_community=undef;
  77. my $d_version=undef;
  78. if ($cam_dev) {
  79. if ($cam_dev->{snmp_version}) { $d_version=$cam_dev->{snmp_version}; }
  80. if ($cam_dev->{community}) { $d_community=$cam_dev->{community}; }
  81. }
  82. if (!$d_version) { $d_version=$config_ref{snmp_default_version}; }
  83. if (!$d_community) { $d_community=$config_ref{snmp_default_community}; }
  84. my $snmp_info = scan_ipcam($auth->{ip},$d_community,$d_version);
  85. if ($snmp_info) {
  86. if (!$cam_dev) {
  87. $cam_dev->{user_id}=$auth->{'user_id'};
  88. $cam_dev->{device_type}=5;
  89. $cam_dev->{ip}=$auth->{'ip'};
  90. $cam_dev->{device_name}=$login->{login};
  91. $cam_dev->{snmp_version}=$config_ref{snmp_default_version};
  92. $cam_dev->{community}=$config_ref{snmp_default_community};
  93. my $new_dev_id = insert_record($dbh,"devices",$cam_dev);
  94. $cam_dev = get_record_sql($dbh,"SELECT * FROM devices WHERE user_id=".$auth->{'user_id'});
  95. }
  96. if ($snmp_info->{firmware} and ($cam_dev->{firmware} ne $snmp_info->{firmware})) {
  97. do_sql($dbh,"UPDATE devices SET firmware='".$snmp_info->{firmware}."' WHERE id=".$cam_dev->{'id'});
  98. }
  99. if ($snmp_info->{model_name}) {
  100. my $model = get_record_sql($dbh,"SELECT id FROM device_models WHERE model_name='".$snmp_info->{model_name}."'");
  101. if ($model and $cam_dev->{device_model_id} ne $model->{id}) {
  102. print "Updated: ".$snmp_info->{text}."\n";
  103. do_sql($dbh,"UPDATE devices SET device_model_id=".$model->{id}." WHERE id=".$cam_dev->{'id'});
  104. } else {
  105. print "OK: ".$snmp_info->{text}."\n";
  106. }
  107. }
  108. } else { print "Fail: ".$ip."\n"; }
  109. }
  110. }
  111. exit;