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

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: 1 2 3 [4] 5 6
  Печать  
Автор Тема: CoA проверка работы  (Прочитано 29953 раз)
warzoni
NoDeny
Пользователь
*

Карма: 1
Offline Offline

Сообщений: 83


Просмотр профиля
« Ответ #45 : 01 Марта 2018, 23:13:02 »

1) Добавил
в радиусе в sql.conf в postauth_query и accounting_update_query добавляешь ses=%{Acct-Session-Id}
2) Добавил
Код:
DROP FUNCTION IF EXISTS `get_ip`;
DELIMITER $$
CREATE FUNCTION `get_ip` ( user_id INTEGER UNSIGNED )
    RETURNS VARCHAR(15) NO SQL
BEGIN
    DECLARE user_ip VARCHAR(15);
    DECLARE real_ip VARCHAR(15) DEFAULT 0;
    DECLARE row_cnt INTEGER;
    DECLARE ip_id INTEGER;
    DECLARE tries INTEGER DEFAULT 30;
    DECLARE id_min INTEGER;
    DECLARE id_max INTEGER;
    DECLARE blocked INTEGER DEFAULT 0;

    SELECT 1 INTO blocked FROM users WHERE state='off' AND id=user_id LIMIT 1;

    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id AND type = 'static' AND blocked = 0 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,%';

    SELECT id, INET_NTOA(ip) INTO ip_id, user_ip FROM ip_pool
        WHERE uid = user_id AND type = 'dynamic' AND realip = IF(real_ip>0,1,0)
            AND IF(blocked>0, tags LIKE '%,blocked,%', tags NOT LIKE '%,blocked,%')
        LIMIT 1;

    IF( ip_id IS NOT NULL) THEN
        UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 3600
            WHERE id = ip_id AND uid = user_id;
        SELECT ROW_COUNT() INTO row_cnt;
        IF( row_cnt > 0 ) THEN RETURN user_ip; END IF;
    END IF;

    SELECT MAX(id), MIN(id) INTO id_max, id_min
        FROM ip_pool
        WHERE type = 'dynamic' AND realip = IF(real_ip>0,1,0);

    sel_ip: WHILE tries > 0 DO
        SELECT id, INET_NTOA(ip) INTO ip_id, user_ip
            FROM ip_pool
            WHERE uid = 0
                AND id >= (CEIL(RAND() * (id_max - id_min)) + id_min)
                AND id <= id_max
                AND IF(blocked>0, tags LIKE '%,blocked,%', tags NOT LIKE '%,blocked,%')
                LIMIT 1;
        IF( user_ip IS NOT NULL) THEN
            UPDATE ip_pool SET uid = user_id, `release` = UNIX_TIMESTAMP() + 3600
                WHERE id = ip_id AND uid = 0;
            SELECT ROW_COUNT() INTO row_cnt;
            IF( row_cnt > 0 ) THEN RETURN user_ip; END IF;
            SET tries = tries - 5;
        END IF;
        SET tries = tries - 1;
    END WHILE;

END$$
DELIMITER ;

После тестов, появилась фигня не большая.

Когда юзер в статусе on.  COA  Посылает дисконект, и следом изменения скорости. COA перестал реагировать на статус off и отрубает включенного пользователя.

Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #46 : 02 Марта 2018, 01:07:32 »

 Зачем тебе дисконнектить клиента? Он сам отрубится если захочет. Не делай в $coa_disconnect дисконнект, делай удаление правил в оборудовании
Записан
warzoni
NoDeny
Пользователь
*

Карма: 1
Offline Offline

Сообщений: 83


Просмотр профиля
« Ответ #47 : 02 Марта 2018, 10:07:52 »

Зачем тебе дисконнектить клиента? Он сам отрубится если захочет. Не делай в $coa_disconnect дисконнект, делай удаление правил в оборудовании

Я попробую. не хотелось городить на nas скрипт по выборке клиентов. что бы их отключать. Когда есть coa_disconnect - и он работает. и мог бы выполнять свои функции.

Просто у меня назначается новый айпи, и этот переходу между состояниями on - off - модуль теряется в передаче данных IP - так как назначается ip динамический.

и мы получаем такую ситуацию.

Клиент не отключается, и весит сессия. с его скоростью. а COA отправляет данные на новый IP - а если бы дисконект работал бы только когда клиент заблокирован, он бы перед сменой айпи отключал бы абонента.
Записан
warzoni
NoDeny
Пользователь
*

Карма: 1
Offline Offline

Сообщений: 83


Просмотр профиля
« Ответ #48 : 02 Марта 2018, 10:20:35 »

Зачем тебе дисконнектить клиента? Он сам отрубится если захочет. Не делай в $coa_disconnect дисконнект, делай удаление правил в оборудовании



Я попробую.
Записан
warzoni
NoDeny
Пользователь
*

Карма: 1
Offline Offline

Сообщений: 83


Просмотр профиля
« Ответ #49 : 02 Марта 2018, 11:03:11 »

А как передать в COA имя юзера ? хочу попробовать передать имя юзера, и по нему изменить ip когда состояния off
Записан
fet4
Старожил
****

Карма: 2
Offline Offline

Сообщений: 326


Просмотр профиля Email
« Ответ #50 : 02 Марта 2018, 11:26:00 »

По-моему по имени нельзя менять сессию по user-name используйте session id
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #51 : 02 Марта 2018, 12:55:11 »

По-моему по имени нельзя менять сессию по user-name используйте session id
Думаю да, потому что на имени может быть несколько сессий (не в данном случае, а в принципе)
Записан
warzoni
NoDeny
Пользователь
*

Карма: 1
Offline Offline

Сообщений: 83


Просмотр профиля
« Ответ #52 : 02 Марта 2018, 15:00:36 »

Efendy

Я постарался разобраться. диссконект отрублю нахер.

COA будет передавать унекальное значения через шейпер ну например. 168/359

Код:
 ifname | username | calling-sid |     ip     | rate-limit | type | comp | state  |  uptime
--------+----------+-------------+------------+------------+------+------+--------+----------
 ppp0   | test     | 10.1.6.252  | 172.1.1.52 | 168/359    | pptp | mppe | active | 00:00:13

Все хорошо прекрасно. Но вопрос теперь что бы удалить его не сильно криво, тут я так понимаю надо заюзать cli telnet + perl.

Искать интерфейсы  с значением 168/359 - и  отсоединять. Например раз в 5 минут

В cli есть поиск по совпадениям.

show sessions match rate-limit 168/359 - выдает скорость заблоченных

К ним надо применять команду

terminate if ppp0 soft - где ppp0 - это интерфейс юзера.

----

Я поискал по форуму попытался найти образцы только у Warlock - было нечто востребовано.

Но для меня не подходит...

Efendy

Вы можете помочь создать, что бы делало поиск и отключало клиентов. я бы по тестировал. Я думаю это будет полезно в будещем тем кто захотят создать полу независимый NAS ( мать бы его так )

---

Ну или в место COA диссконект заюзать radstop -  может он правильно будет вырубать клиентов. мне все равно надо чем то их отключать, когда COA меняет значения, иначе, они будут веселиться   и радоваться что их не отрубили.





« Последнее редактирование: 02 Марта 2018, 15:28:25 от warzoni » Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #53 : 03 Марта 2018, 09:46:43 »

COA и нужен для того, чтобы не городить заходы телнетами или ссх.

Чтобы тебе получить на выходе, что ты хочешь, тебе на время нужно стать COA. Заходишь на устройство и выполняешь команды, которые нужны чтобы абону прописалась какая-то скорость. Записываешь на бумажке. Затем тебе нужно изменить скорость, что нужно сделать? А хз. Ой вернее тоже выполнить какие-то команды и записать их на бумажке.

Я не понимаю что там сложно. COA дает команды, устройство выполняет. Никого дисконнектить не нужно. Просто забудь об этом. Это запрещено женевской конвенцией. Просто подумай какие команды нужно выполнить чтобы изменить скорость клиента не киляя его
Записан
warzoni
NoDeny
Пользователь
*

Карма: 1
Offline Offline

Сообщений: 83


Просмотр профиля
« Ответ #54 : 03 Марта 2018, 11:12:54 »

COA и нужен для того, чтобы не городить заходы телнетами или ссх.

Чтобы тебе получить на выходе, что ты хочешь, тебе на время нужно стать COA. Заходишь на устройство и выполняешь команды, которые нужны чтобы абону прописалась какая-то скорость. Записываешь на бумажке. Затем тебе нужно изменить скорость, что нужно сделать? А хз. Ой вернее тоже выполнить какие-то команды и записать их на бумажке.

Я не понимаю что там сложно. COA дает команды, устройство выполняет. Никого дисконнектить не нужно. Просто забудь об этом. Это запрещено женевской конвенцией. Просто подумай какие команды нужно выполнить чтобы изменить скорость клиента не киляя его

Да все и работает как надо, просто когда юзера блокирует надо послать команду на отключения,  - Как отправить на nas команду стоп ( radius ) когда клиент переходить в статус блокированный ?

попробую так работать. пусть скрипт рубит.

Код:
#!/usr/bin/perl
use Control::CLI;
use Data::Dumper;
use Logger::Syslog;
use File::Basename;

logger_prefix(basename($0));
info("Starting at ".localtime());

my $hostname="127.0.0.1";
my $port="2000";
my $username='123';
my $password='12345';
my $cmd_1 = 'show sessions ifname,rate-limit';
my $cmd_2 = 'show sessions ifname,username,rate-limit match rate-limit 168/359';
my $cmd_3 = 'terminate if $iface soft ';

$cli = new Control::CLI('TELNET');
$cli->connect(Host      => $hostname,
              Port      => $port,);
$cli->login(Username    => $username,
            Password        => $password,);
my @arr = split("\n",$cli->cmd($cmd_2));
@arr = get_iface_array(\@arr);

foreach $elem (@arr) {
    my @in_array = @{$elem};
    my $iface = $in_array[0];
    info ("Delete iface: ".$iface." for username: ".$in_array[1]);
    $cli->cmd("terminate if ${iface} soft");
}


$cli->disconnect;
info("Stopped at ".localtime());

sub get_iface_array() {
        my @result;
        my @in_array = @{$_[0]};
        foreach $elem (@in_array) {
                @parts = ($elem =~ m/(ppp\d+)|([\d\/]+)/g);
                my @res;
                foreach $elem2 (@parts) {
                        if ($elem2 ne undef) {
                                push @res,$elem2;
                        }
                }
                if ($#res > 0) {
                        push @result, \@res;
                }
        }
        return @result;
}
Записан
Warlock
NoDeny
Старожил
*

Карма: 8
Offline Offline

Сообщений: 367


Просмотр профиля
« Ответ #55 : 03 Марта 2018, 12:09:03 »

Зачем себе так жизнь усложнять? Мне кажется, что вас пользователи пошлют туда подальше, если вы будете сессию рубить
Записан
warzoni
NoDeny
Пользователь
*

Карма: 1
Offline Offline

Сообщений: 83


Просмотр профиля
« Ответ #56 : 03 Марта 2018, 12:57:03 »

Зачем себе так жизнь усложнять? Мне кажется, что вас пользователи пошлют туда подальше, если вы будете сессию рубить

Сессия будет рубится только в случаи блокировки пользователя. А если разрешен, работай себе на здоровье.
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #57 : 03 Марта 2018, 14:03:30 »

Зачем себе так жизнь усложнять? Мне кажется, что вас пользователи пошлют туда подальше, если вы будете сессию рубить

Сессия будет рубится только в случаи блокировки пользователя. А если разрешен, работай себе на здоровье.
Зачем? Чтобы юзер бегал перегружал свой роутер, проклинал провайдера, стеснялся звонить спросить причину отсуствия интернета с последующим переходом к конкурентам?

Не надо никогда не давать создавать сессию! Это ваш канал связи с пользователем. Вы можете его переслать на страницу с сообщением "пополни счет в этом терминале или возьми кредит", абон может зайти на страницу и увидеть свой баланс, может оплатить через платежный сервис если в фаерволе открыть доступ только к "платежным ip". Все, что ты должен делать - это регулировать скорость и доступы
Записан
warzoni
NoDeny
Пользователь
*

Карма: 1
Offline Offline

Сообщений: 83


Просмотр профиля
« Ответ #58 : 03 Марта 2018, 16:21:34 »

Я Вас прекрасно понимаю. В nodeny все прекрасно работает. Но у меня обычные просьбы, при этом я как и все не хочу не куда лезть сильно, и малой кровью отделаться.

Нам это требуется, в данной схеме что мы делаем, значит это надо делать.. Вы не сделали nodeny plus под линукс, а нам надо под линукс, возможно тогда бы мы не задовали глупых вопросов, и

настроили все по мануалу, и NAS бы работал с фаерволом, и не надо было думать, и тестировать работу и прочию хрень тратить время и т п.

Но увы что имеем то имеем. Поэтому продолжаем дисскусию в духе ( пусть клиенты идут до конкурентов ))

Пока запустились,это конечно не финиш но уже что-то.  Улыбающийся

Efendy - с работой главное программиста - не часто говорить зачем.  Улыбающийся Обленишся быстро ))) Но это пока не к вам вы на высоте и стараетесь, это видно.
Записан
Warlock
NoDeny
Старожил
*

Карма: 8
Offline Offline

Сообщений: 367


Просмотр профиля
« Ответ #59 : 03 Марта 2018, 16:45:29 »

Ты вообще разобрался как работает модуль?
если вдруг нет, то попробую я.
в create.cfg.coa.cfg.pm есть такие параметры
$coa_connect__state_on - тут указываешь, что нужно послать, когда у пользователя все нормально и он только что подключился.
$coa_connect__state_off - тут указываешь, что нужно послать, когда пользователь заблокирован (нет тарифа или просто заблокирован) - и он только что подключился.
$coa_disconnect - тут указываешь, что нужно послать, когда пользователь УЖЕ подключен.
Расскажу как в моем случае работает $coa_disconnect. Когда пользователь подключен, у него деактивируются 2 профайла (т.к. мы не хотим разбираться, включен ему доступ или нет) а дальше уже в зависимости от его статуса активируется $coa_connect__state_on либо $coa_connect__state_off.
Записан
Страниц: 1 2 3 [4] 5 6
  Печать  
 
Перейти в:  

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