bdcom.pm 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. use Modern::Perl;
  2. use utf8;
  3. use Mojo::AsyncAwait;
  4. use Data::Dumper;
  5. sub bdcom_extract_onu_num {
  6. my $onu_name = shift;
  7. $onu_name =~ m|EPON0/\d+:(\d+)|;
  8. return $1;
  9. }
  10. sub bdcom_extract_onu_info {
  11. my @lines = @_;
  12. return map([substr($_, 0, 11), split(' ', substr($_, 11, -1))], @lines[3..@lines-3]);
  13. }
  14. async bdcom_login => sub {
  15. my $t = shift;
  16. my $login = shift;
  17. my $password = shift;
  18. await $t->connect;
  19. await $t->reply(qr/Username:/, $login);
  20. await $t->reply(qr/Password:/, $password);
  21. my @greeting = await $t->waitfor(qr/>/);
  22. my $version = "C";
  23. for (@greeting)
  24. {
  25. $version = $1 if /Welcome to BDCOM P3310(\w)/;
  26. }
  27. $t->print("enable");
  28. my @next = await $t->waitfor(qr/#|password:/);
  29. if (grep {$_ =~ /password:/} @next)
  30. {
  31. $t->print($password);
  32. await $t->waitfor(qr/#/);
  33. }
  34. $t->prompt(qr/#/);
  35. await $t->cmd("terminal length 0");
  36. await $t->cmd("terminal width 200");
  37. };
  38. async bdcom_inspect => sub
  39. {
  40. my $ip = shift;
  41. my $login = shift;
  42. my $password = shift;
  43. my $tree = shift;
  44. ############################
  45. my $t = new telnet($ip);
  46. # $t->debug(1);
  47. await bdcom_login($t, $login, $password);
  48. #######################
  49. my @inactive_onu = await $t->cmd("show epon inactive-onu interface ePON 0/$tree");
  50. $inactive_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|;
  51. my $inactive_count = $1 || "?";
  52. if (@inactive_onu <= 1) {
  53. $inactive_count = 0;
  54. }
  55. my @active_onu = await $t->cmd("show epon active-onu interface ePON 0/$tree");
  56. $active_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|;
  57. my $active_count = $1 || "?";
  58. if (@active_onu <= 1) {
  59. $active_count = 0;
  60. }
  61. my $total_count = $active_count + $inactive_count;
  62. $t->close;
  63. my $res = "Всего: $total_count
  64. Количество активных ONU: $active_count
  65. Количество неактивных ONU: $inactive_count
  66. \n";
  67. my @in_onu_info = bdcom_extract_onu_info(@inactive_onu);
  68. my @compact_in_onu_info = map( [bdcom_extract_onu_num(@$_[0]), @$_[1]], @in_onu_info );
  69. @compact_in_onu_info = map( join(" ", @$_), @compact_in_onu_info);
  70. say Dumper @active_onu;
  71. my @a_onu_info = bdcom_extract_onu_info(@active_onu);
  72. say "test2";
  73. my @compact_a_onu_info = map( [bdcom_extract_onu_num(@$_[0]), @$_[1]], @a_onu_info );
  74. @compact_a_onu_info = map( join(" ", @$_), @compact_a_onu_info);
  75. $res = $res . "Неактивные ONU:\n" . join("\n", @compact_in_onu_info) . "\n\n";
  76. $res = $res . "Активные ONU:\n" . join("\n", @compact_a_onu_info);
  77. return $res;
  78. };
  79. async bdcom_onu => sub
  80. {
  81. my $ip = shift;
  82. my $login = shift;
  83. my $password = shift;
  84. my $tree = shift;
  85. ############################
  86. my $t = new telnet($ip);
  87. # $t->debug(1);
  88. await bdcom_login($t, $login, $password);
  89. #######################
  90. my @inactive_onu = await $t->cmd("show epon inactive-onu interface ePON 0/$tree");
  91. $inactive_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|;
  92. my $inactive_count = $1 || "?";
  93. if (@inactive_onu <= 1) {
  94. $inactive_count = 0;
  95. }
  96. $t->prompt(qr/#/);
  97. my @active_onu = await $t->cmd("show epon active-onu interface ePON 0/$tree");
  98. $active_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|;
  99. my $active_count = $1 || "?";
  100. if (@active_onu <= 1) {
  101. $active_count = 0;
  102. }
  103. my $total_count = $active_count + $inactive_count;
  104. $t->close;
  105. my $res = "Всего: $total_count
  106. Количество активных ONU: $active_count
  107. Количество неактивных ONU: $inactive_count
  108. \n";
  109. return $res;
  110. };
  111. async bdcom_purge => sub
  112. {
  113. my $ip = shift;
  114. my $login = shift;
  115. my $password = shift;
  116. my $tree = shift;
  117. ############################
  118. my $t = new telnet($ip);
  119. # $t->debug(1);
  120. await bdcom_login($t, $login, $password);
  121. #######################
  122. my @inactive_onu = await $t->cmd("show epon inactive-onu interface ePON 0/$tree");
  123. $inactive_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|;
  124. my $inactive_count = $1 || "?";
  125. if (@inactive_onu <= 1) {
  126. $inactive_count = 0;
  127. }
  128. my @active_onu = await $t->cmd("show epon active-onu interface ePON 0/$tree");
  129. $active_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|;
  130. my $active_count = $1 || "?";
  131. if (@active_onu <= 1) {
  132. $active_count = 0;
  133. }
  134. my $total_count = $active_count + $inactive_count;
  135. if ($inactive_count == 0) {
  136. $t->close;
  137. return "Нечего чистить";
  138. }
  139. await $t->cmd("config");
  140. await $t->cmd("interface EPON0/$tree");
  141. my @in_onu_info = bdcom_extract_onu_info(@inactive_onu);
  142. my @compact_in_onu_info = map( [bdcom_extract_onu_num(@$_[0]), @$_[1]], @in_onu_info );
  143. foreach my $i ( @compact_in_onu_info ) {
  144. say Dumper @$i[1];
  145. my $onu_mac = @$i[1];
  146. my @tmp = await $t->cmd("no epon bind-onu mac $onu_mac");
  147. say Dumper @tmp;
  148. }
  149. my @deleted_onu = map( join(" ", @$_), @compact_in_onu_info);
  150. await $t->cmd("exit");
  151. @inactive_onu = await $t->cmd("show epon inactive-onu interface ePON 0/$tree");
  152. $inactive_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|;
  153. $inactive_count = $1 || "?";
  154. if (@inactive_onu <= 1) {
  155. $inactive_count = 0;
  156. }
  157. @active_onu = await $t->cmd("show epon active-onu interface ePON 0/$tree");
  158. $active_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|;
  159. $active_count = $1 || "?";
  160. if (@active_onu <= 1) {
  161. $active_count = 0;
  162. }
  163. $total_count = $active_count + $inactive_count;
  164. await $t->cmd("write all");
  165. $t->close;
  166. my $res = "После чистки осталось ONU: $total_count
  167. Количество активных ONU: $active_count
  168. Количество неактивных ONU: $inactive_count
  169. \n";
  170. $res = $res . "Удалённые ONU:\n" . join("\n", @deleted_onu) if @deleted_onu > 0;
  171. return $res;
  172. };
  173. 1;