From 95cef8cf0a2138501293783a676c0a5623fee0c3 Mon Sep 17 00:00:00 2001 From: deeplow Date: Fri, 23 Jun 2023 06:46:55 +0100 Subject: [PATCH] Containers: capture conversion logs Store the conversion log to a file (captured-output.txt) in the container and when in development mode, have its output displayed on the terminal output. --- dangerzone/conversion/doc_to_pixels.py | 10 +++++++--- dangerzone/isolation_provider/base.py | 2 ++ dangerzone/isolation_provider/container.py | 18 +++++++++++------- dangerzone/isolation_provider/qubes.py | 3 +-- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/dangerzone/conversion/doc_to_pixels.py b/dangerzone/conversion/doc_to_pixels.py index 994a9d5..1c80f26 100644 --- a/dangerzone/conversion/doc_to_pixels.py +++ b/dangerzone/conversion/doc_to_pixels.py @@ -377,12 +377,16 @@ async def main() -> int: try: await converter.convert() + error_code = 0 # Success! except (RuntimeError, TimeoutError, ValueError) as e: converter.update_progress(str(e), error=True) - return 1 - else: - return 0 # Success! + error_code = 1 + if not running_on_qubes(): + # Write debug information (containers version) + with open("/tmp/dangerzone/captured_output.txt", "wb") as container_log: + container_log.write(converter.captured_output) + return error_code if __name__ == "__main__": sys.exit(asyncio.run(main())) diff --git a/dangerzone/isolation_provider/base.py b/dangerzone/isolation_provider/base.py index 38f02c7..2fc8b31 100644 --- a/dangerzone/isolation_provider/base.py +++ b/dangerzone/isolation_provider/base.py @@ -10,6 +10,8 @@ from ..util import replace_control_chars log = logging.getLogger(__name__) +MAX_CONVERSION_LOG_CHARS = 150 * 50 # up to ~150 lines of 50 characters + class IsolationProvider(ABC): """ diff --git a/dangerzone/isolation_provider/container.py b/dangerzone/isolation_provider/container.py index 8e5fb80..abc0100 100644 --- a/dangerzone/isolation_provider/container.py +++ b/dangerzone/isolation_provider/container.py @@ -7,17 +7,13 @@ import platform import shlex import shutil import subprocess +import sys import tempfile from typing import Any, Callable, List, Optional, Tuple from ..document import Document -from ..util import ( - get_resource_path, - get_subprocess_startupinfo, - get_tmp_dir, - replace_control_chars, -) -from .base import IsolationProvider +from ..util import get_resource_path, get_subprocess_startupinfo, get_tmp_dir +from .base import MAX_CONVERSION_LOG_CHARS, IsolationProvider # Define startupinfo for subprocesses if platform.system() == "Windows": @@ -288,6 +284,14 @@ class Container(IsolationProvider): f"ENABLE_TIMEOUTS={self.enable_timeouts}", ] ret = self.exec_container(document, command, extra_args) + + if getattr(sys, "dangerzone_dev", False): + log_path = pixel_dir / "captured_output.txt" + with open(log_path, "r", encoding="ascii", errors="replace") as f: + log.info( + f"Conversion output (doc to pixels):\n{f.read(MAX_CONVERSION_LOG_CHARS)}" + ) + if ret != 0: log.error("documents-to-pixels failed") else: diff --git a/dangerzone/isolation_provider/qubes.py b/dangerzone/isolation_provider/qubes.py index b4764d1..0269d92 100644 --- a/dangerzone/isolation_provider/qubes.py +++ b/dangerzone/isolation_provider/qubes.py @@ -22,14 +22,13 @@ log = logging.getLogger(__name__) from ..conversion.common import running_on_qubes from ..conversion.pixels_to_pdf import PixelsToPDF from ..util import get_resource_path, get_subprocess_startupinfo, get_tmp_dir +from .base import MAX_CONVERSION_LOG_CHARS CONVERTED_FILE_PATH = ( # FIXME won't work for parallel conversions (see #454) "/tmp/safe-output-compressed.pdf" ) -MAX_CONVERSION_LOG_CHARS = 150 * 50 # up to ~150 lines of 50 characters - def read_bytes(p: subprocess.Popen, buff_size: int) -> bytes: """Read bytes from stdout."""