commands.pm 6.3 KB

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