use Modern::Perl; use utf8; use Mojo::AsyncAwait; use Data::Dumper; use bdcom; use cdata; our $client; ############################################## sub command_help { my $cmd = shift; my $args = shift; my $chatid = shift; my $rest = shift; # TEMP # /purge-all-trees ip-адрес-устройства - Очистить все деревья PON # notify($chatid, "/purge ip-адрес-устройства номер-дерева - Очистить дерево PON /inspect ip-адрес-устройства номер-дерева - Информация об ONU на дереве /onu ip-адрес-устройства номер-дерева - Краткая информация ONU на дереве", $rest); } # inspect 172.25.7.1 2 - посмотреть информацию об ONU на дереве 2 устройства 172.25.7.1 async command_inspect => sub { my $cmd = shift; my $args = shift; my $chatid = shift; my $rest = shift; my $ip = $args->[0]; my $tree = $args->[1]; return notify($chatid, "Не указан IP-адрес") unless $ip; return notify($chatid, "Не указан номер дерева") unless $tree; return notify($chatid, "Неправильный IP-адрес: $ip") unless is_valid_ip($ip); my $res; eval { $res = await $client->get_p("device", "/pon?query=ip=\"$ip\""); }; return notify($chatid, "Ошибка: " . parse_error($@)) if $@; return notify($chatid, "Устройство с ip=$ip не найдено") if @$res<1; my $dev = $res->[0]; my $sub; if ($dev->{type} =~ /^BDCOM/) { $sub = reference("bdcom_inspect"); # $sub = sub { bdcom->inspect(@_) }; } elsif ($dev->{type} =~ /^C-DATA/) { $sub = reference("cdata_inspect"); } return notify($chatid, "Неправильный номер дерева: $tree") unless is_valid_tree($dev->{type}, $tree); return notify($chatid, "Устройство $ip '$dev->{name}' неизвестного типа $dev->{type}") unless $sub; # notify($chatid, "Смотрю дерево $tree на устройстве $ip '$dev->{name}'"); my $text; eval { $text = await $sub->($ip, $dev->{login}, $dev->{password}, $tree); }; return notify($chatid, "$ip '$dev->{name}': $@") if $@; notify($chatid, "$ip '$dev->{name}' дерево $tree $text"); }; # onu 172.25.7.1 2 - получить короткую информацию об ONU на дереве 2 устройства 172.25.7.1 async command_onu => sub { my $cmd = shift; my $args = shift; my $chatid = shift; my $rest = shift; my $ip = $args->[0]; my $tree = $args->[1]; return notify($chatid, "Не указан IP-адрес") unless $ip; return notify($chatid, "Не указан номер дерева") unless $tree; return notify($chatid, "Неправильный IP-адрес: $ip") unless is_valid_ip($ip); my $res; eval { $res = await $client->get_p("device", "/pon?query=ip=\"$ip\""); }; return notify($chatid, "Ошибка: " . parse_error($@)) if $@; return notify($chatid, "Устройство с ip=$ip не найдено") if @$res<1; my $dev = $res->[0]; my $sub; if ($dev->{type} =~ /^BDCOM/) { $sub = reference("bdcom_onu"); } elsif ($dev->{type} =~ /^C-DATA/) { $sub = reference("cdata_onu"); } return notify($chatid, "Неправильный номер дерева: $tree") unless is_valid_tree($dev->{type}, $tree); return notify($chatid, "Устройство $ip '$dev->{name}' неизвестного типа $dev->{type}") unless $sub; # notify($chatid, "Смотрю дерево $tree на устройстве $ip '$dev->{name}'"); my $text; eval { $text = await $sub->($ip, $dev->{login}, $dev->{password}, $tree); }; return notify($chatid, "$ip '$dev->{name}': $@") if $@; notify($chatid, "$ip '$dev->{name}' дерево $tree $text"); }; # purge 172.1.1.1 2 - почистить дерево 2 на ПОН async command_purge => sub { my $cmd = shift; my $args = shift; my $chatid = shift; my $rest = shift; my $ip = $args->[0]; my $tree = $args->[1]; return notify($chatid, "Не указан IP-адрес") unless $ip; return notify($chatid, "Не указан номер дерева") unless $tree; return notify($chatid, "Неправильный IP-адрес: $ip") unless is_valid_ip($ip); my $res; eval { $res = await $client->get_p("device", "/pon?query=ip=\"$ip\""); }; return notify($chatid, "Ошибка: " . parse_error($@)) if $@; return notify($chatid, "Устройство с ip=$ip не найдено") if @$res<1; my $dev = $res->[0]; my $sub; if ($dev->{type} =~ /^BDCOM/) { $sub = reference("bdcom_purge"); } elsif ($dev->{type} =~ /^C-DATA/) { $sub = reference("cdata_purge"); } return notify($chatid, "Неправильный номер дерева: $tree") unless is_valid_tree($dev->{type}, $tree); return notify($chatid, "Устройство $ip '$dev->{name}' неизвестного типа $dev->{type}") unless $sub; notify($chatid, "Очищаю дерево $tree на устройстве $ip '$dev->{name}'"); my $text; eval { $text = await $sub->($ip, $dev->{login}, $dev->{password}, $tree, 1); }; return notify($chatid, "$ip '$dev->{name}': $@") if $@; notify($chatid, "$ip '$dev->{name}' дерево $tree $text"); }; ################################### sub is_valid_ip { return $_[0] =~ /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; } sub get_tree_count { my $devtype = shift; if ($devtype =~ /^BDCOM P3608/) { return 8; } elsif ($devtype =~ /^BDCOM P3600-08/) { return 8; } elsif ($devtype =~ /^BDCOM P3616/) { return 16; } elsif ($devtype =~ /^BDCOM P3310/) { return 4; } elsif ($devtype =~ /^C-DATA FD1208/) { return 8; } elsif ($devtype =~ /^C-DATA FD1216/) { return 16; } return 0; } sub is_valid_tree { my $devtype = shift; my $tree_num = shift; my $tree_count = get_tree_count($devtype); return ($tree_num <= $tree_count) && ($tree_num > 0); } sub parse_error { my $e = shift; return $e unless ref $e; return "$e->{code} $e->{message} $e->{body}"; } 1;