commands.pm 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. use Modern::Perl;
  2. use utf8;
  3. use Mojo::AsyncAwait;
  4. use Data::Dumper;
  5. use purge_cdata qw(purge_cdata);
  6. #use purge_bdcom qw(purge_bdcom);
  7. #use inspect_bdcom qw(inspect_bdcom);
  8. use inspect_cdata qw(inspect_cdata);
  9. #use onu_bdcom qw(onu_bdcom);
  10. use onu_cdata qw(onu_cdata);
  11. use bdcom;
  12. our $client;
  13. ##############################################
  14. sub command_help
  15. {
  16. my $cmd = shift;
  17. my $args = shift;
  18. my $chatid = shift;
  19. my $rest = shift;
  20. notify($chatid,
  21. "<b>/purge </b> <i>ip-адрес-устройства номер-дерева</i> - Очистить дерево PON
  22. <b>/inspect</b> <i>ip-адрес-устройства номер-дерева</i> - Информация об ONU на дереве
  23. <b>/onu</b> <i>ip-адрес-устройства номер-дерева</i> - Краткая информация ONU на дереве", $rest);
  24. }
  25. # inspect 172.25.7.1 2 - посмотреть информацию об ONU на дереве 2 устройства 172.25.7.1
  26. async command_inspect => sub
  27. {
  28. my $cmd = shift;
  29. my $args = shift;
  30. my $chatid = shift;
  31. my $rest = shift;
  32. my $ip = $args->[0];
  33. my $tree = $args->[1];
  34. return notify($chatid, "Не указан IP-адрес") unless $ip;
  35. return notify($chatid, "Не указан номер дерева") unless $tree;
  36. return notify($chatid, "Неправильный IP-адрес: $ip") unless is_valid_ip($ip);
  37. my $res;
  38. eval {
  39. $res = await $client->get_p("device", "/pon?query=ip=\"$ip\"");
  40. };
  41. return notify($chatid, "Ошибка: " . parse_error($@)) if $@;
  42. return notify($chatid, "Устройство с ip=$ip не найдено") if @$res<1;
  43. my $dev = $res->[0];
  44. my $sub;
  45. if ($dev->{type} =~ /^BDCOM/)
  46. {
  47. $sub = reference("bdcom_inspect");
  48. # $sub = sub { bdcom->inspect(@_) };
  49. }
  50. elsif ($dev->{type} =~ /^C-DATA/)
  51. {
  52. $sub = reference("inspect_cdata");
  53. }
  54. return notify($chatid, "Неправильный номер дерева: $tree") unless is_valid_tree($dev->{type}, $tree);
  55. return notify($chatid, "Устройство $ip '$dev->{name}' неизвестного типа $dev->{type}") unless $sub;
  56. # notify($chatid, "Смотрю дерево $tree на устройстве $ip '$dev->{name}'");
  57. my $text;
  58. eval {
  59. $text = await $sub->($ip, $dev->{login}, $dev->{password}, $tree);
  60. };
  61. return notify($chatid, "$ip '$dev->{name}': $@") if $@;
  62. notify($chatid, "$ip '$dev->{name}' дерево $tree
  63. <code>$text</code>");
  64. };
  65. # onu 172.25.7.1 2 - получить короткую информацию об ONU на дереве 2 устройства 172.25.7.1
  66. async command_onu => sub
  67. {
  68. my $cmd = shift;
  69. my $args = shift;
  70. my $chatid = shift;
  71. my $rest = shift;
  72. my $ip = $args->[0];
  73. my $tree = $args->[1];
  74. return notify($chatid, "Не указан IP-адрес") unless $ip;
  75. return notify($chatid, "Не указан номер дерева") unless $tree;
  76. return notify($chatid, "Неправильный IP-адрес: $ip") unless is_valid_ip($ip);
  77. my $res;
  78. eval {
  79. $res = await $client->get_p("device", "/pon?query=ip=\"$ip\"");
  80. };
  81. return notify($chatid, "Ошибка: " . parse_error($@)) if $@;
  82. return notify($chatid, "Устройство с ip=$ip не найдено") if @$res<1;
  83. my $dev = $res->[0];
  84. my $sub;
  85. if ($dev->{type} =~ /^BDCOM/)
  86. {
  87. $sub = reference("bdcom_onu");
  88. }
  89. elsif ($dev->{type} =~ /^C-DATA/)
  90. {
  91. $sub = reference("onu_cdata");
  92. }
  93. return notify($chatid, "Неправильный номер дерева: $tree") unless is_valid_tree($dev->{type}, $tree);
  94. return notify($chatid, "Устройство $ip '$dev->{name}' неизвестного типа $dev->{type}") unless $sub;
  95. # notify($chatid, "Смотрю дерево $tree на устройстве $ip '$dev->{name}'");
  96. my $text;
  97. eval {
  98. $text = await $sub->($ip, $dev->{login}, $dev->{password}, $tree);
  99. };
  100. return notify($chatid, "$ip '$dev->{name}': $@") if $@;
  101. notify($chatid, "$ip '$dev->{name}' дерево $tree
  102. <code>$text</code>");
  103. };
  104. # purge 172.1.1.1 2 - почистить дерево 2 на ПОН
  105. async command_purge => sub
  106. {
  107. my $cmd = shift;
  108. my $args = shift;
  109. my $chatid = shift;
  110. my $rest = shift;
  111. my $ip = $args->[0];
  112. my $tree = $args->[1];
  113. return notify($chatid, "Не указан IP-адрес") unless $ip;
  114. return notify($chatid, "Не указан номер дерева") unless $tree;
  115. return notify($chatid, "Неправильный IP-адрес: $ip") unless is_valid_ip($ip);
  116. my $res;
  117. eval {
  118. $res = await $client->get_p("device", "/pon?query=ip=\"$ip\"");
  119. };
  120. return notify($chatid, "Ошибка: " . parse_error($@)) if $@;
  121. return notify($chatid, "Устройство с ip=$ip не найдено") if @$res<1;
  122. my $dev = $res->[0];
  123. my $sub;
  124. if ($dev->{type} =~ /^BDCOM/)
  125. {
  126. $sub = reference("bdcom_purge");
  127. }
  128. elsif ($dev->{type} =~ /^C-DATA/)
  129. {
  130. $sub = reference("purge_cdata");
  131. }
  132. return notify($chatid, "Неправильный номер дерева: $tree") unless is_valid_tree($dev->{type}, $tree);
  133. return notify($chatid, "Устройство $ip '$dev->{name}' неизвестного типа $dev->{type}") unless $sub;
  134. notify($chatid, "Очищаю дерево $tree на устройстве $ip '$dev->{name}'");
  135. my $text;
  136. eval {
  137. $text = await $sub->($ip, $dev->{login}, $dev->{password}, $tree);
  138. };
  139. return notify($chatid, "$ip '$dev->{name}': $@") if $@;
  140. notify($chatid, "$ip '$dev->{name}' дерево $tree
  141. <code>$text</code>");
  142. };
  143. ###################################
  144. sub is_valid_ip
  145. {
  146. 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]?)$/;
  147. }
  148. sub get_tree_count
  149. {
  150. my $devtype = shift;
  151. if ($devtype =~ /^BDCOM P3608/) {
  152. return 8;
  153. } elsif ($devtype =~ /^BDCOM P3600-08/) {
  154. return 8;
  155. } elsif ($devtype =~ /^BDCOM P3616/) {
  156. return 16;
  157. } elsif ($devtype =~ /^BDCOM P3310/) {
  158. return 4;
  159. } elsif ($devtype =~ /^C-DATA FD1208/) {
  160. return 8;
  161. } elsif ($devtype =~ /^C-DATA FD1216/) {
  162. return 16;
  163. }
  164. return 0;
  165. }
  166. sub is_valid_tree
  167. {
  168. my $devtype = shift;
  169. my $tree_num = shift;
  170. my $tree_count = get_tree_count($devtype);
  171. return ($tree_num <= $tree_count)&&($tree_num > 0);
  172. }
  173. sub parse_error
  174. {
  175. my $e = shift;
  176. return $e unless ref $e;
  177. return "$e->{code} $e->{message} $e->{body}";
  178. }
  179. 1;