forum.bitel.ru
http://forum.bitel.ru/

Выполнение скрипта на Mikrotik по событию в биллинге
http://forum.bitel.ru/viewtopic.php?f=5&t=2196
Страница 1 из 3

Автор:  Chaos [ 16 апр 2009, 05:28 ]
Заголовок сообщения:  Выполнение скрипта на Mikrotik по событию в биллинге

Доброе время суток, уважаемые Гуру.
Имеется в процессе тестирования БГБ с модулем DialUP, Установленный на FreeBSD 6.4(кстати, запустился без проблем) и NAS Mikrotik 4.02 он же шлюз с внешним миром.
Так же имеется скрипт-наследие от предыдущего, не прошедшего тестирование, биллинга /usr/local/bin/mikrotik_rfw.sh, который умеет принять что-то для микротика, подцепится к нему по SSH и порулить им
Код:
#!/bin/sh
ssh admin-admin-bla-bla-bla@192.168.x.x "$*"

Суть задачи в следующем: как
1. Выполнить этот внешний скрипт из БГБ и
2. Передать этому скрипту некие параметры: к примеру UserID, GroupID, ID текущего тарифа, командную строку для микротика /ip firewall....мби какие-либо текстовые параметры договора?
3. Понятно, как вышеописанное привязать/выполнить при (событие модуля VPN=>Radius-аутентификация) входе юзера. Возможно ли аналогичные действия выполнить при выходе/потере юзера?
Заранее благодарен.
ЗЫ.Доки, Вики, форум рыл, толкового решения не встретил

Автор:  Администратор [ 16 апр 2009, 12:38 ]
Заголовок сообщения: 

События "Выход юзера" у нас нет пока. Что скрипт-то делает? Для сброса юзера например, можно вызывать скрипт..

Автор:  Chaos [ 16 апр 2009, 17:15 ]
Заголовок сообщения:  Re: Выполнение скрипта на Mikrotik по событию в биллинге

Chaos писал(а):
2. Передать этому скрипту некие параметры: к примеру UserID, GroupID, ID текущего тарифа, командную строку для микротика /ip firewall....мби какие-либо текстовые параметры договора?
Присвоенный IP еще бы крайне желательно.
Администратор писал(а):
События "Выход юзера" у нас нет пока.
А жаль, потому как резко сокращает функционал всей системы. Ведь это несколько строк кода. Может стоит добавить? К тому же, какой смысл регистрить событие "Вход", если нельзя зарегистрировать "Выход"?! Прямо полумера получается.
Администратор писал(а):
Что скрипт-то делает?
Общая идея такова: из БГБ передать при логон/логоф пользователей параметры внешнему скрипту, который передаст параметры микротишному скрипту. Тот в свою очередь раскидывает вновь залогинившихя, в зависимости от переданных параметров, на разные аплинки, режет им внешнюю скорость, ведет учет общей и израсходованной полосы всех аплинков и т.д. Но это потом... Сейчас нужно передать параметры юзера/договора в момент его логон/логоф.
Может у кого-то есть уже нечто подобное реализовано другими методами? Было бы инетересно узнать.
Администратор писал(а):
Для сброса юзера например, можно вызывать скрипт..
По дропу зависших соединений имеете ввиду?

Автор:  Администратор [ 16 апр 2009, 17:21 ]
Заголовок сообщения: 

Цитата:
По дропу зависших соединений имеете ввиду?

Скорее активных, у которых деньги кончились или иная причина разрыва.

Автор:  Chaos [ 16 апр 2009, 17:48 ]
Заголовок сообщения: 

Событие перехода границы баланса встречал, про иные причины разрыва не понял.

Автор:  Администратор [ 17 апр 2009, 13:32 ]
Заголовок сообщения: 

Возможно использвание скрипта для разрыва соединения. В вашем случае это не подойдет, т.к. при добровольном выходе клиента он не будет работать. В обещем случае события "Завершение соединения" нет.

Автор:  Chaos [ 17 апр 2009, 14:43 ]
Заголовок сообщения: 

Понятно... давайте пока забъем на логоф, а остановимся на первых двух вопросах, разложив их:
1.1 Синтаксис получения вышеназванных переменных.
1.2. Синтаксис вызова внешнего скрипта.
1.3 Скармливание этих переменных внешнему скрипту.
Либо
2.1 Синтаксис получения вышеназванных переменных.
2.2 Синтаксис работы с SSH-консолью с подстановкой IP , логина, пароля микротика.
2.3 Скармливание этих переменных консоли.
Что-то вроде того, что описано здесь http://www.bgbilling.ru/v4.5/doc/ch09s11s12.html но чтобы без использования модуля IPN
В целом биллинг очень понравился. Устрило бы даже возможность использования скрипта по расписанию, задачей которого бы было: просмотр активных соединений, занесение их списка в массив, сравнивание массива с массивом 1-3 часовой давности, параметры отсутствующих соединений посылать на МТ. В случае возможности решения этих задач расчитываем приобрести. Спасибо за поддержку.

Автор:  Администратор [ 17 апр 2009, 17:01 ]
Заголовок сообщения: 

Может проще событие логоф добавить? А то что-то грозный алгоритм выходит.. Только в WiKi опишите, как вы это применили. Для 4.6 на следующей недели мог бы сделать..

Автор:  Rionet [ 17 апр 2009, 19:13 ]
Заголовок сообщения: 

Поясню я тогда..)
задача очень проста - по событию логона или логоффа необходимо выполнить несколько арифметических и логических проверок и поместить абонента в некоторый ADRESS_LIST на NAS (в нашем случае Mikrotik).

даже если будет событие логофф, абсолютно не понятен синтаксис скрипта с помощью которого можно передать адрес абонента и имя списка NAS-у.

Пожалуйста, ткните носом в нужное место справки - вроде все прочитано, а как сделать непонятно..
алгоритм применения опишу после ответа, чтобы Вас не путать )

Автор:  snark [ 18 апр 2009, 18:50 ]
Заголовок сообщения: 

перечитал несколько раз и так и не понял зачем нужно событие логаута ...

Автор:  Chaos [ 18 апр 2009, 19:20 ]
Заголовок сообщения: 

Для учета микротиком израсходованной полосы каждого аплика. Пожалуйста, просто покажите, как вызвать внешний скрипт из скриптов поведения , передав ему переменные в качестве параметров. Либо как работать с SSH из скриптов поведения. Как получить переменные договора, вызвавшего этот скрипт. В случае успешной реализации задуманного мы готовы разместить описание реализованного в вики.

Автор:  Администратор [ 20 апр 2009, 12:35 ]
Заголовок сообщения: 

Цитата:
Пожалуйста, просто покажите, как вызвать внешний скрипт из скриптов поведения , передав ему переменные в качестве параметров.

http://www.google.ru/search?q=java+exec ... al+program
Runtime.getRuntime().exec( .... );

Только учитывайте, что порождение процессов ОС на каждое действие негативно скажется на скорости.

Цитата:
Либо как работать с SSH из скриптов поведения.


SSHSession, см. примеры тут например: http://wiki.bgbilling.ru/index.php/%D0% ... _BeanShell

Цитата:
Как получить переменные договора, вызвавшего этот скрипт.

Класс работы с праметрами договора (если это имелось в виду.)
http://www.bgbilling.ru/v4.5/javadoc/bi ... Utils.html

Автор:  snark [ 20 апр 2009, 13:14 ]
Заголовок сообщения: 

Chaos писал(а):
Для учета микротиком израсходованной полосы каждого аплика.

т.е. чтобы учесть какую полосу израсходовал пользователь в период своего сидения в инете?

Автор:  Rionet [ 20 апр 2009, 14:19 ]
Заголовок сообщения: 

2 Администратор
Спасибо, будем пробовать!

2 Shark

Задача динамической балансировки нагрузки аплинков.

Имеется N аплинков, каждый полосой Pi.
Каждому аплинку сопоставляется список юзеров (адресов), которые на данный момент работают через него. (другие методы баллансировки не рассматриваются).
При подключении юзера, шлюзу передается его адрес и требуемая полоса. Шлюз выполняет расчет коэффициентов нагруженности каналов (как отношение суммарной полосы юзеров в списке канала к полосе канала) и добавляет адрес вновь прибывшего в список, соответствующий наименее нагруженному каналу. (и создает соответствующее правило ограничения скорости - фактически, выделяет полосу юзеру).
При отключении юзера производится его удаление из списка, т.е. освобождение полосы.

Можно также учитывать реальную нагрузку, которую создает пользователь в ЧНН, с помощью поправочного коэффициента к его полосе.

При падении любого канала производится распределение пользователей из его списка по другим каналам.

Метод предусматривает любые возможности для управления полосой юзеров (например, деление всей свободной полосы поровну между активными юзерами ночью - как делают спутниковые провайдеры для повышения коэффициента использования).

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

Автор:  Chaos [ 20 апр 2009, 14:34 ]
Заголовок сообщения: 

Мне остается только добавить, что с описанной позиции видно, как важность события логофа недооценена. Реализация бы намного упростилась при его наличии. Просьба к разработчикам: может стоит его добавить?!

Автор:  Chaos [ 22 апр 2009, 05:55 ]
Заголовок сообщения: 

Администратор писал(а):
Цитата:
Либо как работать с SSH из скриптов поведения.


SSHSession, см. примеры тут например: http://wiki.bgbilling.ru/index.php/%D0% ... _BeanShell

За намек еще раз благодарен, но только почему-то я не могу найти здесь http://www.bgbilling.ru/v4.5/javadoc/in ... Utils.html описания этого класса bitel.billing.server.util.ssh.*; и соответственно описания работы с ним. Решив, что его просто не добавили в документацию, решил поэксперемнтировать с простейшим куском
Код:
import java.util.*;
import java.util.regex.*;
import ru.bitel.bgbilling.common.*;
import bitel.billing.common.module.ipn.*;
import bitel.billing.server.ipn.bean.*;
import bitel.billing.server.dialup.bean.*;
import bitel.billing.server.util.ssh.*;
 
 
        host = ( "192.x.х.х" );
        port = ( "22" );
        login = ( "bla-bla" );
        pswd = ( "admin-admin" );
          try
      {           
      session = new SSHSessionExec( host, port, login, pswd );
      session.connect();
       {
       session.command( "ip firewall address-list print" );
      }
   }
   finally
   {
      if ( session != null )
      {
       session.disconnect();
      }
   }

Цель была простая: получить в логах Микротика инфу о входе пользователя bla-bla.
Вместо этого в логах выполнения скрипта получаю
Код:
GENERATE_TIME: 22.04.09 03:03:16
EXECUTION_STOP_TIME: 22.04.09 03:03:16
PROCESS_TIME: 33

OUT:


ERROR:


EXCEPTIONS:
Sourced file: Function [id:2; title:test] : Constructor error: Can't find constructor: bitel.billing.server.util.ssh.SSHSessionExec( java.lang.String, java.lang.String, java.lang.String, java.lang.String ) in class: bitel.billing.server.util.ssh.SSHSessionExecSourced file: Function [id:2; title:test] : Constructor error: Can't find constructor: bitel.billing.server.util.ssh.SSHSessionExec( java.lang.String, java.lang.String, java.lang.String, java.lang.String ) in class: bitel.billing.server.util.ssh.SSHSessionExec : at Line: 27 : in file: Function [id:2; title:test] : new SSHSessionExec ( host , port , login , pswd )

   at bsh.BSHAllocationExpression.constructObject(Unknown Source)
   at bsh.BSHAllocationExpression.objectAllocation(Unknown Source)
   at bsh.BSHAllocationExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHAssignment.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHTryStatement.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at ru.bitel.bgbilling.kernel.script.server.bean.ScriptInstance.eval(ScriptInstance.java:310)
   at bitel.billing.server.script.bean.ScriptMachine$SimpleScriptRunner.runScript(ScriptMachine.java:60)
   at bitel.billing.server.script.bean.ScriptMachine.runScript(ScriptMachine.java:128)
   at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:238)
   at bitel.billing.server.processor.DefaultProcessor.standartAuth(DefaultProcessor.java:204)
   at bitel.billing.server.processor.dialup.DialUpProcessor.authenticationProcess(DialUpProcessor.java:127)
   at bitel.billing.server.radius.RadiusRequestThread.processRequest(RadiusRequestThread.java:180)
   at bitel.billing.server.radius.RadiusRequestThread.run(RadiusRequestThread.java:79)
   at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
   at java.lang.Thread.run(Thread.java:619)
   at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40)


WARNINGS:

Подскажите, куда копать?

Автор:  stark [ 22 апр 2009, 20:19 ]
Заголовок сообщения: 

порт должен быть числом..без всяких кавычек

Автор:  Chaos [ 23 апр 2009, 04:14 ]
Заголовок сообщения: 

Теперь вот это
Код:
Contract ppuser123
GENERATE_TIME: 23.04.09 01:17:43
EXECUTION_STOP_TIME: 23.04.09 01:17:43
PROCESS_TIME: 90

OUT:


ERROR:


EXCEPTIONS:
Sourced file: Function [id:2; title:test] : Method Invocation session.disconnectSourced file: Function [id:2; title:test] : Method Invocation session.disconnect : at Line: 32 : in file: Function [id:2; title:test] : session .disconnect ( )

Target exception: java.lang.NoClassDefFoundError: com/jcraft/jsch/Session

        at bsh.BSHMethodInvocation.eval(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHBlock.evalBlock(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHIfStatement.eval(Unknown Source)
        at bsh.BSHBlock.evalBlock(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHTryStatement.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at ru.bitel.bgbilling.kernel.script.server.bean.ScriptInstance.eval(ScriptInstance.java:310)
        at bitel.billing.server.script.bean.ScriptMachine$SimpleScriptRunner.runScript(ScriptMachine.java:60)
        at bitel.billing.server.script.bean.ScriptMachine.runScript(ScriptMachine.java:128)
        at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:238)
        at bitel.billing.server.processor.DefaultProcessor.standartAuth(DefaultProcessor.java:204)
        at bitel.billing.server.processor.dialup.DialUpProcessor.authenticationProcess(DialUpProcessor.java:127)
        at bitel.billing.server.radius.RadiusRequestThread.processRequest(RadiusRequestThread.java:180)
        at bitel.billing.server.radius.RadiusRequestThread.run(RadiusRequestThread.java:79)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
        at java.lang.Thread.run(Thread.java:619)
        at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40)


WARNINGS:

PS. Может стоит выложить в доках описание класса и пример минимального кода для работы с ним? Очень нужно в сжатые сроки доработать, настроить, обкатать связку, заплатить Вам денюжек и запустить, чтоб само работало и юзеры разбрасывались на аплики по уму.

Автор:  Администратор [ 23 апр 2009, 11:40 ]
Заголовок сообщения: 

jsch.jar есть в BGBillingServer/lib? Под какой ОС сервер?

Автор:  stark [ 23 апр 2009, 12:31 ]
Заголовок сообщения: 

писание api выложил для 4.6..там правда нет коментариев к методам , но по названию понятно должно быть..У вас ругается в 32- строчке на то, что он не может нати jsch.jar - либо нет это бибюлиотеки либо если это виндовс и версия 4.5, то она не прописана в ini-файле

Автор:  Chaos [ 23 апр 2009, 14:08 ]
Заголовок сообщения: 

Библиотека /usr/local/bgbilling/BGBillingServer/lib/jsch.jar имеется, BGBillng версии 4.6, версия ява diablo-jre1.6.0, сервер FreeBSD 6.4, права на директории BGBillingServer, BGRadiusDialup - в режиме 775, установлены на все поддиректории рекурсивно.

Автор:  Администратор [ 24 апр 2009, 10:07 ]
Заголовок сообщения: 

Попробуйте эту либу снова выбрать из дистрибутива, может покрошилась. Обновление JRE последнее стоит?

Автор:  Chaos [ 25 апр 2009, 15:39 ]
Заголовок сообщения: 

Скачал BGBillingServer_4.6_434, тупо перезалил всю папку /lib, снес JRE, скачал с http://www.freebsdfoundation.org/downloads/java.shtml diablo-jdk-freebsd6.i386.1.6.0.07.02.tbz, поставил теперь точно все свежее, но изменений не произошло...Может серверу как-то абсолютный путь к либам скормить?

Автор:  stark [ 27 апр 2009, 17:06 ]
Заголовок сообщения: 

diablo .. у вас не sun-ская ява чтоли стоит ?

Автор:  Chaos [ 27 апр 2009, 17:34 ]
Заголовок сообщения: 

Ну...я как бы это обозначил четыремя постами ранее. Да и под фрей, насколько я распологаю инфой, диабло крайне рекомендована. Тем более. что там сказано
Цитата:
The official JRE and JDK binaries based on Sun's latest partner sources provide end-users and developers alike with confidence that they can use and create Java applications on FreeBSD with the same degree of portability, robustness and stability that they have come to expect from other supported operating systems. These binaries have been fully tested under Sun's compatibility test suite.

Вы считаете, что может здесь собака порылась? Чтож, буду искать методы прикручивания Sun-овской явы.

Автор:  Chaos [ 04 май 2009, 18:37 ]
Заголовок сообщения: 

В общем почти все срослось, поставил из портов /usr/ports/java/jdk16
только нужно после каждого изменения скрипта не забывать делать radius.sh flush_script_cache
Администратор писал(а):
Может проще событие логоф добавить? А то что-то грозный алгоритм выходит.. Только в WiKi опишите, как вы это применили. Для 4.6 на следующей недели мог бы сделать..

Сделайте пожалуйста, очень нужно.
Текущий вопрос в следующем: как получить IP залогиневшегося юзера?
при использовании
Код:
request = event.getRequest();
     ip = request.getStringAttribute(RadiusStandartAttributes.Framed_IP_Address)

переменной ip присвается значение null
Код:
05-04/01:48:41  INFO [processor-p-2-t-12] EventProcessor - Process event cid:2; event:Event bitel.billing.server.processor.event.RadiusAuthenticationEvent cid: 2; module: 1; type: 120
05-04/01:48:41  INFO [processor-p-2-t-12] script - Process time => 99
05-04/01:48:41  INFO [processor-p-2-t-12] script - UserName:ppuser123
mac:00:xx:xx:xx:xx:xx
ip:null

хотя в логе радиуса вроде все в порядке
Код:
05-04/01:48:41  INFO [processor-p-2-t-12] radius -  AUTH:
Type=AUTHENTICATION_REQUEST
Attributes:
   User-Name=ppuser123
   NAS-Identifier=MikroTik
   NAS-Port-Id=6_Lan
   NAS-IP-Address=192.168.8.1
   NAS-Port=390
   Service-Type=2
   Framed-Protocol=1
   Calling-Station-Id=00:xx:xx:xx:xx:xx
   NAS-Port-Type=15
   Called-Station-Id=pppoe_in
   MS-CHAP2-Response=t-Interim-Interval=60
   Service-Type=2
   Framed-Protocol=1
   Framed-IP-Address=192.168.9.20
   MS-MPPE-Send-Key=Ђ6
   NAS-Port-Type=15
   Called-Station-Id=pppoe_in
   MS-CHAP2-Response=·ДЌ4
   MS-MPPE-Recv-Key=Ђ:
   User-Name=ppuser123
   NAS-Identifier=MikroTik
   NAS-IP-Address=192.168.8.1
   NAS-Port=392
   Service-Type=2
   Framed-Protocol=1
   Framed-IP-Address=192.168.9.20
   Acct-Status-Type=1
   Acct-Delay-Time=0
   Acct-Session-Id=8190017c
   Acct-Authentic=1
   NAS-Port-Id=6_Lan
   Event-Timestamp=1241389059
   NAS-Port-Type=15
   Calling-Station-Id=00:xx:xx:xx:xx:xx
   Called-Station-Id=pppoe_in

Автор:  stark [ 04 май 2009, 19:55 ]
Заголовок сообщения: 

попробуйте получить getByteValue

Автор:  Chaos [ 05 май 2009, 02:39 ]
Заголовок сообщения: 

Не получается, сыпятся ошибки синтаксиса. Я так понимаю, сначала дожно произойти радиус-аксепт? как его правильно зафиксировать? Каков должен быть правильный синтаксис проверки аксепта и выполнения getValueByte?

Автор:  stark [ 05 май 2009, 13:09 ]
Заголовок сообщения: 

Chaos писал(а):
Не получается, сыпятся ошибки синтаксиса. Я так понимаю, сначала дожно произойти радиус-аксепт? как его правильно зафиксировать? Каков должен быть правильный синтаксис проверки аксепта и выполнения getValueByte?


вы как его получали и печатали и работали с ним ?

попробуйте так :

Код:
ip = request.getByteAttribute(RadiusStandartAttributes.Framed_IP_Address);
print("ip=");
if ( ip != null)
{
  for ( i =0; i < ip.length;i++)
  {
   print(ip[i]);
  }
  print("\n");
}

надо работаьть с ним как с массивом байтов и пробразовать его в строку можно как-то так :
IPUtils.convertIpToString( Utils.IuTol( Utils.convertBytesToInt( ip ) ) );

Автор:  Chaos [ 06 май 2009, 00:49 ]
Заголовок сообщения: 

Благодарен. Получилось вот так
Код:
   response = event.getResponse();
   ip = response.getIntAttribute(RadiusStandartAttributes.Framed_IP_Address);
   ipadr = Utils.convertIpToString( ip );
   print("ip=" + ipadr);
ИМХО на много проще, да и мороки нету с массивом. Только почему-то работает только в случае, если ip занесен/привязан в договоре. Можно конечно забить, но хотелось бы использоваться микротишные пулы. По событию логофа вопрос актуален. Что нужно для его решения?

Страница 1 из 3 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/