0

現在、サーバーの構成を自動化するスクリプトに取り組んでいます。モジュールを使用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;
}
4

1 に答える 1

0

デバイスのセット

それが魔法の言葉です。Set::Scalarを使用します。

の場合$expect_devices->is_subset($known_devices)、あなたの「一致」があります。

于 2013-07-18T10:58:56.220 に答える