## ISC-DHCP Сервер, взаимодействие с биллингом. В общих чертах взаимодействие происходит с помощью скрипта **dhcp_lever.py**,который хранится в корне проекта, или [dhcp_lever](https://github.com/nerosketch/dhcp_lever), который написан на C++.. Запущенный DHCP сервер, при возникновении событий запускает этот сценарий , а тот говорит биллингу о случившемся. При событии *expiry* или *release* биллингу нужно освободить ip, а при *commit* нужно назначить динамическую аренду ip для учётной записи абонента в биллинге. Сам скрипт не выполняет все эти действия, он просто отправляет полученные от dhcp сервера параметры на url адрес для обработки dhcp. View распологается в **abonapp.views.DhcpLever**. ### Выделение аренды ip Как происходит выделение аренды ip, от события в dhcp сервере и до появления интернета у абонента. Когда в dhcp сервере происходит событие *commit* то из **abonapp.views.DhcpLever** вызывается функция **agent.commands.dhcp.dhcp_commit**, с помощью DHCP OPTION.82 получаем mac адрес управляемого свича и порт через который пришёл запрос. Каждое такое устройство должно быть зарегистрировано в биллинге. Далее ищем в базе абонента, или абонентов к которому привязано устройство с переданным mac адресом. Проверяем может-ли данный тип устройства содержать несколько подключённых абонентов(напрмер PON ONU, в основном, содержит одного абонента). Проверка происходит по свойству **is_use_device_port** из менеджера устройства, которое открыто для кастомизации, подробнее в [Менеджер устройства](./docs/dev.md). А далее, если может быть несколько абонентов, то фильтруем вывод ещё по порту свича. Получется что на управляемом свиче мы авторизуем абонентов при помощи dhcp option.82 по маку свича и порту абонента. Если наше устройство PON ONU(ONT) то авторизуем только по mac адресу оптического юнита(onu). После добавления абоненту аренды динамического ip, он(абонент) синхронизуется с nas сервером и открывается доступ к интернету в соответствии с тарифом абонента.