Обработчик активации сервисов по snmp, зависящий от статуса договора
Материал из BiTel WiKi
Версия от 07:46, 24 марта 2016; Stark (Обсуждение | вклад)
Цель была сделать закрытие/открытие порта по 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> () ) ); } } } }