summaryrefslogtreecommitdiffstats
path: root/src/live
diff options
context:
space:
mode:
authorAlejandro Sirgo Rica <asirgo@soleta.eu>2024-11-26 11:50:52 +0100
committerAlejandro Sirgo Rica <asirgo@soleta.eu>2024-11-27 13:53:19 +0100
commite4be5c34eb71da9a705bc62fdfcfe6d763022747 (patch)
tree70883c72fd8baa07ca225e5a7fee173158283bd2 /src/live
parenta36c4daa23d32aeee9539374aa591152ef2c914b (diff)
src: add support for direct command executionv1.3.2-25
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.
Diffstat (limited to 'src/live')
-rw-r--r--src/live/ogOperations.py45
1 files changed, 25 insertions, 20 deletions
diff --git a/src/live/ogOperations.py b/src/live/ogOperations.py
index ef18e33..ee83c4a 100644
--- a/src/live/ogOperations.py
+++ b/src/live/ogOperations.py
@@ -38,8 +38,6 @@ from src.utils.hw_inventory import get_hardware_inventory, legacy_list_hardware_
from src.log import OgError
-OG_SHELL = '/bin/bash'
-
class OgLiveOperations:
def __init__(self, config):
self._url = config['opengnsys']['url']
@@ -381,32 +379,38 @@ class OgLiveOperations:
def shellrun(self, request, ogRest):
cmd = request.getrun()
- cmds = cmd.split(";|\n\r")
+ is_inline = request.get_inline()
self._restartBrowser(self._url_log)
- shell_path = '/opt/opengnsys/shell/'
+ if is_inline:
+ cmds = cmd
+ else:
+ cmds = shlex.split(cmd)
+ shell_path = '/opt/opengnsys/shell/'
- restricted_mode = False
+ try:
+ shell_path_files = os.listdir(shell_path)
+ except OSError as e:
+ raise OgError(f'Error accessing {shell_path}: {e}') from e
- for file_name in os.listdir(shell_path):
- file_path = os.path.join(shell_path, file_name)
+ for file_name in shell_path_files:
+ file_path = os.path.join(shell_path, file_name)
- if cmds[0] == file_name:
- cmds[0] = file_path
- restricted_mode = True
- break
+ if cmds[0] == file_name:
+ cmds[0] = file_path
+ cmd = " ".join(cmds)
+ break
+ else:
+ raise OgError(f'Script {cmds[0]} not found in {shell_path}')
try:
- if restricted_mode:
- ogRest.proc = subprocess.Popen(cmds, stdout=subprocess.PIPE)
- else:
- ogRest.proc = subprocess.Popen(cmds,
- stdout=subprocess.PIPE,
- shell=True,
- executable=OG_SHELL)
+ ogRest.proc = subprocess.Popen(
+ cmds,
+ stdout=subprocess.PIPE,
+ shell=is_inline)
(output, error) = ogRest.proc.communicate()
- except OSError as e:
+ except (OSError, subprocess.SubprocessError) as e:
raise OgError(f'Error when running "shell run" subprocess: {e}') from e
if ogRest.proc.returncode != 0:
@@ -416,7 +420,8 @@ class OgLiveOperations:
self.refresh(ogRest)
- return (ogRest.proc.returncode, " ".join(cmds), output.decode('utf-8'))
+ output = output.decode('utf-8-sig', errors='replace')
+ return (ogRest.proc.returncode, cmd, output)
def session(self, request, ogRest):
disk = request.getDisk()