From 563fae93598326cac01bac07e125d595f39a6600 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Sun, 19 Dec 2021 18:00:15 +0100 Subject: [PATCH] Add cbpi service logfile download via journalctl --- cbpi/__init__.py | 2 +- cbpi/controller/satellite_controller.py | 2 +- cbpi/controller/system_controller.py | 18 +++++++++++++ cbpi/http_endpoints/http_system.py | 36 ++++++++++++++++++++++++- 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 75aa62c..357bfeb 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.0.57" +__version__ = "4.0.0.58" diff --git a/cbpi/controller/satellite_controller.py b/cbpi/controller/satellite_controller.py index e12223c..4629ac8 100644 --- a/cbpi/controller/satellite_controller.py +++ b/cbpi/controller/satellite_controller.py @@ -109,7 +109,7 @@ class SatelliteController: async with AsyncExitStack() as stack: self.tasks = set() stack.push_async_callback(cancel_tasks, self.tasks) - self.client = Client(self.host, port=self.port, username=self.username, password=self.password, will=Will(topic="cbpi/diconnect", payload="CBPi Server Disconnected")) + self.client = Client(self.host, port=self.port, username=self.username, password=self.password, will=Will(topic="cbpi/disconnect", payload="CBPi Server Disconnected")) await stack.enter_async_context(self.client) diff --git a/cbpi/controller/system_controller.py b/cbpi/controller/system_controller.py index 718edfa..d165447 100644 --- a/cbpi/controller/system_controller.py +++ b/cbpi/controller/system_controller.py @@ -40,6 +40,24 @@ class SystemController: dir_name = pathlib.Path(os.path.join(".", 'config')) shutil.make_archive(output_filename, 'zip', dir_name) + async def downloadlog(self, logtime): + filename = "cbpi4.log" + fullname = pathlib.Path(os.path.join(".",filename)) + output_filename="cbpi4_log.zip" + if logtime == "b": + os.system('journalctl -b -u craftbeerpi.service > {}'.format(fullname)) + else: + os.system('journalctl --since \"{} hours ago\" -u craftbeerpi.service > {}'.format(logtime, fullname)) + + zipObj=zipfile.ZipFile(output_filename , 'w', zipfile.ZIP_DEFLATED) + zipObj.write(fullname) + zipObj.close() + os.remove(fullname) + + + + + def allowed_file(self, filename, extension): return '.' in filename and filename.rsplit('.', 1)[1] in set([extension]) diff --git a/cbpi/http_endpoints/http_system.py b/cbpi/http_endpoints/http_system.py index 468d57a..aa3121b 100644 --- a/cbpi/http_endpoints/http_system.py +++ b/cbpi/http_endpoints/http_system.py @@ -146,6 +146,40 @@ class SystemHttpEndpoints: await response.write_eof() return response + + @request_mapping("/log/{logtime}/", method="GET", name="BackupConfig", auth_required=False) + async def downloadlog(self, request): + """ + --- + description: Zip and download craftbeerpi.service log + tags: + - System + responses: + "200": + description: successful operation + content: # Response body + application/zip: # Media type + """ + logtime = request.match_info['logtime'] + await self.controller.downloadlog(logtime) + filename = "cbpi4_log.zip" + file_name = pathlib.Path(os.path.join(".", filename)) + + response = web.StreamResponse( + status=200, + reason='OK', + headers={'Content-Type': 'application/zip'}, + ) + await response.prepare(request) + with open(file_name, 'rb') as file: + for line in file.readlines(): + await response.write(line) + + await response.write_eof() + os.remove(file_name) + return response + + @request_mapping("/restore", method="POST", name="RestoreConfig", auth_required=False) async def restore(self, request): """ @@ -192,4 +226,4 @@ class SystemHttpEndpoints: data = await request.post() logging.info("Data received") await self.controller.uploadSVG(data) - return web.Response(status=200) \ No newline at end of file + return web.Response(status=200)