package br.com.centralit.citcorpore.batch; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.sql.Date; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; import br.com.centralit.citcorpore.bean.FormulaDTO; import br.com.centralit.citcorpore.bean.ItemConfiguracaoDTO; import br.com.centralit.citcorpore.bean.NetMapDTO; import br.com.centralit.citcorpore.comm.server.XmlReadDtdAgente; import br.com.centralit.citcorpore.metainfo.script.ScriptRhinoJSExecute; import br.com.centralit.citcorpore.metainfo.util.RuntimeScript; import br.com.centralit.citcorpore.negocio.FormulaService; import br.com.centralit.citcorpore.negocio.ItemConfiguracaoService; import br.com.centralit.citcorpore.snmp.SNMPManager; import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema; import br.com.centralit.citcorpore.util.ParametroUtil; import br.com.citframework.excecao.LogicException; import br.com.citframework.excecao.ServiceException; import br.com.citframework.service.ServiceLocator; import br.com.citframework.util.UtilDatas; import br.com.citframework.util.UtilTratamentoArquivos; @SuppressWarnings({ "unchecked", "rawtypes" }) public class ThreadProcessaInventario extends Thread { private NetMapDTO netMapDTO; private boolean finish = false; private boolean breakThread = false; private Socket echoSocket = null; private PrintWriter out = null; private BufferedReader in = null; @Override public void run() { if (netMapDTO == null) { finish = true; return; } netMapDTO.setNovoIC(false); netMapDTO.setForce(false); SimpleDateFormat spd = new SimpleDateFormat("yyyyMMdd"); Date dataAtual = UtilDatas.getDataAtual(); String dataAtualInv = spd.format(dataAtual).trim(); boolean agenteLocalDOTNET = false; boolean agenteServerWindows = false; boolean agenteSNMP = false; String nameOrIp = ""; if (netMapDTO.getNome() != null) { nameOrIp = netMapDTO.getNome(); } else { nameOrIp = netMapDTO.getIp(); } FormulaService formulaService = null; try { formulaService = (FormulaService) ServiceLocator.getInstance().getService(FormulaService.class, null); } catch (ServiceException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } MonitoraAtivosDiscovery.MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.verificandoOAtivo" + "#" + nameOrIp; File fXX = new File(MonitoraAtivosDiscovery.DIRETORIO_ARQUIVOS_INVENTARIO + "CITSMART_INVENTORY_" + nameOrIp + "_" + dataAtualInv + ".BKP"); if (!fXX.exists()) { String ipServidorInv = null; try { ipServidorInv = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.IP_SERVIDOR_INVENTARIO, null); } catch (Exception e1) { e1.printStackTrace(); } boolean arquivoExiste = false; MonitoraAtivosDiscovery.MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.capturandoInventario" + "#" + nameOrIp; try { Collection<FormulaDTO> listFormula = formulaService.findByIdentificador(FormulaDTO.FORMULA_INVENTORY_PROCESS_BEFORE_CAPTURE); if (listFormula != null && !listFormula.isEmpty()) { for (FormulaDTO formulaDTO : listFormula) { if (formulaDTO != null) { String strScript = formulaDTO.getConteudo(); if (strScript != null && !strScript.trim().equalsIgnoreCase("")) { ScriptRhinoJSExecute scriptExecute = new ScriptRhinoJSExecute(); RuntimeScript runtimeScript = new RuntimeScript(); Context cx = Context.enter(); Scriptable scope = cx.initStandardObjects(); scope.put("listaInfo", scope, null); scope.put("fileName", scope, MonitoraAtivosDiscovery.DIRETORIO_ARQUIVOS_INVENTARIO + "CITSMART_INVENTORY_" + nameOrIp + "_" + dataAtualInv + ".XML"); scope.put("netMapDTO", scope, netMapDTO); scope.put("thread", scope, this); scope.put("out", scope, System.out); scope.put("dataAtualInv", scope, dataAtualInv); scope.put("RuntimeScript", scope, runtimeScript); scriptExecute.processScript(cx, scope, strScript, ThreadProcessaInventario.class.getName() + "_" + FormulaDTO.FORMULA_INVENTORY_PROCESS_SAVE); } } } } if (finish) { return; } } catch (Exception e) { e.printStackTrace(); } fXX = new File(MonitoraAtivosDiscovery.DIRETORIO_ARQUIVOS_INVENTARIO + "CITSMART_INVENTORY_" + nameOrIp + "_" + dataAtualInv + ".XML"); if (fXX.exists()) { arquivoExiste = true; } else { agenteLocalDOTNET = geraInventarioAtivoAgenteLocal(nameOrIp, dataAtualInv); if (!agenteLocalDOTNET) { // Se nao tem AGENTE LOCAL .NET, tenta AGENTE SERVER if (ipServidorInv != null && !ipServidorInv.trim().equalsIgnoreCase("")) { agenteServerWindows = geraInventarioAtivo(ipServidorInv, nameOrIp, nameOrIp, dataAtualInv); } if (!agenteServerWindows) { // Se nao tem AGENTE SERVER .NET, tenta SNMP agenteSNMP = geraInventarioAtivoSNMP(nameOrIp, dataAtualInv); if (agenteSNMP) { MonitoraAtivosDiscovery.MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.inventarioDoAtivo" + "#" + nameOrIp + "#" + "mostrarStatusInventario.caturadoComSucesso"; arquivoExiste = true; } else { MonitoraAtivosDiscovery.MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.inventarioDoAtivo" + "#" + nameOrIp + "#" + "mostrarStatusInventario.problemaAoCapturarInforma��es"; } } else { // Deu certo, entao grava na lista para processamento MonitoraAtivosDiscovery.MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.inventarioDoAtivo" + "#" + nameOrIp + "#" + "mostrarStatusInventario.caturadoComSucesso"; arquivoExiste = true; } } else { // Deu certo, entao grava na lista para processamento MonitoraAtivosDiscovery.MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.inventarioDoAtivo" + "#" + nameOrIp + "#" + "mostrarStatusInventario.caturadoComSucesso"; arquivoExiste = true; } } if (arquivoExiste) { boolean erroAux = false; MonitoraAtivosDiscovery.MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.processamentoOInventarioDoAtivo" + "#" + nameOrIp; String fileName = MonitoraAtivosDiscovery.DIRETORIO_ARQUIVOS_INVENTARIO + "CITSMART_INVENTORY_" + nameOrIp + "_" + dataAtualInv + ".XML"; File f = new File(fileName); if (!f.exists()) { MonitoraAtivosDiscovery.MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.arquivoDeInvetarioNaoExiste" + "#" + nameOrIp; finish = true; return; } f = null; StringBuilder strBuffer = null; try { strBuffer = UtilTratamentoArquivos.lerArquivoCharUTF8(fileName); } catch (Exception e) { e.printStackTrace(); erroAux = true; } if (!erroAux) { XmlReadDtdAgente xmlReadDtdAgente = new XmlReadDtdAgente(); List<ItemConfiguracaoDTO> list = null; try { if (strBuffer != null) { String aux = strBuffer.toString(); if (aux.indexOf("<") > -1) { aux = aux.substring(aux.indexOf("<")); list = xmlReadDtdAgente.XmlReadDtdAgent(aux); } } } catch (ServiceException e) { System.out.println("CITSMART --> PROBLEMAS NO PROCESSAMENTO DO ARQUIVO: " + fileName); e.printStackTrace(); erroAux = true; } catch (LogicException e) { System.out.println("CITSMART --> PROBLEMAS NO PROCESSAMENTO DO ARQUIVO: " + fileName); e.printStackTrace(); erroAux = true; } catch (Exception e) { System.out.println("CITSMART --> PROBLEMAS NO PROCESSAMENTO DO ARQUIVO: " + fileName); e.printStackTrace(); erroAux = true; } ItemConfiguracaoService serviceItem = null; try { serviceItem = (ItemConfiguracaoService) ServiceLocator.getInstance().getService(ItemConfiguracaoService.class, null); } catch (ServiceException e) { e.printStackTrace(); erroAux = true; } catch (Exception e) { e.printStackTrace(); erroAux = true; } if (!erroAux) { try { if (list != null) { if (!breakThread) { try { Collection<FormulaDTO> col = formulaService.findByIdentificador(FormulaDTO.FORMULA_INVENTORY_PROCESS_SAVE); if (col != null && !col.isEmpty()) { for (FormulaDTO formulaDTO : col) { if (formulaDTO != null) { String strScript = formulaDTO.getConteudo(); if (strScript != null && !strScript.trim().equalsIgnoreCase("")) { ScriptRhinoJSExecute scriptExecute = new ScriptRhinoJSExecute(); RuntimeScript runtimeScript = new RuntimeScript(); Context cx = Context.enter(); Scriptable scope = cx.initStandardObjects(); scope.put("listaInfo", scope, list); scope.put("fileName", scope, fileName); scope.put("netMapDTO", scope, netMapDTO); scope.put("thread", scope, this); scope.put("out", scope, System.out); scope.put("dataAtualInv", scope, dataAtualInv); scope.put("RuntimeScript", scope, runtimeScript); scriptExecute.processScript(cx, scope, strScript, ThreadProcessaInventario.class.getName() + "_" + FormulaDTO.FORMULA_INVENTORY_PROCESS_SAVE); } } } } if (finish) { return; } } catch (Exception e) { e.printStackTrace(); } try { List<ItemConfiguracaoDTO> listaSincronizada = Collections.synchronizedList(new ArrayList<ItemConfiguracaoDTO>(list)); synchronized (listaSincronizada) { if (listaSincronizada != null && !listaSincronizada.isEmpty()) { for (ItemConfiguracaoDTO itemConfiguracaoDTO : listaSincronizada) { serviceItem.createItemConfiguracao(itemConfiguracaoDTO, null); } } } } catch (Exception e) { e.printStackTrace(); } String fileNameBkp = fileName.replaceAll(".XML", ".BKP"); UtilTratamentoArquivos.copyFile(fileName, fileNameBkp); File fAux = new File(fileName); fAux.delete(); fAux = null; netMapDTO.setForce(false); netMapDTO.setDataInventario(new java.sql.Date(UtilDatas.getDataHoraAtual().getTime())); } else { netMapDTO.setForce(true); } } } catch (Exception e) { e.printStackTrace(); } finally { serviceItem = null; } } serviceItem = null; } } } else { MonitoraAtivosDiscovery.MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.oAtivo" + "#<b>" + nameOrIp + "</b>#" + "mostrarStatusInventario.jaTemInventarioCapturadoParaHoje"; netMapDTO.setForce(false); } fXX = null; finish = true; } private boolean geraInventarioAtivoSNMP(String nomeHostIP, String dataAtualInv) { try { String xml = SNMPManager.getSNMPXML(nomeHostIP, MonitoraAtivosDiscovery.PORTA_SNMP, null); if (xml != null && !xml.trim().equalsIgnoreCase("")) { UtilTratamentoArquivos.gravaArquivoCharSetISO(MonitoraAtivosDiscovery.DIRETORIO_ARQUIVOS_INVENTARIO + "CITSMART_INVENTORY_" + nomeHostIP + "_" + dataAtualInv + ".XML", xml); return true; } return false; } catch (Exception e) { return false; } } private boolean geraInventarioAtivoAgenteLocal(String nomeHostIPServer, String dataAtualInv) { return geraInventarioAtivo(nomeHostIPServer, "localhost", nomeHostIPServer, dataAtualInv); } public boolean geraInventarioAtivo(String nomeHostIPServer, String nomeHostIPInventario, String nomeGerarFile, String dataAtualInv) { boolean retorno = false; try { echoSocket = new Socket(nomeHostIPServer, MonitoraAtivosDiscovery.PORTA_AGENTE_DOTNET); // corretiva 162506 - Esta altera��o corrige problema de retorno de // Caracteres n�o convertidos para o CharSet correto. out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(echoSocket.getOutputStream(), "ISO-8859-1")), true); in = new BufferedReader(new InputStreamReader(this.echoSocket.getInputStream(), "ISO-8859-1")); } catch (UnknownHostException e) { // System.err.println("Don't know about host: localhost."); try { if (out != null) { out.close(); } } catch (Exception eX1) { } try { if (in != null) { in.close(); } } catch (Exception eX1) { } try { // Encerra o echoSocket if (echoSocket != null && !echoSocket.isClosed()) { echoSocket.close(); } } catch (IOException eZ) { System.out.println("Problema ao encerrar o socket: " + eZ); e.printStackTrace(); } echoSocket = null; out = null; in = null; return false; } catch (IOException e) { // System.err.println("Couldn't get I/O for the connection to: localhost."); try { if (out != null) { out.close(); } } catch (Exception eX1) { } try { if (in != null) { in.close(); } } catch (Exception eX1) { } try { // Encerra o echoSocket if (echoSocket != null && !echoSocket.isClosed()) { echoSocket.close(); } } catch (IOException eZ) { System.out.println("Problema ao encerrar o socket: " + eZ); e.printStackTrace(); } echoSocket = null; out = null; in = null; return false; } try { out.println("GETINVENT:" + nomeHostIPInventario + "\n"); } catch (Exception e) { try { // Encerra o echoSocket if (echoSocket != null && !echoSocket.isClosed()) { echoSocket.close(); } } catch (IOException eZ) { System.out.println("Problema ao encerrar o socket: " + eZ); e.printStackTrace(); } } // out.println("INVENTORY:" + nomeHostIPInventario + "\n"); String answer = ""; List lst = new ArrayList(); try { answer = in.readLine(); if (answer.trim().equalsIgnoreCase("NOK")) { out.println("INVENTORY:" + nomeHostIPInventario + "\n"); } else { lst.add(answer); } } catch (Exception e) { try { if (out != null) { out.close(); } } catch (Exception eX1) { } try { if (in != null) { in.close(); } } catch (Exception eX1) { } try { // Encerra o echoSocket if (echoSocket != null && !echoSocket.isClosed()) { echoSocket.close(); } } catch (IOException eX) { System.out.println("Problema ao encerrar o socket: " + e); eX.printStackTrace(); } echoSocket = null; out = null; in = null; return false; } while (true) { try { if (finish) { break; } answer = in.readLine(); if (answer == null) { break; } if (answer.trim().equalsIgnoreCase("NOK")) { break; } lst.add(answer); // System.out.println(answer); if (answer.trim().equalsIgnoreCase("</CONTENT>")) { lst.add("</REQUEST>"); break; } } catch (Exception e) { break; } } if (!finish) { try { if (lst != null && lst.size() > 0) { UtilTratamentoArquivos.gravaArquivoCharSetISO(MonitoraAtivosDiscovery.DIRETORIO_ARQUIVOS_INVENTARIO + "CITSMART_INVENTORY_" + nomeGerarFile + "_" + dataAtualInv + ".XML", lst); retorno = true; } } catch (IOException e) { e.printStackTrace(); } } try { out.println("<EOF>\n"); } catch (Exception e) { } try { out.close(); } catch (Exception e) { e.printStackTrace(); } try { in.close(); } catch (IOException e) { e.printStackTrace(); } try { echoSocket.close(); } catch (IOException e) { e.printStackTrace(); } out = null; in = null; echoSocket = null; return retorno; } public NetMapDTO getNetMapDTO() { return netMapDTO; } public void setNetMapDTO(NetMapDTO netMapDTO) { this.netMapDTO = netMapDTO; } public boolean isFinish() { return finish; } public void setFinish(boolean finish) { this.finish = finish; } public boolean isBreakThread() { return breakThread; } public void setBreakThread(boolean breakThread) { this.breakThread = breakThread; } @Override public void interrupt() { finish = true; try { if (out != null) { out.close(); } } catch (Exception eX1) { } try { if (in != null) { in.close(); } } catch (Exception eX1) { } try { // Encerra o echoSocket if (echoSocket != null && !echoSocket.isClosed()) { echoSocket.close(); } } catch (IOException eZ) { } echoSocket = null; out = null; in = null; super.interrupt(); } }