Предисловие
Всем привет. Я работаю сетевым инженером в интернет провайдере. Я уже как то рассказывал, как мы мониторим абонентские PON терминалы в телеграм боте.
В какой то момент захотелось больше функционала, и больше вендоров.
Добавлять кучу функционала в бот мне показалось избыточным и неудобным. Поэтому начал писать WEB версию, с использованием Flask, параллельно его изучая, т.к. до этого не знал о нём вообще ничего.
Краткая справка:
ОНУ это - Optical Network Unit (ONU)/Optical Network Terminal (ONT);
ОЛТ это - Optical line termination (OLT).

У кого дома интернет подключен по пону, видели у себя маленькую коробочку, в которую приходит оптика, и выходит медный провод, который подключается в роутер. Вот эти коробочки (ОНУ) мы и будем мониторить.
Здесь я расскажу концептуально, что получилось. А сам код можно посмотреть на Github.
Название приложения (OLTs HUB, далее Олтхаб) родилось как то само собой, когда проходили эксперименты с фронтендом, и выслушивались хотелки от техподдежрки :)
Данный пост будет интересен сетевым инженерам маленьких и средних интернет провайдеров, которые используют технологию PON, и мониторят терминалы самописными скриптами. Моя первая версия данной программы, была чисто консольной, а потом уже появился фронтенд, для того, чтобы им могли пользоваться другие люди.
Изначально, все данные мы брали руками непосредственно с ОЛТа через консоль. При возникновении вопросов у операторов техподдержки, они скидывали нам мак или серийник ОНУ, а мы заходили в консоль и смотрели, что там может быть не так. В какой то момент я посчитал, что это идеальная задача для укрепления навыков в питоне, который я начал изучать.
Программа не является по сути привычным всем мониторингом, таким, например, как Zabbix. Zabbix в данном случае нам не подошёл, т.к. данные с ОНУ нужны в реальном времени, по запросу. Чтобы оператор щёлкая кнопку “обновить” получал реальные метрики в данный момент. Да и мониторить 30000 ОНУ в заббиксе то ещё удовольствие.
Программ которые покроют данную задачу я не нашёл. Есть опенсорс программа PonControl, но умеет он не всё, и работает только с BDCOM, и не поддерживается Huawei. У нас же, есть ещё Huawei. Изначально я писал именно под Huawei, а потом уже добавил BDCOM.
Олтхаб работает с ОЛТами BDCOM (EPON) и Huawei MA5600/5800 (EPON/GPON), с однопортовыми ОНУ. Думаю программа пригодится многим провайдерам, поэтому выкладываю на всеобщее обозрение. Может даже кто то даст полезный совет или идею для фичи :)
Функционал
Возьмём для примера обычный звонок в техподдержку, где у абонента не работает интернет. Спросив у абонента номер договора, оператор, находит его в биллинге, там же находит информацию об ОНУ. Оператор заходит в Олтхаб, вводит в строку поиска мак или серийник ОНУ, и получает результат.

Пока абонент нашёл где у него в квартире стоит ОНУ, чтобы посмотреть индикацию, оператор уже нашёл причину неработающего интернета.
Какие полезные данные может получить оператор? Это данные о самом ОЛТе, его имя, ip адрес, pon порт. Если ОНУ в сети, то так же можно увидеть статус LAN порта, иногда абоны его отключают или ломают, и удивляются почему не работает интернет.

В данном случае ОНУ в сети, и показывает хорошие уровни сигнала, но интернета нет. Интересно, почему?
Для GPON Huawei поддерживается управление CATV портом.

Если у абонента подключен коаксиальный кабель, то будет виден уровень сигнала.
ON/OFF в данном случае показывает включен или выключен порт программно. Если его выключить, то телевизор работать не будет. Полезно когда абонент не заплатил за ТВ. Данную операцию тоже делали вручную, т.к. биллинг сам не умеет ходить на ОЛТы и блокировать телевидение.

Для интеграции с другими система, например биллинг, добавил получение статуса ОНУ через API. Получить json можно таким способом http://oltshub_ip/api/onuinfo/aabbccddeeff

ОНУ можно перезагрузить. А для BDCOM ещё и удалить, полезно если ОНУ переезжает с ОЛТа на ОЛТ, или закончилось место на порту. Если уровень плохой или плавает, можно посмотреть уровень со всего дерева на котором работает ОНУ, для этого есть кнопка “Уровень дерева”. И выведется статус всего дерева.

Если пришло уведомление что какой то PON порт лежит. Можно узнать причину зайдя в “Информацию об ОЛТе”, там можно увидеть имя ОЛТа, его ip, платформу и порты. Зайдя в конкретный порт, мы увидим статус дерева, такой же как был выше, очень удобно, сразу понимаешь - нет электричества или порвали оптику.
У ОЛТов Huawei нет автоматической регистрации ОНУ, поэтому для них ещё есть проверка на наличии незарегистрированных ОНУ, часто бывает полезно, когда подключают нового абонента.

Есть конечно небольшие недочёты по красоте вывода, но со временем и до фронтенда руки дойдут :)
Принцип работы
Принцип работы такой же как и у бота, и у скрипта который был изначально. Все метрики беруться по SNMP. Ещё было добавлено и управление, тоже по SNMP. Python запускает стандартный snmpwalk с нужными параметрами, парсит вывод, и красиво это выводит в браузере.
Олтхаб заранее ничего не опрашивает и не хранит историю. Все метрики берутся через SNMP по запросу. Оператор вводит мак/серийник в поисковую строку, далее в базе sqlite ищется нужный ОНУ, происходит проверка “В сети/Не в сети”, и далее уже происходит опрос по всем метрикам. Потом собирается словарь и отдаётся в html страничку.
Опрос ОЛТов это SNMP запрос, который выводит все зарегистрированные ОНУ, далее они складываются в базу sqlite. И когда оператор ищет ОНУ, Олтхаб ищет эту ОНУ в базе, а не опрашивает все ОЛТы. Что экономит и время и ресурсы ОЛТов, т.к. BDCOM, например очень медленно реагирует на SNMP запросы. Поэтому, если было подключение нового абонента, ОЛТ нужно опросить, чтобы ОНУ появилась в базе. Можно опросить все ОЛТы разом, полезно при начальной установке и заполнении базы, но очень долго если подключили нового абонента, для этого есть возможность опросить конкретный ОЛТ.
Добавление ОЛТов происходит через Нетбокс. В последнее время я всё делаю с интеграцией с Нетбокс. Олтхаб делает API запрос в Нетбокс, откуда вытягивает устройства по тегам.
Теги мы используем epon и gpon.

Тут важно разделять ОЛТы, т.к. OIDы у epon и gpon разные даже у одного вендора. Также необходимо указать платформу, чтобы понимать где BDCOM, а где Huawei.

Если нету Нетбокса, то есть возможность добавлять ОЛТы вручную. Удалять можно в независимости от способа добавления.
Безопасность и юзеров в приложение пока не завезли. Конкретно у нас авторизация через nginx, и дальше локальной сети доступа нет.
Заключение
Возможно я изобрёл велосипед, но альтернатив я не нашёл. Ходить руками на 100+ ОЛТов по каждому звонку в техподдержку неохота. Хочется больше времени уделять инженерной работе. К тому же я неплохо набил руку в Python пока писал и 20 раз переписывал данное приложение, лучшее обучение это применение теории на практике. Я не привожу здесь примеров кода, т.к. кода получилось очень много, любой желающий может его посмотреть, скачать и установить у себя. Буду рад если моё приложение будет ещё кому то полезно.
Gansterito
А лого постеснялись выложить?)
dragjj Автор
Нет, контекста не было)) но рад, что кто-то скачал и посмотрел, а не проскролил и закрыл)
Ribera-sun
А почему не omci? Там и управление. Или tr-069, там еще и настройки.
И еще - ведь далеко не все терминалы умеют отвечать по SNMP штатно, у вас кастомизированные прошивки терминалов?