Selaa lähdekoodia

added find_onu

alakiza 2 vuotta sitten
vanhempi
sitoutus
7f780e3346
3 muutettua tiedostoa jossa 74 lisäystä ja 21 poistoa
  1. 32 20
      djinn.pl
  2. 41 0
      modules/commands.pm
  3. 1 1
      run

+ 32 - 20
djinn.pl

@@ -16,6 +16,7 @@ use Mojo::JSON qw/j/;
 use NetAddr::IP;
 use HTML::Restrict;
 use Attribute::Handlers;
+use Redis;
 
 use FindBin qw/$Bin/;
 use lib "$Bin/lib";
@@ -67,13 +68,24 @@ my $term;
 my $int;
 my $hup;
 
-Mojo::IOLoop->next_tick(sub 
-{  
+our $redis;
+
+if ($config->{redis} =~ m|/|)
+{
+  $redis = Redis->new(sock => $config->{redis}, name=>"poller");
+}
+else
+{
+  $redis = Redis->new(server => $config->{redis}, name=>"poller");
+}
+
+Mojo::IOLoop->next_tick(sub
+{
   $term = AnyEvent->signal(signal => "TERM", cb => \&terminate);
   $int = AnyEvent->signal(signal => "INT", cb => \&terminate);
   $hup = AnyEvent->signal(signal => "HUP", cb => \&terminate);
 });
-                            
+
 ##########################
 
 my $ua = new Mojo::UserAgent;
@@ -87,7 +99,7 @@ hook before_dispatch => sub
   my $c = shift;
   say $c->req->to_string;
 };
-        
+
 hook after_dispatch => sub
 {
   my $c = shift;
@@ -107,12 +119,12 @@ post "/:token" => sub
   my $c = shift;
 
   $c->render(text=>"ok");
-  
+
   unless ($c->param("token") eq $config->{token})
   {
     return $c->render(status=>401, text=>"Request from unknown URL");
   }
-  
+
   my $body = j($c->req->body);
   my $m = $body->{message} || $body->{edited_message};
 
@@ -122,13 +134,13 @@ post "/:token" => sub
   {
     return notify($chatid, "Общение с ботом возможно только в чате");
   }
-  
+
   my $from = $m->{from};
   my $cmd = $m->{text};
   my $msgid = $m->{message_id};
-  
+
   return unless substr($cmd, 0, 1) eq "/"; # Бот не должен мешать общению, даже если его добавили админом
-  
+
   do_command($cmd, $chatid, {msgid=>$msgid, from=>$from});
 };
 
@@ -155,7 +167,7 @@ sub request
   {
     my $tx = shift;
     my $resp = $tx->result;
-         
+
     if ($resp->is_error)
     {
        my $err = {};
@@ -179,24 +191,24 @@ sub notify
   my $chatid = shift;
   my $message = shift;
   my $rest = shift || {};
-  
+
   my $params = {
     chat_id => $chatid,
     text => $message,
     disable_web_page_preview => 1,
   };
-  
+
   $params->{parse_mode} ||= "HTML";
   $params->{reply_to_message_id} = $rest->{reply_to} if $rest->{reply_to};
   $params->{disable_notification} = 1 if $rest->{silent};
 
   my $disable_error_handler = delete $params->{disable_error_handler};
-  
+
   if ($params->{parse_mode} eq "HTML")
   {
     $params->{text} = $html_strip->process($params->{text});
   }
-  
+
   my $promise = request("sendMessage", $params);
   unless ($disable_error_handler)
   {
@@ -205,7 +217,7 @@ sub notify
       $log->error(Dumper $params,@_);
     });
   }
-  
+
   return $promise;
 }
 
@@ -216,9 +228,9 @@ sub do_command
   my $cmd = shift;
   my $chatid = shift;
   my $rest = shift;
-  
+
   local($Data::Dumper::Terse) = 1;
-  
+
   my ($c,@args) = split(/\s+/,$cmd);
   $c =~ s|^/||;
   $c =~ s/\@MolDjinnBot$//;
@@ -229,11 +241,11 @@ sub do_command
   {
     return notify($chatid, "Неизвестная команда. Введите <b>/help</b>, чтобы увидеть список команд", $rest);
   }
-  
+
   eval {
     $sub->($c, \@args, $chatid, $rest);
   };
-  
+
   if ($@)
   {
     my $msg = ref $@ eq "HASH" ? Dumper($@) : $@;
@@ -250,7 +262,7 @@ sub refpath
   $name =~ s|/|::|g;
   return reference($name);
 }
-        
+
 sub reference
 {
   my $name = shift;

+ 41 - 0
modules/commands.pm

@@ -9,6 +9,8 @@ use bdcom;
 use cdata;
 
 our $client;
+our $redis;
+our $db;
 
 ##############################################
 
@@ -34,6 +36,45 @@ sub command_help :Alias("помощь")
 ---
 }
 
+async sub command_find :Alias("где")
+{
+  my $cmd = shift;
+  my $args = shift;
+  my $chatid = shift;
+  my $rest = shift;
+
+  my $onu_mac = uc $args->[0];
+
+  return notify($chatid, "Не указан MAC ONU") unless $onu_mac;
+
+  my $olts;
+  eval {
+      $olts = await $client->get_p("device", "/pon");
+  };
+
+  my @keys = $redis->keys("gpon-*");
+
+  foreach my $x (@keys) {
+    my %values = $redis->hgetall($x);
+    my $record = \%values;
+
+    if ( $record->{mac} && $record->{mac} =~ $onu_mac ) {
+        my @key_parts = split("-", $x);
+        my $dev_id = @key_parts[1];
+
+        my @olt_f = grep { $dev_id == $_->{entity} } @$olts;
+        my $olt = @olt_f[0];
+
+        unless ($olt) {
+            notify($chatid, "Не существует OLT id=$dev_id") unless $olt;
+        } else {
+            notify($chatid, "$olt->{name} ($olt->{ip}) $record->{name} (MAC-ONU: $record->{mac})");
+        }
+    }
+  }
+
+}
+
 # inspect 172.25.7.1 2 - посмотреть информацию об ONU на дереве 2 устройства 172.25.7.1
 async sub command_inspect :Alias("проверить")
 {

+ 1 - 1
run

@@ -1 +1 @@
-MOJO_CLIENT_DEBUG=1 MOJO_LOG_LEVEL=debug morbo djinn.pl daemon --mode test --listen http://*:2217
+MOJO_CLIENT_DEBUG=1 MOJO_LOG_LEVEL=debug morbo djinn.pl daemon --mode alakiza_test --listen http://*:2217