#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Vendors report page. Страница управления базой OUI. Бизнес-логика находится в VendorService. Этот модуль отвечает только за HTML-представление. """ from html import escape from .statistics import ( top_vendors, ) from .utils import ( format_datetime as format_report_datetime, ) from .template import ( page_begin, page_end, card, ) # ============================================================ # Helpers # ============================================================ def format_size(size): if not size: return "-" size = float(size) units = ( "B", "KB", "MB", "GB", ) for unit in units: if size < 1024: return f"{size:.1f} {unit}" size /= 1024 return f"{size:.1f} TB" def format_value(value): if value is None or value == "": return "-" return escape( str(value) ) # ============================================================ # Database status # ============================================================ def database_status_block(status): if not status["exists"]: health = "Not found" elif status["healthy"]: health = "Healthy" else: health = "Error" html = f"""
| Property | Value |
|---|---|
| Database | {format_value(status["database"])} |
| Status | {health} |
| Total entries | {status["total"]} |
| MA-L | {status["ma_l"]} |
| MA-M | {status["ma_m"]} |
| MA-S | {status["ma_s"]} |
| Schema version | {format_value(status["schema_version"])} |
| Last import | {format_report_datetime(status["last_import"])} |
| Import status | {format_value(status["import_status"])} |
| Size | {format_size(status["size"])} |
| Vendor | Devices |
|---|---|
| No vendor data. | |
| {escape(str(vendor))} | {total} |
| Source | URL | Mirror |
|---|---|---|
| {escape(str(name))} | {escape(str(url))} | {escape(str(mirror)) if mirror else "—"} |
Этап: {escape(stage_label)}
Источник: {escape(str(source)) if source else "—"}
{escape(str(message)) if message else ""}
{escape(str(error)) if error else ""}
""" if job.get( "status" ) == "running": html += """Обновление выполняется. Страница автоматически обновит результат после завершения.
""" elif job.get( "status" ) == "error": html += """ """ html += """База OUI не изменилась. Обновление не требуется.
""" elif ap_total == 0: status_html = """База OUI содержит изменения, но существующие записи AP не требуют изменения vendor.
Обновление базы OUI можно применить отдельно. Оно обновит справочник для будущих определений vendor.
""" else: status_html = """База OUI содержит изменения. Сначала проверьте изменения в справочнике, затем при необходимости выберите синхронизацию vendor у существующих AP.
""" change_html = f"""| Параметр | Значение |
|---|---|
| Текущих записей | {oui["current"]} |
| Записей в новой базе | {oui["candidate"]} |
| Добавлено | {oui["added"]} |
| Изменено | {oui["changed"]} |
| Удалено | {oui["removed"]} |
| Без изменений | {oui["unchanged"]} |
| Импортировано | {build["imported"]} |
| Пропущено | {build["skipped"]} |
{escape(message["text"])}