2017-02-16 13 views
-1

這個想法是,第一個get_table從WLAN控制器獲取AP狀態,然後使用get_request獲取AP的主機名,因爲它打印出狀態表。我遇到的問題是$ ap_name作爲數組返回,當我只想要單個值時。perl - 從SNMP解析主機名和AP狀態

my ($session, $error) = Net::SNMP->session(
         -hostname => "$hostaddr", 
         -community => "$community", 
         -timeout => "30", 
         -version => "2c", 
         -port => "161"); 

if (!defined($session)) { 
     printf("ERROR: %s.\n", $error); 
     exit 1; 
} 


my $ap_stat = $session->get_table(-baseoid => $ap_stat_oid); 
my $ap_name = $session->get_table(-baseoid => $ap_name_oid); 

if (! defined $ap_stat || ! defined $ap_name) { 
    die "Failed to get OID '$ap_stat_oid': " . $session->error; 
    $session->close(); 
} 
my @ap_name_array; 
foreach my $ap_name_key (keys %$ap_name) { 
     push(@ap_name_array,$ap_name->{$ap_name_key}); 
} 
my @ap_stat_array; 
foreach my $ap_stat_key (keys %$ap_stat) { 
     push(@ap_stat_array,$ap_stat->{$ap_stat_key}); 
} 

編輯:我改變了一下,但仍然無法弄清楚下一步是什麼。我想我想將打印輸出存儲到數組中,然後將它們連接起來並打印到連接的數組中,但我不知道如何。

編輯:這是我想要的輸出:

AP-01 = 1 
AP-02 = 1 
AP-03 = 2 
AP-04 = 1 

等。

更多編輯:我得到的值成一個陣列,現在我只是試圖讓輸出正確的。

+0

對包含VarBindList內容的阻塞模式返回散列引用。在非阻塞模式下,當沒有發生錯誤時返回一個真值。在任一模式下,發生錯誤時都會返回未定義的值。 error()方法可用於確定失敗的原因。 – Pradeep

+0

我也讀過,但我需要非阻塞的get_table。我是否必須爲AP名稱打開另一個會話? – cflinspach

+0

如果您顯示您正在使用的實際OID,這將有所幫助。 – ThisSuitIsBlackNot

回答

0

使用List :: MoreUtils qw(pairwise);從here

if (! defined $ap_stat || ! defined $ap_name) { 
    die "Failed to get OID '$ap_stat_oid': " . $session->error; 
    $session->close(); 
} 
my @ap_name_array; 
foreach my $ap_name_key (keys %$ap_name) { 
     push(@ap_name_array,$ap_name->{$ap_name_key}); 
} 
my @ap_stat_array; 
foreach my $ap_stat_key (keys %$ap_stat) { 
     push(@ap_stat_array,$ap_stat->{$ap_stat_key}); 
} 

print pairwise { "$a = $b\n" } @ap_name_array, @ap_stat_array; 

打敗你吧@ThisSuitIsBlackNot,感謝反正!