2

RT4では、検証済みのipv4またはipv6アドレスで構成される新しいCustomFieldが可能であり、複数の値も可能です。これにより、チケットの複数のアドレスを持つ「IPアドレス」カスタムフィールドを作成できます。

scrip電子メール(またはそのことに関するイベント)から複数のアドレスを受け入れるものを取得できないようですcorrespond。1つのアドレスのみが受け入れられます。

私が使用しているのscripは、次のようなカスタムアクションです。

my $Ticket = $self->TicketObj;
my $Transaction = $self->TransactionObj;
my $body = $Transaction->Content();
my $cf = new RT::CustomField($RT::SystemUser);
my $id;
my $msg;
my $queue = 'Testes';

#---IPS
if($body =~ /X-addresses\:(.*)\n/i){
my $iplist = $1;
($id,$msg) = $cf->LoadByNameAndQueue (Name=>'addresses', Queue=>$queue);
($id,$msg) = $Ticket->AddCustomFieldValue (Field => $cf, Value =>$iplist);
}
return(1);

私はこれについて間違った方向に進んでいると言われることに反対していません。私のRTインストールの現在の慣行は、Webフォームにリクエストを送信させることです。現在、そのリクエストには、同様のscrip(x-fqdn、x-contact、x-OS、およびその他の情報に加えて)によって取得されるIPアドレスフィールドがあります。収集されている)そして私は混合ipv4、ipv6のコンマ区切りのリストを1行にまとめることができ、RTのアドレスパーサーがそれを検証する限り、私たちはビジネスを続けるだろうと考えていました。

恐ろしいBestPracticalwikiに私を導くものを除いて、どんな提案もいただければ幸いです。私はすべてのタンブルウィードに乗ったページをくまなく調べて、空になりました。

4

1 に答える 1

0

ここでの問題は、正規表現を1回だけ実行し、最初の一致のみを取得することです。ループして、できるだけ多くの一致を見つけたいように聞こえます。簡単なperlスクリプトを作成したことを示すために(RTをインストールしていないので、RT固有のものを省略しました)。

最初のものはあなたのものと非常によく似ており、最初の一致をつかんでそれを印刷します:

~/perl/test$ cat testRegex.pl
#! /usr/bin/perl

my $body = <<END;
X-Addresses:1.2.3.4
X-Addresses:2.3.4.5
X-Addresses:10.0.0.1
some other text
another line of content
END

if($body =~ /X-addresses\:(.*)\n/i){
        my $iplist = $1;
        print $iplist, "\n";
}

このスクリプトの出力は次のとおりです。

~/perl/test$ ./testRegex.pl
1.2.3.4

2つ目は、使用する構文を示しています。

~/perl/test$ cat testRegex2.pl
#! /usr/bin/perl

my $body = <<END;
X-Addresses:1.2.3.4
X-Addresses:2.3.4.5
X-Addresses:10.0.0.1
some other text
another line of content
END

while ($body =~ /X-addresses\:(.*)\n/gi){
        my $ip = $1;
        print $ip, "\n";
}

このスクリプトの出力は次のとおりです。

~/perl/test$ ./testRegex2.pl
1.2.3.4
2.3.4.5
10.0.0.1

$ ip変数を出力する代わりに、AddCustomFieldValueなどの別の関数またはメソッドに渡すことができます。

説明:正規表現はg(またはグローバル)スイッチを使用するようにわずかに変更され、最初の一致で停止するのではなく、文字列全体を検索することを示します。ifがしばらくに変更されると、おそらくifを使用してこれを行うことができます。どういうわけか-私は方法がわかりません。そうした場合、1つの変数(おそらく配列)ですべての一致を取得する必要があります。その後、要素ごとにAddCustomFieldValueを実行して、とにかく配列を反復処理する必要があります。私のperlは、ifを使用してそれを理解するのに十分なほど強力ではありませんが、とにかく、もう少し読みやすく、すっきりしていると思います。

于 2012-10-10T04:59:06.623 に答える