use Modern::Perl;
use utf8;
use Mojo::AsyncAwait;
use Data::Dumper;
use purge_cdata;
use purge_bdcom;
use inspect_bdcom;
use inspect_cdata;
use onu_bdcom;
use onu_cdata;
our $client;
##############################################
sub command_help
{
my $cmd = shift;
my $args = shift;
my $chatid = shift;
my $rest = shift;
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("inspect_bdcom");
}
elsif ($dev->{type} =~ /^C-DATA/)
{
$sub = reference("inspect_cdata");
}
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("onu_bdcom");
}
elsif ($dev->{type} =~ /^C-DATA/)
{
$sub = reference("onu_cdata");
}
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("purge_bdcom");
}
elsif ($dev->{type} =~ /^C-DATA/)
{
$sub = reference("purge_cdata");
}
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 $count;
eval {
$count = await $sub->($ip, $dev->{login}, $dev->{password}, $tree);
};
return notify($chatid, "$ip '$dev->{name}': $@") if $@;
notify($chatid, "$ip '$dev->{name}': работает $count ONU");
};
###################################
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;