1
0

mikrotik.pm 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package Rstat::mikrotik;
  2. #
  3. # Copyright (C) Roman Dmitiriev, rnd@rajven.ru
  4. #
  5. use strict;
  6. use English;
  7. use FindBin '$Bin';
  8. use lib "$Bin";
  9. use base 'Exporter';
  10. use vars qw(@EXPORT @ISA);
  11. use Data::Dumper;
  12. use Rstat::config;
  13. use Rstat::main;
  14. use Net::Telnet;
  15. use Rstat::cmd;
  16. use Rstat::net_utils;
  17. use NetAddr::IP;
  18. use Net::IPv4Addr qw( :all );
  19. use Rstat::mysql;
  20. @ISA = qw(Exporter);
  21. @EXPORT = qw(
  22. Login_Mikrotik
  23. backup_Mikrotik
  24. get_arp_cache_Mikrotik
  25. get_fdb_table_Mikrotik
  26. ping_Mikrotik
  27. run_cmd_Mikrotik
  28. telnet_stringMi
  29. telnet_string_verboseMi
  30. );
  31. BEGIN
  32. {
  33. #------------------------------- Mikrotik switch -----------------------------------
  34. sub Login_Mikrotik {
  35. my $ip=shift;
  36. my $switch_type='mikrotik';
  37. log_session("Connect to switch $ip");
  38. my $timeout = $def_timeout;
  39. my $prompt=qr/\[(.*)+\@(.*)+\]\s+> $/;
  40. my $t;
  41. #for connect to session with timeout
  42. if ($debug) {
  43. $t = new Net::Telnet (Timeout => $timeout, Max_buffer_length=>10240000, Port => $router_port, Prompt => "/$prompt/", Dump_Log=>"$LOG_DIR/telnet-$ip.log") or die;
  44. } else {
  45. $t = new Net::Telnet (Timeout => $timeout, Max_buffer_length=>10240000, Port => $router_port, Prompt => "/$prompt/") or die;
  46. }
  47. $t->open($ip);
  48. $t->login($router_login.'+ct400w',$router_password);
  49. log_cmd($t,"/system note set show-at-login=no",1,$t->prompt);
  50. return $t;
  51. }
  52. #---------------------------------------------------------------------------------------------------------
  53. sub telnet_stringMi {
  54. my ($ip,$lines) = @_;
  55. eval {
  56. my $t = Login_Mikrotik($ip);
  57. log_cmd3($t,$lines);
  58. };
  59. if ($@) { log_error("Switch $ip:\n $@"); return 0; };
  60. return 1;
  61. }
  62. #---------------------------------------------------------------------------------------------------------
  63. sub telnet_string_verboseMi {
  64. my ($ip,$lines) = @_;
  65. my $blabla;
  66. eval {
  67. my $t = Login_Mikrotik($ip);
  68. $blabla=log_cmd3($t,$lines);
  69. };
  70. if ($@) { log_error("Switch $ip:\n $@"); return $@; };
  71. return $blabla;
  72. }
  73. #---------------------------------------------------------------------------------
  74. sub run_cmd_Mikrotik {
  75. my $t=shift;
  76. my $cmd=shift;
  77. my $cmd_id = shift || 1;
  78. run_command($t,$cmd,$cmd_id);
  79. }
  80. #---------------------------------------------------------------------------------
  81. sub backup_Mikrotik {
  82. my $t=shift;
  83. my @config=log_cmd($t,"/export");
  84. return \@config;
  85. }
  86. #---------------------------------------------------------------------------------
  87. sub get_arp_cache_Mikrotik {
  88. my $t=shift;
  89. my $interface = shift;
  90. my %arp_cache;
  91. my @arp_info=log_cmd($t,"/ip arp print without-paging");
  92. #Flags: X - disabled, I - invalid, H - DHCP, D - dynamic, P - published
  93. # # ADDRESS MAC-ADDRESS INTERFACE
  94. # 0 D 10.170.200.251 00:13:49:9C:CD:D3 vlan1000-managment
  95. # 1 D 10.170.200.250 00:15:6D:60:CD:CA vlan1000-managment
  96. chomp(@arp_info);
  97. foreach my $arp_str (@arp_info) {
  98. next if (!$arp_str);
  99. $arp_str=trim($arp_str);
  100. next if (!($arp_str=~/^\d/));
  101. next if ($interface and ($arp_str!~/$interface/));
  102. my @values = split(/\s+/,$arp_str);
  103. next if (!$values[2]);
  104. $arp_cache{$values[2]}=$values[3];
  105. }
  106. return \%arp_cache;
  107. }
  108. #---------------------------------------------------------------------------------
  109. sub get_fdb_table_Mikrotik {
  110. my $t=shift;
  111. my @fdb_info=log_cmd($t,"/interface bridge host print without-paging");
  112. chomp(@fdb_info);
  113. return @fdb_info;
  114. }
  115. #---------------------------------------------------------------------------------
  116. sub ping_Mikrotik {
  117. my $t=shift;
  118. my $ip = shift;
  119. my @ping_info=log_cmd($t,"/ping count=5 $ip");
  120. chomp(@ping_info);
  121. return @ping_info;
  122. }
  123. 1;
  124. }