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

Присвоение статического IP Inet уже выданного пользователю
http://forum.bitel.ru/viewtopic.php?f=19&t=12241
Страница 1 из 1

Автор:  iseed [ 07 фев 2017, 11:45 ]
Заголовок сообщения:  Присвоение статического IP Inet уже выданного пользователю

Доброго дня.

Имеем billing 6.1
Сервер: вер. 6.1.1177 / 19.08.2016 11:58:42
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.7.0_80
inet: вер. 6.1.734 / 22.06.2016 13:23:18

Хочу реализовать скрипт присвоения статической записи IP в случае если абонент получил IP из определенного пула.

import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
import bitel.billing.server.contract.bean.Contract;
import bitel.billing.server.contract.bean.ContractManager;
import java.util.Date;
import java.util.GregorianCalendar;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.sql.Statement;
import java.util.List;
import java.lang.String;
import ru.bitel.bgbilling.modules.inet.api.server.bean.InetServDao;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;
import ru.bitel.bgbilling.modules.inet.api.server.bean.InetConnectionDao;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetConnection;
import ru.bitel.oss.systems.inventory.resource.common.bean.IpResourceSubscription;
import ru.bitel.oss.systems.inventory.resource.server.bean.IpResourceSubscriptionDao;
import ru.bitel.bgbilling.modules.inet.api.server.bean.InetServDao;
import ru.bitel.bgbilling.kernel.container.managed.ServerContext;
import ru.bitel.bgbilling.modules.inet.api.common.service.InetServService;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServOption;

public class statusTest extends GlobalScriptBase
{
int resourceId = 27;
int modileId = 9;

@Override
public void execute( Setup setup1, ConnectionSet connectionSet2 )
throws Exception
{
int cid = 2842;
//int cid = 69744;

Connection con = connectionSet2.getConnection();
ServerContext sc = new ServerContext(setup1, modileId, 0);
InetConnectionDao connect = new InetConnectionDao(con, modileId);
IpResourceSubscriptionDao ird = new IpResourceSubscriptionDao(con, modileId);
InetServService iss = sc.getService(InetServService.class, modileId);
List<InetServ> isl = iss.inetServList(cid);
for(InetServ is :isl){
List<InetConnection> icl = connect.list(is.getId());
IpResourceSubscription ir = ird.findSubscribed(is.getId());
if(ir == null){
for(InetConnection ic : icl){
System.out.println(is.getIpResourceId() + "/" + ic.getIpResourceId());
if(is.getIpResourceId() == 0 && ic.getIpResourceId() == resourceId){
is.setIpResourceId(resourceId);
is.setAddressFrom(ic.getInetAddressBytes());
iss.inetServUpdate(is, new ArrayList<InetServOption>(), false, false, 0);
}
}
}
}
sc.recycle();
}
}


Проблема в том, что iss.inetServUpdate создает запись в inv_ip_resource_subscription_9 но не изменяет inet_serv_9 поля ipResourceId и IpResourceSubscribeId.
Насколько видно из реализации InetServServiceImpl.inetServUpdateInternal в нем есть вызов:
String titlePattern = this.getTitlePattern(inetServ, servTypeConfig, device);
inetServ.setTitle(titlePattern);
this.inetServDao.update(inetServ);
this.inetServOptionDao.update(inetServ.getId(), optionList);

Не подскажете как правильно сохранить ItemServ чтобы присваивались изменения из is?
А в частности:
is.setIpResourceId(resourceId);
is.setAddressFrom(ic.getInetAddressBytes());
и id из inv_ip_resource_subscription_9

Автор:  Phricker [ 07 фев 2017, 12:20 ]
Заголовок сообщения:  Re: Присвоение статического IP Inet уже выданного пользовате

Код:
ServerContext context = ServerContext.get();
        ResourceService resourceService = context.getService(ResourceService.class, 12);
        InetServService inetServService = context.getService(InetServService.class, 12);
        ArrayList<Integer> ipResourceCategoryIds = new ArrayList<Integer>();
        ipResourceCategoryIds.add(55);
        List<IpResourceRange> freeIpResourceRangeList = resourceService.freeIpResourceRangeList(ipResourceCategoryIds, null, new Date(), new Date(), 1, 1);
        if (!freeIpResourceRangeList.isEmpty()) {
            inetServService.inetServList(304741, null);
            InetServ inetServ = inetServService.inetServGet(317359);
            inetServ.setAddressFrom(freeIpResourceRangeList.get(0).getAddressFrom());
            inetServ.setAddressTo(freeIpResourceRangeList.get(0).getAddressTo());
            inetServService.inetServUpdate(inetServ, new ArrayList<InetServOption>(), false, false, 0);
        }

Такой код прописывает в таблицу.

Автор:  iseed [ 07 фев 2017, 16:35 ]
Заголовок сообщения:  Re: Присвоение статического IP Inet уже выданного пользовате

Да. Но тут есть существенная разница. Я говорю о изменению существующего сервиса.
Переписал середку скрипта:

InetServ oldIs = is.clone();
InetSubscriber isb = new InetSubscriber(con, modileId);
IpResourceSubscription ips = isb.add(cid, is, resourceId, ic.getInetAddressBytes());
is.setAddressFrom(ic.getInetAddressBytes());
is.setIpResourceSubscriptionId(ips.getId());
InetServWrapper isw = new InetServWrapper(con, modileId);
isw.update(is);
EventProcessor.getInstance().request(new InetServChangingEvent(modileId, userId, oldIs, is));
sc.publishAfterCommit(new InetServModifiedEvent(modileId, cid, userId, oldIs, is, new ArrayList<InetServOption>()));


InetServWrapper

import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import java.sql.Connection;
import ru.bitel.bgbilling.modules.inet.api.server.bean.InetServDao;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;

public class InetServWrapper extends InetServDao
{
public InetServWrapper(Connection con, int modileId)
{
super(con, modileId);
}

public void Update(InetServ is) throws Exception
{
this.updateImpl( is );
}
}


InetSubscriber

import bitel.billing.server.contract.bean.ContractUtils;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;
import java.sql.Connection;
import java.util.Date;

import ru.bitel.oss.systems.inventory.resource.common.bean.IpResourceSubscription;
import ru.bitel.oss.systems.inventory.resource.server.bean.IpResourceSubscriptionDao;

public class InetSubscriber extends IpResourceSubscriptionDao
{
public InetSubscriber(Connection con, int modileId)
{
super(con, modileId);
}

public void Update(IpResourceSubscription ips) throws Exception
{
this.updateImpl( ips );
}

public IpResourceSubscription add(int cid, InetServ is, int resourceId, byte[] address) throws Exception{
ContractUtils cu = new ContractUtils(this.con);
String subscriberTitle = cu.getContractTitle(cid, true) + ";" + is.getTitle();
IpResourceSubscription ips = new IpResourceSubscription();
ips.setSubscriberTitle(subscriberTitle);
ips.setIpResourseId(resourceId);
ips.setAddressFrom(address);
ips.setAddressTo(address);
ips.setDateFrom(new Date());
ips.setSubscriberId(is.getId());
this.update(ips);
return ips;
}
}


Создание записи IpResourceSubscription работает.
Обновление записи InetServ работает.
Но публикация изменений по прежнему не работает.
Может кто скажет что не так в вызываемых мною событиях так как это события из InetServServiceImpl.inetServUpdateInternal которые вызываются в примере где работает.

Автор:  Phricker [ 07 фев 2017, 16:50 ]
Заголовок сообщения:  Re: Присвоение статического IP Inet уже выданного пользовате

а я про что говорил?
Код:
InetServ inetServ = inetServService.inetServGet(317359);

получает текущий сервис с ID = 317359

Автор:  iseed [ 08 фев 2017, 08:08 ]
Заголовок сообщения:  Re: Присвоение статического IP Inet уже выданного пользовате

Phricker писал(а):
а я про что говорил?
Код:
InetServ inetServ = inetServService.inetServGet(317359);

получает текущий сервис с ID = 317359

Я пробовал добавить получение нового сервиса после обновления старого. К сожалению это не помогло.
InetServWrapper isw = new InetServWrapper(con, modileId);
isw.update(is);
InetServ newIs = iss.inetServGet(is.getId());
EventProcessor.getInstance().request(new InetServChangingEvent(modileId, userId, oldIs, newIs));
sc.publishAfterCommit(new InetServModifiedEvent(modileId, cid, userId, oldIs, newIs, new ArrayList<InetServOption>()));

Автор:  iseed [ 08 фев 2017, 11:32 ]
Заголовок сообщения:  Re: Присвоение статического IP Inet уже выданного пользовате

Изменил логику для работы по папке inv_device
public class statusTest extends GlobalScriptBase
{
int resourceTypeId = 9;
int resourceId = 27;
int moduleId = 9;
int userId= 0;

@Override
public void execute( Setup setup1, ConnectionSet connectionSet2 )
throws Exception
{
Connection con = connectionSet2.getConnection();
Statement statement = con.createStatement();
ArrayList<Integer> cids = new ArrayList<Integer>();

ResultSet rs = statement.executeQuery(
" SELECT " +
" is9.contractId as id " +
" FROM inv_device_9 id9 " +
" join inet_serv_9 is9 on is9.deviceId = id9.id " +
" where id9.parentId = 782 "
);
while(rs.next()){
cids.add(rs.getInt("id"));
}

ServerContext sc = new ServerContext(setup1, moduleId, userId);
ResourceService resourceService = sc.getService(ResourceService.class, sc.getModuleId());
ArrayList<Integer> ipResourceCategoryIds = new ArrayList<Integer>();
ipResourceCategoryIds.add(resourceTypeId);
ArrayList<Integer> ipResourceIds = new ArrayList<Integer>();
ipResourceIds.add(resourceId);
List<IpResourceRange> freeIpResourceRangeList = resourceService.freeIpResourceRangeList(ipResourceCategoryIds, ipResourceIds, new Date(), new Date(), 1, 512);
System.out.println("Обработаем: " + cids + "\n");
InetConnectionDao connect = new InetConnectionDao(con, moduleId);
IpResourceSubscriptionDao ird = new IpResourceSubscriptionDao(con, moduleId);
InetServService iss = sc.getService(InetServService.class, moduleId);
for(Integer cid : cids){
List<InetServ> isl = iss.inetServList(cid);
for(InetServ is :isl){
IpResourceSubscription ir = ird.findSubscribed(is.getId());
if(ir == null && is.getIpResourceId() == 0){
List<InetConnection> icl = connect.list(is.getId());
System.out.println("Текущие соединения: " + icl + "\n");
if(icl.isEmpty()){
InetServ oldIs = is.clone();
InetSubscriber isb = new InetSubscriber(con, moduleId);
IpResourceSubscription ips = isb.addFreeIp(cid, is, resourceId, freeIpResourceRangeList);
is.setAddressFrom(ips.getAddressFrom());
is.setIpResourceSubscriptionId(ips.getId());
InetServWrapper isw = new InetServWrapper(con, moduleId);
isw.update(is);
InetServ newIs = iss.inetServGet(is.getId());
EventProcessor.getInstance().request(new InetServChangingEvent(moduleId, userId, oldIs, is));
sc.publishAfterCommit(new InetServModifiedEvent(moduleId, cid, userId, oldIs, is, new ArrayList<InetServOption>()));
System.out.println("Добавим к cid:" + cid + " новый IP: " + IpAddress.toString(ips.getAddressFrom()) + "\n");
} else {
for(InetConnection ic : icl){
if(is.getIpResourceId() == 0 && ic.getIpResourceId() == resourceId){
InetServ oldIs = is.clone();
InetSubscriber isb = new InetSubscriber(con, moduleId);
IpResourceSubscription ips = isb.add(cid, is, resourceId, ic.getInetAddressBytes());
is.setAddressFrom(ic.getInetAddressBytes());
is.setIpResourceSubscriptionId(ips.getId());
InetServWrapper isw = new InetServWrapper(con, moduleId);
isw.update(is);
InetServ newIs = iss.inetServGet(is.getId());
EventProcessor.getInstance().request(new InetServChangingEvent(moduleId, userId, oldIs, is));
sc.publishAfterCommit(new InetServModifiedEvent(moduleId, cid, userId, oldIs, is, new ArrayList<InetServOption>()));
System.out.println("Добавим к cid:" + cid + " выданный IP: " + IpAddress.toString(ips.getAddressFrom()) + "\n");
}
}
}
}
}
}
sc.recycle();
}
}


InetSubscriber

public class InetSubscriber extends IpResourceSubscriptionDao
{

public InetSubscriber(Connection con, int modileId)
{
super(con, modileId);
}

public void Update(IpResourceSubscription ips) throws Exception
{
this.updateImpl( ips );
}

public IpResourceSubscription add(int cid, InetServ is, int resourceId, byte[] address) throws Exception{
ContractUtils cu = new ContractUtils(this.con);
String subscriberTitle = cu.getContractTitle(cid, true) + ";" + is.getTitle();
IpResourceSubscription ips = new IpResourceSubscription();
ips.setSubscriberTitle(subscriberTitle);
ips.setIpResourseId(resourceId);
ips.setAddressFrom(address);
ips.setAddressTo(address);
ips.setSubscriberId(is.getId());
this.update(ips);
return ips;
}

public IpResourceSubscription addFreeIp(int cid, InetServ is, int resourceId, List<IpResourceRange> freeIpResourceRangeList) throws Exception
{
ContractUtils cu = new ContractUtils(this.con);
String subscriberTitle = cu.getContractTitle(cid, true) + ";" + is.getTitle();
IpResourceSubscription ips = new IpResourceSubscription();
if (!freeIpResourceRangeList.isEmpty()) {
ips.setSubscriberTitle(subscriberTitle);
ips.setIpResourseId(resourceId);
ips.setAddressFrom(freeIpResourceRangeList.get(0).getAddressFrom());
ips.setAddressTo(freeIpResourceRangeList.get(0).getAddressTo());
freeIpResourceRangeList.remove(0);
ips.setSubscriberId(is.getId());
this.update(ips);
}
return ips;
}
}


Возникла новая проблема. resourceService.freeIpResourceRangeList() возвращает уже присвоенный на inetServ Ip адрес.
Имеется запись с данным Ip в таблице inv_ip_resource_subscription_9 с указанной датой окончания сервиса http://joxi.ru/DrlNvxgFvvZVB2
При установке в клиенте биллинга этого ip адреса пишет что существует конфликт ip с данным договором.

Автор:  iseed [ 09 фев 2017, 09:28 ]
Заголовок сообщения:  Re: Присвоение статического IP Inet уже выданного пользовате

Тут даже просто если в договоре имеется статическая привязка IP c закрытым сервисом. http://joxi.ru/l2Z1Xz4TwwOXLm
То при добавлении в новый сервис имею ошибку http://joxi.ru/eAOlL8zIxxQVdr
Я думаю это связано с тем что при построении интервалов использования IP используется дата начала сервиса, а не запись в inv_ip_resource_subscription_9;

Автор:  iseed [ 09 фев 2017, 10:32 ]
Заголовок сообщения:  Re: Присвоение статического IP Inet уже выданного пользовате

В результате того что биллинг считает активный интервал статического IP по датам активности сервиса, невозможно отделить
интервал активности статического IP от активности сервиса.
Пришлось удалить статические записи IP из закрытых сервисов.
Тему можно закрывать.

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