Обработчик активации сервисов по snmp, зависящий от статуса договора

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

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

Цель была сделать закрытие/открытие порта по snmp в зависимости от статуса договора. При этом не учитывается состояние сервиса , баланс и т.п. Проверялось на устройстве АТ-8000.

Для этого добавлен обработчик активации сервисов. И обработчик события "Изменение статуса договора".

1) Код обработчика активации сервисов.

package ru.maglan.bgbilling.modules.inet.dyn.device.switchDlink;
 
 
import java.net.InetSocketAddress;
import java.sql.Connection;
import java.util.Date;
import java.util.List;
 
import org.apache.log4j.Logger;
 
import ru.bitel.bgbilling.kernel.network.snmp.SnmpClient;
import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivator;
import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorAdapter;
import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorEvent;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDeviceType;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;
import ru.bitel.bgbilling.server.util.ServerUtils;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;
import uk.co.westhawk.snmp.stack.AsnObjectId;
import bitel.billing.common.KernelConst;
import bitel.billing.server.contract.bean.ContractStatus;
import bitel.billing.server.contract.bean.ContractStatusManager;
 
public class SwitchServiceActivator
	extends ServiceActivatorAdapter
	implements ServiceActivator
{	
	private static Logger log = Logger.getLogger( SwitchServiceActivator.class );
	private static String PDU_PREFIX = "1.3.6.1.2.1.2.2.1.7";
 
	private InetDevice inetDevice;
	private String host;
 
	private ParameterMap parameterMap; 
	private Setup setup;
	private SnmpClient snmpClient; 
 
 
	@Override
	public Object init( Setup setup, int moduleId, InetDevice inetDevice, InetDeviceType inetDeviceType, ParameterMap parameterMap )
		throws Exception
	{
		this.inetDevice = inetDevice;
		this.parameterMap = parameterMap;
		this.setup = setup;
 
		return true;
	}
 
	@Override
	public Object connect()
		throws Exception
	{
 
            final List<String[]> hosts = inetDevice.getHostsAsString();
            final String[] hostArr = (hosts != null && hosts.size() > 0) ? hosts.get( 0 ) : null;        
 
            int snmpVersion = parameterMap.getInt( "snmp.version", 1 );
            this.host = parameterMap.get( "snmp.host", hostArr != null ? hostArr[0] : inetDevice.getHost() );
            int port  = parameterMap.getInt( "snmp.port", Utils.parseInt( hostArr != null ? hostArr[1] : "161" ) );
            String snmpCommunity = parameterMap.get( "snmp.community", inetDevice.getSecret() );
 
 
            if( log.isDebugEnabled() )
            {
                log.debug( "SNMP version: " + snmpVersion );
            }
 
            if( log.isDebugEnabled() )
            {
                log.debug( inetDevice.getId() + " device: " + host + ":" + port + " commutinty " + snmpCommunity );
            }
 
            snmpClient = new SnmpClient( host, port, snmpVersion, snmpCommunity ); 
 
            log.debug ( "SnmpClient created" );
 
            return null;		
	}
 
	private Object proccesServ( ServiceActivatorEvent serviceActivatorEvent, InetServ inetServ )
			throws Exception
	{
		Connection con = null;
 
		//InetServ inetServ =  serviceActivatorEvent.getNewInetServ();
 
		int contractId = inetServ.getContractId();
		int port = inetServ.getInterfaceId();
 
		log.debug( "serviceModify" );
 
 
		try
		{
			con  = setup.getDBConnectionFromPool();
    		ContractStatusManager statusManager = new ContractStatusManager( con );
 
		   	ContractStatus contractStatus = statusManager.getStatus( contractId, new Date() );
 
		   	log.debug( "port=" + port );
 
            if( port >= 0 )
            {
                int value = 2;						
                if( contractStatus == null  || contractStatus.getStatus() == KernelConst.CONTRACT_STATUS_ACTIVE )
                {
                    value = 1;
                }
                else
                {
                    value = 2;
                }
 
                snmpClient.set(  new AsnObjectId( PDU_PREFIX + "." + port).getOid(), -1, value );
 
                if( log.isDebugEnabled() )
                {
                    log.debug( "Add oid " + host + " " + PDU_PREFIX + "." + port + " i " + value );
                }
            }
		}
		finally
		{
			ServerUtils.closeConnection( con );
		}
 
		return null;	
	}
 
	@Override
	public Object serviceModify( ServiceActivatorEvent serviceActivatorEvent )
		throws Exception
	{
 
		InetServ inetServ =  serviceActivatorEvent.getNewInetServ();
		return proccesServ( serviceActivatorEvent, inetServ );		
	}
 
 
 
	@Override
	public Object disconnect()
		throws Exception
	{
		if( snmpClient != null )
		{
			snmpClient.destroy();
			snmpClient = null;
		}
 
		return null;
	}
 
	public Object serviceCreate( ServiceActivatorEvent e )
    throws Exception
	{
	    log.debug( "serviceCreate" );	    	    
	    return serviceModify( e );	    
	}
 
	@Override
	public Object serviceCancel( ServiceActivatorEvent e )
	    throws Exception
	{
	    log.debug( "serviceCancel" );
	    InetServ serv = e.getOldInetServ();		
	    return proccesServ( e, serv );
	}
 
 
}

2)Код обработчик события "Изменение статуса договора".

package ru.maglan.bgbilling.script.contract;
 
import java.util.ArrayList;
import java.util.List;
 
import ru.bitel.bgbilling.kernel.container.managed.ServerContext;
import ru.bitel.bgbilling.kernel.event.Event;
import ru.bitel.bgbilling.kernel.module.common.bean.User;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
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.InetServService;
//import ru.bitel.bgbilling.modules.inet.api.server.event.InetServModifiedEvent;
import ru.bitel.bgbilling.modules.inet.access.sa.event.InetSaServModifyEvent;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
 
public class StatusChanged
	extends EventScriptBase
{
	private static int DLINK_SERV_TYPE = 2;
	private static int INET_MODULE_ID = 18;
 
	@Override
	public void onEvent( Event event, Setup setup, ConnectionSet connectionSet )
		throws Exception
	{				
		ServerContext context = ServerContext.get();		
		InetServService wsServ = context.getService( InetServService.class, INET_MODULE_ID );
 
		List<InetServ> servList = wsServ.inetServList( event.getContractId() );
 
		for ( InetServ serv : servList )
		{
			if ( serv.getTypeId() == DLINK_SERV_TYPE )
			{
				print( "publish InetSaServModifyEvent ");
				//context.publishAfterCommit( new InetServModifiedEvent( INET_MODULE_ID, event.getContractId(), User.USER_SERVER, serv, serv, new ArrayList<InetServOption> () ) );
				context.publishAfterCommit( new InetSaServModifyEvent( INET_MODULE_ID, 0, serv, serv, InetServ.STATE_ENABLE, new ArrayList<InetServOption> ()  ) );
			}
		}
	}
 
}
Личные инструменты