BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 16 июн 2024, 03:09

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




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
СообщениеДобавлено: 19 сен 2012, 21:58 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
Есть несколько вопросов которые я не могу понять. Нужна ваша помощь.
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 - это бы изменило всю логику работы скрипта.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 сен 2012, 23:01 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
1. Я сделал общую функцию processEvent и вызываю её внутри serviceCreate/Modify/Cancel
2. Не могу ответить, самому непонятно и ни каких изменений в поведении я не нашел. Вот если exception кинуть - тогда да
3. Что именно изменит? Какая разница как вы назовете переменную, это ни на что, кроме удобочитаемости кода не влияет


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 сен 2012, 23:12 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
Вот ниже описываю что в моем случае получается что у меня общая функция serviceModify и при обращении к ней с serviceCreate все пашет но при обращении к ней с serviceCancel выходят ошибки
На первый вопрос дополню. в servicemodify имеется проверка на три статуса
Код:
InetServ.STATE_ENABLE, InetServ.STATE_DELETED, InetServ.STATE_DISABLE.

При создании сервиса отрабатывает serviceCreate но в коде этой процедуры указать
Код:
serviceModify(serviceActivatorEvent);

то в коде serviceModify отрабатывает текущий статус сервиса указанный при создании.
тут все понятно и все работает.
Но вот если установить на созданном сервисе дату закрытия вчерашним числом, статус меняется верно меняется на удален и по логам отрабатывает serviceCancel но если указать в serviceCancel serviceModify(serviceActivatorEvent); то в логах появляется ошибка


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 сен 2012, 23:48 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
И еще непонятно как сделать чтобы тут не возникло проблем.
Имеется сервис где нужно указывать статическую сеть, в договоре создается сервис в котором указывается блок адресов, далее передается команда 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.
Пока я вижу решение только одно, перед тем чтобы что-то изменять нужно в начале перевести шлюз в состояние удален, внести изменения и снова открыть.
Или как-то можно проще решить задачу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 сен 2012, 08:43 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
В serviceModify вы получаете два сервиса - старый (до модификации) и новый (после). А тут уж ваша воля - либо сделать "интеллектуальный" обработчик, либо просто как вы писали: delete старый и add новый.

P.S. А вообще трудно о чем-то предметно говорить не видя вашего кода


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 сен 2012, 12:04 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
Спасибо вопрос закрыт.
Осталось только понять почему в 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;
   }


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 сен 2012, 13:10 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
Так нашлась проблема в serviceCancel можно использовать только getOldInetServ и getOldState.
А в serviceCreate только getNewInetServ getNewState.
Не знаю как у других работают вызовы из serviceCreate и serviceCancel если выходят ошибки


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 сен 2012, 18:46 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Так все зависит от конкретных задач. Например мне не очень важно знать getOldService, потому что он сохраняется у меня в MANAD. Поэтому мой кусок кода выглядит так:
Код:
      InetServ   oldService = e.getOldInetServ();
      InetServ   newService = e.getNewInetServ();

      if( newService == null )
         newService = oldService;


и дальше я работаю только с одним сервисом


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 сен 2012, 11:21 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
Да тут вопрос тоже закрыт. Осталось решить каким образом можно вытащить ip адрес дочернего сервиса.
Делаю String ip = IpAddress.toString( serviceActivatorEvent.getNewInetServ().getChildren().getAddressFrom());
Но выходит ошибка.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 сен 2012, 12:54 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
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())) );
      }


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 сен 2012, 18:22 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
Да тут появилась проблема, нижеуказанный код для дочерних сервисов показывает одно и тоже значения.
Хотя в родительском сервисе все отрабатывает корректно.
Код:
InetServ oldserv = serviceActivatorEvent.getOldInetServ();
InetServ newserv = serviceActivatorEvent.getNewInetServ();
List<InetServ> oldresourceChildren = oldserv.getChildren();   
List<InetServ> newresourceChildren = newserv.getChildren();

Это баг или так и должно быть?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 сен 2012, 21:22 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Не совсем понял что вы имеете в виду. Какое одно и то же значение?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 сен 2012, 23:07 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
Если на дочернем сервисе например поменять ip address то старое значение адреса не показывается а выходит значение на которое произвели замену. Это я про вышеуказанный код если его добавить в servicemodify.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 сен 2012, 09:48 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Да, действительно. Похоже баг.
Уважаемые разработчики, обратите внимание! В serviceModify List<InetServ> resourceChildren = service.getChildren(); возвращает одинаковое значение как для oldService, как и для newService.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 сен 2012, 15:05 
Не в сети
Разработчик
Аватара пользователя

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


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

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


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

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


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

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