diff --git a/handlers/backup.py b/handlers/backup.py index 13a290c..ebd3193 100644 --- a/handlers/backup.py +++ b/handlers/backup.py @@ -133,6 +133,52 @@ async def cmd_last_backup(msg: Message): await msg.answer(text, reply_markup=backup_kb) +async def cmd_last_snapshot(msg: Message): + await msg.answer("⏳ Loading last snapshot…", reply_markup=backup_kb) + + async def worker(): + rc, raw = await run_cmd( + ["restic", "snapshots", "--json"], + use_restic_env=True, + timeout=20 + ) + if rc != 0: + await msg.answer(raw, reply_markup=backup_kb) + return + + snaps = json.loads(raw) + if not snaps: + await msg.answer("πŸ“¦ Snapshots: none", reply_markup=backup_kb) + return + + snaps.sort(key=lambda s: s["time"], reverse=True) + s = snaps[0] + t = datetime.fromisoformat(s["time"].replace("Z", "+00:00")) + short_id = s["short_id"] + + rc2, raw2 = await run_cmd( + ["restic", "stats", short_id, "--json"], + use_restic_env=True, + timeout=20 + ) + if rc2 != 0: + await msg.answer(raw2, reply_markup=backup_kb) + return + + stats = json.loads(raw2) + + msg_text = ( + "πŸ“¦ **Last snapshot**\n\n" + f"πŸ•’ {t:%Y-%m-%d %H:%M}\n" + f"πŸ§‰ ID: {short_id}\n" + f"πŸ“ Files: {stats.get('total_file_count', 'n/a')}\n" + f"πŸ’½ Size: {stats.get('total_size', 0) / (1024**3):.2f} GiB\n" + ) + await msg.answer(msg_text, reply_markup=backup_kb, parse_mode="Markdown") + + asyncio.create_task(worker()) + + @dp.message(F.text == "πŸ“¦ Status") async def bs(msg: Message): if is_admin_msg(msg): @@ -151,6 +197,12 @@ async def lb(msg: Message): await cmd_last_backup(msg) +@dp.message(F.text == "πŸ“¦ Last snapshot") +async def ls(msg: Message): + if is_admin_msg(msg): + await cmd_last_snapshot(msg) + + @dp.message(F.text == "▢️ Run backup") async def br(msg: Message): if is_admin_msg(msg): diff --git a/keyboards.py b/keyboards.py index c3c9132..32a4cfa 100644 --- a/keyboards.py +++ b/keyboards.py @@ -29,6 +29,7 @@ backup_kb = ReplyKeyboardMarkup( keyboard=[ [KeyboardButton(text="πŸ“¦ Status")], [KeyboardButton(text="πŸ“¦ Last backup")], + [KeyboardButton(text="πŸ“¦ Last snapshot")], [KeyboardButton(text="πŸ“Š Repo stats")], [KeyboardButton(text="▢️ Run backup")], [KeyboardButton(text="🧯 Restore help")],