簡體   English   中英

如何在Icinga數組參數中轉義逗號

[英]How to escape commas in Icinga array argument

我有一個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
    }
}

而且我必須使用輸入["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:我當前針對特定情況的解決方法是在.join()方法中使用%2C ,這是逗號的URL編碼。

我猜最好的方法是在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不允許您在命令行的各個部分插入“空格”。 這是一項安全功能,因此您無法添加任何外殼程序代碼。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM