Rework JsonHelper.get() to work with bracket in keys

This commit is contained in:
Markus Opolka 2024-03-20 16:19:41 +01:00 committed by Markus Opolka
parent ce9c5fdada
commit dfcdf4d872
2 changed files with 45 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:

View File

@ -302,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)