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

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

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« : 15 Января 2012, 21:10:08 »

Посмотрел я на noserver новой версии и решил, что он достаточно хорош, настолько, что было бы неплохо бекпортировать его на 50.32/33 версию.

В чем хорошесть? Главное:

1) код более понятен и не так запутан, т.е. проще модифицировать сторонним разработчикам
2) удобный режим отладки
3) модульная структура
4) введение таких сущностей как "задача" и "событие"

Подробнее.

Например. Вы пишите свой плагин, который оформляется как отдельный файл и подключается к noserver во время загрузки. Ваш модуль подписывается на событие "получание данных клиента". noserver вызывает соответсвующую подпрограмму, когда получит данные клиента. Допустим эта ваша подпрограмма посмотрела на звезды и решила уменьшить скорость на 40%, она берет и меняет эту скорость (так: $M->{user}{$uid}{speed_in1} *= 0.6; ). noserver видит, что данные клиента изменились и переподключает его, т.е удаляет и создает правила уже с новыми шейпами.

Естественно, ваша подпрограмма может вести учет использования канала конкретным клиентом и, например, если в течении 30 минут клиент выгребает в среднем  более 90% своей скорости - берет и прирезает его. Т.е возможностей для интеллектуального шейпа много. Главное, что это вынесено из noserver и нет необходимости держать в голове кучу глобальных переменных.

$M->{user} - это данных клиентов, которые в состоянии "включен". Ваш плагин может, вообще, запретить доступ в интернет в данный момент:

Код:
delete $M->{user}{$uid};

На данный момент в noserver реализованы шейпы в 4 направления. По умолчанию шейп действует на 1е направление, т.е. один шейп на весь трафик. Однако, плагином можно посмотреть в поле "скрипты" тарифного плана и если там закодировать скорости для остальных направлений, то всего одной строчкой клиент начнет шейпится и по ним.

Дебажить очень просто:
perl noserver.pl -v
или более детальный дебаг:
perl noserver.pl -vv

Код:
[0.030342: noserver.pl(12) nod.pm::new(95)]
Start. Flag -h for help

[0.044852: noserver.pl(12) nod.pm::new(100) Db.pm::new(37) Db.pm::connect(70)]
Connecting to DBI:mysql:database=bill;host=localhost;mysql_connect_timeout=5 : OK

[0.044944: noserver.pl(25)]
loading /usr/local/nodeny/noserver/nofire.pl...

[0.046463: noserver.pl(25)]
loading /usr/local/nodeny/noserver/shapes.pl...

[0.049258: noserver.pl(59) nod.pm::sleep(116) nod.pm::task_run(169) nod.pm(169) noserver.pl::load_nets(136) Db.pm::sql(160)]
SELECT SQL_BUFFER_RESULT * FROM nets WHERE priority>0 ORDER BY priority
Строк: 4. Время выполнения sql: 0.0003 сек

[0.049599: noserver.pl(59) nod.pm::sleep(116) nod.pm::task_run(169) nod.pm(169) noserver.pl::load_nets(146) nofire.pl::fw_net_add(147)]
Добавление в фаервол сети 10.0.0.0/8, пресет 0, направление 4

[0.049845: noserver.pl(59) nod.pm::sleep(116) nod.pm::task_run(169) nod.pm(169) noserver.pl::load_nets(146) nofire.pl::fw_net_add(147)]
Добавление в фаервол сети 192.168.0.0/16, пресет 0, направление 4

[0.050052: noserver.pl(59) nod.pm::sleep(116) nod.pm::task_run(169) nod.pm(169) noserver.pl::load_nets(146) nofire.pl::fw_net_add(147)]
Добавление в фаервол сети 203.211.129.0/27, пресет 0, направление 3

[0.050219: noserver.pl(59) nod.pm::sleep(116) nod.pm::task_run(169) nod.pm(169) noserver.pl::load_nets(146) nofire.pl::fw_net_add(147)]
Добавление в фаервол сети 0.0.0.0/0, пресет 0, направление 1

[0.050679: noserver.pl(59) nod.pm::sleep(116) nod.pm::task_run(169) nod.pm(169) noserver.pl::load_tarifs(122) Db.pm::sql(160)]
SELECT SQL_BUFFER_RESULT * FROM plans2
Строк: 50. Время выполнения sql: 0.0002 сек

В общем, надеюсь, я вас заинтриговал. Пока тестирую. Скоро выложу
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #1 : 15 Января 2012, 21:25:59 »

отлично, ждем Подмигивающий
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #2 : 15 Января 2012, 21:52:17 »

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

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #3 : 15 Января 2012, 22:32:54 »

А динамический шейпер в нем уже реализован?
что такое динамический шейп? как я его понимаю: изменение скорости в зависимости от ситуации. Ситуация - это загруженность канала/наглость клиента/время суток и т.д. По новой схеме это все и должно учитываться плагинами. Т.е мониторит плагин какой-то параметр, видит, что клиент наглеет - прирезает скорость. а может и не прирезает, если это ночь или канал не загружен.

Вот, на примере. В воскресенье вечером я вижу, что абонент на тарифе "неограниченный локальный трафик" запарил качать HD фильмы. Я лучше ваще заблочу ему доступ к локальным ресурсам. Да я г..дон, но другие клиенты будут чувствовать себя комфортно. Вот я и есть справедливый динамический шейпер. Ну по крайней мере для мелких сетей, которые вынуждены крутиться в ситуации "вроде бы нормальный канал, но уроды портят все". Вместо меня это спокойно может делать скрипт (плагин).
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #4 : 16 Января 2012, 12:15:12 »

В текущей реализации по умолчанию в билинге - т.е. в зависимости от общего трафика и времени.
Записан
stix
NoDeny
Спец
*

Карма: 72
Offline Offline

Сообщений: 1872


Nodeny Support Team

205539
Просмотр профиля
« Ответ #5 : 16 Января 2012, 12:41:46 »

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

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #6 : 16 Января 2012, 13:59:17 »

и кстати это будет работать только на сателлитах фряхи.
на микротиках динамический шейпер работать не будет
почему?
Записан
stix
NoDeny
Спец
*

Карма: 72
Offline Offline

Сообщений: 1872


Nodeny Support Team

205539
Просмотр профиля
« Ответ #7 : 16 Января 2012, 14:05:29 »

и кстати это будет работать только на сателлитах фряхи.
на микротиках динамический шейпер работать не будет
почему?
микротиковый сателлит дергает информацию из поля speed
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #8 : 16 Января 2012, 14:31:54 »

и кстати это будет работать только на сателлитах фряхи.
на микротиках динамический шейпер работать не будет
почему?
микротиковый сателлит дергает информацию из поля speed
а что есть запрет на изменение скрипта для микротика? нет ничего невозможного - все зависит от желания/денег и др. критериев. Если речь идет о радиусе, то он может запускать и скрипты и вообще можно подготавливать скорость в другом поле, специально сделать таблицу для этого
« Последнее редактирование: 16 Января 2012, 14:34:50 от Efendy » Записан
stix
NoDeny
Спец
*

Карма: 72
Offline Offline

Сообщений: 1872


Nodeny Support Team

205539
Просмотр профиля
« Ответ #9 : 16 Января 2012, 14:45:56 »

и кстати это будет работать только на сателлитах фряхи.
на микротиках динамический шейпер работать не будет
почему?
микротиковый сателлит дергает информацию из поля speed
а что есть запрет на изменение скрипта для микротика? нет ничего невозможного - все зависит от желания/денег и др. критериев. Если речь идет о радиусе, то он может запускать и скрипты и вообще можно подготавливать скорость в другом поле, специально сделать таблицу для этого
нене, это я человеку просто навсякий случай
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #10 : 16 Января 2012, 20:54:59 »

Дабы подогреть интерес, прикрепил пример модуля, который динамически шейпит по такому критерию:

если за определенный интервал времени клиент утилизирует больше x% скорости своего тарифа, то ему устанавливается скорость y% тарифной на время z.

Естественно, можно усложнить модуль и включать эту фичу, если утилизация всей сеткой канала в интернет составляет w%.

Если посмотреть на модуль, то мы видим, что, несмотря на усложненную логику шейпа по сравнению со стандартным, читается и понимается он легко (я надеюсь на это).

Походу несколько комментариев. Вычислить загрузку канала в интервал времени - это не тривиальная задача как может показаться, поскольку необходимо иметь данные по трафику за каждый срез времени. Например, клиент скачал 100 мб в первую минуту, потом 200 во 2ю, 300 в 3ю и 400 в 4ю. Если считать среднюю скорость за 2 минуты, то в первые 2 минуты он скачал 300 мб, с 2й минуты по 3ю: 500 мб, с 3й по 4ю: 700 мб.

Вот это в скрипте:

Код:
# Массив значений трафика в определенную единицу времени:
#   [ time1 , { uid1 => traf1, uid2 => traf2 } ],
#   [ time2 , { uid1 => traf1, uid2 => traf2 } ],
my $Traf = ();

с этим все понятно:
Код:
# Подпишемся на событие `получен трафик клиентов`
nod->event_add('load_usr_traf', \&load_usr_traf);

Подпрограмма load_usr_traf заполняет $Traf в каждый срез. Кроме того, вычисляет среднюю скорость за требуемый промежуток времени. Естественно, при старте $Traf пустой и заполняется постепенно, поэтому пока не соберутся данные за требуемый период времени - скорости клиентов не трогаем.

$Limits_end хранит время, когда уже можно перестать понижать скорость:

Код:
$Limits_end->{$uid} = $time_now + $limit_period;

Единственная проблема, с которой вы можете столкнуться так это многоуровневые хеши и массивы. Я раньше пытался избегать их, чтобы проще было разобраться, однако результат был обратным - кучи переменных разбросанных по коду. Здесь же мы имеем иерархию в одном объекте:

$M->{users} - данные клиентов
$M->{users}{15} - данные клиента с id = 15
$M->{users}{15}{ip} - ip клиента с id = 15

После тестов, выложу и сам noserver
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #11 : 17 Января 2012, 01:32:23 »

Прошу протестировать. В прикреплении (переименуйте в tar) такие файлы:

Debug.pm - модуль дебага
Db.pm - работа с БД
nod.pm - что-то типа nosat.pm в 50.32/33
noserver/nofire.pm - управление фаерволом ipfw
noserver/shapes.pm - плагин понижения скорости в зависимости от загрузки канала
sat.cfg - он есть и в 50.32/33, но внимание:

в нем есть дополнительные конфигурационные строки. Конфиг сателлита в БД больше не используется. Данные будут браться исключительно из sat.cfg

Также важно:

В настройках направлений, последним правилом должна быть сеть 0.0.0.0/0 для направления №1

Сначала запустите

Код:
perl noserver.pl -vv

или

Код:
perl noserver.pl -v

на экран будет выведено, что скрипт будет делать. В реальности правила выполнены только при

Код:
perl noserver.pl

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

Записан
stix
NoDeny
Спец
*

Карма: 72
Offline Offline

Сообщений: 1872


Nodeny Support Team

205539
Просмотр профиля
« Ответ #12 : 17 Января 2012, 07:17:26 »

оу супер, попробую как буду на работе
Записан
stix
NoDeny
Спец
*

Карма: 72
Offline Offline

Сообщений: 1872


Nodeny Support Team

205539
Просмотр профиля
« Ответ #13 : 17 Января 2012, 09:23:22 »

я так понимаю функциональная логика работы совершенно иная.
Записан
bnet
NoDeny
Пользователь
*

Карма: 6
Offline Offline

Сообщений: 85


Просмотр профиля
« Ответ #14 : 17 Января 2012, 16:14:02 »

дизайн крутой
Записан
Страниц: [1] 2 3 4
  Печать  
 
Перейти в:  

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