【问题标题】:How can a Request Tracker `scrip` insert multiple IP addresses in RT4's new IP Address custom field?请求跟踪器“脚本”如何在 RT4 的新 IP 地址自定义字段中插入多个 IP 地址?
【发布时间】:2012-08-30 22:40:12
【问题描述】:

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 的建议,我已经梳理了每一个风滚草缠身的页面,但都是空的。

【问题讨论】:

  • 这看起来像 perl。如果是这样,如果您添加 perl 标签,您可能会得到更多响应。
  • 好的,我对此很好奇,但不确定当地的习俗。
  • 如果灰熊perl 的巫师变得焦躁不安,我可以毫无问题地将标签拉出来。我不想成为垃圾邮件。
  • 我注意到您使用术语“脚本”而不是“脚本”。这是故意的吗?
  • 是的,RT 使用一系列scrips 对票证上的交易执行各种逻辑。我不知道该术语的起源或它的细微差别,但我通常将它们视为“处方”。它们更像是 procmail 配方或 sieve 规则,而不是您通常认为的脚本。

标签: regex rt


【解决方案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

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

~/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 来计算它,但我认为它在一段时间内更易读和更整洁。

【讨论】:

  • 我想我遵循了您提供的解释,并且带有while 的脚本似乎没问题。我不确定是否将插入作为自定义字段,我的OnCorrespond 脚​​本中的当前节看起来像这样:gist。 — 但只插入第一个匹配项。有任何想法吗?感谢您迄今为止的帮助!
  • hmmmm,我只是在这里猜测,但可能是 $cf->LoadByNameAndQueue 应该只出现一次(并且当它回来重试时它会失败)。如果是这种情况,我只会将该行移到 while 行上方。但是,因为这更多是猜测,您可能需要添加::x
  • ...但是因为这更多是猜测,您可能需要在 LoadByNameAndQueue 和 AddCustomFieldValue 方法下添加 $RT::Logger->debug 语句以输出您返回的 id 和消息从他们。例如:$RT::Logger-&gt;debug("ID: " . $id . " MSG: " . $msg); 然后增加 RT 的日志记录级别以进行调试。该死的 5 分钟编辑限制...
  • 我相信它不起作用的原因是因为我正在使用“On Correspondence”的脚本操作进行测试,然后使用了评论。它必须是回复,您的调试建议显示我仍在调用我的旧脚本行为,因为它没有考虑它对应。 #facepalm。我仍在努力确保这一点,但到目前为止,多亏了你,我似乎可以顺利完成这项工作!现在我的表单人可能会告诉我他想要逗号分隔的东西。
猜你喜欢
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
相关资源
最近更新 更多