Большая картина:
Цель состоит в том, чтобы (C ++) подпрограммы, предоставляемые процессами, выполнялись SNMP NMS (Network Management System) через агента SNMP с одной стороны.
С другой стороны, процессам нужна способность сообщать свое состояние (например, инициализируется, активен, остановлен) и регистрировать сообщения в SNMP NMS через агента SNMP.
Наиболее многообещающий подход, который я нашел, заключается в реализации субагента C ++ Net-SNMP, который предоставляет небольшой API.
например
Соответствующие процессы могут реализовывать эти API и передавать объекты обратного вызова, устанавливать фактическое состояние и регистрировать сообщения.
Дело в том, что подпрограммы, предоставляемые объектами обратного вызова, должны быть описаны в MIB (База управляющей информации), чтобы сделать их доступными для NMS. Поскольку конкретные подпрограммы не известны во время компиляции, я ищу способ перевести сигнатуру подпрограммы в описание SMIv2 (ASN.1) для расширения MIB во время выполнения.
Знаете ли вы структуру, инструмент или подход, который отвечает требованиям или методике, чтобы сделать подпрограммы «доступными» в MIB агента SNMP?
Можно ли даже расширить Agent MIB во время выполнения?
Расширение MIB во время выполнения поставило бы под угрозу назначение MIB. Предполагается, что MIB сообщает менеджеру, какие переменные доступны, и если набор переменных изменяется динамически, MIB не предоставляет эту информацию менеджеру.
Я уверен, что это можно было бы решить, если бы менеджер мог регулярно загружать файл MIB по FTP, когда это необходимо, и мог динамически адаптироваться к содержимому MIB, но я не видел NMS, способную на это. Даже если это возможно, я бы настоятельно рекомендовал против такого нарушения соглашения. Есть RFC о том, как вносить изменения в модуль MIB, и вы наверняка их нарушите.
Я думаю, что лучшее, что вы могли бы сделать, это иметь список подпрограмм в таблице (которые агент может динамически изменять во время выполнения). Затем создайте скалярную переменную для чтения / записи «runSubroutine», где Manager может установить значение индекса подпрограммы, которую он хочет запустить. Положите аргументы и возвращайте значения в других переменных. Диспетчер выполнит SNMP-обход таблицы подпрограмм, найдет индекс той, которую хочет запустить, а затем отправит команду set SNMP с аргументами и индексом подпрограммы.
В конце концов, это может сработать, но, пожалуйста, ради любви к Кнуту, рассмотрите возможность использования реального протокола RPC вместо того, чтобы пытаться втиснуть такие возможности в SNMP.