Netpulse_SasS/server/migrations/0027_sysobjectid_autoassign.sql
byrsapty 29f440d436
Some checks are pending
CI / web (push) Waiting to run
CI / server (push) Waiting to run
CI / agent (push) Waiting to run
Автопризначення шаблонів за sysObjectID
Пристрій сам каже, що він таке, і шаблон чіпляється без натискань.
Системна група знімається тією ж SNMP-сесією, що й обхід топології:
три зайві PDU дешевші за окремий чек із власним розкладом.

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

Шаблони тільки додаються, ніколи не знімаються: автоматика знає модель
пристрою, але не знає, чому цьому хосту дали ще один шаблон руками.

DiscoveredDevice отримав device_id: зіставляти за адресою не можна —
за одним NAT кілька хостів мають ту саму адресу опитування.

Заразом дубль перевірки перестав давати «внутрішню помилку».

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 16:29:39 +03:00

80 lines
4.1 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =====================================================================
-- 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;