| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- use Modern::Perl;
- use utf8;
- use telnet;
- use Mojo::AsyncAwait;
- use Data::Dumper;
- sub cdata_extract_onu_info {
- my @lines = @_;
- my @onu_info = @lines[6..@lines-5];
- return map([ split(' ', $_) ], @onu_info );
- };
- async cdata_inspect => sub
- {
- my $ip = shift;
- my $login = shift;
- my $password = shift;
- my $tree = shift;
- my $t = new telnet($ip);
- # $t->debug(1);
- await $t->connect;
- await $t->reply(qr/User name:/, $login);
- await $t->reply(qr/User password:/, $password);
- $t->print("enable");
- await $t->waitfor("#");
- $t->prompt(qr/#\s?$/);
- await $t->cmd("config");
- await $t->cmd("vty output show-all");
- $t->print("interface epon 0/0");
- $t->prompt(qr/#\s?$/);
- my @lines = await $t->cmd("show ont info $tree all");
- my $onu_count_line = @lines[@lines-3];
- $onu_count_line =~ m|Total: (\d+), online (\d+)|;
- my $total_onu_cnt = $1;
- my $online_onu_cnt = $2;
- my $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
- $t->close;
- if ($lines[2] =~ /Error/) {
- $total_onu_cnt = 0;
- $online_onu_cnt = 0;
- $offline_onu_cnt = 0;
- }
- my @onu_info = cdata_extract_onu_info(@lines);
- my @online_onu = grep { @$_[5] =~ "online" } @onu_info;
- @online_onu = map join(' ', @$_[2,3]), @online_onu;
- my @offline_onu = grep { @$_[5] =~ "offline|powerdown" } @onu_info;
- @offline_onu = map join(' ', @$_[2,3]), @offline_onu;
- my $res = "Всего: $total_onu_cnt
- Количество активных ONU: $online_onu_cnt
- Количество неактивных ONU: $offline_onu_cnt
- \n";
- $res = $res . "Неактивные ONU:\n" . join("\n", @offline_onu) . "\n\n" if $offline_onu_cnt;
- $res = $res . "Активные ONU:\n" . join("\n", @online_onu) if $online_onu_cnt;
- return $res;
- };
- async cdata_onu => sub
- {
- my $ip = shift;
- my $login = shift;
- my $password = shift;
- my $tree = shift;
- my $t = new telnet($ip);
- # $t->debug(1);
- await $t->connect;
- await $t->reply(qr/User name:/, $login);
- await $t->reply(qr/User password:/, $password);
- $t->print("enable");
- await $t->waitfor("#");
- $t->prompt(qr/#\s?$/);
- await $t->cmd("config");
- await $t->cmd("vty output show-all");
- $t->print("interface epon 0/0");
- $t->prompt(qr/#\s?$/);
- my @lines = await $t->cmd("show ont info $tree all");
- my $onu_count_line = @lines[@lines-3];
- $onu_count_line =~ m|Total: (\d+), online (\d+)|;
- my $total_onu_cnt = $1;
- my $online_onu_cnt = $2;
- my $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
- $t->close;
- if ($lines[2] =~ /Error/) {
- $total_onu_cnt = 0;
- $online_onu_cnt = 0;
- $offline_onu_cnt = 0;
- }
- my $res = "Всего: $total_onu_cnt
- Количество активных ONU: $online_onu_cnt
- Количество неактивных ONU: $offline_onu_cnt
- \n";
- return $res;
- };
- async cdata_purge => sub
- {
- my $ip = shift;
- my $login = shift;
- my $password = shift;
- my $tree = shift;
- my $t = new telnet($ip);
- # $t->debug(1);
- await $t->connect;
- await $t->reply(qr/User name:/, $login);
- await $t->reply(qr/User password:/, $password);
- $t->print("enable");
- await $t->waitfor("#");
- $t->prompt(qr/#\s?$/);
- await $t->cmd("config");
- await $t->cmd("vty output show-all");
- $t->print("interface epon 0/0");
- $t->prompt(qr/#\s?$/);
- my @lines = await $t->cmd("show ont info $tree all");
- my $onu_count_line = @lines[@lines-3];
- $onu_count_line =~ m|Total: (\d+), online (\d+)|;
- my $total_onu_cnt = $1;
- my $online_onu_cnt = $2;
- my $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
- if ($lines[2] =~ /Error/) {
- $total_onu_cnt = 0;
- $online_onu_cnt = 0;
- $offline_onu_cnt = 0;
- }
- if ($offline_onu_cnt == 0) {
- $t->close;
- return "Нечего чистить.";
- }
- my @onu_info = cdata_extract_onu_info(@lines);
- my @offline_onu = grep { @$_[5] =~ "offline|powerdown" } @onu_info;
- foreach my $i (@offline_onu) {
- my $onu_num = @$i[2];
- my @tmp = await $t->cmd("ont delete $tree $onu_num");
- }
- my @deleted_onu = map join(' ', @$_[2,3]), @offline_onu;
- @lines = await $t->cmd("show ont info $tree all");
- $onu_count_line = @lines[@lines-3];
- $onu_count_line =~ m|Total: (\d+), online (\d+)|;
- $total_onu_cnt = $1;
- $online_onu_cnt = $2;
- $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
- if ($lines[2] =~ /Error/) {
- $total_onu_cnt = 0;
- $online_onu_cnt = 0;
- $offline_onu_cnt = 0;
- }
- my $res = "После чистки осталось ONU: $total_onu_cnt
- Количество активных ONU: $online_onu_cnt
- Количество неактивных ONU: $offline_onu_cnt
- \n";
- $res = $res . "Удалённые ONU:\n" . join("\n", @deleted_onu) if @deleted_onu > 0;
- await $t->cmd("exit");
- await $t->cmd("save");
- $t->close;
- return $res;
- };
- 1;
|