#package inspect_bdcom; use Modern::Perl; use utf8; use telnet; use Exporter; our @ISA= qw( Exporter ); our @EXPORT = qw( inspect_bdcom ); sub inspect_bdcom::_extract_onu_num { my $onu_name = shift; $onu_name =~ m|EPON0/\d+:(\d+)|; return $1; }; sub inspect_bdcom::_extract_onu_info { my @lines = @_; return map([substr($_, 0, 11), split(' ', substr($_, 11, -1))], @lines[3..@lines-3]); }; async inspect_bdcom => 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/Username:/, $login); await $t->reply(qr/Password:/, $password); my @greeting = await $t->waitfor(qr/>/); my $version = "C"; for (@greeting) { $version = $1 if /Welcome to BDCOM P3310(\w)/; } $t->print("enable"); my @next = await $t->waitfor(qr/#|password:/); if (grep {$_ =~ /password:/} @next) { $t->print($password); await $t->waitfor(qr/#/); } $t->prompt(qr/#/); await $t->cmd("terminal length 0"); await $t->cmd("terminal width 200"); ####################### my @inactive_onu = await $t->cmd("show epon inactive-onu interface ePON 0/$tree"); $inactive_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|; my $inactive_count = $1 || "?"; if (@inactive_onu <= 1) { $inactive_count = 0; } my @active_onu = await $t->cmd("show epon active-onu interface ePON 0/$tree"); $active_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|; my $active_count = $1 || "?"; if (@active_onu <= 1) { $active_count = 0; } my $total_count = $active_count + $inactive_count; $t->close; my $res = "Всего: $total_count Количество активных ONU: $active_count Количество неактивных ONU: $inactive_count \n"; my @in_onu_info = inspect_bdcom::_extract_onu_info(@inactive_onu); my @compact_in_onu_info = map( [inspect_bdcom::_extract_onu_num(@$_[0]), @$_[1]], @in_onu_info ); @compact_in_onu_info = map( join(" ", @$_), @compact_in_onu_info); say Dumper @active_onu; my @a_onu_info = inspect_bdcom::_extract_onu_info(@active_onu); say "test2"; my @compact_a_onu_info = map( [inspect_bdcom::_extract_onu_num(@$_[0]), @$_[1]], @a_onu_info ); @compact_a_onu_info = map( join(" ", @$_), @compact_a_onu_info); $res = $res . "Неактивные ONU:\n" . join("\n", @compact_in_onu_info) . "\n\n"; $res = $res . "Активные ONU:\n" . join("\n", @compact_a_onu_info); return $res; }; 1;