Efendy
|
|
« : 07 Августа 2013, 10:14:09 » |
|
Как сделать чтоб клиент мог подключить несколько компов на pppoe под одним логином, при этом ровно столько подключений, сколько у него подключено ip? Как известно, логин и пароль у учетки существует в единственном экземпляре. Но, ничего, мы придумаем добавлять постфикс к логинам: +1 (2й ip в списке), +2 (3й) и т.д. Например, логин у нас ivanov. Тогда при коннекте по логину ivanov или ivanov+0 подсоединимся и получим 1й ip из списка его ip. По логину ivanov+2 - второй и т.д. Если после плюса стоит не число или число больше чем у него ip - выдается 1й айпи из списка (ivanov+blablabla+oh_no) Итак, создаем следующие процедуры: DROP FUNCTION IF EXISTS `get_ip_by_num`; DELIMITER $$ CREATE FUNCTION `get_ip_by_num` ( user_id INTEGER UNSIGNED, num INTEGER) RETURNS VARCHAR(15) NO SQL BEGIN DECLARE user_ip VARCHAR(15); DECLARE real_ip VARCHAR(15);
SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool WHERE uid = user_id AND type='static' ORDER BY ip LIMIT num, 1; IF( user_ip IS NOT NULL ) THEN RETURN user_ip; END IF;
SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool WHERE uid = user_id AND type='static' ORDER BY ip LIMIT 1; IF( user_ip IS NOT NULL ) THEN RETURN user_ip; END IF;
SELECT 1 INTO real_ip FROM users_services WHERE uid = user_id AND tags LIKE '%,realip,%'; UPDATE ip_pool SET uid = user_id, `release` = UNIX_TIMESTAMP() + 300 WHERE (uid = 0 OR uid = user_id) AND type = 'dynamic' AND realip = IF(real_ip>0,1,0) ORDER BY uid DESC, id ASC LIMIT 1;
SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool WHERE uid = user_id LIMIT 1; RETURN user_ip; END$$ DELIMITER ; DROP PROCEDURE IF EXISTS `radcheck`; DELIMITER $$ CREATE PROCEDURE `radcheck` (IN login VARCHAR(64)) BEGIN DECLARE real_login VARCHAR(64) DEFAULT NULL; SELECT SUBSTRING_INDEX(login, '+', 1) INTO real_login; SELECT id, name, 'Password' AS Attribute, AES_DECRYPT(passwd,'hardpass') AS Value,'==' FROM users WHERE name=real_login; END$$ DELIMITER ; DROP PROCEDURE IF EXISTS `radreply`; DELIMITER $$ CREATE PROCEDURE `radreply`(IN login VARCHAR(64)) BEGIN DECLARE usr_id INT; DECLARE ip_index INT; DECLARE usr_ip VARCHAR(15) DEFAULT NULL; DECLARE real_login VARCHAR(64) DEFAULT NULL;
SELECT SUBSTRING_INDEX(login, '+', 1) INTO real_login; SELECT CAST(REPLACE(login, real_login, '') AS UNSIGNED) INTO ip_index;
SELECT id INTO usr_id FROM users WHERE name=real_login LIMIT 1; SELECT get_ip_by_num(usr_id, ip_index) INTO usr_ip;
SELECT NULL,login,'Framed-IP-Address',usr_ip,'='; SELECT NULL,login,'Framed-IP-Netmask','255.255.255.255','='; SELECT NULL,login,'Framed-Protocol','PPP','='; END$$ DELIMITER ; Процедура radupdate - это домашнее задание, справитесь по аналогии. Не забудьте в radcheck изменить hardpass на свой ключ шифрования паролей(см. sat.cfg) Проверяем: call test_radreply('ivanov+1'); Если у клиента не прописано ни одного ip - выдается динамически по старой схеме и подсоединится может только один юзер
|
|
|
Записан
|
|
|
|
boomer666
NoDeny
Постоялец
Карма: 1
Offline
Сообщений: 194
|
|
« Ответ #1 : 07 Августа 2013, 12:29:55 » |
|
Спасибо .Будем пробовать.
|
|
|
Записан
|
|
|
|
sov
|
|
« Ответ #2 : 09 Августа 2013, 22:43:02 » |
|
Протестировал. Если вызывать radreply в консоли mysql - процедура работает, а если через радиус - получается ерунда: [sql] expand: %{User-Name} -> sov213+1 [sql] sql_set_user escaped user --> 'sov213+1' rlm_sql (sql): Reserving sql socket id: 9 [sql] expand: call radcheck('%{SQL-User-Name}') -> call radcheck('sov213=2B1') rlm_sql_mysql: query: call radcheck('sov213=2B1') rlm_sql (sql): Released sql socket id: 9 [sql] User sov213+1 not found То есть, радиус в процессе передачи логина базе данных заменяет плюс на =2B. Кто нибудь знает, как это поправить? Лично я сходу не придумал. Однако, это легко лечится в самих процедурах. Нужно просто заменить такие строки: SELECT SUBSTRING_INDEX(login, '+', 1) INTO real_login; SELECT CAST(REPLACE(login, real_login, '') AS UNSIGNED) INTO ip_index;
на, допустим, такие: SELECT SUBSTRING_INDEX(login, '=', 1) INTO real_login; SELECT CAST(REPLACE(REPLACE(login, real_login, ''),'=2B','') AS UNSIGNED) INTO ip_index;
После чего алиасы начинают работать.
|
|
|
Записан
|
|
|
|
Nafanya
NoDeny
Старожил
Карма: 1
Offline
Сообщений: 459
|
|
« Ответ #3 : 05 Августа 2014, 13:14:05 » |
|
Процедура radupdate - это домашнее задание, справитесь по аналогии. Не забудьте в radcheck изменить hardpass на свой ключ шифрования паролей(см. sat.cfg)
Прошу помощи, в мускуле не силен. Сделайте работу над ошибками: DROP PROCEDURE IF EXISTS `radupdate`; DELIMITER $$ CREATE PROCEDURE `radupdate`(IN login VARCHAR(64), IN ip VARCHAR(16), IN properties VARCHAR(255)) BEGIN DECLARE usr_id INT; DECLARE ip_index INT; DECLARE usr_ip VARCHAR(15) DEFAULT NULL; DECLARE real_login VARCHAR(64) DEFAULT NULL;
SELECT SUBSTRING_INDEX(login, '+', 1) INTO real_login; SELECT CAST(REPLACE(login, real_login, '') AS UNSIGNED) INTO ip_index;
SELECT id INTO usr_id FROM users WHERE name=real_login LIMIT 1; SELECT get_ip_by_num(usr_id, ip_index) INTO usr_ip; CALL set_auth(usr_ip, CONCAT('mod=pppoe;',REPLACE(properties,':',''))); END$$ DELIMITER ;
Спасибо
|
|
|
Записан
|
Кому то Бог дал ручки, а кому то - грабельки.
|
|
|
Nafanya
NoDeny
Старожил
Карма: 1
Offline
Сообщений: 459
|
|
« Ответ #4 : 08 Августа 2014, 18:24:10 » |
|
Ну не хочет оно работать!!! Уже нашел у себя ошибки, исправил... Помогите. ЛЮДИ!!!! АУ...
|
|
|
Записан
|
Кому то Бог дал ручки, а кому то - грабельки.
|
|
|
Nafanya
NoDeny
Старожил
Карма: 1
Offline
Сообщений: 459
|
|
« Ответ #5 : 10 Августа 2014, 05:35:07 » |
|
Да, видимо здесь, в форуме, помощи не дождаться. Здесь все "ПРОГРАММИСТЫ", а кто какой вопрос не по их уровню - такЮ мелочь пузатая. Спасибо всем за помощь. Это называется - оперативная поддержка.
|
|
|
Записан
|
Кому то Бог дал ручки, а кому то - грабельки.
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #6 : 10 Августа 2014, 09:37:41 » |
|
Ну я даже не знаю... Вижу кусок кода и какая-то просьба что-то сделать, а что именно - в упор не вижу.... а потом вижу вопли, что все вокруг пи...расы! Точность ответа на Ваш вопрос прямопропорциональна точности вопроса... Тут никто, никому, ничем, не обязан. Даже (я не читал, но думаю так и есть) если ты прочитаешь лицензионное соглашение на Н+, то вряд ли ты там найдешь пункт о том, что на любой твой вопрос, даже - "почему земля круглая", будет кто-то, спотыкаясь отвечать... Хочешь ответ? - пиши внятный вопрос, в одном сообщении...
|
|
|
Записан
|
|
|
|
Nafanya
NoDeny
Старожил
Карма: 1
Offline
Сообщений: 459
|
|
« Ответ #7 : 10 Августа 2014, 19:52:26 » |
|
Ну я даже не знаю... Вижу кусок кода и какая-то просьба что-то сделать, а что именно - в упор не вижу.... а потом вижу вопли, что все вокруг пи...расы! Точность ответа на Ваш вопрос прямопропорциональна точности вопроса... Тут никто, никому, ничем, не обязан. Даже (я не читал, но думаю так и есть) если ты прочитаешь лицензионное соглашение на Н+, то вряд ли ты там найдешь пункт о том, что на любой твой вопрос, даже - "почему земля круглая", будет кто-то, спотыкаясь отвечать... Хочешь ответ? - пиши внятный вопрос, в одном сообщении...
Никого я тут не оскорблял, и такой ответ я предполагал. А на сайте Нодени+ есть такоеЖ Обширное сообщество позволяет найти ответ на любой вопрос, поделится своим опытом или принять участие в разработке проекта (даже если вы не умеете программировать) А если Вы лично так восприняли мою фразу, тогда ПРОСТИТЕ. Но это как бы не уровень. Когда человек инвалид и прости помощи, но ему игнор. Еще раз прошу прощения, кого оскорбил (вернее человек принял это как оскорбление) Я просто хотел обратить внимание на вопрос.
|
|
|
Записан
|
Кому то Бог дал ручки, а кому то - грабельки.
|
|
|
Nafanya
NoDeny
Старожил
Карма: 1
Offline
Сообщений: 459
|
|
« Ответ #8 : 10 Августа 2014, 20:08:56 » |
|
Да и кому показалось, что я его оскорбил, стучите в лмчку - не будем засорять эфир выяснением отношений.
|
|
|
Записан
|
Кому то Бог дал ручки, а кому то - грабельки.
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #9 : 10 Августа 2014, 22:11:36 » |
|
У меня нет Н+ и искать в доках что-то - желания нет. излагайте проблему: 1. Что нужно получить на выходе; 2. что не работает; 3. Что делали чтобы заработало; 4. Что не работает, после того, как что-то делали.
|
|
|
Записан
|
|
|
|
Nafanya
NoDeny
Старожил
Карма: 1
Offline
Сообщений: 459
|
|
« Ответ #10 : 11 Августа 2014, 07:31:52 » |
|
Весь вопрос заключается: подключить одному клиенту два РРРоЕ, на два IP. Сделал процедуры как здесь. Добавил процедуру radupdate: DROP PROCEDURE IF EXISTS `radupdate`; DELIMITER $$ CREATE PROCEDURE `radupdate`(IN login VARCHAR(64), IN ip VARCHAR(16), IN properties VARCHAR(255)) BEGIN DECLARE usr_id INT; DECLARE ip_index INT; DECLARE usr_ip VARCHAR(15) DEFAULT NULL; DECLARE real_login VARCHAR(64) DEFAULT NULL;
SELECT SUBSTRING_INDEX(login, '=', 1) INTO real_login; SELECT CAST(REPLACE(REPLACE(login, real_login, ''),'=2B','') AS UNSIGNED) INTO ip_index;
SELECT id INTO usr_id FROM users WHERE name=real_login LIMIT 1; SELECT get_ip_by_num(usr_id, ip_index) INTO usr_ip;
CALL set_auth(usr_ip, CONCAT('mod=pppoe;',REPLACE(properties,':',''))); END$$ DELIMITER ; Как видите, что в этой процедуре, что в процедуре radreply Я заменил две строки, как говорилось выше: То есть, радиус в процессе передачи логина базе данных заменяет плюс на =2B. Кто нибудь знает, как это поправить? Лично я сходу не придумал.
Однако, это легко лечится в самих процедурах. Нужно просто заменить такие строки: Код: SELECT SUBSTRING_INDEX(login, '+', 1) INTO real_login; SELECT CAST(REPLACE(login, real_login, '') AS UNSIGNED) INTO ip_index; на, допустим, такие: Код: SELECT SUBSTRING_INDEX(login, '=', 1) INTO real_login; SELECT CAST(REPLACE(REPLACE(login, real_login, ''),'=2B','') AS UNSIGNED) INTO ip_index; После чего алиасы начинают работать. Однако не работает. Может, что то делаю неправильно? Я мало понимаю в мускуле, я это писал выше, однако учусь. Но не все так быстро. Не смейтесь, но где выполнять проверку: call test_radreply('ivanov+1'); Заранее спасибо за помощь. Надеюсь вся инфа, если что-то не хватает - пожалуйста вопросы.
|
|
|
Записан
|
Кому то Бог дал ручки, а кому то - грабельки.
|
|
|
ser970
NoDeny
Спец
Карма: 70
Offline
Сообщений: 1323
|
|
« Ответ #11 : 11 Августа 2014, 08:23:28 » |
|
call test_radreply('ivanov+1'); Заранее спасибо за помощь. Надеюсь вся инфа, если что-то не хватает - пожалуйста вопросы. сначала mysql -u root -pпароль мускула nodeny и потом call test_radreply('ivanov+1')
|
|
|
Записан
|
|
|
|
Efendy
|
|
« Ответ #12 : 11 Августа 2014, 09:34:08 » |
|
надо проверять не call test_radreply('ivanov+1'); а call test_radreply('ivanov=2B1'); ты же сам процитировал сообщение, что радиус меняет + на =2B! Клиент посылает ivanov+1, радиус меняет на ivanov=2B1 и в radreply подставляет этот логин
|
|
|
Записан
|
|
|
|
Nafanya
NoDeny
Старожил
Карма: 1
Offline
Сообщений: 459
|
|
« Ответ #13 : 12 Августа 2014, 06:47:54 » |
|
надо проверять не call test_radreply('ivanov+1'); а call test_radreply('ivanov=2B1'); ты же сам процитировал сообщение, что радиус меняет + на =2B! Клиент посылает ivanov+1, радиус меняет на ivanov=2B1 и в radreply подставляет этот логин Пытаюсь проверитьЖ mysql> call test_radreply('telefon=2B1'); ERROR 1305 (42000): PROCEDURE nodeny.test_radreply does not exist mysql> call test_radreply('telefon+1'); ERROR 1305 (42000): PROCEDURE nodeny.test_radreply does not exist
подскажите куда смотреть. Хочу все таки разобраться. Процедуры прикрепил
|
|
|
Записан
|
Кому то Бог дал ручки, а кому то - грабельки.
|
|
|
Efendy
|
|
« Ответ #14 : 12 Августа 2014, 07:47:41 » |
|
Ты даже не пытаешься читать, что тебе mysql пишет. Он пишет, что процедуры test_radreply не существует. Это логично, поскольку ты ее не создавал, а создавал radreply. Кто-то привел пример с test_radreply, надеясь что ты не робот и подумаешь перед слепым использованием и переименуешь под свой случай, но оказался не прав
|
|
|
Записан
|
|
|
|
|