From: Christoph Heiss Date: Mon, 26 Feb 2024 14:18:38 +0000 (+0100) Subject: tui: install_progress: write low-level non-JSON messages to separate file X-Git-Url: https://git.proxmox.com/?p=pve-installer.git;a=commitdiff_plain;h=22de6e5f9f1f429ec5fd59df607216b4d30f2145 tui: install_progress: write low-level non-JSON messages to separate file The low-level installer prints quite a few messages during the install to its stdout which are not JSON-formatted and thus parseable. Thus catch them early and write them to `/tmp/install-low-level.log`, to avoid polluting the log tty at /dev/tty2 with mostly useless parse errors. Signed-off-by: Christoph Heiss --- diff --git a/proxmox-tui-installer/src/views/install_progress.rs b/proxmox-tui-installer/src/views/install_progress.rs index 4626fe4..c2c9ddf 100644 --- a/proxmox-tui-installer/src/views/install_progress.rs +++ b/proxmox-tui-installer/src/views/install_progress.rs @@ -6,6 +6,7 @@ use cursive::{ }; use serde::Deserialize; use std::{ + fs::File, io::{BufRead, BufReader, Write}, sync::{Arc, Mutex}, thread, @@ -86,6 +87,9 @@ impl InstallProgressView { .map_err(|err| format!("failed to serialize install config: {err}"))?; writeln!(writer).map_err(|err| format!("failed to write install config: {err}"))?; + let mut lowlevel_log = File::create("/tmp/install-low-level.log") + .map_err(|err| format!("failed to open low-level installer logfile: {err}"))?; + let writer = Arc::new(Mutex::new(writer)); for line in reader.lines() { @@ -94,11 +98,20 @@ impl InstallProgressView { Err(err) => return Err(format!("low-level installer exited early: {err}")), }; + // The low-level installer also spews the output of any command it runs on its + // stdout. Use a very simple heuricstic to determine whether it is actually JSON + // or not. + if !line.starts_with('{') || !line.ends_with('}') { + let _ = writeln!(lowlevel_log, "{}", line); + continue; + } + let msg = match serde_json::from_str::(&line) { Ok(msg) => msg, - Err(stray) => { + Err(err) => { // Not a fatal error, so don't abort the installation by returning - eprintln!("low-level installer: {stray}"); + eprintln!("low-level installer: error while parsing message: '{err}'"); + eprintln!(" original message was: '{line}'"); continue; } };