cdata.pm 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. use Modern::Perl;
  2. use utf8;
  3. use telnet;
  4. use Mojo::Base -strict, -async_await;
  5. use Data::Dumper;
  6. our $log;
  7. sub cdata_extract_onu_info {
  8. my @lines = @_;
  9. # say Dumper @lines;
  10. my @onu_info = @lines[4..@lines-5];
  11. return map([ split(' ', $_) ], @onu_info );
  12. };
  13. async sub cdata_login
  14. {
  15. my $t = shift;
  16. my $login = shift;
  17. my $password = shift;
  18. await $t->connect;
  19. await $t->reply(qr/User name:/, $login);
  20. await $t->reply(qr/User password:/, $password);
  21. $t->print("enable");
  22. await $t->waitfor("#");
  23. $t->prompt(qr/#\s?$/);
  24. await $t->cmd("config");
  25. await $t->cmd("vty output show-all");
  26. };
  27. async sub cdata_get_onu_info
  28. {
  29. my $t = shift;
  30. my $tree = shift;
  31. await $t->cmd("interface epon 0/0");
  32. my @lines = await $t->cmd("show ont info $tree all");
  33. my $onu_count_line = @lines[@lines-3];
  34. $onu_count_line =~ m|Total: (\d+), online (\d+)|;
  35. my $total_onu_cnt = $1;
  36. my $online_onu_cnt = $2;
  37. my $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
  38. if ($lines[2] =~ /Error/) {
  39. $total_onu_cnt = 0;
  40. $online_onu_cnt = 0;
  41. $offline_onu_cnt = 0;
  42. }
  43. await $t->cmd("exit");
  44. my @onu_info = cdata_extract_onu_info(@lines);
  45. my @online_onu = grep { @$_[5] =~ "online" } @onu_info;
  46. @online_onu = map [@$_[2,3]], @online_onu;
  47. my @offline_onu = grep { @$_[5] =~ "offline|powerdown" } @onu_info;
  48. @offline_onu = map [@$_[2,3]], @offline_onu;
  49. my %res = (
  50. 'total_cnt' => $total_onu_cnt,
  51. 'active_cnt' => $online_onu_cnt,
  52. 'inactive_cnt' => $offline_onu_cnt,
  53. 'active' => [ @online_onu ],
  54. 'inactive' => [ @offline_onu ],
  55. );
  56. return %res;
  57. };
  58. async sub cdata_fun_purge_tree
  59. {
  60. my $t = shift;
  61. my $tree = shift;
  62. my $onu_info = shift;
  63. my %onu_info = %{$onu_info};
  64. #say Dumper \%onu_info;
  65. await $t->cmd("interface epon 0/0");
  66. foreach my $i ( @{$onu_info{'inactive'}} ) {
  67. #say Dumper @$i[0];
  68. my $onu_num = @$i[0];
  69. # say Dumper $onu_num;
  70. my @tmp = await $t->cmd("ont delete $tree $onu_num");
  71. #say Dumper @tmp;
  72. }
  73. await $t->cmd("exit");
  74. my @deleted_onu = map { sprintf("%2d %s", $_->[0], $_->[1]) } @{$onu_info{inactive}};
  75. return @deleted_onu;
  76. };
  77. async sub cdata_inspect
  78. {
  79. my $ip = shift;
  80. my $login = shift;
  81. my $password = shift;
  82. my $tree = shift;
  83. my $t = new telnet($ip);
  84. # $t->debug(1);
  85. await cdata_login($t, $login, $password);
  86. my %onu_info = await cdata_get_onu_info($t, $tree);
  87. # say Dumper \%onu_info;
  88. $t->close;
  89. my $res = "Всего: $onu_info{'total_cnt'}
  90. Количество активных ONU: $onu_info{'active_cnt'}
  91. Количество неактивных ONU: $onu_info{'inactive_cnt'}
  92. \n";
  93. $res = $res . "Неактивные ONU:\n" . join("\n", map( join(" ", @$_), @{$onu_info{'inactive'}} ) ) . "\n\n";
  94. $res = $res . "Активные ONU:\n" . join("\n", map( join(" ", @$_), @{$onu_info{'active'}} ) );
  95. return $res;
  96. };
  97. async sub cdata_onu
  98. {
  99. my $ip = shift;
  100. my $login = shift;
  101. my $password = shift;
  102. my $tree = shift;
  103. my $t = new telnet($ip);
  104. # $t->debug(1);
  105. await cdata_login($t, $login, $password);
  106. my %onu_info = await cdata_get_onu_info($t, $tree);
  107. $t->close;
  108. my $res = "Всего: $onu_info{'total_cnt'}
  109. Количество активных ONU: $onu_info{'active_cnt'}
  110. Количество неактивных ONU: $onu_info{'inactive_cnt'}
  111. \n";
  112. return $res;
  113. };
  114. async sub cdata_purge
  115. {
  116. my $ip = shift;
  117. my $login = shift;
  118. my $password = shift;
  119. my $tree = shift;
  120. my $save = shift;
  121. my $t = new telnet($ip);
  122. # $t->debug(1);
  123. await cdata_login($t, $login, $password);
  124. my %onu_info = await cdata_get_onu_info($t, $tree);
  125. if ($onu_info{'inactive_cnt'} == 0) {
  126. $t->close;
  127. return "Нечего чистить.";
  128. }
  129. my @deleted_onu = await cdata_fun_purge_tree($t, $tree, \%onu_info);
  130. %onu_info = await cdata_get_onu_info($t, $tree);
  131. if ($save) {
  132. await $t->cmd("save");
  133. }
  134. $t->close;
  135. my $res = "Осталось ONU: $onu_info{'total_cnt'}\n";
  136. if ( $onu_info{'active_cnt'} != $onu_info{'total_cnt'} ) {
  137. $res = $res . "Общее количество ONU и количество активных ONU не совпадает.
  138. Лучше обратиться к Вашему системному администратору\n";
  139. }
  140. $res = $res . "Удалённые ONU: " . scalar @deleted_onu . "\n";
  141. $log->info("IP $ip TREE $tree\n" . join("\n", @deleted_onu));
  142. return $res;
  143. };
  144. async sub cdata_purgeall
  145. {
  146. my $ip = shift;
  147. my $login = shift;
  148. my $password = shift;
  149. my $tree_count = shift;
  150. my $save = shift;
  151. my @res;
  152. my $t = new telnet($ip);
  153. # $t->debug(1);
  154. await cdata_login($t, $login, $password);
  155. for (my $tree=1; $tree <= $tree_count; $tree++) {
  156. my $res = "Дерево $tree\n";
  157. my %onu_info = await cdata_get_onu_info($t, $tree);
  158. # say Dumper %onu_info;
  159. if ($onu_info{'inactive_cnt'} == 0) {
  160. $res = $res . "Не имеет неактивных ONU\n";
  161. push @res, $res;
  162. next;
  163. }
  164. my @deleted_onu = await cdata_fun_purge_tree($t, $tree, \%onu_info);
  165. # say Dumper @deleted_onu;
  166. %onu_info = await cdata_get_onu_info($t, $tree);
  167. $res = $res . "Осталось ONU: $onu_info{'total_cnt'}\n";
  168. $res = $res . "Удалённые ONU: " . scalar @deleted_onu . "\n";
  169. $log->info("IP $ip TREE $tree\n" . join("\n", @deleted_onu));
  170. push @res, $res;
  171. }
  172. if ($save) {
  173. await $t->cmd("save");
  174. }
  175. $t->close;
  176. return \@res;
  177. };
  178. 1;