From e4be5c34eb71da9a705bc62fdfcfe6d763022747 Mon Sep 17 00:00:00 2001 From: Alejandro Sirgo Rica Date: Tue, 26 Nov 2024 11:50:52 +0100 Subject: src: add support for direct command execution Update live shell run mode for the new REST API interface. Evaluate the "inline" field to diferentiate between execution of script in /opt/opengnsys/shell/ and a cmd execution. Remove usage of echo argument of the API REST. Update Windows and Linux mode for direct command execution. Set OutputEncoding environment variable to 'utf-8' in Windows to unify the encoding of stdout for the invoked programs. Decode stdout to utf-8-sig to remove potential BOM. While at this, remove strange legacy ;|\n\r terminator. --- src/linux/ogOperations.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'src/linux') diff --git a/src/linux/ogOperations.py b/src/linux/ogOperations.py index bbce41a..5813cf7 100644 --- a/src/linux/ogOperations.py +++ b/src/linux/ogOperations.py @@ -7,9 +7,9 @@ # (at your option) any later version. import os +import shlex import psutil import subprocess -from subprocess import CalledProcessError from src.log import OgError from src.ogRest import ThreadState @@ -30,20 +30,22 @@ class OgLinuxOperations: def shellrun(self, request, ogRest): cmd = request.getrun() + is_inline = request.get_inline() + + if not is_inline: + raise OgError("Only inline mode is supported on Linux") + try: - result = subprocess.run(cmd, - shell=True, - stdin=subprocess.DEVNULL, - capture_output=True, - text=True, - check=True) - except CalledProcessError as error: - if error.stderr: - return error.stderr - if error.stdout: - return error.stdout - return "{Non zero exit code and empty output}" - return result.stdout + ogRest.proc = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + shell=True) + (output, error) = ogRest.proc.communicate() + except (OSError, subprocess.SubprocessError) as e: + raise OgError(f'Error when running "shell run" subprocess: {e}') from e + + output = output.decode('utf-8-sig', errors='replace') + return (ogRest.proc.returncode, cmd, output) def session(self, request, ogRest): raise OgError('Function not implemented') -- cgit v1.2.3-18-g5258