bdcom.pm 6.9 KB

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