cdata.pm 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. use Modern::Perl;
  2. use utf8;
  3. use telnet;
  4. use Mojo::AsyncAwait;
  5. use Data::Dumper;
  6. sub cdata_extract_onu_info {
  7. my @lines = @_;
  8. my @onu_info = @lines[6..@lines-5];
  9. return map([ split(' ', $_) ], @onu_info );
  10. };
  11. async cdata_inspect => sub
  12. {
  13. my $ip = shift;
  14. my $login = shift;
  15. my $password = shift;
  16. my $tree = shift;
  17. my $t = new telnet($ip);
  18. # $t->debug(1);
  19. await $t->connect;
  20. await $t->reply(qr/User name:/, $login);
  21. await $t->reply(qr/User password:/, $password);
  22. $t->print("enable");
  23. await $t->waitfor("#");
  24. $t->prompt(qr/#\s?$/);
  25. await $t->cmd("config");
  26. await $t->cmd("vty output show-all");
  27. $t->print("interface epon 0/0");
  28. $t->prompt(qr/#\s?$/);
  29. my @lines = await $t->cmd("show ont info $tree all");
  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. $t->close;
  36. if ($lines[2] =~ /Error/) {
  37. $total_onu_cnt = 0;
  38. $online_onu_cnt = 0;
  39. $offline_onu_cnt = 0;
  40. }
  41. my @onu_info = cdata_extract_onu_info(@lines);
  42. my @online_onu = grep { @$_[5] =~ "online" } @onu_info;
  43. @online_onu = map join(' ', @$_[2,3]), @online_onu;
  44. my @offline_onu = grep { @$_[5] =~ "offline|powerdown" } @onu_info;
  45. @offline_onu = map join(' ', @$_[2,3]), @offline_onu;
  46. my $res = "Всего: $total_onu_cnt
  47. Количество активных ONU: $online_onu_cnt
  48. Количество неактивных ONU: $offline_onu_cnt
  49. \n";
  50. $res = $res . "Неактивные ONU:\n" . join("\n", @offline_onu) . "\n\n" if $offline_onu_cnt;
  51. $res = $res . "Активные ONU:\n" . join("\n", @online_onu) if $online_onu_cnt;
  52. return $res;
  53. };
  54. async cdata_onu => sub
  55. {
  56. my $ip = shift;
  57. my $login = shift;
  58. my $password = shift;
  59. my $tree = shift;
  60. my $t = new telnet($ip);
  61. # $t->debug(1);
  62. await $t->connect;
  63. await $t->reply(qr/User name:/, $login);
  64. await $t->reply(qr/User password:/, $password);
  65. $t->print("enable");
  66. await $t->waitfor("#");
  67. $t->prompt(qr/#\s?$/);
  68. await $t->cmd("config");
  69. await $t->cmd("vty output show-all");
  70. $t->print("interface epon 0/0");
  71. $t->prompt(qr/#\s?$/);
  72. my @lines = await $t->cmd("show ont info $tree all");
  73. my $onu_count_line = @lines[@lines-3];
  74. $onu_count_line =~ m|Total: (\d+), online (\d+)|;
  75. my $total_onu_cnt = $1;
  76. my $online_onu_cnt = $2;
  77. my $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
  78. $t->close;
  79. if ($lines[2] =~ /Error/) {
  80. $total_onu_cnt = 0;
  81. $online_onu_cnt = 0;
  82. $offline_onu_cnt = 0;
  83. }
  84. my $res = "Всего: $total_onu_cnt
  85. Количество активных ONU: $online_onu_cnt
  86. Количество неактивных ONU: $offline_onu_cnt
  87. \n";
  88. return $res;
  89. };
  90. async cdata_purge => sub
  91. {
  92. my $ip = shift;
  93. my $login = shift;
  94. my $password = shift;
  95. my $tree = shift;
  96. my $t = new telnet($ip);
  97. # $t->debug(1);
  98. await $t->connect;
  99. await $t->reply(qr/User name:/, $login);
  100. await $t->reply(qr/User password:/, $password);
  101. $t->print("enable");
  102. await $t->waitfor("#");
  103. $t->prompt(qr/#\s?$/);
  104. await $t->cmd("config");
  105. await $t->cmd("vty output show-all");
  106. $t->print("interface epon 0/0");
  107. $t->prompt(qr/#\s?$/);
  108. my @lines = await $t->cmd("show ont info $tree all");
  109. my $onu_count_line = @lines[@lines-3];
  110. $onu_count_line =~ m|Total: (\d+), online (\d+)|;
  111. my $total_onu_cnt = $1;
  112. my $online_onu_cnt = $2;
  113. my $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
  114. if ($lines[2] =~ /Error/) {
  115. $total_onu_cnt = 0;
  116. $online_onu_cnt = 0;
  117. $offline_onu_cnt = 0;
  118. }
  119. if ($offline_onu_cnt == 0) {
  120. $t->close;
  121. return "Нечего чистить.";
  122. }
  123. my @onu_info = cdata_extract_onu_info(@lines);
  124. my @offline_onu = grep { @$_[5] =~ "offline|powerdown" } @onu_info;
  125. foreach my $i (@offline_onu) {
  126. my $onu_num = @$i[2];
  127. my @tmp = await $t->cmd("ont delete $tree $onu_num");
  128. }
  129. my @deleted_onu = map join(' ', @$_[2,3]), @offline_onu;
  130. @lines = await $t->cmd("show ont info $tree all");
  131. $onu_count_line = @lines[@lines-3];
  132. $onu_count_line =~ m|Total: (\d+), online (\d+)|;
  133. $total_onu_cnt = $1;
  134. $online_onu_cnt = $2;
  135. $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
  136. if ($lines[2] =~ /Error/) {
  137. $total_onu_cnt = 0;
  138. $online_onu_cnt = 0;
  139. $offline_onu_cnt = 0;
  140. }
  141. my $res = "После чистки осталось ONU: $total_onu_cnt
  142. Количество активных ONU: $online_onu_cnt
  143. Количество неактивных ONU: $offline_onu_cnt
  144. \n";
  145. $res = $res . "Удалённые ONU:\n" . join("\n", @deleted_onu) if @deleted_onu > 0;
  146. await $t->cmd("exit");
  147. await $t->cmd("save");
  148. $t->close;
  149. return $res;
  150. };
  151. 1;