Initial commit: Debian Manager — управление Debian-серверами

- SSH/SFTP управление без агентов
- Пакеты (apt), Docker, файлы, systemd, ufw, cron
- Плейбуки, групповые операции, планировщик
- Бэкапы, отчёты, Portainer, Proxmox VE, Gitea Deploy
- Терминал, Telegram-уведомления, тёмная/светлая тема
This commit is contained in:
dinlo
2026-09-05 19:46:45 +08:00
commit f624fee5e0
65 changed files with 6981 additions and 0 deletions
+43
View File
@@ -0,0 +1,43 @@
"""Diff пакетов между серверами."""
from __future__ import annotations
from dataclasses import dataclass
from typing import Dict, List
from app.core.packages import Package, list_packages
from app.core.ssh import SSHClient
@dataclass
class VersionDiff:
name: str
version_a: str
version_b: str
@dataclass
class PackageDiff:
only_a: List[Package]
only_b: List[Package]
version_mismatch: List[VersionDiff]
async def diff_servers(ca: SSHClient, cb: SSHClient,
user_only: bool = True) -> PackageDiff:
pa = await list_packages(ca)
pb = await list_packages(cb)
if user_only:
pa = [p for p in pa if not p.is_system and p.manual]
pb = [p for p in pb if not p.is_system and p.manual]
map_a: Dict[str, Package] = {p.name: p for p in pa}
map_b: Dict[str, Package] = {p.name: p for p in pb}
only_a = [map_a[n] for n in sorted(map_a.keys() - map_b.keys())]
only_b = [map_b[n] for n in sorted(map_b.keys() - map_a.keys())]
mismatch = [
VersionDiff(n, map_a[n].version, map_b[n].version)
for n in sorted(map_a.keys() & map_b.keys())
if map_a[n].version != map_b[n].version
]
return PackageDiff(only_a, only_b, mismatch)