Обновил модуль dhcp. В настройках подключений, там, где вручную можно ввести мак-адрес, если у абона в данный момент подключен один или больше статических ip, то можно эти ip привязать к мак-адресу - смотрите прикрепление.
ip записывается в таблицу mac_uid. Напомню, что в этой таблице поле ip нужен для регистрации подключений неизвестных абонов и не играет роли при выдаче ip радиусом. Но я решил в этом же поле хранить и статические ip. При этом важно переделать процедуры mysql чтобы они:
1) не перетирали поле ip, что нужно для динамических ибо они могут плясать по абонам
2) выдавать ip не через get_ip
Вот переделанная процедураиз доки
http://nodeny.com.ua/wiki/index.php/Dhcp%2BRadius :
DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
BEGIN
DECLARE usr_mac VARCHAR(12);
DECLARE usr_ip VARCHAR(15);
DECLARE usr_id INT;
SELECT REPLACE(login, ':', '') INTO usr_mac;
SELECT uid INTO usr_id FROM mac_uid WHERE mac=usr_mac;
IF usr_id IS NOT NULL AND usr_id>0 THEN
SELECT INET_NTOA(m.ip) INTO usr_ip FROM mac_uid m JOIN ip_pool i ON m.ip=i.ip AND m.uid=i.uid
WHERE i.type='static' AND m.mac=usr_mac;
IF usr_ip IS NULL THEN
SELECT get_ip(usr_id) INTO usr_ip;
UPDATE mac_uid SET ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP() WHERE uid=usr_id;
END IF;
UPDATE mac_uid SET ip=0 WHERE ip=INET_ATON(usr_ip) AND uid<>usr_id;
ELSE
START TRANSACTION;
SELECT INET_NTOA(ip) INTO usr_ip FROM ip_pool
WHERE uid=0 AND type='dynamic' AND `release` < UNIX_TIMESTAMP()
ORDER BY RAND() LIMIT 1 FOR UPDATE;
INSERT INTO mac_uid VALUES(
NULL, usr_mac, INET_ATON(usr_ip), 0, UNIX_TIMESTAMP(), 0, 0, 0, '')
ON DUPLICATE KEY
UPDATE ip=IF(ip>0,ip,INET_ATON(usr_ip)), time=UNIX_TIMESTAMP();
COMMIT;
SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid WHERE mac=usr_mac;
UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 3600
WHERE ip = INET_ATON(usr_ip);
END IF;
SELECT NULL, login, 'Framed-IP-Address', usr_ip, '=';
SELECT NULL, login, 'Session-Timeout', '600', '=';
END$$
DELIMITER ;
Был переделан этот фрагмент:
SELECT INET_NTOA(m.ip) INTO usr_ip FROM mac_uid m JOIN ip_pool i ON m.ip=i.ip AND m.uid=i.uid
WHERE i.type='static' AND m.mac=usr_mac;
IF usr_ip IS NULL THEN
SELECT get_ip(usr_id) INTO usr_ip;
UPDATE mac_uid SET ip=INET_ATON(usr_ip), time=UNIX_TIMESTAMP() WHERE uid=usr_id;
END IF;