restart_port_snmp.pl 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #!/usr/bin/perl
  2. #
  3. # Copyright (C) Roman Dmitriev, rnd@rajven.ru
  4. #
  5. use utf8;
  6. use warnings;
  7. use Encode;
  8. use open qw(:std :encoding(UTF-8));
  9. no warnings 'utf8';
  10. use FindBin '$Bin';
  11. use lib "$Bin/";
  12. use strict;
  13. use Time::Local;
  14. use FileHandle;
  15. use Data::Dumper;
  16. use eyelib::config;
  17. use eyelib::main;
  18. use eyelib::logconfig;
  19. use eyelib::net_utils;
  20. use eyelib::database;
  21. use eyelib::common;
  22. use eyelib::snmp;
  23. use Net::SNMP qw(:snmp);
  24. my $pethPsePortAdminEnable ='.1.3.6.1.2.1.105.1.1.1.3.1.';
  25. my $huawei_poe_oid ='.1.3.6.1.4.1.2011.5.25.195.3.1.3.';
  26. my $allied_poe_oid ='.1.3.6.1.2.1.105.1.1.1.3.1.';
  27. my $hp_poe_oid ='.1.3.6.1.2.1.105.1.1.1.3.1.';
  28. my $netgear_poe_oid ='.1.3.6.1.4.1.4526.11.15.1.1.1.6.1.';
  29. my $mikrotik_poe_oid ='.1.3.6.1.4.1.14988.1.1.15.1.1.3.';
  30. my $admin_status_oid ='.1.3.6.1.2.1.2.2.1.7.';
  31. #wait for up interface
  32. my $sleep_time = 15;
  33. $|=1;
  34. exit if (!$ARGV[0]);
  35. my $HOST_IP = $ARGV[0];
  36. my $IP_ATON=StrToIp($HOST_IP);
  37. my $auth_rec = get_record_sql($dbh,'SELECT * FROM user_auth WHERE deleted=0 and ip_int=?',$IP_ATON);
  38. if (!$auth_rec) { db_log_error("Record with ip $HOST_IP not found! Bye."); exit; }
  39. my $auth_id = $auth_rec->{id};
  40. my $auth_name = $auth_rec->{dns_name};
  41. my $auth_ident = $HOST_IP;
  42. if ($auth_name) { $auth_ident = $auth_name."[".$HOST_IP."]"; }
  43. my $d_sql = "
  44. SELECT
  45. D.id, D.ip, D.device_name, D.vendor_id, D.device_model_id,
  46. DP.port, DP.snmp_index
  47. FROM devices D
  48. INNER JOIN device_ports DP ON D.id = DP.device_id
  49. INNER JOIN connections C ON DP.id = C.port_id
  50. WHERE
  51. D.snmp_version > 0
  52. AND C.auth_id = ?
  53. AND DP.uplink = 0
  54. ";
  55. my $dev_port = get_record_sql($dbh, $d_sql, $auth_id);
  56. if (!$dev_port) { db_log_error($dbh,"Connection for $HOST_IP not found! Bye."); exit; }
  57. my $switch = get_record_sql($dbh,'SELECT * FROM devices WHERE id=?',$dev_port->{id});
  58. if (!$switch) { db_log_error($dbh,"Switch for $HOST_IP not found! Bye."); exit; }
  59. setCommunity($switch);
  60. my $ip=$dev_port->{ip};
  61. my $model_id=$dev_port->{device_model_id};
  62. my $model_rec = get_record_sql($dbh,'SELECT model_name FROM device_models WHERE id=?',$model_id);
  63. my $model = $model_rec->{model_name};
  64. my $port=$dev_port->{port};
  65. my $vendor_id = $dev_port->{vendor_id};
  66. my $snmp_index=$dev_port->{snmp_index};
  67. my $device_name = $dev_port->{device_name};
  68. db_log_warning($dbh,"Restart $auth_ident at $device_name ($model $ip) [$port] request found. Try.");
  69. my $poe_oid;
  70. my $admin_oid;
  71. my $poe_enabled_value = 1;
  72. my $poe_disabled_value = 2;
  73. my $ret;
  74. #################### PORT STATE ###################
  75. #default
  76. $admin_oid=$admin_status_oid.$port;
  77. ##################### POE #########################
  78. #default
  79. $poe_oid=$pethPsePortAdminEnable.$snmp_index;
  80. #Huawei
  81. if ($vendor_id eq 3) {
  82. $poe_oid=$huawei_poe_oid.$snmp_index;
  83. }
  84. #NetGear
  85. if ($vendor_id eq 10) {
  86. $poe_oid=$netgear_poe_oid.$snmp_index;
  87. }
  88. ##################### Action ########################
  89. db_log_debug($dbh,"POE oid: $poe_oid");
  90. db_log_debug($dbh,"Admin oid: $admin_oid");
  91. if ($poe_oid) {
  92. $ret=snmp_set_int($ip,$poe_oid,$poe_disabled_value,$switch->{snmp});
  93. db_log_info($dbh,"Try disable POE at port $port.");
  94. db_log_debug($dbh,"Send to oid: $poe_oid value: $poe_disabled_value");
  95. }
  96. if ($admin_oid) {
  97. $ret=snmp_set_int($ip,$admin_oid,$poe_disabled_value,$switch->{snmp});
  98. db_log_info($dbh,"Try shutdown port $port.");
  99. db_log_debug($dbh,"Send to oid: $admin_oid value: $poe_disabled_value");
  100. }
  101. sleep($sleep_time);
  102. if ($admin_oid) {
  103. $ret=snmp_set_int($ip,$admin_oid,$poe_enabled_value,$switch->{snmp});
  104. db_log_info($dbh,"Enable POE at port $port.");
  105. db_log_debug($dbh,"Send to oid: $admin_oid value: $poe_enabled_value");
  106. }
  107. if ($poe_oid) {
  108. $ret=snmp_set_int($ip,$poe_oid,$poe_enabled_value,$switch->{snmp});
  109. db_log_info($dbh,"Up port $port.");
  110. db_log_debug($dbh,"Send to oid: $poe_oid value: $poe_enabled_value");
  111. }
  112. db_log_info($dbh,'Done!');
  113. exit;