如何在Icinga数组参数中转义逗号

时间:2018-05-16 16:40:53

标签: nagios icinga icinga2 icingaweb2 icingaweb

我有一个Python脚本,它采用可变数量的整数,并使用它们。使用命令行参数min(Node*)将值传递给脚本。当我在本地运行脚本时,它工作正常:

-s

在内部,使用以下代码将整数转换为逗号分隔的数组:

python check_myScript.py -s 1 2 3 4

如果我然后在脚本中调用# /usr/lib/naios/plugins/check_myScript.py import argparse parser = argparse.ArgumentParser parser.add_argument('-s', '--myNumbers', nargs='*', default="") args = parser.parse_args() ,我最终会得到一个如下所示的数组:

print args.myNumbers

我无法在Icinga Web上获得相同的输出。我怀疑这与Icinga如何解析宏有关。我的代码如下:

['1', '2', '3', '4']
# /etc/icinga2/conf.d/myScript.conf

# . . .

object Service "myService" {
  import "generic-service"
  host_name = "myHost"
  check_command = "myCheckCommand"
  vars.someNumbers = "1,2,3,4"
}

以下是我为#/etc/icinga2/conf.d/commands.conf # . . . object CheckCommand "myCheckCommand" { command = [PluginDir + "/check_myScript.py",] arguments = {"-s" = "$someNumbers$"} } 尝试的一些输入及其相应的输出:

vars.someNumbers =

更新:经过多次摆弄后,我设法让阵列看起来一样。我首先必须更改check命令的 INPUT | OUTPUT ---------------------------------------------- "'1' '2' '3' '4'" → ["'1' '2' '3' '4'"] "['1' '2' '3' '4']" → ["['1' '2' '3' '4']"] "['1','2','3','4']" → ["['1', '2', '3', '4']"] ['1','2','3','4'] → error [1,2,3,4] → ['4'] [1 2 3 4] → error "1,2,3,4" → ['1, 2, 3, 4'] 部分以禁用重复键:

arguments

我必须使用输入arguments = { "-s" = { value = "$someNumbers$" repeat_key = false } } 。 (有趣的是,["1", "2", "3", "4"] 工作,所以单引号和双引号之间显然存在差异。)

但是,有一个新问题:我的['1', '2', '3', '4']方法在Icinga上的行为与本地计算机上的行为不同。在我的本地计算机上,在.join()之后,我得到:

.join()

而在Icinga,我得到:

1,2,3,4(注意空格)

我尝试将1, 2, 3, 4添加到我的.replace(" ","")命令中,但它没有效果。

更新2: Icinga似乎对逗号和空格有一些奇怪的痴迷。该测试说明了这个问题:

.join()

这是一个更简单的问题示例:

# test.py

sentence = ['this','is','a','sentence']
print sentence           # → ['this', 'is', 'a', 'sentence']
print '-'.join(sentence) # → this-is-a-sentence
print ','.join(sentence) # → this, is, a, sentence

尽我所能,我还没有能够删除空格(这对我的应用程序来说是一个问题,因为它应该动态构建一个带有传入参数的URL)。

更新3 :针对我的特定情况,我当前的解决方法是在print "I,don't,want,spaces!" # → I, don't, want, spaces! 方法中使用%2C,这是逗号的URL编码。

1 个答案:

答案 0 :(得分:1)

我想最好的方法是使用Array in Icinga 2

object Service "myService" {
  import "generic-service"
  host_name = "myHost"
  check_command = "myCheckCommand"
  vars.someNumbers = [1, 2, 3, 4]
}

然后使用repeat_key false它应该可以工作。

arguments = {
    "-s" = { 
        value = "$someNumbers$"
        repeat_key = false
    }
}

请注意,Icinga 2不会允许你注射"空格"分隔命令行的各个部分。这是一个安全功能,因此您无法添加任何shell代码。

Icinga 2正在构建一个要执行的参数列表,以便将空格包含在一个参数中。

您也可以执行split in Icinga 2,但这是高级用法:

vars.someNumbers = "1,2,3,4"

object CheckCommand "myCheckCommand" {
  command = [PluginDir + "/check_myScript.py",]
  arguments = {
    "-s" = { 
      value = {{ 
        return macro("$someNumbers$").split(",")
      }}
      repeat_key = false
  }
}