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

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]
  Печать  
Автор Тема: фикс noserver.pl  (Прочитано 5133 раз)
elite
Начальник планеты
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1226

In LAN we trust!

358714596
Просмотр профиля
« : 02 Июня 2017, 19:59:22 »


Предлагаю небольшой фикс noserver.pl
Код:
# Sql выборки всех авторизованных клиентов, которым не запрещен доступ и у которых подключена услуга с тегом `inet`

my $sql_get_auth_usr = <<SQL;
    SELECT u.id, u.balance, u.name, u.state, a.auth_start, a.ip, a.properties
        FROM (
        SELECT ip, properties, start AS auth_start FROM auth_now
                UNION ALL
        SELECT INET_NTOA(i.ip) AS ip, '' as properties, UNIX_TIMESTAMP() AS auth_start
            FROM users u JOIN ip_pool i ON i.uid=u.id WHERE u.lstate=1.
    ) a.
        JOIN ip_pool i ON INET_ATON(a.ip)=i.ip
        JOIN users u ON i.uid=u.id
    WHERE TRUE
SQL
и в функции load_usr_info
изменить
Код:
my $db = Db->sql( $sql_get_auth_usr );
на
Код:
my $db = Db->sql( $sql_get_auth_usr.' GROUP BY ip' );

Смысл: если у клиента стоит состояние "всегда онлайн", а он авторизуется чем-либо (dhcp, pppoe и т.п.), то noserver "видит" его как 2 разных ip. Данным фиксом убираем эту проблему
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #1 : 02 Июня 2017, 20:10:40 »

Этот sql будет некорректным хотя и будет выполнен mysql - нельзя выбирать неагрегированные поля, не участвующие в группировке. Со временем они это пофиксят и будут проблемы.
Записан
elite
Начальник планеты
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1226

In LAN we trust!

358714596
Просмотр профиля
« Ответ #2 : 02 Июня 2017, 22:00:05 »

Тогда как правильно решить задачу?
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #3 : 02 Июня 2017, 23:13:38 »

Смотря какую запись считать приоритетной
Записан
elite
Начальник планеты
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1226

In LAN we trust!

358714596
Просмотр профиля
« Ответ #4 : 03 Июня 2017, 12:35:23 »

Смотря какую запись считать приоритетной
приоритетной считать из auth_now
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #5 : 03 Июня 2017, 19:35:45 »

Слегка протестил это:
Код:
    SELECT u.id, u.balance, u.name, u.state, a.auth_start, a.ip, a.properties
        FROM (
        SELECT INET_NTOA(i.ip) AS ip, '' as properties, UNIX_TIMESTAMP() AS auth_start
            FROM users u JOIN ip_pool i ON i.uid=u.id WHERE u.lstate=1
                AND NOT EXISTS (SELECT 1 FROM auth_now WHERE INET_ATON(ip)=i.ip)
                UNION ALL
        SELECT ip, properties, start AS auth_start FROM auth_now
    ) a
        JOIN ip_pool i ON INET_ATON(a.ip)=i.ip
        JOIN users u ON i.uid=u.id
    WHERE TRUE
Записан
Страниц: [1]
  Печать  
 
Перейти в:  

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