2

RT4 允许新的 CustomField 由经过验证的 ipv4 或 ipv6 地址组成,并且还允许多个值。这允许我拥有一个“IP 地址”自定义字段,其中包含多个票证地址。

我似乎无法scrip从电子邮件(或任何与此相关的correspond事件)中接受多个地址,只接受一个地址。

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 表单提交请求,目前该请求将具有一个由类似的 IP 地址字段scrip(除了 x-fqdn、x-contact、x-OS 和其他信息正在收集)我在想一个逗号分隔的混合 ipv4、ipv6 列表可以在一行中被捕获,只要 RT 的地址解析器验证它,我们就可以开展业务。

任何建议都将不胜感激,除了那些将我引向可怕的 BestPractical wiki 的建议外,我已经梳理了每一个充满风滚草的页面,但都是空的。

4

1 回答 1

0

这里的问题是您只执行一次正则表达式,并且只获得第一个匹配项。您听起来像是想循环并找到尽可能多的匹配项。为了演示我制作了一些快速的 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

第二个演示了您要使用的语法:

~/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

您可以将其传递给另一个函数或方法,例如 AddCustomFieldValue,而不是打印 $ip 变量。

解释一下:正则表达式稍作更改以使用 g (或全局)开关,表明它将搜索整个字符串而不是在第一个匹配处停止 if 更改为一段时间 - 您可能可以使用 if 执行此操作不知何故-我只是不知道怎么做。如果你这样做了,你将不得不在一个变量中获取所有匹配项 - 可能是一个数组。之后,无论如何您都需要遍历数组,为每个元素运行 AddCustomFieldValue。我的 perl 不够强大,无法使用 if 来计算它,但我认为它在一段时间内更易读和更整洁。

于 2012-10-10T04:59:06.623 回答