2016-04-05 33 views
0

以下の機能はルータにログインし、コマンドを実行してIPsecセッションのステータスを取得し、インターフェイス名とIPアドレスを文字列として返します。文字列を返す代わりに、関数がハッシュの配列を返すようにしたい。誰かがそれで私を助けることができますか?perlのハッシュ配列を返します

sub cryptoSessionStatus { 
    my ($self,$interface) = @_; 
    my $status = 0; 
    my $peer_ip = 0; 

    #command to check the tunnel status 
    my $cmd  = 'command goes here ' . $interface; 
    #$self->_login(); 
    my $tunnel_status = $self->_login->exec($cmd); 

    #Regex to match the 'tunnel status' and 'peer ip' string in the cmd output 
    #Session status: DOWN/UP 
    #Peer: x.x.x.x 
    foreach my $line ( $tunnel_status) { 
     if ($line =~ m/Session\s+status:\s+(.*)/) { 
      $status = $1; 
     } 
     if ($line =~ m/Peer:\s+(\d+.\d+.\d+.\d+)/) { 
      $peer_ip = $1; 
     } 
    } 

    return ($status,$peer_ip); 
} 

ファンクションコール:

my $tunnel_obj = test::Cryptotunnels->new('host'=> 'ip'); 

my $crypto_sessions = $tunnel_obj->cryptoSessionStatus("tunnel1"); 
+0

Status => Ipのハッシュが存在することを意味しますか?そしてあなたはそれが返ってきたいと思いますか? –

+0

@Edダン私はIPおよびステータス({=> "アップ" IP => "x.x.x.x"、 ステータス} )ハッシュアレイのアレイ=として返されたいです。 – virat

+0

出力はどのように見えますか?サンプルを入手できますか? –

答えて

1

これはそれを行う必要があります。

my @session_states; 
my $status; 
foreach my $line ( $tunnel_status) { 
    if ($line =~ m/Session\s+status:\s+(.*)/) { 
     $status = $1; 
    } 
    if ($line =~ m/Peer:\s+(\d+.\d+.\d+.\d+)/) { 
     push @session_states, { ip => $1 , status => $status }; 
     $status = "" 
    } 
} 
return \@session_states; 
# 
# called like so 
# 
my $tunnel_obj = test::Cryptotunnels->new('host'=> 'ip'); 
my $crypto_sessions = $tunnel_obj->cryptoSessionStatus("tunnel1"); 
for my $obj (@$crypto_sessions) { 
    print $obj->{ip}, "\n"; 
    print $obj->{status}, "\n"; 
} 

これはSession status行は出力にPeer行を表示されます前提としています。逆の場合(ルータ出力のサンプルを提供していないので、少し推測する必要があります...):Peer行がSession status行の前にある場合は、このようにする必要があります:

my @session_states; 
my $peer_ip; 
foreach my $line ( $tunnel_status) { 
    if ($line =~ m/Session\s+status:\s+(.*)/) { 
     push @session_states, { ip => $peer_ip , status => $1 }; 
     $peer_ip = ""; 
    } 
    if ($line =~ m/Peer:\s+(\d+.\d+.\d+.\d+)/) { 
     $peer_ip = $1; 
    } 
} 
return \@session_states; 
# 
# called the same as above 
# 

アルゴリズムには実質的な違いはありません - 出力に第二どちらか早い方 - PeerまたはSession status - エントリの終了を定義し、ハッシュが2つのエントリを作成し、@session_statesアレイ上にプッシュされます。

+0

この回答の以前のバージョンでは、出力の行の出現順に依存しませんでした。そのバージョンのコードはおそらく動作しませんでした。 – Marty

関連する問題