commands.pm 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. use Modern::Perl;
  2. use utf8;
  3. use Mojo::AsyncAwait;
  4. use Data::Dumper;
  5. use purge_cdata;
  6. use purge_bdcom;
  7. our $client;
  8. ##############################################
  9. sub command_help
  10. {
  11. my $cmd = shift;
  12. my $args = shift;
  13. my $chatid = shift;
  14. my $rest = shift;
  15. notify($chatid, "<b>/purge</b> <i>ip-адрес-устройства номер-дерева</i> - Очистить дерево PON", $rest);
  16. }
  17. # purge 172.1.1.1 2 - почистить дерево 2 на ПОН
  18. async command_purge => sub
  19. {
  20. my $cmd = shift;
  21. my $args = shift;
  22. my $chatid = shift;
  23. my $rest = shift;
  24. my $ip = $args->[0];
  25. my $tree = $args->[1];
  26. return notify($chatid, "Не указан IP-адрес") unless $ip;
  27. return notify($chatid, "Не указан номер дерева") unless $tree;
  28. return notify($chatid, "Неправильный IP-адрес: $ip") unless is_valid_ip($ip);
  29. return notify($chatid, "Неправильный номер дерева: $tree") unless $tree =~ /^\d+$/;
  30. my $res;
  31. eval {
  32. $res = await $client->get_p("device", "/pon?query=ip=\"$ip\"");
  33. };
  34. return notify($chatid, "Ошибка: " . parse_error($@)) if $@;
  35. return notify($chatid, "Устройство с ip=$ip не найдено") if @$res<1;
  36. my $dev = $res->[0];
  37. my $sub;
  38. if ($dev->{type} =~ /^BDCOM/)
  39. {
  40. $sub = reference("purge_bdcom");
  41. }
  42. elsif ($dev->{type} =~ /^C-DATA/)
  43. {
  44. $sub = reference("purge_cdata");
  45. }
  46. return notify($chatid, "Устройство $ip '$dev->{name}' неизвестного типа $dev->{type}") unless $sub;
  47. notify($chatid, "Очищаю дерево $tree на устройстве $ip '$dev->{name}'");
  48. my $count;
  49. eval {
  50. $count = await $sub->($ip, $dev->{login}, $dev->{password}, $tree);
  51. };
  52. return notify($chatid, "$ip '$dev->{name}': $@") if $@;
  53. notify($chatid, "$ip '$dev->{name}': работает $count ONU");
  54. };
  55. ###################################
  56. sub is_valid_ip
  57. {
  58. 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]?)$/;
  59. }
  60. sub parse_error
  61. {
  62. my $e = shift;
  63. return $e unless ref $e;
  64. return "$e->{code} $e->{message} $e->{body}";
  65. }
  66. 1;