forum.bitel.ru http://forum.bitel.ru/ |
|
Вопросы про написания кода обработчика активации сервиса http://forum.bitel.ru/viewtopic.php?f=44&t=7234 |
Страница 1 из 1 |
Автор: | madmax [ 19 сен 2012, 21:58 ] |
Заголовок сообщения: | Вопросы про написания кода обработчика активации сервиса |
Есть несколько вопросов которые я не могу понять. Нужна ваша помощь. 1. при создании сервиса вызывается serviceCreate, при удалении serviceCancel. Всю логику удаления и добавления мы по wiki сделали в serviceModify. Но вот как при создании сервиса сделать чтобы отработало serviceModify. В примерах вики почему-то у всех логика правил serviceModify но как тогда выполняются команды при создании сервиса - по примерам вики получается сервис создают но команды никакие не отрабатывают, и если сервис удалить то также команды не отрабатывают. 2. Что означает return false; return true по wiki не понятна его логика. 3. В wiki имеются примеры, например http://wiki.bgbilling.ru/index.php/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_FreeBSD-%D1%88%D0%BB%D1%8E%D0%B7%D0%BE%D0%BC_%D0%BF%D0%BE_%D1%81%D1%85%D0%B5%D0%BC%D0%B5_VLAN-per-user_%D0%B8_%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_DHCP_option_82 и по нему непонятно почему в connectionClose( ServiceActivatorEvent serviceActivatorEvent1 ) поставили serviceActivatorEvent1 а в serviceCancel и других процедурах установили event. почему в connectionClose не написали event - это бы изменило всю логику работы скрипта. |
Автор: | borisk [ 19 сен 2012, 23:01 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
1. Я сделал общую функцию processEvent и вызываю её внутри serviceCreate/Modify/Cancel 2. Не могу ответить, самому непонятно и ни каких изменений в поведении я не нашел. Вот если exception кинуть - тогда да 3. Что именно изменит? Какая разница как вы назовете переменную, это ни на что, кроме удобочитаемости кода не влияет |
Автор: | madmax [ 19 сен 2012, 23:12 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
Вот ниже описываю что в моем случае получается что у меня общая функция serviceModify и при обращении к ней с serviceCreate все пашет но при обращении к ней с serviceCancel выходят ошибки На первый вопрос дополню. в servicemodify имеется проверка на три статуса Код: InetServ.STATE_ENABLE, InetServ.STATE_DELETED, InetServ.STATE_DISABLE. При создании сервиса отрабатывает serviceCreate но в коде этой процедуры указать Код: serviceModify(serviceActivatorEvent); то в коде serviceModify отрабатывает текущий статус сервиса указанный при создании. тут все понятно и все работает. Но вот если установить на созданном сервисе дату закрытия вчерашним числом, статус меняется верно меняется на удален и по логам отрабатывает serviceCancel но если указать в serviceCancel serviceModify(serviceActivatorEvent); то в логах появляется ошибка |
Автор: | madmax [ 19 сен 2012, 23:48 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
И еще непонятно как сделать чтобы тут не возникло проблем. Имеется сервис где нужно указывать статическую сеть, в договоре создается сервис в котором указывается блок адресов, далее передается команда serviceCreate со статусом Открыть, и на manad посылается команда такого типа table 1 add + ip тут все ОК. где адрес получается из Код: String ip = IpNet.toString(serv.getAddressFrom(), serv.getAddressTo() ); Но если зайти на сервис то можно изменить ip address, в итоге отрабатывает serviceModify со статусом Открыть и повторно посылается команда table 1 add + ip но только ip адрес уже другой. В итоге первый указанный адрес при создании сервиса не удаляется из таблицы manad а добавляется еще одна подсеть. Можно в скрипте сделать чтобы предварительно отрабатывала команда table 1 delete + ip, а затем table 1 add + ip но после изменения адреса скрипт уже не узнает какой был до этого адрес и удалит новую подсеть и добавит новую подсеть. И вот тут мы приехали первый указанный адрес завис в таблице manad. Пока я вижу решение только одно, перед тем чтобы что-то изменять нужно в начале перевести шлюз в состояние удален, внести изменения и снова открыть. Или как-то можно проще решить задачу. |
Автор: | borisk [ 20 сен 2012, 08:43 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
В serviceModify вы получаете два сервиса - старый (до модификации) и новый (после). А тут уж ваша воля - либо сделать "интеллектуальный" обработчик, либо просто как вы писали: delete старый и add новый. P.S. А вообще трудно о чем-то предметно говорить не видя вашего кода |
Автор: | madmax [ 20 сен 2012, 12:04 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
Спасибо вопрос закрыт. Осталось только понять почему в serviceCancel выходит ошибка, чтобы найти причину перенес код с serviceModify в serviceCancel вот код который в serviceCreate при serviceModify(serviceActivatorEvent); нормально отрабатывает. Но в serviceCancel выходит ошибки Код: @Override
public Object serviceModify( ServiceActivatorEvent serviceActivatorEvent ) throws Exception { Set<Integer> oldOptions = serviceActivatorEvent.getOldOptions(); Set<Integer> newOptions = serviceActivatorEvent.getNewOptions(); log.info( "oldState=" + serviceActivatorEvent.getOldState() + ";" + "newState=" + serviceActivatorEvent.getNewState() ); log.info( "oldOptions=" + oldOptions + ";" + "newOptions=" + newOptions ); log.info( "state!=state " + ( serviceActivatorEvent.getNewState() != serviceActivatorEvent.getOldState() ) ); InetServ oldserv = serviceActivatorEvent.getOldInetServ(); InetServ newserv = serviceActivatorEvent.getNewInetServ(); int state = serviceActivatorEvent.getNewState(); //int status = serviceActivatorEvent.getNewInetServ().getStatus(); //Вычисляем старую и новую подсеть String oldip = IpNet.toString(oldserv.getAddressFrom(), oldserv.getAddressTo() ); String newip = IpNet.toString(newserv.getAddressFrom(), newserv.getAddressTo() ); //Вычисляем адрес шлюза String gw = IPUtils.convertLongIpToString(IPUtils.convertStringIPtoLong(IpAddress.toString( newserv.getAddressFrom() )) + 1); //Вычисляем маску в формате 255.255.255.x int maskBit = IpNet.getMask(newserv.getAddressFrom(), newserv.getAddressTo() ); long mask = ( 0xFFFFFFFFl << ( 32 - Utils.parseInt( String.valueOf(maskBit), 0 ) ) ) & 0xFFFFFFFFl; String net_mask = IPUtils.convertLongIpToString( mask ); //Вычисляем старый и новый номер vlan String oldvlan = String.valueOf( oldserv.getVlan() ); String newvlan = String.valueOf( newserv.getVlan() ); log.info( "gw="+gw+",mask="+net_mask+",newvlan="+newvlan+",oldvlan="+oldvlan+",oldip="+oldip+",newip="+newip ); Boolean changed = false; if( !oldvlan.equals( newvlan ) ) { if( state == InetServ.STATE_ENABLE || state == InetServ.STATE_DISABLE ) { log.info( "changed vlan" ); result.append( session.doCommand( "no vlan "+ oldvlan ) ); result.append( session.doCommand( "no interface Vlan " + oldvlan ) ); result.append( session.doCommand( "vlan "+ newvlan ) ); result.append( session.doCommand( "interface Vlan " + newvlan ) ); result.append( session.doCommand( "ip address " + gw + " " + net_mask) ); result.append( session.doCommand( "no shutdown" ) ); result.append( session.doCommand( "exit" ) ); changed = true; } } else if (!oldip.equals( newip )) { if( state == InetServ.STATE_ENABLE || state == InetServ.STATE_DISABLE ) { log.info( "changed ip" ); result.append( session.doCommand( "interface Vlan " + newvlan ) ); result.append( session.doCommand( "ip address " + gw + " " + net_mask) ); } } if( serviceActivatorEvent.getNewState() != serviceActivatorEvent.getOldState() ) { if( state == InetServ.STATE_ENABLE & !changed ) { // открываем log.info( "open" ); result.append( session.doCommand( "vlan "+ newvlan ) ); result.append( session.doCommand( "interface Vlan " + newvlan ) ); result.append( session.doCommand( "ip address " + gw + " " + net_mask) ); result.append( session.doCommand( "no shutdown" ) ); result.append( session.doCommand( "exit" ) ); } else if( state == InetServ.STATE_DELETED ) { // удаляем log.info( "detete" ); result.append( session.doCommand( "no vlan "+ newvlan ) ); result.append( session.doCommand( "no interface Vlan " + newvlan ) ); } } return null; } |
Автор: | madmax [ 20 сен 2012, 13:10 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
Так нашлась проблема в serviceCancel можно использовать только getOldInetServ и getOldState. А в serviceCreate только getNewInetServ getNewState. Не знаю как у других работают вызовы из serviceCreate и serviceCancel если выходят ошибки |
Автор: | borisk [ 20 сен 2012, 18:46 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
Так все зависит от конкретных задач. Например мне не очень важно знать getOldService, потому что он сохраняется у меня в MANAD. Поэтому мой кусок кода выглядит так: Код: InetServ oldService = e.getOldInetServ(); InetServ newService = e.getNewInetServ(); if( newService == null ) newService = oldService; и дальше я работаю только с одним сервисом |
Автор: | madmax [ 21 сен 2012, 11:21 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
Да тут вопрос тоже закрыт. Осталось решить каким образом можно вытащить ip адрес дочернего сервиса. Делаю String ip = IpAddress.toString( serviceActivatorEvent.getNewInetServ().getChildren().getAddressFrom()); Но выходит ошибка. |
Автор: | borisk [ 21 сен 2012, 12:54 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
getChildren() возвращает List, поэтому требуется итератор: Код: List<InetServ> resourceChildren = service.getChildren();
if(resourceChildren == null) { logger.error("children is null"); return iplist; } Iterator<InetServ> resourceIterator = resourceChildren.iterator(); while(resourceIterator.hasNext()) { InetServ ipService = resourceIterator.next(); iplist.append( SPACE ); iplist.append( IpNet.toString(ipService.getAddressFrom(), IpNet.getMask(ipService.getAddressFrom(), ipService.getAddressTo())) ); } |
Автор: | madmax [ 21 сен 2012, 18:22 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
Да тут появилась проблема, нижеуказанный код для дочерних сервисов показывает одно и тоже значения. Хотя в родительском сервисе все отрабатывает корректно. Код: InetServ oldserv = serviceActivatorEvent.getOldInetServ(); InetServ newserv = serviceActivatorEvent.getNewInetServ(); List<InetServ> oldresourceChildren = oldserv.getChildren(); List<InetServ> newresourceChildren = newserv.getChildren(); Это баг или так и должно быть? |
Автор: | borisk [ 22 сен 2012, 21:22 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
Не совсем понял что вы имеете в виду. Какое одно и то же значение? |
Автор: | madmax [ 22 сен 2012, 23:07 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
Если на дочернем сервисе например поменять ip address то старое значение адреса не показывается а выходит значение на которое произвели замену. Это я про вышеуказанный код если его добавить в servicemodify. |
Автор: | borisk [ 24 сен 2012, 09:48 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
Да, действительно. Похоже баг. Уважаемые разработчики, обратите внимание! В serviceModify List<InetServ> resourceChildren = service.getChildren(); возвращает одинаковое значение как для oldService, как и для newService. |
Автор: | Amir [ 24 сен 2012, 15:05 ] |
Заголовок сообщения: | Re: Вопросы про написания кода обработчика активации сервиса |
Выложили обновление модуля. |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |