BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 29 мар 2024, 01:29

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 24 ] 
Автор Сообщение
 Заголовок сообщения: [7.0] TerminalServiceActivator
СообщениеДобавлено: 18 сен 2017, 16:19 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Добрый день!

Помогите найти ошибку. У меня, видимо, глаз замылился. Хочу управлять mikrotik через новый TerminalServiceActivator
sa.terminal.type=mikrotik стоит
конифгурация:
Цитата:
# V1.0
m_ipLoop=,${net()}
sa.terminal.set.ipService.serv.create.1=/queue/simple/remove\n=numbers="${contractId()}_${servId()}"
sa.terminal.set.ipService.serv.create.2=/queue/simple/add\n=name=${contractId()}_${servId()}\n=queue=ethernet-default/ethernet-default\n=target=127.0.0.1/32${loopServ(m_ipLoop, false, '')}
#
sa.terminal.set.ipService.serv.cancel.1=/queue/simple/remove\n=numbers="${contractId()}_${servId()}"
#
sa.terminal.set.ipService.serv.disable.1=/queue/simple/set\n=numbers="${contractId()}_${servId()}"\n=max-limit=64K/64K
#
sa.terminal.set.ipService.serv.inetOption.1.enable=/queue/simple/set\n=numbers="${contractId()}_${servId()}"\n=max-limit=${param(option(),'mkt_max_limit','64K/64K')}


Но, увы, получаю exception:
Цитата:
connection 09-18/15:14:36 ERROR [sa-p-13-t-60] AcknowledgeConsumer - Error on device:189 - java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
ru.bitel.bgbilling.common.BGException: Error on device:189 - java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:504)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTaskImpl(AsyncEventWorker.java:211)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.notify(AsyncEventWorker.java:201)
at ru.bitel.bgbilling.kernel.event.AcknowledgeConsumer.onMessage0(AcknowledgeConsumer.java:83)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTask(AsyncEventWorker.java:176)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.doTasks(AsyncEventWorker.java:109)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runWorker(ServiceActivatorDeviceWorker.java:246)
at ru.bitel.bgbilling.kernel.event.EventWorker.internalRunWorker(EventWorker.java:142)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runImpl(ServiceActivatorDeviceWorker.java:152)
at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:46)
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.invoke(TerminalServiceActivator.java:944)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator$TGroovyMacro.invoke(TerminalServiceActivator.java:231)
at ru.bitel.common.groovy.GroovyMacro$MacroMetaClassDelegate.invokeMethod(GroovyMacro.java:258)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
at Script2$_run_closure1.doCall(Script2.groovy:1)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
at ru.bitel.common.groovy.MetaClassDelegate.invokeMethod(MetaClassDelegate.java:107)
at ru.bitel.common.groovy.GroovyMacro$MacroMetaClassDelegate.invokeMethod(GroovyMacro.java:228)
at groovy.lang.Closure.call(Closure.java:414)
at ru.bitel.common.groovy.GroovyMacro.eval(GroovyMacro.java:200)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:672)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:650)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.serviceCancel(TerminalServiceActivator.java:1939)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.serviceModify(TerminalServiceActivator.java:1990)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorSet.serviceModify(ServiceActivatorSet.java:413)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doCommand(ServiceActivatorDeviceWorker.java:527)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:500)
... 17 more


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 18 сен 2017, 16:36 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Вставив пару сообщений в исходный код понял что, проблема возникает где в ${contractId()}, который он почему-то и где-то не может преобразовать в строку. Но где именно и почему?
Код:
bill: вер. 7.0.124 / 11.08.2017 16:04:07
  card: вер. 7.0.44 / 04.08.2017 17:34:18
  dialup: вер. 7.0.321 / 04.08.2017 17:33:58
  email: вер. 7.0.182 / 04.08.2017 17:34:39
  inet: вер. 7.0.772 / 05.09.2017 19:44:59
  ipn: вер. 7.0.270 / 08.08.2017 15:43:59
  mps: вер. 7.0.221 / 11.09.2017 16:42:32
  npay: вер. 7.0.210 / 07.08.2017 03:07:28
  phone: вер. 7.0.293 / 04.08.2017 17:34:56
  reports: вер. 7.0.236 / 04.09.2017 14:32:37
  ru.bitel.bgbilling.plugins.documents: вер. 7.0.178 / 08.08.2017 15:44:22
  ru.bitel.bgbilling.plugins.organizer: вер. 7.0.75 / 05.10.2016 13:43:02
  voiceip: вер. 7.0.196 / 04.08.2017 17:33:59


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 18 сен 2017, 17:39 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
В обще решил пойти последовательно. Убрал пока вообще все макросы, просто использую статические строки. И наткнулся на странную проблему - TerminalServiceActivator не хочет соединяться с mikrotik. Пишет
Код:
connection 09-18/16:27:19 ERROR [sa-p-13-t-96] TerminalServiceActivator - Can't connect to Mikrotik: RB3011
[X.X.X.125:8728] to X.X.X.125:8728. Check host/port, username/password and sa.endSequence (command prompt)


Меняю на MikrotikServiceActivator - и тут же все прекрасно начинает работать.
Что может быть не так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 18 сен 2017, 20:53 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Так, одну проблему нашел. В TerminalSession::newTerminalSession забыты break; в ветках case. Разработчики, пофиксите плиз в коде. заодно я бы написал type.toLowerCase(), а то вдруг кто-нибудь решить написать Telnet или SSH и тоже будет долго мучаться почему не работает

Код:
      switch( type )
      {
         case "ssh":
            result = new SshTerminalSession( host, port );

         case "shell":
            result = new ExecTerminalSession();

         case "tcp":
            result = new TcpTerminalSession( host, port );
            
         case "mikrotik":
            result = new MikrotikTerminalSession( host, port );

         case "telnet":
         default:
            result = new TelnetTerminalSession( host, port );
      }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 18 сен 2017, 21:01 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
А вот дальше всё же жду помощи, потому что такие команды выполняются на ура и на mikrotik создаются нужные очереди
Код:
sa.terminal.set.ipService.serv.create.1=/queue/simple/add\n=name=555\n=queue=ethernet-default/ethernet-default\n=target=127.0.0.1/32
sa.terminal.set.ipService.serv.cancel.1=/queue/simple/remove\n=numbers=555


А вот такие
Код:
sa.terminal.set.ipService.serv.create.1=/queue/simple/add\n=name=${contractId()}\n=queue=ethernet-default/ethernet-default\n=target=127.0.0.1/32
sa.terminal.set.ipService.serv.cancel.1=/queue/simple/remove\n=numbers=${contractId()}

уже приводят к Exception
Код:
connection 09-18/19:59:06 ERROR [sa-p-13-t-39] EventWorker - Error on device:189 - java.lang.NullPointerException
ru.bitel.bgbilling.common.BGException: Error on device:189 - java.lang.NullPointerException
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:504)
        at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTaskImpl(AsyncEventWorker.java:211)
        at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTask(AsyncEventWorker.java:183)
        at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.doTasks(AsyncEventWorker.java:109)
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runWorker(ServiceActivatorDeviceWorker.java:246)
        at ru.bitel.bgbilling.kernel.event.EventWorker.internalRunWorker(EventWorker.java:142)
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runImpl(ServiceActivatorDeviceWorker.java:152)
        at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)
        at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:46)
Caused by: java.lang.NullPointerException
        at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.invoke(TerminalServiceActivator.java:1176)
        at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator$TGroovyMacro.invoke(TerminalServiceActivator.java:231)
        at ru.bitel.common.groovy.GroovyMacro$MacroMetaClassDelegate.invokeMethod(GroovyMacro.java:233)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:158)
        at Script2$_run_closure1.doCall(Script2.groovy:1)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
        at ru.bitel.common.groovy.MetaClassDelegate.invokeMethod(MetaClassDelegate.java:107)
        at ru.bitel.common.groovy.GroovyMacro$MacroMetaClassDelegate.invokeMethod(GroovyMacro.java:228)
        at groovy.lang.Closure.call(Closure.java:414)
        at ru.bitel.common.groovy.GroovyMacro.eval(GroovyMacro.java:200)
        at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:672)
        at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:651)
        at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.serviceCreate(TerminalServiceActivator.java:1929)
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorSet.serviceCreate(ServiceActivatorSet.java:386)
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doCommand(ServiceActivatorDeviceWorker.java:564)
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:500)
        ... 15 more


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 18 сен 2017, 21:45 
Не в сети
Клиент

Зарегистрирован: 30 авг 2013, 03:37
Сообщения: 183
Карма: 12
А у меня вот так работает:
sa.command.serv.enable.9=/ip/dhcp-server/lease/add\n=address=$ip\n=mac-address=$mac\n=server=$ipParam(DHCP)\n=comment=$contractTitle
sa.command.serv.disable.3=/ip/firewall/address-list/add\n=address=$ip\n=list={@name_al}\n=comment=$contractTitle

Правда через MikrotikServiceActivator, возможно в TerminalServiceActivator перестали работать с Микротиком, все в отдельный динкод пошло!

_________________
BGBilling 7.1.xxxx+BGCRM, update от ВЧЕРА, Ubuntu 17.04 64bit, JAVA 1.8.xxxx


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 18 сен 2017, 21:49 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Смотрим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 18 сен 2017, 22:09 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Arcad77 писал(а):
А у меня вот так работает:

Правда через MikrotikServiceActivator, возможно в TerminalServiceActivator перестали работать с Микротиком, все в отдельный динкод пошло!


В TerminalServiceActivator стали использовать Groovy Macros, но что-то пошло не так :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 19 сен 2017, 19:21 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Выложили обновление (ядра и TerminalServiceActivator).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 20 сен 2017, 00:03 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Спасибо, завтра обновлюсь


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 20 сен 2017, 14:21 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Уже лучше. Но вот для такой конструкции
Код:
sa.terminal.set.ipService.serv.cancel.1=/queue/simple/remove\n=numbers="${contractId()}"


бросает Exception что не может cast java.lang.Integer to java.lang.String


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 20 сен 2017, 14:32 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Еще не воспринимает вот такую вот конструкцию:
Код:
sa.terminal.set.ipService.serv.create.1=/queue/simple/add\n=name=${contractId()}_${servId()}\n=queue=ethernet-default/ethernet-default\n=target=127.0.0.1/32${loopServ(m_ipLoop, false, '')}


Цитата:
connection 09-20/13:29:04 ERROR [sa-p-13-t-92] AcknowledgeConsumer - Error on device:189 - org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during canonicalization: Constant expression type [boolean] is not allowed

java.lang.SecurityException: Constant expression type [boolean] is not allowed
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitConstantExpression(SecureASTCustomizer.java:1004)
at org.codehaus.groovy.ast.expr.ConstantExpression.visit(ConstantExpression.java:83)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitListOfExpressions(SecureASTCustomizer.java:1038)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitTupleExpression(SecureASTCustomizer.java:927)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitArgumentlistExpression(SecureASTCustomizer.java:1092)
at org.codehaus.groovy.ast.expr.ArgumentListExpression.visit(ArgumentListExpression.java:76)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitMethodCallExpression(SecureASTCustomizer.java:864)
at org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:66)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitListOfExpressions(SecureASTCustomizer.java:1038)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitGStringExpression(SecureASTCustomizer.java:1046)
at org.codehaus.groovy.ast.expr.GStringExpression.visit(GStringExpression.java:52)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitExpressionStatement(SecureASTCustomizer.java:779)
at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitBlockStatement(SecureASTCustomizer.java:739)
at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitClosureExpression(SecureASTCustomizer.java:922)
at org.codehaus.groovy.ast.expr.ClosureExpression.visit(ClosureExpression.java:45)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitBinaryExpression(SecureASTCustomizer.java:899)
at org.codehaus.groovy.ast.expr.BinaryExpression.visit(BinaryExpression.java:51)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitExpressionStatement(SecureASTCustomizer.java:779)
at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer$SecuringCodeVisitor.visitBlockStatement(SecureASTCustomizer.java:739)
at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71)
at org.codehaus.groovy.control.customizers.SecureASTCustomizer.call(SecureASTCustomizer.java:554)
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1065)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at groovy.lang.GroovyShell.parse(GroovyShell.java:736)
at groovy.lang.GroovyShell.parse(GroovyShell.java:727)
at ru.bitel.common.groovy.GroovyMacro.parse(GroovyMacro.java:290)
at ru.bitel.common.groovy.GroovyMacro.lambda$eval$0(GroovyMacro.java:191)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
at ru.bitel.common.groovy.GroovyMacro.eval(GroovyMacro.java:191)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:672)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:650)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.serviceCreate(TerminalServiceActivator.java:1929)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorSet.serviceCreate(ServiceActivatorSet.java:386)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doCommand(ServiceActivatorDeviceWorker.java:564)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:500)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTaskImpl(AsyncEventWorker.java:211)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.notify(AsyncEventWorker.java:201)
at ru.bitel.bgbilling.kernel.event.AcknowledgeConsumer.onMessage0(AcknowledgeConsumer.java:83)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTask(AsyncEventWorker.java:176)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.doTasks(AsyncEventWorker.java:109)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runWorker(ServiceActivatorDeviceWorker.java:246)
at ru.bitel.bgbilling.kernel.event.EventWorker.internalRunWorker(EventWorker.java:142)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runImpl(ServiceActivatorDeviceWorker.java:152)
at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:46)

1 error


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 20 сен 2017, 17:39 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
sa.terminal.set.ipService.serv.cancel.1=/queue/simple/remove\n=numbers="${contractId()}"
Может где-то по другому указано, с еще одним $, например ${$contractId()} ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 20 сен 2017, 17:47 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Повторили, смотрим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 20 сен 2017, 19:23 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Выложили обновление ядра, кавычки не правильно обрабатывались.

Также в последнем макросе нужно указывать имя параметра в апострофах:
${loopServ('m_ipLoop', false, '')}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 21 сен 2017, 12:23 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Всё лучше и лучше :) Теперь вопрос про опции. Сделано так:
Код:
sa.terminal.set.ipService.serv.inetOption.1.enable=/queue/simple/set\n=numbers=${contractId()}_${servId()}\n=max-limit=${param(option(),'mkt_max_limit','64K/64K')}


Меняю опцию, вижу такие события:
Код:
mq 09-21/11:15:52  INFO [event-proc-p-2-t-1] InetServRuntimeMap - Caught event: Event[ru.bitel.bgbilling.modules.inet
.api.server.event.InetServModifiedEvent] moduleId: 14; pluginId: no; cid: 2; scid: -1; userId: 2; timestamp: 15059745
52809
mq 09-21/11:15:52  INFO [event-proc-p-2-t-1] InetServRuntimeMap - Reload InetServRuntime: 1800
mq 09-21/11:15:52  INFO [event-proc-p-2-t-1] InetServRuntimeMap - Removing InetServRuntime: 1800
mq 09-21/11:15:52  INFO [event-proc-p-2-t-1] InetServRuntimeMap - Adding InetServRuntime: 1800
mq 09-21/11:15:52  INFO [event-proc-p-2-t-1] InetServRuntimeMap - ContractId: 2; status: 0; servId: 1800
        3844:SNR-S2960-24G: 00030F25FCC0 [172.16.3.1]:7
        Options [34:01.09.2017-01.01.1970; ] TariffModuleTreeSet [61:01.09.2009-…; ]
        Device state: 1; optionSet:10,29
connection 09-21/11:15:52  INFO [sa-p-13-t-79] ServiceActivatorDeviceWorker - Do task deviceId: 189; Event[ru.bitel.b
gbilling.modules.inet.access.sa.event.InetSaServModifyEvent] moduleId: 14; pluginId: no; cid: 2; scid: -1; userId: -1
; oldInetServ: 3844:SNR-S2960-24G: 00030F25FCC0 [172.16.3.1]:7; newInetServ: 3844:SNR-S2960-24G: 00030F25FCC0 [172.16.3.1]:7; newInetServState: 1; newInetServOptionList: InetServOption [serviceId:1800; optionId:34; 01.09.2017-…]; timestamp: 1505974552812
connection 09-21/11:15:52  INFO [sa-p-13-t-79] InetApplication - contract tariffOptions: {}
connection 09-21/11:15:52  INFO [sa-p-13-t-79] InetApplication - OptionSet: [34]
connection 09-21/11:15:52  INFO [sa-p-13-t-79] ServiceActivatorDeviceWorker - Command result event: ServiceActivatorEvent type=2; inetServId: 1800; call: false; oldState: 1; newState: 1; oldOptionSet: 10,29; newOptionSet: 34
connection 09-21/11:15:52  INFO [sa-p-13-t-79] ServiceActivatorDeviceWorker - Processing deviceId:189; command ServiceActivatorEvent type=2; inetServId: 1800; call: false; oldState: 1; newState: 1; oldOptionSet: 10,29; newOptionSet: 34
connection 09-21/11:15:52  INFO [sa-p-13-t-79] ServiceActivatorSet - Invoking serviceModify
connection 09-21/11:15:52  INFO [sa-p-13-t-79] TerminalServiceActivator - serviceModify
connection 09-21/11:15:52  INFO [sa-p-13-t-79] TerminalServiceActivator - switchOptions
connection 09-21/11:15:52  INFO [sa-p-13-t-79] ServiceActivatorDeviceWorker - Process event type[2] result=true
connection 09-21/11:15:52  INFO [sa-p-13-t-79] ServiceActivatorDeviceWorker - Changing InetServ:1800 state and/or options
mq 09-21/11:15:52  INFO [event-proc-p-2-t-1] InetServRuntimeMap - Caught event: Event[ru.bitel.bgbilling.modules.inet.access.event.InetServDeviceStateAndOptionsModifiedEvent] moduleId: 14; pluginId: no; cid: global; scid: -1; userId: -1; deviceId: 189; inetServId: 1800; state: -1000; optionSet: 34; timestamp: 1505974552816


Опция ID == 34 является потомком опции ID == 1. Но почему-то команды для установки опции не выполняются. Да,
sa.terminal.set.ipService.serv.modify у меня пустой, но ведь раньше, с MikrotikServiceActivator всё это работало? Тут как-то изменилась логика? Как сейчас правильно делать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 25 сен 2017, 18:06 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Упустил последнее сообщение. Выложили обновление TerminalServiceActivator.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 28 сен 2017, 14:30 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Спасибо. Продолжаем дальше :)
Еще раз напоминаю мою конфигурацию:
Код:
m_ipLoop=,${net()}
sa.terminal.set.ipService.serv.create.1=/queue/simple/add\n=name=${contractId()}_${servId()}\n=queue=ethernet-default/ethernet-default\n=target=127.0.0.1/32${loopServ('m_ipLoop', false, '')}\n=max-limit=${param(option(),'mkt_max_limit','64K/64K')}
sa.terminal.set.ipService.serv.cancel.1=/queue/simple/remove\n=numbers=${contractId()}_${servId()}
sa.terminal.set.ipService.serv.inetOption.1.enable=/queue/simple/set\n=numbers=${contractId()}_${servId()}\n=maxlimit=${param(option(),'mkt_max_limit','64K/64K')}


Создаю основной сервис - всё создаётся хорошо:
Цитата:
connection 09-28/13:18:53 INFO [sa-p-13-t-50] TerminalServiceActivator - Connected to Mikrotik: RB3011-GGM-TAGNET [x.x.29.125:8728]
connection 09-28/13:18:53 INFO [sa-p-13-t-50] TerminalServiceActivator - [Mikrotik: RB3011-GGM-TAGNET [x.x.29.125:8728]] execute: /queue/simple/add
=name=2_1822
=queue=ethernet-default/ethernet-default
=target=127.0.0.1/32
=max-limit=50M/50M
connection 09-28/13:18:53 INFO [sa-p-13-t-50] TerminalServiceActivator -
!done
=ret=*21
connection 09-28/13:18:53 INFO [sa-p-13-t-50] TerminalServiceActivator - optionsEnable
connection 09-28/13:18:53 INFO [sa-p-13-t-50] TerminalServiceActivator - switchOptions
connection 09-28/13:18:53 INFO [sa-p-13-t-50] TerminalServiceActivator - [Mikrotik: RB3011-GGM-TAGNET [x.x.29.125:8728]] execute: /queue/simple/set
=numbers=2_1822
=max-limit=50M/50M
connection 09-28/13:18:53 INFO [sa-p-13-t-50] TerminalServiceActivator -
!done


Теперь добавляю дочерний сервис, в этом дочернем сервисе только ip. Получаю:
Цитата:
connection 09-28/13:19:51 INFO [sa-p-13-t-41] TerminalServiceActivator - Connected to Mikrotik: RB3011-GGM-TAGNET [x.x.29.125:8728]
connection 09-28/13:19:51 INFO [sa-p-13-t-41] TerminalServiceActivator - [Mikrotik: RB3011-GGM-TAGNET [x.x.29.125:8728]] execute: /queue/simple/remove
=numbers=2_1822
connection 09-28/13:19:51 INFO [sa-p-13-t-41] TerminalServiceActivator -
!done
connection 09-28/13:19:51 ERROR [sa-p-13-t-41] AcknowledgeConsumer - Error on device:189 - java.lang.NullPointerException
ru.bitel.bgbilling.common.BGException: Error on device:189 - java.lang.NullPointerException
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:504)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTaskImpl(AsyncEventWorker.java:211)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.notify(AsyncEventWorker.java:201)
at ru.bitel.bgbilling.kernel.event.AcknowledgeConsumer.onMessage0(AcknowledgeConsumer.java:83)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTask(AsyncEventWorker.java:176)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.doTasks(AsyncEventWorker.java:109)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runWorker(ServiceActivatorDeviceWorker.java:246)
at ru.bitel.bgbilling.kernel.event.EventWorker.internalRunWorker(EventWorker.java:142)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runImpl(ServiceActivatorDeviceWorker.java:152)
at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:46)
Caused by: java.lang.NullPointerException
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.invoke(TerminalServiceActivator.java:1066)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator$TGroovyMacro.invoke(TerminalServiceActivator.java:231)
at ru.bitel.common.groovy.GroovyMacro$MacroMetaClassDelegate.invokeMethod(GroovyMacro.java:233)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:158)
at Script1$_run_closure1.doCall(Script1.groovy:1)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
at ru.bitel.common.groovy.MetaClassDelegate.invokeMethod(MetaClassDelegate.java:107)
at ru.bitel.common.groovy.GroovyMacro$MacroMetaClassDelegate.invokeMethod(GroovyMacro.java:228)
at groovy.lang.Closure.call(Closure.java:414)
at ru.bitel.common.groovy.GroovyMacro.eval(GroovyMacro.java:200)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:673)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:651)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.serviceCreate(TerminalServiceActivator.java:1930)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.serviceModify(TerminalServiceActivator.java:1992)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorSet.serviceModify(ServiceActivatorSet.java:413)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doCommand(ServiceActivatorDeviceWorker.java:527)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:500)
... 17 more
connection 09-28/13:19:51 INFO [sa-p-13-t-41] ServiceActivatorSet - Disconnecting from device
connection 09-28/13:19:51 INFO [sa-p-13-t-41] TerminalSession$TelnetTerminalSession - sendCommand: exit
connection 09-28/13:19:51 INFO [sa-p-13-t-41] ServiceActivatorDeviceWorker - Execution error - waiting 60000ms for next try.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 28 сен 2017, 17:11 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Это вся текущая конфигурация?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 28 сен 2017, 18:37 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Выложили обновление ядра, была проблема во вложенных вызовах loopServ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 03 окт 2017, 21:43 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Великолепно! Спасибо!

Остался один ньюанс - loopServ не учитывает периоды активности дочерних сервисов. Можно всё же сделать чтобы учитывал? Я пока реализовал так:
Код:
                                else if( "loopServ".equals( macros ) )
                                {
                                        String macr = AbstractTerminalServiceActivator.this.config.get( getString( args, 0, "n_2356" ), null );
                                        if( Utils.isEmptyString( macr ) )
                                        {
                                                return "";
                                        }
                                       
                                        boolean needParent = Utils.parseBoolean( getString( args, 1, "false" ) );
                                        boolean exec = Utils.parseBoolean( getString( args, 2, "false" ) );
                                        Date    today = new Date();
                                       
                                        final InetServ serv = (InetServ)globalArgs[1];
                                       
                                        if( exec )
                                        {
                                                if( needParent )
                                                {
                                                        try
                                                        {
                                                                executeCommand0( macr, (ServiceActivatorEvent)globalArgs[0], serv, (InetConnection)globalArgs[2], (Set<Integer>)globalArgs[3] );
                                                        }
                                                        catch( Exception e )
                                                        {
                                                                throw new BGRuntimeException( e );
                                                        }
                                                }

                                                final List<InetServ> children = serv.getChildren();
                                                if( children != null && children.size() > 0 )
                                                {
                                                        for( InetServ child : children )
                                                        {
                                                                if(!TimeUtils.dateInRange(today, child.getDateFrom(), child.getDateTo()))
                                                                        continue;
                                                               
                                                                try
                                                                {
                                                                        executeCommand0( macr, (ServiceActivatorEvent)globalArgs[0], child, (InetConnection)globalArgs[2], (Set<Integer>)globalArgs[3] );
                                                                }
                                                                catch( Exception e )
                                                                {
                                                                        throw new BGRuntimeException( e );
                                                                }
                                                        }
                                                }
                                               
                                                return "";
                                        }
                                        else
                                        {
                                                StringBuilder sb = new StringBuilder();
                                               
                                                if( needParent )
                                                {
                                                        //getValue( (ServiceActivatorEvent)globalArgs[0], (InetServ)globalArgs[1], (InetConnection)globalArgs[2], (Set<Integer>)globalArgs[3], macros, args, globalArgs );
                                                        Object[] globalArgs2 = Arrays.copyOf( globalArgs, globalArgs.length );
                                                        globalArgs[1] = serv;

                                                        sb.append( this.format( macr, globalArgs ) );
                                                }

                                                final List<InetServ> children = serv.getChildren();
                                                if( children != null && children.size() > 0 )
                                                {
                                                        for( InetServ child : children )
                                                        {
                                                                if(!TimeUtils.dateInRange(today, child.getDateFrom(), child.getDateTo()))
                                                                        continue;

                                                                //getValue( (ServiceActivatorEvent)globalArgs[0], (InetServ)globalArgs[1], (InetConnection)globalArgs[2], (Set<Integer>)globalArgs[3], macros, args, globalArgs );
                                                                Object[] globalArgs2 = Arrays.copyOf( globalArgs, globalArgs.length );
                                                                globalArgs[1] = child;

                                                                sb.append( this.format( macr, globalArgs ) );
                                                        }
                                                }
                                               
                                                return sb.toString();
                                        }
                                }


Но вы как-то писали, что есть еще один ньюанс - система самостоятельно не отслеживает начало/конец периода. Но может быть можно это реализовать в задаче "активация/деактивация сервисов"?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 10 окт 2017, 10:18 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Идея не мила сердцам разработчиков? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 10 окт 2017, 21:43 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Не отслеживает начало/конец периода дочерних сервисов - да. Пока не выглядит просто - надо подумать.

Или отдельную задачу, которая должна будет запускаться только раз в день и отслеживать, что вчера/сегодня что-то в дочерних сервисах закрылось/открылось.
Или добавлять поддержку состояний для дочерних сервисов, что логичней, но сложнее. Вроде такое есть в модуле ТВ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.0] TerminalServiceActivator
СообщениеДобавлено: 10 окт 2017, 22:04 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Ну добавьте в свой волшебный TODO :) А то ведь нелогично. Выделяешь пользователю адреса, забираешь, а в шейперах или еще где - ничего не поменяется.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
POWERED_BY
Русская поддержка phpBB
[ Time : 0.114s | 66 Queries | GZIP : On ]