現在、サーバーの構成を自動化するスクリプトに取り組んでいます。モジュールを使用Expect.pm
してサーバーとやり取りしていますが、解決方法がわからない問題に直面しています。
私がやろうとしているのはsend
、サーバーに現在インストールされているデバイスを一覧表示し、特定のアイテムがその一覧にあるかどうかを確認するサーバーへのコマンドです。問題は、リストがランダムな順序になっているため、どの項目を最初に期待すべきかがわからないことです.
私が達成しようとしているのは、すべてのアイテムを見つけてexpect
、すべてのアイテムが一致したときに呼び出しを終了することです。すべてのサーバーには独自のデバイス セットがあり、一致させる必要があるデバイスの数はさまざまであるため、ソリューションでは一般的なケースを解決する必要があることに注意してください。これを達成する方法はありExpect.pm
ますか?しばらく試してみましたが、良い解決策が見つからないようです...
前もって感謝します!
/ハソ
編集:解決策を見つけました
呼び出しの引数の配列を作成してexpect
呼び出しを行う関数を作成しました。この場合の参照$self
は、私自身が定義したオブジェクトです$self->{_expect}
が、expect オブジェクトです。
sub match_all {
my $self = shift;
my $timeout = shift;
my @patterns = @_;
my $pattern_count = @patterns;
my $match_count = 0;
#Function that is called when a pattern is matched
sub match{
my $exp = shift;
my $mc_ptr = shift;
my $pc_ptr = shift;
$$mc_ptr++;
if($$mc_ptr != $$pc_ptr) {
#Set the accumelator to the before and after string,
#effectivly cutting away the matched substring.
my $before = $exp->before();
my $after = $exp->after();
$exp->set_accum($before.$after);
exp_continue_timeout;
}
}
#Build the array of patterns for the expect call
my @exp_patterns;
foreach my $pattern (@patterns) {
push @exp_patterns, [$pattern, \&match, \$match_count, \$pattern_count];
}
#Set notransfer to True in order to manipulate
#the accumelator on my own during this function
$self->{_expect}->notransfer(1);
$self->{_expect}->expect($timeout, @exp_patterns);
$self->{_expect}->notransfer(0);
return $match_count == $pattern_count;
}