Добрый день!
Мы активно используем систему родительских и дочерних сервисов, где родительский сервис это исключительно устройство/интерфейс/vlan, а дочерние - IP, назначенные клиенту. В качестве ServiceActivator у нас Mikrotik, используем MikrotikServiceActivator. Что показали текущие эксперименты (может я что-то недочитал в документации):
1) Когда создается или удаляется дочерний сервис, то для родительского сервиса вызывается serviceCreate/serviceCancel. И это правильно, и это хорошо. Но вот представим ситуацию, когда пользователь отказывается от части адресов. В этом случае на дочернем сервисе мы выставляем дату окончания сервиса (потому что требуется для учета и любимого всеми СОРМ), и в этом случае, увы, не вызывается ни serviceCancel, ни serviceCreate. А serviceModify, я так понимаю, не предусмотрен вообще? Точнее в самом классе AbstractTerminalServiceActivator есть serviceModify, но, почему-то, при изменении даты активности дочернего сервиса он не вызывается.
2) Не все макросы работают с дочерними сервисами. Например iplist работает, а net не работает. Предлагаю дописать функционал всех макросов.
3) Для всех макросов, которые работают с дочерними сервисами отсутсвует проверка диапазона дат активности сервиса. И это, imho, неправильно. Для своих нужд я доработал макрос "net" следующим образом. Если у разработчиков нет возражений, просьба включить этот вариант в следующие релизы
Код:
else if( "net".equals( macros ) )
{
StringBuilder sb = new StringBuilder();
if(serv.getAddressFrom() != null)
sb.append(IpNet.toString( serv.getAddressFrom(), serv.getAddressTo() ));
if( args.length > 0 && Utils.parseBoolean( String.valueOf( args[0] ) ) )
{
final List<InetServ> children = serv.getChildren();
final Date today = new Date();
if( children != null && children.size() > 0 )
{
for( InetServ child : children )
{
if(!TimeUtils.dateInRange(today, child.getDateFrom(), child.getDateTo()))
continue;
if(sb.length() > 0)
sb.append(",");
sb.append(IpNet.toString( child.getAddressFrom(), child.getAddressTo() ));
}
}
}
return sb.toString();
}
4) Есть мысль в принципе придумать некий общий макрос, который будет для сервиса возвращать ip в нужном нам формате и с нужным нам сепаратором. Я уже как-то ранее писал эту мысль, но, почему-то она отклика не нашла. Но мне кажется, мысль здравая. Что-то вроде
Код:
$getip(определитель_формата, сепаратор_для_ip, обрабатывать_дочерние)
1 - аналог $ip
2 - аналог $net
3 - аналог $net, но с маской вида netmask, сепаратор /
4 - аналог $net, но с маской вида netmask, сепаратор :
.... может еще будут у кого какие мысли
Могу даже сам реализовать, если уважаемые разработчики согласуют имя макроса и список параметров. Ну и включат в будущие обновления
