commands.pm 6.7 KB

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