0

我有一个 Python 脚本,它接受可变数量的整数并对其进行一些处理。这些值通过命令行参数传递给脚本-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脚本,我最终会得到一个如下所示的数组:

['1', '2', '3', '4']

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

# /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 =及其相应的输出:

        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
    }
}

我不得不使用 input ["1", "2", "3", "4"]。(有趣的是,不起作用['1', '2', '3', '4'],因此单引号和双引号之间显然存在差异。)

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

1,2,3,4

而在 Icinga 上,我得到:

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

我尝试添加.replace(" ","")到我的.join()命令,但它没有效果。

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

# 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

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

print "I,don't,want,spaces!" # → I, don't, want, spaces!

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

更新 3:我当前针对特定情况的解决方法是%2C在我的.join()方法中使用,即逗号的 URL 编码。

4

1 回答 1

1

我想最好的方法是在 Icinga 2 中使用数组

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

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

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

请注意,Icinga 2 不允许您注入“空格”来分隔命令行的各个部分。这是一项安全功能,因此您不能添加任何 shell 代码。

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

您也可以在 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
  }
}
于 2018-05-25T07:43:55.067 回答