-- ===================================================================== -- NetPulse :: поля заливки конфігу для вбудованих профілів -- -- ФАЙЛ ЗГЕНЕРОВАНО. Джерело — db/profiles/catalog.json (блоки -- `apply` у профілях і секція `apply_external`). Правити тут -- безглуздо: наступна збірка перезапише. -- -- ЦЕ НЕ МІГРАЦІЯ і сама вона нікуди не накочується. Номер міграції -- призначає людина, а не генератор: над одним каталогом номерів -- працюють паралельні гілки, і вигаданий номер зіткнувся б із чужим. -- Щоб зміни доїхали до бази, скопіюй цей текст у нову міграцію. -- -- Чому не в 0014, звідки беруться самі профілі: колонки apply_* -- заводить 0060, тобто ПІЗНІШЕ, — вставка в 0014 не може згадати -- колонку, якої ще немає. І 0014 уже накочена на стендах, а runner -- звіряє sha256 застосованих файлів: зміна її тексту зупинила б -- накат усім. -- -- Повторний накат безпечний: UPDATE задає всі поля явно, тож -- результат залежить лише від каталогу, а не від того, що вже -- стояло в рядку. -- ===================================================================== -- Cisco IOS. Класика, з якої списані всі інші: `configure terminal`, -- заперечення через `no `, вихід із контексту `exit`, збереження -- `write memory` (а не `copy run start`, який на частині версій -- перепитує ім'я файлу й підвисає на очікуванні Enter). UPDATE ncm.profiles SET apply_enter = '["configure terminal"]'::jsonb, apply_exit = '["end"]'::jsonb, apply_commit = 'write memory', apply_negate = 'no ', apply_block_exit = 'exit', apply_supported = true, apply_note = NULL WHERE tenant_id IS NULL AND key = 'cisco-ios'; -- Juniper JUNOS — теж свідомо без відкату, і теж через формат архіву. -- -- Профіль знімає `show configuration | display omit`, тобто ієрархію у -- фігурних дужках. Це не набір команд: віддати такий текст рядками в -- CLI неможливо. Правильний шлях на JUNOS — `load override terminal` із -- вставкою всього файлу, а він не вкладається в модель «команда → -- запрошення → наступна команда», на якій побудований увесь наш CLI. -- -- Альтернатива існує: профіль, що знімає `show configuration | -- display set`, дав би рядки `set …` із заперечником `delete `. Це -- окрема робота — інший профіль збору й переливання архіву, — і робити -- її мовчки, підмінивши формат історії, не можна. UPDATE ncm.profiles SET apply_enter = '[]'::jsonb, apply_exit = '[]'::jsonb, apply_commit = NULL, apply_negate = NULL, apply_block_exit = 'exit', apply_supported = false, apply_note = 'JUNOS зберігається ієрархією у фігурних дужках — це не набір команд. Для відкату потрібен профіль зі збором «show configuration | display set» (рядки set …, заперечення delete …); наявний архів у такому вигляді немає.' WHERE tenant_id IS NULL AND key = 'juniper-junos'; -- MikroTik RouterOS — свідомо БЕЗ відкату, і причина не в бракові часу. -- -- Вивід `export` виглядає як набір команд, але команди в ньому — -- `add …`. Повторне виконання `add` не повертає рядок на місце, а -- створює ДРУГИЙ такий самий запис: другу адресу на інтерфейсі, друге -- правило фаєрвола. Прибирання ж робиться через `remove [find …]` — -- тобто через пошук за критерієм, якого в рядку експорту немає. -- -- Тобто механічний відкат на RouterOS не «поки не зроблений», а дає -- гарантовано хибний результат. Правильний шлях — `/system backup` або -- `/import` файлом, і це інша функція з іншим транспортом. UPDATE ncm.profiles SET apply_enter = '[]'::jsonb, apply_exit = '[]'::jsonb, apply_commit = NULL, apply_negate = NULL, apply_block_exit = 'exit', apply_supported = false, apply_note = 'RouterOS: рядки експорту — це add, і повторне виконання не повертає запис, а створює дубль; прибирання потребує remove [find …]. Автоматичний відкат тут дав би гарантовано хибний результат — потрібне відновлення з /system backup або /import файлом.' WHERE tenant_id IS NULL AND key = 'mikrotik-routeros'; -- ZTE ZXR10 — CLI родини Cisco з тим самим `configure terminal`/`no `. -- Збереження коротше: `write`. -- -- Родина в каталозі стоїть huawei — але вона описує поведінку -- консолі (пейджер, запрошення), а не синтаксис конфігурації. -- Саме тому заливка задана профілем, а не родиною: успадкувати -- її від huawei означало б відправити на пристрій чужі команди. UPDATE ncm.profiles SET apply_enter = '["configure terminal"]'::jsonb, apply_exit = '["end"]'::jsonb, apply_commit = 'write', apply_negate = 'no ', apply_block_exit = 'exit', apply_supported = true, apply_note = NULL WHERE tenant_id IS NULL AND key = 'zte-zxr10'; -- ZTE ZXAN (OLT C300/C320/C600) — той самий CLI, що й ZXR10. Профіль -- заведено окремо в 0028 через запрошення, а не через синтаксис. UPDATE ncm.profiles SET apply_enter = '["configure terminal"]'::jsonb, apply_exit = '["end"]'::jsonb, apply_commit = 'write', apply_negate = 'no ', apply_block_exit = 'exit', apply_supported = true, apply_note = NULL WHERE tenant_id IS NULL AND key = 'zte-zxan'; -- D-Link DES/DGS (профіль dlink-me, спільний для xStack і Smart /ME — -- див. 0043). Тут два свідомі відступи від класики. -- -- Режиму конфігурації немає: команди виконуються просто із запрошення, -- тому apply_enter і apply_exit порожні, а вкладених контекстів не -- буває — кожен рядок конфігу самодостатній (`create vlan v10 tag 10`). -- -- Заперечення немає ЗОВСІМ, і це не пропуск. У D-Link немає універсального -- `no`: створене прибирається `delete`, налаштоване переписується -- `config`, увімкнене вимикається `disable`. Вивести з рядка конфігу -- потрібне дієслово автоматично неможливо — `create vlan v10 tag 10` -- прибирається як `delete vlan v10`, і жодне механічне правило цього не -- дасть. Тому рядки на прибирання йдуть людині переліком, а система -- заливає лише те, що додає й переписує. UPDATE ncm.profiles SET apply_enter = '[]'::jsonb, apply_exit = '[]'::jsonb, apply_commit = 'save', apply_negate = NULL, apply_block_exit = '', apply_supported = true, apply_note = 'D-Link не має універсального заперечення рядка: створене прибирається delete, налаштоване переписується config. Тому зайві рядки система показує переліком «прибрати вручну», а заливає лише додане й змінене.' WHERE tenant_id IS NULL AND key = 'dlink-me';