Files
dinlo f624fee5e0 Initial commit: Debian Manager — управление Debian-серверами
- SSH/SFTP управление без агентов
- Пакеты (apt), Docker, файлы, systemd, ufw, cron
- Плейбуки, групповые операции, планировщик
- Бэкапы, отчёты, Portainer, Proxmox VE, Gitea Deploy
- Терминал, Telegram-уведомления, тёмная/светлая тема
2026-09-05 19:46:45 +08:00

44 lines
1.2 KiB
Python

"""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)