From 9f7a1fa0620de9be6cbba7b37b0d61032457b1cd Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Wed, 9 Apr 2025 17:36:13 +0200 Subject: [PATCH] configd: support "errors:no" clause on actions, closes https://github.com/opnsense/core/issues/8525 --- src/opnsense/service/modules/actions/base.py | 1 + .../service/modules/actions/script.py | 22 ++++++------------- .../service/modules/actions/script_output.py | 4 ++-- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/opnsense/service/modules/actions/base.py b/src/opnsense/service/modules/actions/base.py index 8d6047887..639b417c1 100644 --- a/src/opnsense/service/modules/actions/base.py +++ b/src/opnsense/service/modules/actions/base.py @@ -42,6 +42,7 @@ class BaseAction: self.parameters = action_parameters.get('parameters', None) self.message = action_parameters.get('message', None) self.description = action_parameters.get('description', '') + self.disable_errors = action_parameters.get('errors', '').lower().strip() == 'no' if action_parameters.get('cache_ttl', '').isdigit(): self.cache_ttl = int(action_parameters['cache_ttl']) else: diff --git a/src/opnsense/service/modules/actions/script.py b/src/opnsense/service/modules/actions/script.py index 558b91922..f352b772d 100644 --- a/src/opnsense/service/modules/actions/script.py +++ b/src/opnsense/service/modules/actions/script.py @@ -37,18 +37,10 @@ class Action(BaseAction): except TypeError as e: return str(e) - try: - exit_status = subprocess.call(script_command, env=self.config_environment, shell=True) - # send response - if exit_status == 0: - return 'OK' - else: - syslog_error('[%s] returned exit status %d' % (message_uuid, exit_status)) - return 'Error (%d)' % exit_status - except Exception as script_exception: - syslog_error('[%s] Script action failed with %s at %s' % ( - message_uuid, - script_exception, - traceback.format_exc() - )) - return 'Execute error' + proc = subprocess.run(script_command, env=self.config_environment, shell=True) + # send response + if proc.returncode == 0 or self.disable_errors: + return 'OK' + else: + syslog_error('[%s] returned exit status %d' % (message_uuid, proc.returncode)) + return 'Error (%d)' % proc.returncode diff --git a/src/opnsense/service/modules/actions/script_output.py b/src/opnsense/service/modules/actions/script_output.py index 897be5901..643d40a27 100644 --- a/src/opnsense/service/modules/actions/script_output.py +++ b/src/opnsense/service/modules/actions/script_output.py @@ -75,8 +75,8 @@ class Action(BaseAction): 'filename': output_stream.name, 'expire': time.time() + self.cache_ttl } - subprocess.check_call(script_command, env=self.config_environment, shell=True, - stdout=output_stream, stderr=error_stream) + subprocess.run(script_command, env=self.config_environment, shell=True, + check=not self.disable_errors, stdout=output_stream, stderr=error_stream) output_stream.seek(0) error_stream.seek(0) script_output = output_stream.read()