use Modern::Perl; use utf8; use telnet; sub extract_onu_num { my $onu_name = shift; $onu_name =~ m|EPON0/\d+:(\d+)|; return $1; }; sub extract_onu_info { my @lines = @_; return map([substr($_, 0, 11), split(' ', substr($_, 12, -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 || "?"; $t->prompt(qr/#/); 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 || "?"; my $total_count = $active_count + $inactive_count; $t->close; my $res = "Всего: $total_count Количество активных ONU: $active_count Количество неактивных ONU: $inactive_count \n"; my @in_onu_info = extract_onu_info(@inactive_onu); my @compact_in_onu_info = map( [extract_onu_num(@$_[0]), @$_[1]], @in_onu_info ); @compact_in_onu_info = map( join(" ", @$_), @compact_in_onu_info); my @a_onu_info = extract_onu_info(@active_onu); my @compact_a_onu_info = map( [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;