Пристрій сам каже, що він таке, і шаблон чіпляється без натискань. Системна група знімається тією ж SNMP-сесією, що й обхід топології: три зайві PDU дешевші за окремий чек із власним розкладом. Збіг за префіксом на межі компонента: моделей у виробника тисячі, і повний збіг означав би рядок на кожну коробку. Довший префікс перемагає. Дванадцять вбудованих правил на основних виробників. Шаблони тільки додаються, ніколи не знімаються: автоматика знає модель пристрою, але не знає, чому цьому хосту дали ще один шаблон руками. DiscoveredDevice отримав device_id: зіставляти за адресою не можна — за одним NAT кілька хостів мають ту саму адресу опитування. Заразом дубль перевірки перестав давати «внутрішню помилку». Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
80 lines
4.1 KiB
SQL
80 lines
4.1 KiB
SQL
-- =====================================================================
|
||
-- NetPulse :: 0027_sysobjectid_autoassign.sql
|
||
-- Автопризначення шаблонів за sysObjectID.
|
||
--
|
||
-- Пристрій сам каже, що він таке: `1.3.6.1.2.1.1.2.0` повертає OID
|
||
-- виробника й моделі. Далі це питання зіставлення, а не здогадок —
|
||
-- і саме так онбординг перестає бути ручною роботою: додав сотню
|
||
-- комутаторів, вони самі отримали свої перевірки, графіки й тригери.
|
||
-- =====================================================================
|
||
|
||
ALTER TABLE inv.devices
|
||
ADD COLUMN sys_object_id text,
|
||
ADD COLUMN sys_descr text;
|
||
|
||
CREATE INDEX devices_sysobjectid_idx ON inv.devices (sys_object_id)
|
||
WHERE sys_object_id IS NOT NULL;
|
||
|
||
COMMENT ON COLUMN inv.devices.sys_object_id IS
|
||
'OID виробника з sysObjectID.0 — джерело автопризначення шаблонів';
|
||
|
||
-- ---------------------------------------------------------------------
|
||
-- Правила зіставлення
|
||
-- ---------------------------------------------------------------------
|
||
|
||
-- Збіг за ПРЕФІКСОМ, а не за повним OID.
|
||
--
|
||
-- Виробник кодує в sysObjectID і серію, і модель: у Cisco це
|
||
-- 1.3.6.1.4.1.9.1.<модель>, і моделей там тисячі. Вимагати повного збігу
|
||
-- означало б заводити рядок на кожну коробку — тобто ту саму ручну
|
||
-- роботу, від якої тікаємо.
|
||
--
|
||
-- Довший префікс перемагає: правило на 1.3.6.1.4.1.9.1.1745 точніше за
|
||
-- загальне 1.3.6.1.4.1.9 і має виграти, якщо задане.
|
||
CREATE TABLE tpl.auto_assign (
|
||
id uuid PRIMARY KEY DEFAULT core.new_id(),
|
||
-- NULL = вбудоване правило, спільне для всіх кабінетів.
|
||
tenant_id uuid REFERENCES core.tenants(id) ON DELETE CASCADE,
|
||
oid_prefix text NOT NULL CHECK (oid_prefix ~ '^[0-9.]+$'),
|
||
template_id uuid NOT NULL REFERENCES tpl.templates(id) ON DELETE CASCADE,
|
||
name text NOT NULL DEFAULT '',
|
||
enabled boolean NOT NULL DEFAULT true,
|
||
created_at timestamptz NOT NULL DEFAULT now(),
|
||
UNIQUE (tenant_id, oid_prefix, template_id)
|
||
);
|
||
CREATE INDEX tpl_auto_assign_prefix_idx ON tpl.auto_assign (oid_prefix) WHERE enabled;
|
||
|
||
ALTER TABLE tpl.auto_assign ENABLE ROW LEVEL SECURITY;
|
||
ALTER TABLE tpl.auto_assign FORCE ROW LEVEL SECURITY;
|
||
|
||
-- Та сама логіка, що для шаблонів: вбудовані видно всім, власні — своїм.
|
||
CREATE POLICY auto_assign_visible ON tpl.auto_assign
|
||
USING (tenant_id IS NULL OR tenant_id = core.current_tenant())
|
||
WITH CHECK (tenant_id = core.current_tenant());
|
||
|
||
-- ---------------------------------------------------------------------
|
||
-- Вбудовані правила
|
||
-- ---------------------------------------------------------------------
|
||
|
||
-- Прив'язуємось до наявного загального SNMP-шаблону: він збирає те, що
|
||
-- віддає будь-який пристрій з SNMP-агентом (uptime, навантаження,
|
||
-- пам'ять). Точніші шаблони під конкретні серії — справа кабінету.
|
||
INSERT INTO tpl.auto_assign (tenant_id, oid_prefix, template_id, name)
|
||
SELECT NULL, v.prefix, t.id, v.label
|
||
FROM tpl.templates t
|
||
CROSS JOIN (VALUES
|
||
('1.3.6.1.4.1.8072', 'Net-SNMP (Linux, BSD)'),
|
||
('1.3.6.1.4.1.2021', 'UCD-SNMP (Linux)'),
|
||
('1.3.6.1.4.1.311', 'Windows SNMP'),
|
||
('1.3.6.1.4.1.9', 'Cisco'),
|
||
('1.3.6.1.4.1.2011', 'Huawei'),
|
||
('1.3.6.1.4.1.14988', 'MikroTik'),
|
||
('1.3.6.1.4.1.171', 'D-Link'),
|
||
('1.3.6.1.4.1.35265', 'Eltex'),
|
||
('1.3.6.1.4.1.11', 'HP / HPE'),
|
||
('1.3.6.1.4.1.4526', 'Netgear'),
|
||
('1.3.6.1.4.1.674', 'Dell'),
|
||
('1.3.6.1.4.1.2636', 'Juniper')
|
||
) AS v(prefix, label)
|
||
WHERE t.tenant_id IS NULL AND t.key = 'snmp-generic'
|
||
ON CONFLICT DO NOTHING;
|