inspect_bdcom.pm 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. use Modern::Perl;
  2. use utf8;
  3. use telnet;
  4. sub extract_onu_num {
  5. my $onu_name = shift;
  6. $onu_name =~ m|EPON0/\d+:(\d+)|;
  7. return $1;
  8. };
  9. sub extract_onu_info {
  10. my @lines = @_;
  11. return map([substr($_, 0, 11), split(' ', substr($_, 12, -1))], @lines[3..@lines-3]);
  12. };
  13. async inspect_bdcom => sub
  14. {
  15. my $ip = shift;
  16. my $login = shift;
  17. my $password = shift;
  18. my $tree = shift;
  19. ############################
  20. my $t = new telnet($ip);
  21. # $t->debug(1);
  22. await $t->connect;
  23. await $t->reply(qr/Username:/, $login);
  24. await $t->reply(qr/Password:/, $password);
  25. my @greeting = await $t->waitfor(qr/>/);
  26. my $version = "C";
  27. for (@greeting)
  28. {
  29. $version = $1 if /Welcome to BDCOM P3310(\w)/;
  30. }
  31. $t->print("enable");
  32. my @next = await $t->waitfor(qr/#|password:/);
  33. if (grep {$_ =~ /password:/} @next)
  34. {
  35. $t->print($password);
  36. await $t->waitfor(qr/#/);
  37. }
  38. $t->prompt(qr/#/);
  39. await $t->cmd("terminal length 0");
  40. await $t->cmd("terminal width 200");
  41. #######################
  42. my @inactive_onu = await $t->cmd("show epon inactive-onu interface ePON 0/$tree");
  43. $inactive_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|;
  44. my $inactive_count = $1 || "?";
  45. $t->prompt(qr/#/);
  46. my @active_onu = await $t->cmd("show epon active-onu interface ePON 0/$tree");
  47. $active_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|;
  48. my $active_count = $1 || "?";
  49. my $total_count = $active_count + $inactive_count;
  50. $t->close;
  51. my $res = "Всего: $total_count
  52. Количество активных ONU: $active_count
  53. Количество неактивных ONU: $inactive_count
  54. \n";
  55. my @in_onu_info = extract_onu_info(@inactive_onu);
  56. my @compact_in_onu_info = map( [extract_onu_num(@$_[0]), @$_[1]], @in_onu_info );
  57. @compact_in_onu_info = map( join(" ", @$_), @compact_in_onu_info);
  58. my @a_onu_info = extract_onu_info(@active_onu);
  59. my @compact_a_onu_info = map( [extract_onu_num(@$_[0]), @$_[1]], @a_onu_info );
  60. @compact_a_onu_info = map( join(" ", @$_), @compact_a_onu_info);
  61. $res = $res . "Неактивные ONU:\n" . join("\n", @compact_in_onu_info) . "\n\n";
  62. $res = $res . "Активные ONU:\n" . join("\n", @compact_a_onu_info);
  63. return $res;
  64. };
  65. 1;