import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import org.elasticsearch.common.xcontent.XContentBuilder; import org.wso2.siddhi.core.SiddhiManager; import org.wso2.siddhi.core.config.SiddhiConfiguration; import org.wso2.siddhi.core.event.Event; import org.wso2.siddhi.core.query.output.callback.QueryCallback; import org.wso2.siddhi.core.stream.input.InputHandler; import org.wso2.siddhi.query.api.extension.annotation.SiddhiExtension; import org.wso2.siddhi.query.api.query.Query; import com.produban.openbus.siddhiCep.SumadorCondicionalConReinicioAggregatorFactory; import backtype.storm.task.TopologyContext; import backtype.storm.topology.BasicOutputCollector; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.base.BaseBasicBolt; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Tuple; import backtype.storm.tuple.Values; public class SiddhiBoltMetricaOnlineRadius1 extends BaseBasicBolt { /** * */ private static final long serialVersionUID = 296651450802350256L; private transient SiddhiManager siddhiManager; private BasicOutputCollector collector; private String q; private int cont=1; @SuppressWarnings("rawtypes") public void init(){ //SiddhiConfiguration configuration = new SiddhiConfiguration(); SiddhiConfiguration conf = new SiddhiConfiguration(); List<Class> ext = new ArrayList<Class>(); ext.add(SumadorCondicionalConReinicioAggregatorFactory.class); conf.setSiddhiExtensions(ext); siddhiManager = new SiddhiManager(conf); /* gestionaStream("define stream streamPostfix (MSGID string, USERFROM string, TOUSER string,DSN string, SIZE int);","insert",""); String query1ID=gestionaQuery( "from streamPostfix[DSN=='2.0.0' or DSN=='2.6.0' or DSN=='2.4.0']#window.time(20000) as resp "+ "join "+ "streamPostfix[ USERFROM != 'null' and SIZE >0 ]#window.time(20000) as tam "+ "on resp.MSGID==tam.MSGID "+ "insert all-events into respuestasOK "+ "tam.MSGID,resp.DSN,sum(tam.SIZE) as TAMANO group by tam.MSGID,tam.DSN;" , "insert", "", true);*/ gestionaStream("define stream radius (ACS_Timestamp string,ID int,User_Name string,Calling_Station_ID string,Authentication_Status string,Failure_Reason string);","insert",""); siddhiManager.defineTable("define table hosts (ID int, maquina string, mac string, cuenta long);"); gestionaQuery( "from radius[(User_Name contains 'host/')] "+ "select ID,User_Name as maquina, Calling_Station_ID as mac, count(1) as cuenta "+ "insert into hosts for current-events "+ ";" , "insert", "", false); gestionaQuery( "from radius[(User_Name contains 'host/')] "+ "join hosts as hosts "+ "on radius.Calling_Station_ID == hosts.mac and hosts.ID<radius.ID " + "select radius.ID,radius.User_Name as maquina, radius.Calling_Station_ID as mac, count(1) as cuenta "+ "delete hosts for current-events "+ ";" , "insert", "", false); gestionaQuery( "from radius[not(User_Name contains 'host/')] "+ "select ACS_Timestamp,ID,User_Name as usuario, Calling_Station_ID as mac, Authentication_Status as status, Failure_Reason as motivo "+ "insert into peticionesUsuario "+ ";" , "insert", "", false); gestionaQuery( "from peticionesUsuario as peticionesUsuario unidirectional "+ "join "+ "hosts as hosts "+ "on hosts.mac==peticionesUsuario.mac " + "select ACS_Timestamp,hosts.ID as idHost, peticionesUsuario.ID as ID , usuario, maquina, peticionesUsuario.mac, status, motivo "+ "insert into peticionConMaquina "+ ";" , "insert", "", false); gestionaQuery( "from peticionesUsuario[not(peticionesUsuario.mac==hosts.mac in hosts)] "+ /*not(fallidas.ID==hosts.ID in hosts) and not(fallidas.ID!=hosts.ID in hosts)*/ "select ACS_Timestamp,0 as idHost, ID , usuario, \"not defined\" as maquina, mac, status, motivo "+ "insert into peticionConMaquina "+ ";" , "insert", "", false); //Detalle de los registros de usuario (m�quina) q=gestionaQuery( "from peticionConMaquina#window.time(20000) "+ "select ACS_Timestamp,idHost, ID , usuario, maquina, mac, status, motivo, agregacion:sumConReset(1L,status,'Passed') as errorsConsecutivos,1 as tamano "+ "group by usuario "+ "insert into fallosConsecutivos for current-events "+ ";" , "insert", "", true); //Conteo de m�s de 3 fallos consecutivos (aunque se salga de laventana el primer registro "el de3 errores", el total seguir� marcando 3) /* gestionaQuery( "from fallosConsecutivos[errorsConsecutivos>=2]#window.time(20000) "+ "select ACS_Timestamp,idHost, ID , usuario, maquina, mac, status, motivo, errorsConsecutivos "+ "insert into masDeTresFallos for current-events "+ ";" , "insert", "", false);*/ } public SiddhiBoltMetricaOnlineRadius1(){ init(); } @Override public void execute(Tuple arg0, BasicOutputCollector arg1) { // TODO Auto-generated method stub collector=arg1; String[] campos=arg0.getString(0).split("�"); if(siddhiManager==null){ init(); } //recuperamos el Stream para pasarle la tupla InputHandler inputHandler = siddhiManager.getInputHandler("radius"); //Adaptamos los campos al formato definido por el stream //podr�amos recuperar el formato de los campos desde la metadata /* if(campos[12]==null) campos[12]="null"; if(campos[15]==null) campos[15]="null"; if(campos[20]==null) campos[20]="null"; if(campos[13].equals("null")) campos[13]="-1";*/ try { //Pasamos los valores relevantes de latupla al Stream de WSO2 //inputHandler.send(new Object[]{campos[2],campos[12],campos[15],campos[20],Integer.parseInt(campos[13])}); inputHandler.send(new Object[]{campos[3],Integer.parseInt(campos[1].trim()),campos[10],campos[16],campos[32],campos[21]}); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } cont++; /* if(cont==8){ gestionaQuery("","delete",q,false); }*/ } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { // TODO Auto-generated method stub //declarer.declare(new Fields("streamID", "datos")); declarer.declare(new Fields("index","type","id","document")); } @Override public void prepare(Map stormConf, TopologyContext context) { super.prepare(stormConf, context); } /** * <p>M�todo para a�adir o eliminar Streams del Siddhi-CEP</p> * @param streamDefinition Definici�n del STREAM a crear/eliminar * @param opcion Valores: *<p>      - insert: Crea el Stream indicado</p> *<p>      - delete: Elimina el Stream indicado</p> * @param streamID Nombre del STREAM si ha si ha sido creado. Si streamID no est� informado, se permite la creaci�n. * Si streamID est� informado se permite el borrado. * */ public void gestionaStream(String streamDefinition, String opcion,String streamID){ if(streamID!=null ){ if(opcion.equals("insert")){ //creamos siddhiManager.defineStream(streamDefinition); } }else{ System.out.println("El STREAM: "+streamID+" no existe"); if(opcion.equals("delete")){ //eliminamos siddhiManager.removeStream(streamID); } } } /** * <p>M�todo para a�adir o eliminar Queries del Siddhi-CEP</p> * <p>En la creaci�n/actualizaci�n adem�s se generar�n las funciones callback. * </p> * @param queryDef Nombre de la QUERY a crear/eliminar * @param opcion Valores: *<p>      - insert: Crea la QUERY indicada</p> *<p>      - delete: Elimina la QUERY indicada</p> * @param queryID Identificador de la query insertada en el Siddhi-CEP. * Si el ID no est� especificado solo se permite la inserci�n. * Si est� especificada permitimos el borrado y la inserci�n pasa a ser una actualizaci�n. * @param callback * <p>      - true: Genera la salida de los eventos al siguiente BOLT</p> * <p>      - false: No se genera callback</p> */ public String gestionaQuery(String queryDef, String opcion,String queryID,boolean callback){ String queryReference=queryID; if(opcion.equals("delete")){ //borramos la query del ID especificado siddhiManager.removeQuery(queryID); /*�Como tratamos las excepciones quepuedan llegar? - QueryID nulo - QueryID inv�lido */ } else if(opcion.equals("insert")){ if(queryID!=null){ //queryAntigua=siddhiManager.getQuery(queryID); //Si existe el ID y es v�lido, borramos la regla //if (queryAntigua!=null){ siddhiManager.removeQuery(queryID); /*�Como tratamos las excepciones quepuedan llegar? - QueryID nulo - QueryID inv�lido */ //} } //a�adimos la nueva Query queryReference=siddhiManager.addQuery(queryDef); /*�Como tratamos las excepciones quepuedan llegar? - queryDef nulo - queryDef inv�lido */ //actualizamos en la metadatael queryID devuelto por la creaci�n //Generamos callback si es necesario if(callback){ siddhiManager.addCallback(queryReference, new QueryCallback() { @Override public void receive(long timeStamp, Event[] inEvents, Event[] removeEvents) { // EventPrinter.print(timeStamp, inEvents, removeEvents); //generar la emisi�n de la tupla /*habr�a que generarun formato com�n de sailda a todas las reglas para pasar al Bolt de escrituraa ElasticSearch */ if(inEvents!=null){ for(Event e:inEvents){ System.out.println("++"+Arrays.toString(e.getData())); //collector.emit(new Values(e.getStreamId(), Arrays.toString(e.getData()))); /*String id=e.getData(0).toString()+"-"+e.getData(1).toString(); String docum="{\"MSGID\":\""+e.getData(0).toString()+"\","+ "\"DSN\":\""+e.getData(1)+"\","+ "\"tamano\":"+Long.parseLong(e.getData(2).toString())+ "}"; System.out.println("gg"); collector.emit(new Values("indiceprueba","typeprueba",id,docum,e.getStreamId(), e.getData()));*/ /* eventtimestamp idHost, ID , usuario, maquina, mac, status, motivo agregacion:sumConReset(1L,status,'Passed') as errorsConsecutivos */ String id=e.getData(0).toString()+"-"+e.getData(3).toString(); try { XContentBuilder dataBuilder=jsonBuilder().startObject() .field("@timestamp",e.getData(0).toString()) .field("idHost",e.getData(1)) .field("ID",Long.parseLong(e.getData(2).toString())) .field("usuario",e.getData(3)) .field("maquina",e.getData(4)) .field("mac",e.getData(5)) .field("status",e.getData(6)) .field("motivo",e.getData(7)) .field("erroresCons",Long.parseLong(e.getData(8).toString())) .field("tamano",Double.parseDouble(e.getData(9).toString())) .endObject(); System.out.println(dataBuilder.string()); collector.emit(new Values("ob_src_postfix","test2",id,dataBuilder.string())); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } if(removeEvents!=null){ for(Event e:removeEvents){ System.out.println("--"+Arrays.toString(e.getData())); //collector.emit(new Values(e.getStreamId(), Arrays.toString(e.getData()))); //----collector.emit(new Values(e.getStreamId(), e.getData())); //para la poc /*String id=e.getData(0).toString()+"-"+e.getData(1).toString(); String docum="{\"MSGID\":\""+e.getData(0).toString()+"\","+ "\"DSN\":\""+e.getData(1)+"\","+ "\"tamano\":"+Long.parseLong(e.getData(2).toString())+ "}"; System.out.println("gg"); collector.emit(new Values("indiceprueba","typeprueba",id,docum,e.getStreamId(), e.getData())); */ } } } }); } } return queryReference; } }