diff --git a/changelogs/fragments/10743-monit-handle-unknown-status.yml b/changelogs/fragments/10743-monit-handle-unknown-status.yml new file mode 100644 index 0000000000..1c9fbb1101 --- /dev/null +++ b/changelogs/fragments/10743-monit-handle-unknown-status.yml @@ -0,0 +1,2 @@ +bugfixes: + - monit - fix crash caused by an unknown status value returned from the monit service (https://github.com/ansible-collections/community.general/issues/10742, https://github.com/ansible-collections/community.general/pull/10743). diff --git a/plugins/modules/monit.py b/plugins/modules/monit.py index a10967264c..a6df722dd8 100644 --- a/plugins/modules/monit.py +++ b/plugins/modules/monit.py @@ -174,7 +174,11 @@ class Monit(object): status_val = status_val.split(' | ')[0] if ' - ' not in status_val: status_val = status_val.replace(' ', '_') - return getattr(Status, status_val) + try: + return getattr(Status, status_val) + except AttributeError: + self.module.warn("Unknown monit status '%s', treating as execution failed" % status_val) + return Status.EXECUTION_FAILED else: status_val, substatus = status_val.split(' - ') action, state = substatus.split() diff --git a/tests/unit/plugins/modules/test_monit.py b/tests/unit/plugins/modules/test_monit.py index e50c8e387f..0c854d913d 100644 --- a/tests/unit/plugins/modules/test_monit.py +++ b/tests/unit/plugins/modules/test_monit.py @@ -124,9 +124,11 @@ BASIC_OUTPUT_CASES = [ (TEST_OUTPUT % ('Process', 'processX', 'Not monitored'), monit.Status.NOT_MONITORED), (TEST_OUTPUT % ('Process', 'processX', 'Running'), monit.Status.OK), (TEST_OUTPUT % ('Process', 'processX', 'Execution failed | Does not exist'), monit.Status.EXECUTION_FAILED), + (TEST_OUTPUT % ('Process', 'processX', 'Some Unknown Status'), monit.Status.EXECUTION_FAILED), ]) def test_parse_status(output, expected): - status = monit.Monit(None, '', 'processX', 0)._parse_status(output, '') + module = mock.MagicMock() + status = monit.Monit(module, '', 'processX', 0)._parse_status(output, '') assert status == expected