From 350850d23ea6e49ca7eb9fa1a4a2761ff6e9c315 Mon Sep 17 00:00:00 2001 From: XSwankyS Date: Wed, 19 Nov 2025 12:14:49 +0500 Subject: [PATCH] Split large logs --- bot_remote.py | 51 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/bot_remote.py b/bot_remote.py index 13cb8bc..30d2d0f 100755 --- a/bot_remote.py +++ b/bot_remote.py @@ -58,6 +58,7 @@ SSH_HOST = os.getenv("SSH_HOST") # ОБЯЗАТЕЛЬНО SSH_USER = os.getenv("SSH_USER", "root") # опционально SSH_PORT = os.getenv("SSH_PORT", "22") # строка, чтобы проще пихать в команду +MAX_DOC_BYTES = int(os.getenv("MAX_DOC_BYTES", str(45 * 1024 * 1024))) # --------------------------- # Утилиты @@ -253,16 +254,54 @@ async def logs_handler(update: Update, context: ContextTypes.DEFAULT_TYPE): return ts = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") - fname = f"logs_{ctx_alias}_{ns}_{name}_{'prev' if previous else 'curr'}_{ts}.log" + base_fname = f"logs_{ctx_alias}_{ns}_{name}_{'prev' if previous else 'curr'}_{ts}" - buf = io.BytesIO(logs.encode("utf-8", errors="ignore")) - buf.name = fname + # кодируем один раз + data = logs.encode("utf-8", errors="ignore") + total_size = len(data) - await update.message.reply_document( - InputFile(buf, filename=fname), - caption=f"{kind}/{name}\npod={pod}\ncontext={ctx_full}\nprevious={previous}", + # Если влезает в один файл — шлём как раньше + if total_size <= MAX_DOC_BYTES: + fname = f"{base_fname}.log" + buf = io.BytesIO(data) + buf.name = fname + + await update.message.reply_document( + InputFile(buf, filename=fname), + caption=f"{kind}/{name}\npod={pod}\ncontext={ctx_full}\nprevious={previous}", + ) + return + + # Слишком жирный лог — режем на части + num_parts = (total_size + MAX_DOC_BYTES - 1) // MAX_DOC_BYTES + await update.message.reply_text( + f"Лог {total_size} байт, делю на {num_parts} файлов по ~{MAX_DOC_BYTES} байт." ) + for idx in range(num_parts): + start = idx * MAX_DOC_BYTES + end = min(start + MAX_DOC_BYTES, total_size) + chunk = data[start:end] + + part_no = idx + 1 + fname = f"{base_fname}.part{part_no:02d}_of_{num_parts:02d}.log" + + buf = io.BytesIO(chunk) + buf.name = fname + + caption = ( + f"{kind}/{name}\n" + f"pod={pod}\n" + f"context={ctx_full}\n" + f"previous={previous}\n" + f"part {part_no}/{num_parts}" + ) + + await update.message.reply_document( + InputFile(buf, filename=fname), + caption=caption, + ) + async def start_handler(update: Update, context: ContextTypes.DEFAULT_TYPE): await update.message.reply_text(