Обработчик управления устройством с синхронизацией интерфейсов и их индексов

Материал из BiTel WiKi

Перейти к: навигация, поиск

Содержание

Описание

Класс - обработчик управления устройством по SNMP (DeviceManager) взамен стандартного.

  • Умеет выдавать uptime, как и стандартный SnmpDeviceManager.
  • Умеет синхронизировать интерфейсы устройства и их snmp-индексы (нужны для учёта flow)
Полезен для схем, использующих интерфейсы, например Vlan per user + Cisco IP subscriber interface + ISG

Как пользоваться

  • Скачиваем библиотеку snmp4j[1] (я использовал snmp4j-2.2.3.jar[2]).
  • Копируем snmp4j-2.2.3.jar (или другую версию) в /usr/local/BGBillingServer/lib/app
  • Рестартуем сервер биллинга
  • Делаем ./update в BGInetAccess и BGInetAccounting и рестартуем их
  • Копируем себе в динамический код классы:
ru.dsi.bgbilling.modules.inet.dyn.device.snmp.IfaceSnmpDeviceManager
ru.dsi.bgbilling.modules.inet.dyn.device.snmp.SnmpDeviceManager
ru.dsi.bgbilling.modules.inet.dyn.device.snmp.SnmpClient
  • Компилируем динамический код
  • Указываем в типе устройства модуля Inet "Обработчик управления устройством: ru.dsi.bgbilling.modules.inet.dyn.device.snmp.IfaceSnmpDeviceManager"
  • Настраиваем конфигурацию устройства/типа устройства/родительского устройства (по усмотрению) - см раздел "Конфигурация"
  • Перечитываем конфигурацию устройств
  • Заходим в устройство с нашим обработчиком, кликаем правой кнопкой, выбираем "выполнить команду", пишем ifsync, смотрим результат:

Файл:ifsync-command.png

Файл:ifsync-result.png

Файл:ifsync-ifaces.png

Принцип работы

Обработчик поддерживает команды:

  • uptime - аналогично стандартному обработчику, возвращает uptime устройства для определения стандартными средствами модуля Inet его перезагрузки. Можно отключить, тогда будет возвращать null (см конфигурацию). Отклчение может пригодиться, если устройство расформировано, чтобы обработчик не слал алармы.
  • ifsync - синхронизация интерфейсов и их ifIndex на роутере и в биллинге:
    • 1. Получаем по SNMP список соответствий: ifIndex->ifName интерфейсов на устройстве
    • 2. Для каждого полученного интерфейса проверяем, есть ли в биллинге на устройсве интерфейс с таким именем?
      • 2.1. Если нет, и он проходит через фильтр snmp.ifNameRegexpFilter - создаём с правильным ifIndex и категорией ip = snmp.ipCategory
      • 2.2. Если есть, то совпадает ли ifIndex?
        • 2.2.1. Если да, то ничего не делаем, всё ок.
        • 2.2.2. Если нет, то меняем ifIndex
    • 3. Оставшиеся необработанными интерфейсы в BG: если их нет на устройстве, то помечаем как отключенный и устанавливаем ifIndex=0

Настройка

Параметры конфигурации устройства/типа устройства:

  • для SnmpDeviceManager
#версия протокола (1 или 2 (для 2с))
snmp.version=1
#ip-адрес или hostname устройства. По-умолчанию берётся из поля "Хост" устройства в модуле Inet
snmp.host=
#порт SNMP устройства
snmp.port=161
#SNMP community. По-умолчанию - secret устройства в Inet
snmp.community=
#проверять ли uptime? Если 0, то метод uptime возвращает null
snmp.checkUptime=1
#OID для опроса uptime устройства
snmp.uptimeOid=1.3.6.1.2.1.1.3.0
#включает работу менеджера на этом устройстве
snmp.enable=1
  • для IfaceSnmpDeviceManager (в дополнение к настройкам из SnmpDeviceManager):
#oid для получения списка интерфейсов устройства
snmp.ifNameOid=1.3.6.1.2.1.31.1.1.1.1
#regexp для фильтрации интерфейсов. Например, если нам в биллинге нужны только интерфейсы, 
#начинающиеся с Gi или Fa, то указываем snmp.ifNameRegexpFilter=.*
snmp.ifNameRegexpFilter=^(Gi|Fa).*
#id категории ресурсов, которая будет указана для создаваемых интерфейсов
snmp.ipCategory=0
#если 1, то меняем индексы не с текущего момента, а со времени старта устройства, если это произошло сегодня.
#Предполагаем, что ifIndex могут меняться только при рестарте устройства.
snmp.substractUptime=1

Код

P.S.

  • Использовал snmp4j вместо westhawk snmp, т.к. в последнем нельзя сделать GETNEXT
Личные инструменты