Название: Подсчет траффика, откуда выборка из базы Отправлено: tuneil от 27 Декабря 2010, 18:19:22 Доброго времени суток.
Волей судеб была необходимость сделать динамическую выдачу внешних адресов. Сделано. Но с недавнего времени возникла необходимость считать этот самы трафик и подсовывать клиентам. С помощью процедур заполняются x-таблицы, тоесть в разделе Траффик кабенета юзера трафик наличиствует. Но, на главной пользовательской странице (модуль Smain.pl) трафик все-равно по нулям. В связи с этим хотелось бы узнать, откуда берутся выборки для формирования значений подведеных красным. Биллинг официален и куплен за кровные. (http://img718.imageshack.us/img718/9027/iv23.png) Название: Re: Подсчет траффика, откуда выборка из базы Отправлено: 0xbad0c0d3 от 27 Декабря 2010, 18:55:33 Из таблицы users_trf
web/calls.pl Код: 966 sub GetClientTraf Название: Re: Подсчет траффика, откуда выборка из базы Отправлено: tuneil от 28 Декабря 2010, 10:49:53 Премного благодарен за ответ.
Название: Re: Подсчет траффика, откуда выборка из базы Отправлено: tuneil от 14 Февраля 2011, 10:03:58 На ваше обсуждение выложу тут свои наработки в плане подсчета трафика.
Входящий и исходящий направления подсчитываются с помощью radius аккаунтинга, с помощью процедур radupdate и radstop. accounting_update_query = "... ,'%{Acct-Input-Packets}','%{Acct-Output-Packets}')" Выглядит примерно это так: 1. Создается временная таблица, содержащая поточные даные аккаунтинга по каждому клиенту CREATE TABLE temp_trf ( login VARCHAR (64), in_o BIGINT, out_o BIGINT, PRIMARY KEY (login) ); 2. Модифицируется процедура radupdate DROP PROCEDURE IF EXISTS `radupdate`; DELIMITER $$ CREATE PROCEDURE `radupdate` (IN login VARCHAR(64), IN stime VARCHAR (12), IN iccts VARCHAR(12), IN occts VARCHAR (12), ip_h VARCHAR(12)) BEGIN INSERT into dblogin (mid,act,time) VALUES ((SELECT id FROM users WHERE name=login LIMIT 1),47,unix_timestamp()); INSERT INTO temp_trf VALUES (login,iccts,occts) ON DUPLICATE KEY UPDATE in_o=iccts, out_o=occts; END$$ DELIMITER ; 3. Внедряется тригер, который и обрабатывает расчеты DROP TRIGGER IF EXISTS `update_trf`; DELIMITER ;; CREATE TRIGGER `update_trf` AFTER UPDATE ON `temp_trf` FOR EACH ROW BEGIN UPDATE users_trf SET in1 = `in1` + (NEW.in_o - OLD.in_o), out1 = `out1` + (NEW.out_o - OLD.out_o) WHERE uid = (SELECT id FROM users WHERE name= OLD.login LIMIT 1); END;; Сделано топорно, готов выслушать ваши идеи Единственное что меня смущает - производительность тригеров. Косяки: - если будет сбой в работе связки NAS(RADIUS+DB+MPD) сервера последняя сессия не будет учтена. - нагрузка??? Название: Re: Подсчет траффика, откуда выборка из базы Отправлено: 0xbad0c0d3 от 14 Февраля 2011, 10:12:57 А как же ведется контроль доступа? Подсчет трафа через аккаунтинг это само собой, а вот как быть с досупом. Например нет бабла на счете или учетка заблокирована.
Название: Re: Подсчет траффика, откуда выборка из базы Отправлено: tuneil от 14 Февраля 2011, 10:28:09 Клиенту назначается адрес из фейковой сети (таблица users поле ip)
Дальше проверка баланса в radreply: DROP PROCEDURE IF EXISTS `radreply`; DELIMITER $$ CREATE PROCEDURE `radreply` (IN login VARCHAR(64), IN mac VARCHAR(18), IN nas_ip VARCHAR(16)) BEGIN DECLARE usr_id INT; DECLARE usr_ip VARCHAR(16); DECLARE rate_limit INT; DECLARE rate_limit_out INT; DECLARE normal_burst INT; DECLARE normal_burst_out INT; DECLARE extended_burst INT; DECLARE extended_burst_out INT; DECLARE balance_ch INT; DECLARE lmbalance INT; SELECT id,balance,limit_balance INTO usr_id,balance_ch,lmbalance FROM users WHERE name=login; SELECT plans2.speed,plans2.speed_out INTO rate_limit,rate_limit_out from users,plans2 where users.name=login and users.paket=plans2.id ; IF balance_ch < lmbalance THEN SELECT ip INTO usr_ip FROM users WHERE name=login; END IF; INSERT into dblogin (mid,act,time) VALUES (usr_id,47,unix_timestamp()); INSERT INTO usession (login,ip,mac,nas_ip,status) VALUES (login,ip,mac,nas_ip,'START'); SET rate_limit=rate_limit*1024*1024; SET rate_limit_out=rate_limit_out*1024*1024; SET normal_burst=ROUND(rate_limit*3/16); SET normal_burst_out=ROUND(rate_limit_out*3/16); SET extended_burst=2*normal_burst; SET extended_burst_out=2*normal_burst_out; SELECT NULL,login,'Framed-IP-Address',usr_ip,'='; SELECT NULL,login,'Framed-IP-Netmask','255.255.255.255','='; SELECT NULL,login,'Framed-Protocol','PPP','='; SELECT NULL,login,'Simultaneous-Use','1',':='; IF (rate_limit>0) THEN SELECT usr_id as id,login,"mpd-limit" as Attribute,concat("out#1=all rate-limit ",rate_limit," ",normal_burst," ",extended_burst) as Value,"+=" as op; END IF; IF (rate_limit_out>0) THEN SELECT usr_id as id,login,"mpd-limit" as Attribute,concat("in#1=all rate-limit ",rate_limit_out," ",normal_burst_out," ",extended_burst_out) as Value,"+=" as op; END IF; END$$ DELIMITER; Соответственно РРРоЕ автризация доступна всегда, просто заблоченым юзерам выдается не маршрутизируемые айпи, с переадресацией на страницу, где сообщается об отсутствии денег или нарушении (спам,флуд,учасник ботнент) Опять же, я понимаю, что корифеи програмерства меня сейчас заплюют. Ах да, есть ещё внешний скрипт, чекает баланс каждые 5 минут по крону. Название: Re: Подсчет траффика, откуда выборка из базы Отправлено: tuneil от 14 Февраля 2011, 10:31:08 Есть ещё таблица usession, где собирается статистика по коннектам.
Ну и понятное дело модифицирован под неё Sseance.pl Прошу прощения ещё раз за свой "индийский код", конечно правильно было бы отдавать radius отлупом (reject), и все такое, но строгал на коленке, в продакшн не запускал. Название: Re: Подсчет траффика, откуда выборка из базы Отправлено: tuneil от 14 Февраля 2011, 10:49:12 Пока такая система работает в тестовом режиме около 3 месяцев (без аккаунтинга), обслуживает 150 юзеров.
Косяки, решение которых пока не внедрено: - Двойной логин под одной учеткой. Решение есть, но пока не внедрено. Название: Re: Подсчет траффика, откуда выборка из базы Отправлено: 0xbad0c0d3 от 14 Февраля 2011, 11:36:21 Так получается, что шлюз пропускает динамический диапазон всегда?
Название: Re: Подсчет траффика, откуда выборка из базы Отправлено: tuneil от 14 Февраля 2011, 16:41:44 На сервер доступа замаршрутизировано /26 внешних адресов. Адресация распределяется из пула mpd (в будущем sqlippool), маленькая проверка и клиенту выдается либо внешний либо фейковый адресс.
|