purge_cdata.pm 2.7 KB

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