Инструменты пользователя

Инструменты сайта


ru:ipoe_dhcp_lua

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

ru:ipoe_dhcp_lua [2014/11/05 16:24] (текущий)
dmitry created
Строка 1: Строка 1:
 +===== Использование LUA для формирования имени пользователя на основе DHCP пакета =====
 +
 +Для этого необходимо:​
 +  * собрать accel-ppp с поддержкой lua: **cmake -DLUA=TRUE**\\
 +  * в кофиге указать:​ \\
 +<​code>​
 + ​[ipoe]
 + ​lua-file=имя_файла
 + ​username=lua:​имя_функции
 +</​code>​
 +
 + ​например
 +<​code>​
 + ​[ipoe]
 + ​lua-file=/​etc/​accel-ppp.lua
 + ​username=lua:​username
 +</​code>​
 +
 +  * в /​etc/​accel-ppp.lua пишем:
 +<​code>​
 +#!lua
 +function username(pkt)
 +    v,​b1,​b2,​b3,​b4=string.unpack(pkt:​agent_remote_id():​sub(-4),'​bbbb'​)
 +    ip=b1..'​.'​..b2..'​.'​..b3..'​.'​..b4
 +    v,​port=string.unpack(string.sub(pkt:​agent_circuit_id(),'​-1'​),'​b'​)
 +    local username=ip..'​-'​..port
 +--    print(username)
 +    return username
 +end
 +</​code>​
 +
 +этот скрипт подходит для разбора опции 82 коммутаторов Dlink.
 +----
 +
 +Объект **pkt** имеет следующие функции:​
 +  ; **hdr(name)** : Возвращает значение поля в заголовке пакета DHCP.
 +//name// может принимать следующие значения:​ //xid, ciaddr, giaddr, chaddr//.
 +  ; **ifname()** : Возвращает имя интерфейса принявшего пакет.
 +  ; **options()** : Возвращает таблицу содержащую номера DHCP опций в принятом пакете.
 +  ; **option(num)** : Возвращает значение опции с номером **num**.
 +  ; **agent_circuit_id()** : Возвращает значение agent_circuit_id опции 82.
 +  ; **agent_remote_id()** : Возвращает значение agent_remote_id опции 82.
 +  ​
 +Все функции за исключением **options()** возвращают **string**.
 +----
 +Так-же для удобства разбора бинарных данных в состав accel-ppp включен пакет [[https://​github.com/​LuaDist/​lpack|lpack]]\\
 +Он добавляет к объекту **string** дополнительную функцию **unpack(binary,​ fmt)**, где **binary** - это строка содержащая бинарные данные,​ а **fmt** - формат этих данных.
 +В **fmt** можно указать следующие типы данных:​\\
 +**z** - zero terminated string\\
 +**p** - string precended by length byte\\
 +**P** - string precended by length word\\
 +**f** - float\\
 +**d** - double\\
 +**c** - int8_t\\
 +**b** - uint8_t\\
 +**h** - int16_t\\
 +**H** - uint16_t\\
 +**i** - int32_t\\
 +**I** - uint32_t\\
 +**l** - int64_t\\
 +**L** - uint64_t\\
 +**<** - little endian\\
 +**>** - big endian\\
 +**=** - native endian\\
  
ru/ipoe_dhcp_lua.txt · Последние изменения: 2014/11/05 16:24 — dmitry