5 Commits

Author SHA1 Message Date
Markus Opolka
dfcdf4d872 Rework JsonHelper.get() to work with bracket in keys 2024-03-22 16:19:43 +01:00
Markus Opolka
ce9c5fdada Merge pull request #85 from drewkerrigan/extend-tests
Extend tests for array syntax
2024-03-22 15:52:10 +01:00
Markus Opolka
27c710b2ea Extend tests for array syntax 2024-03-22 15:45:25 +01:00
Markus Opolka
dddf8432d6 Merge pull request #80 from mho21/master
disabled check_hostname to prevent error message when setting CERT_NONE
2022-10-04 16:26:06 +02:00
Markus Hof
739c093702 disabled check_hostname to prevent error message when setting CERT_NONE 2022-10-04 16:04:12 +02:00
2 changed files with 54 additions and 13 deletions

View File

@@ -156,25 +156,30 @@ class JsonHelper:
data = temp_data
else:
data = self.data
if len(key) <= 0:
return data
if key.find(self.separator) != -1 and \
key.find(self.arrayOpener) != -1:
if key.find(self.separator) != -1 and key.find(self.arrayOpener) != -1:
if key.find(self.separator) < key.find(self.arrayOpener):
return self.getSubElement(key, data)
else:
return self.getSubArrayElement(key, data)
else:
if key.find(self.separator) != -1:
return self.getSubElement(key, data)
else:
if key.find(self.arrayOpener) != -1:
return self.getSubArrayElement(key, data)
else:
if isinstance(data, dict) and key in data:
return data[key]
else:
return (None, 'not_found')
if key.find(self.separator) != -1:
return self.getSubElement(key, data)
if key.find(self.arrayOpener) != -1:
# If we got an arrayOpener but the next char is not [0-9] or * then it might just be a string
# This isn't optimal since this 'update (foobar)(0)' still won't work
if key[key.find(self.arrayOpener)+1].isnumeric() or key[key.find(self.arrayOpener)+1] == "*":
return self.getSubArrayElement(key, data)
if isinstance(data, dict) and key in data:
return data[key]
return (None, 'not_found')
def expandKey(self, key, keys):
if '(*)' not in key:
@@ -549,6 +554,7 @@ def main(cliargs):
context.options |= ssl.OP_NO_SSLv3
if args.insecure:
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
else:
context.verify_mode = ssl.CERT_OPTIONAL

View File

@@ -110,6 +110,14 @@ class UtilTest(unittest.TestCase):
self.check_data(RulesHelper().dash_U(['metric,0']),
'{"metric": 3}', UNKNOWN_CODE)
def test_array(self):
self.check_data(RulesHelper().dash_q(['foo(0),bar']),
'{"foo": ["bar"]}', OK_CODE)
self.check_data(RulesHelper().dash_q(['foo(0),foo']),
'{"foo": ["bar"]}', WARNING_CODE)
self.check_data(RulesHelper().dash_Q(['foo(1),bar']),
'{"foo": ["bar"]}', CRITICAL_CODE)
def test_exists(self):
self.check_data(RulesHelper().dash_e(['nothere']),
'{"metric": 5}', WARNING_CODE)
@@ -294,3 +302,30 @@ class UtilTest(unittest.TestCase):
# This should throw an error
data = '[]'
self.check_data(rules.dash_q(['(*).update_status,warn_me']), data, CRITICAL_CODE)
def test_bracket_in_key(self):
"""
https://github.com/drewkerrigan/nagios-http-json/issues/76
"""
rules = RulesHelper()
# This should work
data = '[{"update status": "failure"}]'
self.check_data(rules.dash_q(['(*).update status,failure']), data, OK_CODE)
data = '[{"update (status)": "failure"}]'
self.check_data(rules.dash_q(['(*).update (status),failure']), data, OK_CODE)
data = '[{"update (((status)": "failure"}]'
self.check_data(rules.dash_q(['(*).update (((status),failure']), data, OK_CODE)
data = '[{"update )status)": "failure"}]'
self.check_data(rules.dash_q(['(*).update )status),failure']), data, OK_CODE)
data = '[{"update (status": "failure"}]'
self.check_data(rules.dash_q(['(*).update (status),failure']), data, WARNING_CODE)
# Does not yet work
# data = '{"update (foobar)": ["bar"]}'
# self.check_data(rules.dash_q(['update (foobar)(0),bar']), data, OK_CODE)