Netpulse_SasS/db/profiles
byrsapty ee3f653bd8 Каталог команд збору конфігу як власні дані
Команди для зчитування конфігу тепер живуть у db/profiles/catalog.json —
147 платформ, 67 вендорів. Міграція з нього породжується збіркою:
два описи одного й того самого розійшлися б із першою ж правкою, і
невідомо було б, який справжній. build.py --check звіряє, чи міграція
не відстала.

Каталог — код, а не дані клієнта: однаковий для всіх інсталяцій,
переглядається в code review, їде з релізом. Тенант при цьому може
завести власний профіль через tenant_id — вбудовані лишаються
недоторканими.

Промпт і вимкнення пейджера тримаються раз на родину CLI, а не в
кожному профілі: bdcom, arista, brocade і ще з десяток говорять
діалектом Cisco, h3c і 3com — діалектом Huawei. Це різниця між правкою
в одному місці й правкою в сорока.

Прибрано разовий імпортер db/import разом із його залежністю від
зовнішнього формату. Слово NOC лишилось тільки там, де воно означає
центр керування мережею (NOC-екран, NOC TV) — це термін із ТЗ.

Лічильники в шапці міграції обчислюються: зашите «148 платформ»
розійшлося зі згенерованими 147 одразу.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 02:46:23 +03:00
..
build.py Каталог команд збору конфігу як власні дані 2026-08-24 02:46:23 +03:00
catalog.json Каталог команд збору конфігу як власні дані 2026-08-24 02:46:23 +03:00
README.md Каталог команд збору конфігу як власні дані 2026-08-24 02:46:23 +03:00

Каталог команд збору конфігу

catalog.json — джерело істини про те, як зняти конфіг із кожної підтримуваної платформи. 148 платформ, 67 вендорів.

Міграція db/migrations/0014_ncm_profiles.sql породжується з каталогу, а не правиться руками: два описи одного й того самого розійшлися б із першою ж правкою, і невідомо було б, який справжній.

python build.py            # перезібрати міграцію
python build.py --check    # звірити, чи вона актуальна

Будова

{
  "families": {
    "cisco": {
      "pager": "terminal length 0",       // чим вимкнути посторінковий вивід
      "prompt": "[>#]\\s*$",              // за чим ловити кінець виводу
      "enable_required": true,            // чи потрібен привілейований режим
      "scrub": ["^Building configuration"],  // вирізати з diff — шум, що змінюється щоразу
      "redact": ["(password|secret) \\S+"]   // замаскувати перед записом у Git
    }
  },
  "vendor_family": { "bdcom": "cisco" },   // чий CLI успадкував вендор
  "profiles": [
    {
      "key": "cisco-ios",
      "name": "Cisco IOS",
      "vendor": "cisco",
      "family": "cisco",
      "config": "show running-config",      // головна команда
      "startup": "show startup-config",     // необовʼязково
      "prepare": ["undo terminal monitor"], // необовʼязково: підготовка консолі
      "strip_lines": 3,                     // скільки службових рядків відкинути
      "alternatives": ["show config current_config"]  // для інших моделей родини
    }
  ]
}

Як додати платформу

  1. Додай запис у profiles. Мінімум — key, name, vendor, family, config.
  2. Якщо CLI не схожий на жодну наявну родину — заведи нову у families.
  3. python build.py.
  4. Накоти міграцію (ON CONFLICT DO NOTHING, тож повторний накат безпечний).

Родини

Родина описує поведінку консолі, а не вендора: bdcom, arista, brocade та ще з десяток говорять діалектом Cisco, h3c і 3com — діалектом Huawei. Тримати це один раз на родину, а не копіювати в кожен профіль, — різниця між правкою в одному місці й правкою в сорока.

Родина generic — запасний варіант: промпт [>#]\s*$, без вимкнення пейджера, з обережним маскуванням паролів і community.

Про промпти

prompt і pager задані за родиною й перевіряються на живому залізі. Одна родина покриває десятки платформ, і дрібні відхилення трапляються: прошивка може давати інший символ запрошення або не розуміти команду вимкнення пейджера. Команди збору конфігу натомість специфічні для платформи й узяті точно.

Чому не в БД

Каталог — код, а не дані клієнта: він однаковий для всіх інсталяцій, має переглядатись у code review і їхати разом із релізом. Тенант може завести власний профіль (ncm.profiles із заповненим tenant_id) — вбудовані при цьому лишаються недоторканими.