Биллинговая система Nodeny
23 Ноября 2024, 14:21:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1] 2
  Печать  
Автор Тема: FAQ. Несколько ip на PPPoE  (Прочитано 13944 раз)
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« : 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 Offline

Сообщений: 194



Просмотр профиля Email
« Ответ #1 : 07 Августа 2013, 12:29:55 »

Спасибо .Будем пробовать.
Записан
sov
Постоялец
***

Карма: 0
Offline Offline

Сообщений: 101


Просмотр профиля
« Ответ #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 Offline

Сообщений: 459


412112973
Просмотр профиля Email
« Ответ #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 Offline

Сообщений: 459


412112973
Просмотр профиля Email
« Ответ #4 : 08 Августа 2014, 18:24:10 »

Ну не хочет оно работать!!! Уже нашел у себя ошибки, исправил... Помогите. ЛЮДИ!!!! АУ...
Записан

Кому то Бог дал ручки, а кому то - грабельки.
Nafanya
NoDeny
Старожил
*

Карма: 1
Offline Offline

Сообщений: 459


412112973
Просмотр профиля Email
« Ответ #5 : 10 Августа 2014, 05:35:07 »

Да, видимо здесь, в форуме, помощи не дождаться. Здесь все "ПРОГРАММИСТЫ", а кто какой вопрос не по их уровню - такЮ мелочь пузатая. Спасибо всем за помощь. Это называется  - оперативная поддержка.
Записан

Кому то Бог дал ручки, а кому то - грабельки.
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #6 : 10 Августа 2014, 09:37:41 »

Ну я даже не знаю... Вижу кусок кода и какая-то просьба что-то сделать, а что именно - в упор не вижу.... а потом вижу вопли, что все вокруг пи...расы! Точность ответа на Ваш вопрос прямопропорциональна точности вопроса... Тут никто, никому, ничем, не обязан. Даже (я не читал, но думаю так и есть) если ты прочитаешь лицензионное соглашение на Н+, то вряд ли ты там найдешь пункт о том, что на любой твой вопрос, даже - "почему земля круглая", будет кто-то, спотыкаясь отвечать... Хочешь ответ? - пиши внятный вопрос, в одном сообщении...
Записан
Nafanya
NoDeny
Старожил
*

Карма: 1
Offline Offline

Сообщений: 459


412112973
Просмотр профиля Email
« Ответ #7 : 10 Августа 2014, 19:52:26 »

Ну я даже не знаю... Вижу кусок кода и какая-то просьба что-то сделать, а что именно - в упор не вижу.... а потом вижу вопли, что все вокруг пи...расы! Точность ответа на Ваш вопрос прямопропорциональна точности вопроса... Тут никто, никому, ничем, не обязан. Даже (я не читал, но думаю так и есть) если ты прочитаешь лицензионное соглашение на Н+, то вряд ли ты там найдешь пункт о том, что на любой твой вопрос, даже - "почему земля круглая", будет кто-то, спотыкаясь отвечать... Хочешь ответ? - пиши внятный вопрос, в одном сообщении...
Никого я тут не оскорблял, и такой ответ я предполагал. А на сайте Нодени+ есть такоеЖ
Цитировать
Обширное сообщество позволяет найти ответ на любой вопрос, поделится своим опытом или принять участие в разработке проекта (даже если вы не умеете программировать)

А если Вы лично так восприняли мою фразу, тогда ПРОСТИТЕ. Но это как бы не уровень.
Когда человек инвалид и прости помощи, но ему игнор.
Еще раз прошу прощения, кого оскорбил (вернее человек принял это как оскорбление) Я просто хотел обратить внимание на вопрос.
Записан

Кому то Бог дал ручки, а кому то - грабельки.
Nafanya
NoDeny
Старожил
*

Карма: 1
Offline Offline

Сообщений: 459


412112973
Просмотр профиля Email
« Ответ #8 : 10 Августа 2014, 20:08:56 »

Да и кому показалось, что я его оскорбил, стучите в лмчку - не будем засорять эфир выяснением отношений.
Записан

Кому то Бог дал ручки, а кому то - грабельки.
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #9 : 10 Августа 2014, 22:11:36 »

У меня нет Н+ и искать в доках что-то - желания нет. излагайте проблему:
1. Что нужно получить на выходе;
2. что не работает;
3. Что делали чтобы заработало;
4. Что не работает, после того, как что-то делали.
Записан
Nafanya
NoDeny
Старожил
*

Карма: 1
Offline Offline

Сообщений: 459


412112973
Просмотр профиля Email
« Ответ #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 Offline

Сообщений: 1323

262462619
Просмотр профиля Email
« Ответ #11 : 11 Августа 2014, 08:23:28 »


Цитировать
call test_radreply('ivanov+1');
Заранее спасибо за помощь.
Надеюсь вся инфа, если что-то не хватает - пожалуйста вопросы.


сначала
mysql -u root -pпароль мускула nodeny

и потом
call test_radreply('ivanov+1')
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #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 Offline

Сообщений: 459


412112973
Просмотр профиля Email
« Ответ #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
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #14 : 12 Августа 2014, 07:47:41 »

Ты даже не пытаешься читать, что тебе mysql пишет. Он пишет, что процедуры test_radreply не существует. Это логично, поскольку ты ее не создавал, а создавал radreply. Кто-то привел пример с test_radreply, надеясь что ты не робот и подумаешь перед слепым использованием и переименуешь под свой случай, но оказался не прав
Записан
Страниц: [1] 2
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!