Досрочно завершим!

Статическая версия.

Erlang Snmp Client

Вот понадобилось опрашивать некоторые железные switch через snmp из erlang. Первая попытка понять что для этого нужна (наскоком, по Буденновски) – не удалась. На erlang.org полно документации как писать и управлять snmp сервера, но вот информация по клиентам – разбросана по крупицам.

Так что пришлось собраться и создать картину у себя в голове, как должен выглядить snmp клиент.

Общая картина

Общая идея такая. Нет одной такой командочки типа snmpwalk. Мы вынуждены строить целую систему для того чтобы опросить железку.

Есть snmp manager, мы его должны настроить и запустить, даже если у нас только клиент. Этот snmp manager содержит список snmp user. Я сначала думал что snmp user – это что-то типа community, оказалось – нет.. Snmp user в erlang – это такой модуль, который содержит просто набор callback для приема ответов от устройств.

Manager должен либо определять этого user-а в свой конфигурации, либо зарегистрировать его с помощью snmpm:register_user(имя, модуль).

Дальше нам нужны agents. То есть manager каждому такому user назначает (в конфиге, либо с помощью snmpm:register_agent ) набор агентов которых опрашивать. Вот эти агенты как раз и содержат реквизиты опрашиваемых железок. Там, IP, community, port, версию протокола и т.д.

Когда все это настроено, можно посылать из manager-а запрос. Например с помощью snmpm:ag(). Manager поищет в настройках который это агент(по адресу). Пошлет асинхронный запрос на железку, а когда придет ответ, Manager по привязанным user/agent, сообразит на которого user (ну грубо говоря в какой модуль) его переслать.

В данном случает придет ответ на handle_pdu(Addr, Port, ReqId, SnmpResponse, UserData) в том user-е к которому привязан агент, куда посылался запрос.

В следующих постах приведу примеры кода.

Comments