Биллинговая система Nodeny

Главная категория => Nodeny Plus => Тема начата: elite от 02 Июня 2017, 19:59:22



Название: фикс noserver.pl
Отправлено: elite от 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. Данным фиксом убираем эту проблему


Название: Re: фикс noserver.pl
Отправлено: Efendy от 02 Июня 2017, 20:10:40
Этот sql будет некорректным хотя и будет выполнен mysql - нельзя выбирать неагрегированные поля, не участвующие в группировке. Со временем они это пофиксят и будут проблемы.


Название: Re: фикс noserver.pl
Отправлено: elite от 02 Июня 2017, 22:00:05
Тогда как правильно решить задачу?


Название: Re: фикс noserver.pl
Отправлено: Efendy от 02 Июня 2017, 23:13:38
Смотря какую запись считать приоритетной


Название: Re: фикс noserver.pl
Отправлено: elite от 03 Июня 2017, 12:35:23
Смотря какую запись считать приоритетной
приоритетной считать из auth_now


Название: Re: фикс noserver.pl
Отправлено: Efendy от 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