## 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 сервером и открывается доступ
к интернету в соответствии с тарифом абонента.
