summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/live/ogOperations.py74
1 files changed, 47 insertions, 27 deletions
diff --git a/src/live/ogOperations.py b/src/live/ogOperations.py
index 05c6a10..364f3bd 100644
--- a/src/live/ogOperations.py
+++ b/src/live/ogOperations.py
@@ -183,20 +183,35 @@ class OgLiveOperations:
def _restore_image(self, image_path, devpath):
logging.debug(f'Restoring image at {image_path} into {devpath}')
logging.debug(f'This process can take some time, please *DO NOT SHUT DOWN OR REBOOT* this client')
+
cmd_lzop = shlex.split(f'lzop -dc {image_path}')
cmd_pc = shlex.split(f'partclone.restore -d0 -C -I -o {devpath}')
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:
- 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()
+ 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')
def _ogbrowser_clear_logs(self):
logfiles = ['/tmp/command.log', '/tmp/session.log']
@@ -450,32 +465,37 @@ 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')
- 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}')
+ 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')
ogExtendFs(disk, partition)