Browse Source

refactor cdata

alakiza 2 years ago
parent
commit
2a3be365d7
1 changed files with 76 additions and 101 deletions
  1. 76 101
      modules/cdata.pm

+ 76 - 101
modules/cdata.pm

@@ -14,15 +14,11 @@ sub cdata_extract_onu_info {
     return map([ split(' ', $_) ], @onu_info );
 };
 
-async cdata_inspect => sub
+async cdata_login => sub
 {
-    my $ip = shift;
-    my $login = shift;
+    my $t        = shift;
+    my $login    = shift;
     my $password = shift;
-    my $tree = shift;
-
-    my $t = new telnet($ip);
-#    $t->debug(1);
 
     await $t->connect;
 
@@ -36,47 +32,52 @@ async cdata_inspect => sub
     await $t->cmd("config");
     await $t->cmd("vty output show-all");
 
-    $t->print("interface epon 0/0");
-    $t->prompt(qr/#\s?$/);
+};
+
+async cdata_get_onu_info => sub
+{
+    my $t    = shift;
+    my $tree = shift;
+
+    await $t->cmd("interface epon 0/0");
     my @lines = await $t->cmd("show ont info $tree all");
 
     my $onu_count_line = @lines[@lines-3];
 
-
     $onu_count_line =~ m|Total: (\d+), online (\d+)|;
     my $total_onu_cnt   = $1;
     my $online_onu_cnt  = $2;
     my $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
 
-    $t->close;
-
     if ($lines[2] =~ /Error/) {
         $total_onu_cnt   = 0;
         $online_onu_cnt  = 0;
         $offline_onu_cnt = 0;
     }
 
+    await $t->cmd("exit");
+
     my @onu_info = cdata_extract_onu_info(@lines);
 
     my @online_onu = grep { @$_[5] =~ "online" }  @onu_info;
-    @online_onu = map join(' ', @$_[2,3]), @online_onu;
+    @online_onu = map [@$_[2,3]], @online_onu;
 
     my @offline_onu = grep { @$_[5] =~ "offline|powerdown" }  @onu_info;
-    @offline_onu = map join(' ', @$_[2,3]), @offline_onu;
-
-    my $res = "Всего: $total_onu_cnt
-Количество активных ONU: $online_onu_cnt
-Количество неактивных ONU: $offline_onu_cnt
-\n";
+    @offline_onu = map [@$_[2,3]], @offline_onu;
 
-    $res = $res . "Неактивные ONU:\n" . join("\n", @offline_onu) . "\n\n" if $offline_onu_cnt;
+    my %res = (
+        'total_cnt'    => $total_onu_cnt,
+        'active_cnt'   => $online_onu_cnt,
+        'inactive_cnt' => $offline_onu_cnt,
+        'active'       => [ @online_onu ],
+        'inactive'     => [ @offline_onu ],
+    );
 
-    $res = $res . "Активные ONU:\n" . join("\n", @online_onu) if $online_onu_cnt;
+    return %res;
 
-    return $res;
 };
 
-async cdata_onu => sub
+async cdata_inspect => sub
 {
     my $ip = shift;
     my $login = shift;
@@ -86,47 +87,27 @@ async cdata_onu => sub
     my $t = new telnet($ip);
 #    $t->debug(1);
 
-    await $t->connect;
-
-    await $t->reply(qr/User name:/, $login);
-    await $t->reply(qr/User password:/, $password);
-
-    $t->print("enable");
-    await $t->waitfor("#");
-    $t->prompt(qr/#\s?$/);
-
-    await $t->cmd("config");
-    await $t->cmd("vty output show-all");
-
-    $t->print("interface epon 0/0");
-    $t->prompt(qr/#\s?$/);
-    my @lines = await $t->cmd("show ont info $tree all");
-
-    my $onu_count_line = @lines[@lines-3];
+    await cdata_login($t, $login, $password);
 
-    $onu_count_line =~ m|Total: (\d+), online (\d+)|;
-    my $total_onu_cnt   = $1;
-    my $online_onu_cnt  = $2;
-    my $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
+    my %onu_info = await cdata_get_onu_info($t, $tree);
 
+#    say Dumper \%onu_info;
+    
     $t->close;
 
-    if ($lines[2] =~ /Error/) {
-        $total_onu_cnt   = 0;
-        $online_onu_cnt  = 0;
-        $offline_onu_cnt = 0;
-    }
-
-    my $res = "Всего: $total_onu_cnt
-Количество активных ONU: $online_onu_cnt
-Количество неактивных ONU: $offline_onu_cnt
+    my $res = "Всего: $onu_info{'total_cnt'}
+Количество активных ONU: $onu_info{'active_cnt'}
+Количество неактивных ONU: $onu_info{'inactive_cnt'}
 \n";
 
+    $res = $res . "Неактивные ONU:\n" . join("\n", map( join(" ", @$_), @{$onu_info{'inactive'}} ) ) . "\n\n";
+
+    $res = $res . "Активные ONU:\n" . join("\n", map( join(" ", @$_), @{$onu_info{'active'}} ) );
+
     return $res;
 };
 
-
-async cdata_purge => sub
+async cdata_onu => sub
 {
     my $ip = shift;
     my $login = shift;
@@ -136,77 +117,71 @@ async cdata_purge => sub
     my $t = new telnet($ip);
 #    $t->debug(1);
 
-    await $t->connect;
+    await cdata_login($t, $login, $password);
 
-    await $t->reply(qr/User name:/, $login);
-    await $t->reply(qr/User password:/, $password);
+    my %onu_info = await cdata_get_onu_info($t, $tree);
 
-    $t->print("enable");
-    await $t->waitfor("#");
-    $t->prompt(qr/#\s?$/);
+    $t->close;
 
-    await $t->cmd("config");
-    await $t->cmd("vty output show-all");
+    my $res = "Всего: $onu_info{'total_cnt'}
+Количество активных ONU: $onu_info{'active_cnt'}
+Количество неактивных ONU: $onu_info{'inactive_cnt'}
+\n";
 
-    $t->print("interface epon 0/0");
-    $t->prompt(qr/#\s?$/);
-    my @lines = await $t->cmd("show ont info $tree all");
+    return $res;
+};
 
-    my $onu_count_line = @lines[@lines-3];
+async cdata_purge => sub
+{
+    my $ip = shift;
+    my $login = shift;
+    my $password = shift;
+    my $tree = shift;
+    my $save = shift;
 
-    $onu_count_line =~ m|Total: (\d+), online (\d+)|;
-    my $total_onu_cnt   = $1;
-    my $online_onu_cnt  = $2;
-    my $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
+    my $t = new telnet($ip);
+#    $t->debug(1);
 
-    if ($lines[2] =~ /Error/) {
-        $total_onu_cnt   = 0;
-        $online_onu_cnt  = 0;
-        $offline_onu_cnt = 0;
-    }
+    await cdata_login($t, $login, $password);
+
+    my %onu_info = await cdata_get_onu_info($t, $tree);
 
-    if ($offline_onu_cnt == 0) {
+    if ($onu_info{'inactive_cnt'} == 0) {
         $t->close;
         return "Нечего чистить.";
     }
 
-    my @onu_info = cdata_extract_onu_info(@lines);
+    say Dumper \%onu_info;
 
-    my @offline_onu = grep { @$_[5] =~ "offline|powerdown" }  @onu_info;
+    await $t->cmd("interface epon 0/0");
 
-    foreach my $i (@offline_onu) {
-        my $onu_num = @$i[2];
+    foreach my $i ( @{$onu_info{'inactive'}} ) {
+        say Dumper @$i[0];
+        my $onu_num = @$i[0];
         my @tmp = await $t->cmd("ont delete $tree $onu_num");
+        say Dumper @tmp;
     }
 
-    my @deleted_onu = map join(' ', @$_[2,3]), @offline_onu;
+    await $t->cmd("exit");
 
-    @lines = await $t->cmd("show ont info $tree all");
-    $onu_count_line = @lines[@lines-3];
+    my @deleted_onu = map( join(" ", @$_), @{$onu_info{'inactive'}});
 
-    $onu_count_line =~ m|Total: (\d+), online (\d+)|;
-    $total_onu_cnt   = $1;
-    $online_onu_cnt  = $2;
-    $offline_onu_cnt = $total_onu_cnt - $online_onu_cnt;
+    %onu_info = await cdata_get_onu_info($t, $tree);
 
-    if ($lines[2] =~ /Error/) {
-        $total_onu_cnt   = 0;
-        $online_onu_cnt  = 0;
-        $offline_onu_cnt = 0;
+    if ($save) {
+        await $t->cmd("save");
     }
 
-    my $res = "После чистки осталось ONU: $total_onu_cnt
-Количество активных ONU: $online_onu_cnt
-Количество неактивных ONU: $offline_onu_cnt
-\n";
-
-    $res = $res . "Удалённые ONU:\n" . join("\n", @deleted_onu) if @deleted_onu > 0;
+    $t->close;
 
-    await $t->cmd("exit");
+    my $res = "Осталось ONU: $onu_info{'total_cnt'}\n";
 
-    await $t->cmd("save");
+    if ( $onu_info{'active_cnt'} != $onu_info{'total_cnt'} ) {
+        $res = $res . "Общее количество ONU и количество активных ONU не совпадает.
+Лучше обратиться к Вашему системноу администратору\n";
+    }
 
-    $t->close;
+    $res = $res . "Удалённые ONU:\n" . join("\n", @deleted_onu) if @deleted_onu > 0;
 
     return $res;
 };