Во время запроса канала dlink перехватывает igmp query и отправляет его радиусу с такими полями:
User-Name = "FFFFFFFFFFFF"
(21) NAS-IP-Address = 10.0.0.1
(21) NAS-Identifier = "D-Link"
(21) NAS-Port-Type = Virtual
(21) Service-Type = Framed-User
(21) Framed-Protocol = PPP
(21) NAS-Port = 24
(21) Framed-IP-Address = 238.0.0.65
radius 3.0 отказывается кушать поле Framed-IP-Address через регулярку
+----+--------------+--------------------+----+--------------+
| id | username | attribute | op | value |
+----+--------------+--------------------+----+--------------+
| 1 | FFFFFFFFFFFF | Cleartext-Password | := | FFFFFFFFFFFF |
| 2 | FFFFFFFFFFFF | NAS-Port | == | 24 |
| 3 | FFFFFFFFFFFF | Framed-IP-Address | =~ | 238.0.0.* |
+----+--------------+--------------------+----+--------------+
Собственно ошибка.
(23) sql: ERROR: Error parsing value: Failed resolving "238.0.0.*" to IPv4 address: Name or service not known
(23) sql: ERROR: Error parsing user data from database result
(23) sql: ERROR: Error getting check attributes
Проблема в том, что я не пойму где radius приводит строку к типу IPv4 адреса.
Способов решения накопилось прилично. Но вопрос не в том как можно, а как правильно это сделать.
Так как абонентов iptv будет прилично и вероятно будет разделение по пакетам программ, хотелось бы уменьшить нагрузку на сервера.
1. Создать группу, напихать в нее абонентов и на эту группу повесить правило для каждого канала, но так как каналов 100+ и во время каждого запроса radius будет проходить все правила пока не найдет совпадение. Не уверен что это жирный запрос.
2. Решение через unlang.
3. Вызов Python скрипта.
Выключаю абонов методом удаления в базе порта абонента, relay в любом случае не обманет. А при отсутствии денег на счету абонент не получит iptv.
Но хотелось бы рулить регуляркой и оставлять абонам несколько каналов, чтобы они были счастливы.
P.S. ссылка на howto