use Modern::Perl; use utf8; use Mojo::AsyncAwait; use Data::Dumper; sub bdcom_extract_onu_num { my $onu_name = shift; $onu_name =~ m|EPON0/\d+:(\d+)|; return $1; } sub bdcom_extract_onu_info { my @lines = @_; return map([substr($_, 0, 11), split(' ', substr($_, 11, -1))], @lines[3..@lines-3]); } async bdcom_login => sub { my $t = shift; my $login = shift; my $password = shift; 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"); }; async bdcom_inspect => sub { my $ip = shift; my $login = shift; my $password = shift; my $tree = shift; ############################ my $t = new telnet($ip); # $t->debug(1); await bdcom_login($t, $login, $password); ####################### 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 = bdcom_extract_onu_info(@inactive_onu); my @compact_in_onu_info = map( [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 = bdcom_extract_onu_info(@active_onu); say "test2"; my @compact_a_onu_info = map( [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; }; async bdcom_onu => sub { my $ip = shift; my $login = shift; my $password = shift; my $tree = shift; ############################ my $t = new telnet($ip); # $t->debug(1); await bdcom_login($t, $login, $password); ####################### 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; } $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 || "?"; 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"; return $res; }; async bdcom_purge => sub { my $ip = shift; my $login = shift; my $password = shift; my $tree = shift; ############################ my $t = new telnet($ip); # $t->debug(1); await bdcom_login($t, $login, $password); ####################### 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; if ($inactive_count == 0) { $t->close; return "Нечего чистить"; } await $t->cmd("config"); await $t->cmd("interface EPON0/$tree"); my @in_onu_info = bdcom_extract_onu_info(@inactive_onu); my @compact_in_onu_info = map( [bdcom_extract_onu_num(@$_[0]), @$_[1]], @in_onu_info ); foreach my $i ( @compact_in_onu_info ) { say Dumper @$i[1]; my $onu_mac = @$i[1]; my @tmp = await $t->cmd("no epon bind-onu mac $onu_mac"); say Dumper @tmp; } my @deleted_onu = map( join(" ", @$_), @compact_in_onu_info); await $t->cmd("exit"); @inactive_onu = await $t->cmd("show epon inactive-onu interface ePON 0/$tree"); $inactive_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|; $inactive_count = $1 || "?"; if (@inactive_onu <= 1) { $inactive_count = 0; } @active_onu = await $t->cmd("show epon active-onu interface ePON 0/$tree"); $active_onu[0] =~ m|Interface EPON0/\d+ has bound (\d+)|; $active_count = $1 || "?"; if (@active_onu <= 1) { $active_count = 0; } $total_count = $active_count + $inactive_count; await $t->cmd("write all"); $t->close; my $res = "После чистки осталось ONU: $total_count Количество активных ONU: $active_count Количество неактивных ONU: $inactive_count \n"; $res = $res . "Удалённые ONU:\n" . join("\n", @deleted_onu) if @deleted_onu > 0; return $res; }; 1;