purge_cdata.pm 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. use Modern::Perl;
  2. use utf8;
  3. use telnet;
  4. use Exporter;
  5. our @ISA= qw( Exporter );
  6. our @EXPORT = qw( purge_cdata );
  7. sub purge_cdata::_extract_onu_info {
  8. my @lines = @_;
  9. my @onu_info = @lines[6..@lines-5];
  10. return map([ split(' ', $_) ], @onu_info );
  11. };
  12. async purge_cdata => sub
  13. {
  14. my $ip = shift;
  15. my $login = shift;
  16. my $password = shift;
  17. my $tree = shift;
  18. my $t = new telnet($ip);
  19. # $t->debug(1);
  20. await $t->connect;
  21. await $t->reply(qr/User name:/, $login);
  22. await $t->reply(qr/User password:/, $password);
  23. $t->print("enable");
  24. await $t->waitfor("#");
  25. $t->prompt(qr/#\s?$/);
  26. await $t->cmd("config");
  27. await $t->cmd("vty output show-all");
  28. $t->print("interface epon 0/0");
  29. $t->prompt(qr/#\s?$/);
  30. my @lines = await $t->cmd("show ont info $tree all");
  31. my $onu_count_line = @lines[@lines-3];
  32. $onu_count_line =~ m|Total: (\d+), online (\d+)|;
  33. my $total_onu_cnt = $1;
  34. my $online_onu_cnt = $2;
  35. my $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
  36. if ($lines[2] =~ /Error/) {
  37. $total_onu_cnt = 0;
  38. $online_onu_cnt = 0;
  39. $offline_onu_cnt = 0;
  40. }
  41. if ($offline_onu_cnt == 0) {
  42. $t->close;
  43. return "Нечего чистить.";
  44. }
  45. my @onu_info = purge_cdata::_extract_onu_info(@lines);
  46. my @offline_onu = grep { @$_[5] =~ "offline|powerdown" } @onu_info;
  47. foreach my $i (@offline_onu) {
  48. my $onu_num = @$i[2];
  49. my @tmp = await $t->cmd("ont delete $tree $onu_num");
  50. }
  51. my @deleted_onu = map join(' ', @$_[2,3]), @offline_onu;
  52. @lines = await $t->cmd("show ont info $tree all");
  53. $onu_count_line = @lines[@lines-3];
  54. $onu_count_line =~ m|Total: (\d+), online (\d+)|;
  55. $total_onu_cnt = $1;
  56. $online_onu_cnt = $2;
  57. $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
  58. if ($lines[2] =~ /Error/) {
  59. $total_onu_cnt = 0;
  60. $online_onu_cnt = 0;
  61. $offline_onu_cnt = 0;
  62. }
  63. my $res = "После чистки осталось ONU: $total_onu_cnt
  64. Количество активных ONU: $online_onu_cnt
  65. Количество неактивных ONU: $offline_onu_cnt
  66. \n";
  67. $res = $res . "Удалённые ONU:\n" . join("\n", @deleted_onu) if @deleted_onu > 0;
  68. await $t->cmd("exit");
  69. await $t->cmd("save");
  70. $t->close;
  71. return $res;
  72. };
  73. 1;