1
0

restart_port_snmp.pl 3.9 KB

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