From 24dc8914d06a094a644330a39ac1a09abeb78721 Mon Sep 17 00:00:00 2001 From: Eric Callahan Date: Fri, 6 Jan 2023 11:01:43 -0500 Subject: [PATCH] klippy_connection: implement manual log rollover On systems where Klipper is installed as a service allow a manual log rollover. The rollover cannot be called while printing. Signed-off-by: Eric Callahan --- moonraker/klippy_connection.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/moonraker/klippy_connection.py b/moonraker/klippy_connection.py index 458751d..b46e81b 100644 --- a/moonraker/klippy_connection.py +++ b/moonraker/klippy_connection.py @@ -561,6 +561,37 @@ class KlippyConnection: stats = job_state.get_last_stats() return stats.get("state", "") == "printing" + async def rollover_log(self) -> None: + if "unit_name" not in self._service_info: + raise self.server.error( + "Unable to detect Klipper Service, cannot perform " + "manual rollover" + ) + logfile: Optional[str] = self._klippy_info.get("log_file", None) + if logfile is None: + raise self.server.error( + "Unable to detect path to Klipper log file" + ) + if self.is_printing(): + raise self.server.error("Cannot rollover log while printing") + logpath = pathlib.Path(logfile).expanduser().resolve() + if not logpath.is_file(): + raise self.server.error( + f"No file at {logpath} exists, cannot perform rollover" + ) + machine: Machine = self.server.lookup_component("machine") + await machine.do_service_action("stop", self.unit_name) + suffix = time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime()) + new_path = pathlib.Path(f"{logpath}.{suffix}") + + def _do_file_op() -> None: + if new_path.exists(): + new_path.unlink() + logpath.rename(new_path) + + await self.event_loop.run_in_thread(_do_file_op) + await machine.do_service_action("start", self.unit_name) + async def _on_connection_closed(self) -> None: self.init_list = [] self._state = "disconnected"