diff options
author | OpenGnSys Support Team <soporte-og@soleta.eu> | 2024-03-27 17:25:53 +0100 |
---|---|---|
committer | OpenGnSys Support Team <soporte-og@soleta.eu> | 2024-04-01 13:44:17 +0200 |
commit | 1aba9d09236233e19d6145992c28e94afbd8758b (patch) | |
tree | e4e602ac78b3ac32c1596c299717e8542cdd0e40 | |
parent | 474183ab71aadd5b150b5d0a8acf0eae56e43ee2 (diff) |
Revert "live: improve lzop and partclone error handling"
This reverts commit 57787dab5499a38915b5e2f702844553abd2ea2a.
Read from stderr is blocking if no data is available, revert this patch since
ogClient hangs indefinitely in lzop invocations due to races in process
execution through Popen.
-rw-r--r-- | src/live/ogOperations.py | 73 |
1 files changed, 27 insertions, 46 deletions
diff --git a/src/live/ogOperations.py b/src/live/ogOperations.py index 6703041..cfe05f6 100644 --- a/src/live/ogOperations.py +++ b/src/live/ogOperations.py @@ -190,28 +190,14 @@ class OgLiveOperations: if not os.path.exists(image_path): raise RuntimeError(f'Image not found at {image_path} during image restore') - proc_lzop = subprocess.Popen(cmd_lzop, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - proc_pc = subprocess.Popen(cmd_pc, - stdin=proc_lzop.stdout, - stderr=subprocess.PIPE) - - pc_stderr = proc_pc.communicate()[1] - lzop_stderr = proc_lzop.stderr.read() - proc_lzop.poll() # update returncode - with open('/tmp/command.log', 'wb', 0) as logfile: - logfile.write(lzop_stderr) - logfile.write(pc_stderr) - - if proc_lzop.returncode != 0: - raise OSError(f'lzop subprocess failed: {lzop_stderr.decode("utf-8")}') - - if proc_pc.returncode != 0: - raise OSError(f'partclone subprocess failed: {pc_stderr.decode("utf-8")}') - - logging.info('Image restore successful') + proc_lzop = subprocess.Popen(cmd_lzop, + stdout=subprocess.PIPE) + proc_pc = subprocess.Popen(cmd_pc, + stdin=proc_lzop.stdout, + stderr=logfile) + proc_lzop.stdout.close() + proc_pc.communicate() def _ogbrowser_clear_logs(self): logfiles = ['/tmp/command.log', '/tmp/session.log'] @@ -465,37 +451,32 @@ class OgLiveOperations: if ogReduceFs(disk, partition) == -1: raise ValueError(f'Failed to shrink {fstype} filesystem in {padev}') + cmd1 = shlex.split(f'partclone.{fstype} -I -C --clone -s {padev} -O -') + cmd2 = shlex.split(f'lzop -1 -fo {image_path}') + + logfile = open('/tmp/command.log', 'wb', 0) + if os.path.exists(image_path) and backup: shutil.move(image_path, f'{image_path}.ant') + p1 = Popen(cmd1, stdout=PIPE, stderr=logfile) + p2 = Popen(cmd2, stdin=p1.stdout) + p1.stdout.close() + logging.info(f'Creating image at {image_path} from {padev} using {fstype}') logging.info('*DO NOT REBOOT OR POWEROFF* the client during this time') - cmd_pc = shlex.split(f'partclone.{fstype} -I -C --clone -s {padev} -O -') - cmd_lzop = shlex.split(f'lzop -1 -fo {image_path}') - - proc_pc = subprocess.Popen(cmd_pc, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - proc_lzop = subprocess.Popen(cmd_lzop, - stdin=proc_pc.stdout, - stderr=subprocess.PIPE) - - lzop_stderr = proc_lzop.communicate()[1] - pc_stderr = proc_pc.stderr.read() - proc_pc.poll() # update returncode - - with open('/tmp/command.log', 'wb', 0) as logfile: - logfile.write(pc_stderr) - logfile.write(lzop_stderr) - - if proc_pc.returncode != 0: - raise OSError(f'partclone subprocess failed: {pc_stderr.decode("utf-8")}') - - if proc_lzop.returncode != 0: - raise OSError(f'lzop subprocess failed: {lzop_stderr.decode("utf-8")}') - - logging.info('Image creation successful') + try: + retdata = p2.communicate() + except OSError as e: + raise OSError(f'Unexpected error when running partclone and lzop commands: {e}') from e + finally: + logfile.close() + p2.terminate() + p1.poll() + + logging.info(f'partclone process exited with code {p1.returncode}') + logging.info(f'lzop process exited with code {p2.returncode}') ogExtendFs(disk, partition) |