请求跟踪器`scrip`如何在RT4的新IP地址自定义字段中插入多个IP地址?

时间:2012-08-30 22:40:12

标签: regex rt

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表单提交请求,当前该请求将具有一个由类似scrip拾取的IP地址字段(除了x-fqdn,x-contact,x-操作系统,以及正在收集的其他信息)我正在考虑混合ipv4的逗号分隔列表,ipv6可以在一行中进行snarfed,只要RT的地址解析器验证它,我们就可以开展业务。

任何建议都会受到赞赏,除了那些引导我进入可怕的BestPractical wiki的建议,我已经梳理了每一个风滚草的页面并且空了。

1 个答案:

答案 0 :(得分: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改变了一段时间 - 你可能会以某种方式做到这一点 - 我只是不知道如何。如果你这样做了,你必须在一个变量中获得所有匹配 - 可能是一个数组。之后,您需要遍历数组,无论如何为每个元素运行AddCustomFieldValue。我的perl不够强大,不能用if来解决它,但我认为它有点可读性和干净一段时间。