Конвертер: at-8000 в сервисы INET

Материал из BiTel WiKi

Перейти к: навигация, поиск

Конвертер переносит данные из договоров в сервисы inet. Для каждого устройства и порта с вкладки "порты" в договоре в модуле IPN создается сервис отдельный в модуле INET. Сервис имеет то же самый порт и устройство.

Сами устройства переносятся вот этим скриптом(и имеют такую же иерархию ): http://wiki.bgbilling.ru/index.php/%D0%9A%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%B5%D1%80:_%D1%88%D0%BB%D1%8E%D0%B7%D1%8B_at-8000_%D0%B2_%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_INET


Сервис управляется по порту .В данном случае у этого сервиса был вот такой обработчик(хотя это не имеет значения, просто для справки )  : http://wiki.bgbilling.ru/index.php/%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA_%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%B0%D1%86%D0%B8%D0%B8_%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2_%D0%BF%D0%BE_snmp,_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D1%8F%D1%89%D0%B8%D0%B9_%D0%BE%D1%82_%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81%D0%B0_%D0%B4%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B0



Код конвертера:

package ru.maglan.bgbilling.script.global;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
import org.apache.log4j.Logger;
 
import ru.bitel.bgbilling.common.BGException;
import ru.bitel.bgbilling.kernel.container.managed.ServerContext;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServOption;
import ru.bitel.bgbilling.modules.inet.api.common.service.InetDeviceService;
import ru.bitel.bgbilling.modules.inet.api.common.service.InetServService;
import ru.bitel.bgbilling.server.util.ModuleSetup;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
import bitel.billing.common.TimeUtils;
import bitel.billing.common.module.ipn.IPNContractStatus;
import bitel.billing.server.contract.bean.ContractModuleManager;
import bitel.billing.server.ipn.bean.IPNContractStatusManager;
import bitel.billing.server.contract.bean.ContractScript;
import bitel.billing.server.contract.bean.ContractScriptManager;
 
 
public class ConvertIPNAT8000ToInetServices
	extends GlobalScriptBase
{
 
	//код модуля IPN
	private static int IPN_MODULE_ID = 1;
	private static int IPN_ROOT_DEVICE_ID = 4;
	private static int IPN_AT8000_GATE_TYPE_ID = 24;
	private static int IPN_UNUSED_FOLDER = 6;
 
 
	private static int INET_MODULE_ID = 18;
	private static int INET_SERV_TYPE_AT8000_ID = 2;
	private static int INET_AT8000_DEVICE_TYPE_ID = 3;
	private static int	INET_CONTRACT_STATUS_SCRIPT_ID = 7;
 
 
	private InetServService wsServ = null;
	private  InetDeviceService wsDevice = null;
 
	Logger logger = Logger.getLogger( ConvertIPNAT8000ToInetServices.class );
 
	@Override
	public void execute( Setup setup, ConnectionSet connectionSet )
		throws Exception
	{
		ServerContext context = ServerContext.get();
		wsServ = context.getService( InetServService.class, INET_MODULE_ID );
		wsDevice = context.getService( InetDeviceService.class, INET_MODULE_ID );
 
		Map<Integer, InetDevice> ipnInetDeviceMap = new HashMap<Integer, InetDevice>();
 
		getDevices( connectionSet, ipnInetDeviceMap );
 
		createServices( connectionSet, ipnInetDeviceMap );
 
		print( "OK" );
	}
 
 
	private void getDevices( ConnectionSet connectionSet, Map<Integer, InetDevice> ipnInetDeviceMap  )
       throws BGException, SQLException
   {
 
		List<InetDevice> inetDevicelist = new ArrayList<InetDevice>();
 
		inetDevicelist.addAll( wsDevice.deviceList( INET_AT8000_DEVICE_TYPE_ID ) );
 
 
		Map<String, InetDevice> inetDeviceMap = new HashMap<String, InetDevice>();
 
		for ( InetDevice device : inetDevicelist )
		{
			inetDeviceMap.put( device.getHost(), device );
		}
 
		Connection con = connectionSet.getConnection();
 
		logger.info( "loading devices...." );
 
		String tableName = "ipn_gate_" + IPN_MODULE_ID;
 
		String query =  " SELECT gate.* FROM " + tableName + " as gate " + 
						" LEFT JOIN " + tableName + " as parent ON parent.id=gate.parent_id"  +
						" LEFT JOIN " + tableName + " as parentParent ON parentParent.id=parent.parent_id"  +
			" WHERE parentParent.id = " + IPN_ROOT_DEVICE_ID + 
			" AND gate.type=" + IPN_AT8000_GATE_TYPE_ID;
 
 
		PreparedStatement ps = con.prepareStatement( query );
		ResultSet rs = ps.executeQuery();
 
		while ( rs.next() )
		{
			String host = rs.getString( "host" );
			int port = rs.getInt( "port" );
			int gid =  rs.getInt( "id" );
			String hostPort = host + ":" + port;
 
			InetDevice device = inetDeviceMap.get(  hostPort  );
 
			if ( device == null )
			{
				print( "device is NULL " + gid );
				continue;
			}
 
 
			ipnInetDeviceMap.put( gid, device );
			device.setId( device.getId() );
			device.setHost( hostPort );	
 
		}
		ps.close();
 
		logger.info( " devices loaded" );
   }
 
	private void createServices( ConnectionSet connectionSet,	                            
	                             Map<Integer, InetDevice> ipnInetDeviceMap ) 
		throws SQLException, BGException
    {
	    Connection con = connectionSet.getConnection();
 
		//обязательно чтобы мы с этого места могли делать rollback если что
		connectionSet.commit();
 
		logger.info( "creating services..." );	
 
		String query = "SELECT * FROM contract  " +
						" LEFT JOIN contract_module as cm  ON contract.id = cm.cid " +
						" WHERE cm.mid = " + IPN_MODULE_ID;
						//" LIMIT 0,10 ";
 
		PreparedStatement ps = con.prepareStatement( query );
		ResultSet rs = ps.executeQuery();
 
		ContractModuleManager cmm = new ContractModuleManager( con );
		ContractScriptManager contractScriptManager = new ContractScriptManager( con );	
 
 
		ModuleSetup ipnSetup = new ModuleSetup( con, IPN_MODULE_ID );
 
		IPNContractStatusManager statusManager = new IPNContractStatusManager( con , IPN_MODULE_ID, ipnSetup );
 
 
 
		Date now = new Date(); 
 
		int portIdx = 0 ;
 
		int idx = 0 ;
 
		Map<Integer,Map<Integer, InetServ>> servMap = new HashMap<Integer,Map<Integer, InetServ>>();
		Map<Integer,Map<Integer, InetServ>> servMapСopy = new HashMap<Integer,Map<Integer, InetServ>>();
 
 
		while ( rs.next() )
		{
			int cid = rs.getInt( "contract.id" );				
 
			int ipnStatus = statusManager.getContractStatus( cid );
 
			//print( "cid = " + cid );
 
			/*
			//удаленные договора игнорим 
			if( ipnStatus == IPNContractStatus.STATUS_REMOVED )
			{
				continue;
			}
 */
 
			int inetStatus = InetServ.STATUS_ACTIVE;
 
			switch ( ipnStatus )
			{
				case IPNContractStatus.STATUS_LOCK : 
				case IPNContractStatus.STATUS_OPEN : inetStatus = InetServ.STATUS_ACTIVE; break;
				case IPNContractStatus.STATUS_REMOVED:
				case IPNContractStatus.STATUS_CLOSED : inetStatus = InetServ.STATUS_CLOSED; break;
 
				case IPNContractStatus.STATUS_HARD_LOCK : inetStatus = InetServ.STATUS_LOCKED; break;						 
			}
 
			int count = 0;
 
			List<InetServ> list =  wsServ.inetServList( cid );
 
			//print( "list.size() = " + list.size() );
 
 			//
 
 
			for ( InetServ oldServ : list )
			{				
 
				if ( oldServ.getTypeId() ==  INET_SERV_TYPE_AT8000_ID )
				{
 
					/*
					//во такой вот костыль чтобы удалить сервис, иначе не дает
					logger.info( "delete serviceIdx =" + idx++ );
					connectionSet.commit();
					if ( oldServ.getDateTo() == null || TimeUtils.dateBefore(  now, oldServ.getDateTo() ) )
					{
						oldServ.setDateTo( TimeUtils.getPrevDay( now ) );
 
						try
	                    {
							//logger.info( "updating serv date for cid = " + cid );
							wsServ.inetServUpdate( oldServ, new ArrayList<InetServOption>(), false, false, 0  );							
 
	                    }
	                    catch( Exception e )
	                    {
	                    	//printError( cid, e, "Error while updating service date for contract "  + cid +  ";" + oldServ.getDeviceId()  + ";port=" + oldServ.getInterfaceId() + ":" + e.getMessage() );
	                    	//logger.error( "", e );	                    	
	                    }
					}
 
 
 
				    try
	                {
 
	                	wsServ.inetServDelete( oldServ.getId() );
						count ++;
					}
					catch( Exception e )
	                {
	                	printError( cid, e, "Error while deleting service date for contract " + cid +  ";" + oldServ.getDeviceId()  + ";port=" + oldServ.getInterfaceId() + ":" + e.getMessage()   );
	                   //logger.error( "", e );
	                   continue;	                    	
	                 }
					*/
 
					Map<Integer, InetServ> deviceMap = servMap.get( oldServ.getDeviceId() );
					Map<Integer, InetServ> deviceMapCopy = servMapСopy.get( oldServ.getDeviceId() );
 
					if ( deviceMap == null )
					{
						deviceMap = new HashMap<Integer, InetServ>();
						servMap.put( oldServ.getDeviceId(),  deviceMap );
						//еще один экземляр
						deviceMapCopy = new HashMap<Integer, InetServ>();
						servMapСopy.put( oldServ.getDeviceId(),  deviceMapCopy );	
					}
 
					if ( deviceMap.get( oldServ.getInterfaceId() ) != null )
					{
						print( "contract " + cid + " has already the port " + oldServ.getInterfaceId() );							
					}	
 
					deviceMap.put( oldServ.getInterfaceId(), oldServ );		
					deviceMapCopy.put( oldServ.getInterfaceId(), oldServ );		
 
					/*
 
					if ( oldServ.getDeviceId() == 212 && oldServ.getInterfaceId() == 3 )
					{
						print ( "ccccc cid=" + cid );
					}
					*/	
 
				}
 
 
 
 
			}
 
			//print( count + " services was deleted" );
 
			connectionSet.commit();
 
 
			query = "SELECT * FROM " + "ipn_gate_contract_port_" + IPN_MODULE_ID + " AS port " + 
			" LEFT JOIN ipn_gate_" + IPN_MODULE_ID + " AS gate ON gate.id = port.gid " + 
			" WHERE port.cid = " + cid +
			" AND gate.parent_id != " +  IPN_UNUSED_FOLDER;
			//" LIMIT 0, 10";
 
 
			PreparedStatement psPort = con.prepareStatement( query );
			ResultSet rsPort = psPort.executeQuery();
 
			boolean flag = false;
 
			//print( "cid before ports = " + cid );
 
 
			while ( rsPort.next() )
			{
				int gid = rsPort.getInt( "gid" );
				int port = rsPort.getInt( "port" );
 
				logger.info( "create port idx=" + portIdx++ );
 
				//в первый раз добавляем модуль и скрипт поведения
				if ( !flag )
				{
					try
		            {
			            Set<Integer> moduleSet = cmm.getContractModuleSet( cid );
 
			            if( !moduleSet.contains( INET_MODULE_ID ) )
			            {	            				
			            	cmm.addContractModule( cid, INET_MODULE_ID );
			            	//EventProcessor.getInstance().publishAfterCommit( new ContractModifiedEvent( User.USER_SERVER, cid ) );
			            }	            
 
						boolean found = false;
						List<ContractScript> contractScriptList = contractScriptManager.getContractScriptList( cid );
 
						for( ContractScript script : contractScriptList )
						{
							if ( script.getScriptId() == INET_CONTRACT_STATUS_SCRIPT_ID )
							{
								found = true;
								break;
							}	
						}
						if ( !found )
						{
							ContractScript  script = new ContractScript();
							script.setDate1( TimeUtils.convertDateToCalendar( now ) );
							script.setContractId( cid );
							script.setScriptId( INET_CONTRACT_STATUS_SCRIPT_ID );
							script.setComment( "Добавлен при импорте" );
 
 
							contractScriptManager.updateContractScript( "new", script );
						}
 
						connectionSet.commit();
 
		            }
		            catch( Exception e )
		            {
		            	print("error=" +  e.getMessage() );
		            	logger.error( "", e );
						connectionSet.rollback();
						continue;
		            }
		            flag = true;
				}
 
				InetDevice device = ipnInetDeviceMap.get( gid );;
 
				if ( device == null )
				{
					//print( "device is null for contract " + cid );
					logger.info( "Device for IPN id =" + gid + " is null for contract " + cid );
					print( "Device for IPN id =" + gid + " is null for contract " + cid );
					continue;
				}
 
				Map<Integer, InetServ> deviceMap = servMap.get( device.getId() );
 
				if ( deviceMap == null )
				{
					deviceMap = new HashMap<Integer, InetServ>();
					servMap.put( device.getId(), deviceMap );
				}
 
				Map<Integer, InetServ> deviceMapCopy = servMapСopy.get( device.getId() );
				if ( deviceMapCopy == null )
				{
					deviceMapCopy = new HashMap<Integer, InetServ>();
					servMapСopy.put( device.getId(), deviceMapCopy );
				}
 
 
				InetServ serv = deviceMap.get(port );
				boolean needUpdate = false;
 
				if ( serv == null ) 
				{
					print( "add  new service for cid " + cid + ";deviceId" + device.getId() + ";port " + port ); 
					serv = new InetServ();
					serv.setContractId( cid );
					serv.setComment( "Импортирован из IPN" );
					serv.setDateFrom( now );
					serv.setLogin( "" );
					serv.setPassword( "" );
					serv.setTypeId( INET_SERV_TYPE_AT8000_ID );
					needUpdate = true;
 
				}	
 
				if ( serv.getDateTo() != null )
				{
					print( "dateTo changed");
					serv.setDateTo( null );
					needUpdate = true;
				} 
 
				/*if ( device.getId() == 212 && deviceMapCopy.get( 3 ) != null )
				{
					print( "bbbbb deviceId = 212;port - 3; cid = " + cid );
				} 
 
				if ( device.getId() == 212 && port == 3 ) 
				{
					print( "aaaaa deviceId = 212;port - 3; cid = " + cid );
				}
 
				*/
 
				//удаляем чтобы потом найти те, которые не использовались
				deviceMapCopy.remove( port );
 
 
 
 
				if ( serv.getStatus() !=  inetStatus )
				{
					print( "status changed");
					serv.setStatus( inetStatus );
					needUpdate = true;	
				}
 
				if ( serv.getDeviceId() !=  device.getId() )
				{
					print( "device changed");
					serv.setDeviceId( device.getId() );
					needUpdate = true;
				}
 
				if( serv.getInterfaceId() != port )
				{
					print( "interface changed");
					serv.setInterfaceId( port );
					needUpdate = true;
				}
 
				try
			    {
 
 
			    	if ( needUpdate ) 
					{
			    		logger.info( "updating serv for cid = " + cid + ";deviceId" + device.getId()  + 
							";device host " + 	device.getHost() + 
							";port=" + port );
 
						wsServ.inetServUpdate( serv, new ArrayList<InetServOption>(), false, false, 0 );
					}
			    }
			    catch( Exception e )
			    {
			    	printError(  cid, e, "Error while updating  service  for contract " + cid +  ";deviceId" + device.getId()  + 
						";device host " + 	device.getHost() + 
						";port=" + port + ":" + e.getMessage() );
		 			//logger.error( "", e );
 
					connectionSet.rollback();
			    }
 
				connectionSet.commit();
 
			}
 
			psPort.close();
 
			;
 
		}
 
			//delete extra services
			int extraIdx = 0;	
			connectionSet.commit();
 
			for ( Map.Entry<Integer,Map<Integer, InetServ>> entry : servMapСopy.entrySet() )
			{
				Map<Integer, InetServ> deviceMapCopy = entry.getValue();
				for ( Map.Entry<Integer, InetServ> entry2 : deviceMapCopy.entrySet() )
				{
					InetServ serv = entry2.getValue();
					print ( "deleting serv " + serv.getId()  + ";serv.getDeviceId()=" + serv.getDeviceId() 
						+ ";port=" + serv.getInterfaceId()  + ";contract id =" + serv.getContractId() );
 
 
					//во такой вот костыль чтобы удалить сервис, иначе не дает
					logger.info( "delete extra service =" + extraIdx++ );
					connectionSet.commit();
					if ( serv.getDateTo() == null || TimeUtils.dateBefore(  now, serv.getDateTo() ) )
					{
						serv.setDateTo( TimeUtils.getPrevDay( now ) );
 
						try
	                    {
							//logger.info( "updating serv date for cid = " + cid );
							wsServ.inetServUpdate( serv, new ArrayList<InetServOption>(), false, false, 0  );							
 
	                    }
	                    catch( Exception e )
	                    {
	                    	printError( serv.getContractId(), e, "Error while updating extra service date for contract "  + serv.getContractId() +  ";" + serv.getDeviceId()  + ";port=" + serv.getInterfaceId() + ":" + e.getMessage() );
	                    	//logger.error( "", e );	                    	
	                    }
					}
 
 
 
				    try
	                {
 
	                	wsServ.inetServDelete( serv.getId() );
					}
					catch( Exception e )
	                {
	                	printError( serv.getContractId(), e, "Error while deleting extra  service date for contract " + serv.getContractId() +  ";" + serv.getDeviceId()  + ";port=" + serv.getInterfaceId() + ":" + e.getMessage()   );
	                   //logger.error( "", e );
						connectionSet.commit();
	                   continue;	                    	
	                 }
 
					connectionSet.commit();
 
				} 
			}
 
		ps.close();
 
    }
 
 
	private void printError( int cid, Exception e, String message )
    {
	    logger.error( message, e );
	    print( message );
    }
 
}
Личные инструменты