| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 | 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# <b>/purge-all-trees</b> <i>ip-адрес-устройства</i> - Очистить все деревья PON#  notify($chatid, "<b>/purge </b> <i>ip-адрес-устройства номер-дерева</i> - Очистить дерево PON<b>/inspect</b> <i>ip-адрес-устройства номер-дерева</i> - Информация об ONU на дереве<b>/onu</b> <i>ip-адрес-устройства номер-дерева</i> - Краткая информация ONU на дереве", $rest);}# inspect 172.25.7.1 2 - посмотреть информацию об ONU на дереве 2 устройства 172.25.7.1async 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<code>$text</code>");};# onu 172.25.7.1 2 - получить короткую информацию об ONU на дереве 2 устройства 172.25.7.1async 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<code>$text</code>");};# 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<code>$text</code>");};###################################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;
 |