package br.com.centralit.citcorpore.batch;
import java.io.File;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import br.com.centralit.citcorpore.bean.NetMapDTO;
import br.com.centralit.citcorpore.comm.server.IPAddress;
import br.com.centralit.citcorpore.util.CITCorporeUtil;
import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.citframework.util.Constantes;
import br.com.citframework.util.UtilDatas;
public class MonitoraAtivosDiscovery extends Thread {
public static Semaphore semaforo = new Semaphore(1);
public static int PORTA_AGENTE_DOTNET = 7103;
public static String PORTA_SNMP = "161";
public static String DIRETORIO_ARQUIVOS_INVENTARIO;
public static String MENSAGEM_PROCESSAMENTO = "";
public static String MENSAGEM_PROCESSAMENTO_COMPL = "";
public static int NUMERO_THREADS = 1;
public static int QTDE_THREADS = 50;
public static boolean recomeca = false;
public static boolean iniciouDiscovery = false;
@Override
public void run() {
iniciouDiscovery = false;
String INVENTARIO_PROCESSAMENTO_ATIVO = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.INVENTARIO_PROCESSAMENTO_ATIVO, "N");
boolean isAtivo = INVENTARIO_PROCESSAMENTO_ATIVO.equalsIgnoreCase("S");
if (!isAtivo) {
MENSAGEM_PROCESSAMENTO_COMPL = "";
MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.processamentoInventarioDesativado";
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("Iniciando discovery de IPs");
MonitoraDiscoveryIP monitoraDiscoveryIP = new MonitoraDiscoveryIP();
monitoraDiscoveryIP.start();
iniciouDiscovery = true;
}
DIRETORIO_ARQUIVOS_INVENTARIO = CITCorporeUtil.CAMINHO_REAL_APP + "/tempInventario";
try {
System.out.println("Deletando arquivos que ainda existam na pasta..");
File fX = new File(DIRETORIO_ARQUIVOS_INVENTARIO);
if (fX.exists()) {
for (File file : fX.listFiles()) {
file.delete();
}
}
} catch (Exception e) {
e.printStackTrace();
}
MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.iniciandoProcessamentoAguarde";
if (!CITCorporeUtil.START_MODE_INVENTORY) {
System.out.println("CITSMART --> Processo de Invent�rio Desativado.");
MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.processoInvetarioDesativadoVerArquivosConfiguracao";
}
try {
Thread.sleep(240000);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true) {
if (!iniciouDiscovery) {
INVENTARIO_PROCESSAMENTO_ATIVO = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.INVENTARIO_PROCESSAMENTO_ATIVO, "N");
isAtivo = INVENTARIO_PROCESSAMENTO_ATIVO.equalsIgnoreCase("S");
if (!isAtivo) {
MENSAGEM_PROCESSAMENTO_COMPL = "";
MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.processamentoInventarioDesativado";
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
}
iniciouDiscovery = false;
} else {
MonitoraDiscoveryIP monitoraDiscoveryIP = new MonitoraDiscoveryIP();
monitoraDiscoveryIP.start();
iniciouDiscovery = true;
}
}
try {
processa();
} catch (Exception e) {
e.printStackTrace();
}
MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.aguardandoProximaExecucao";
if (!recomeca) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void processa() throws Exception {
if (!CITCorporeUtil.START_MODE_INVENTORY) {
return;
}
semaforo.acquireUninterruptibly();
try {
String ipServidorInv = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.IP_SERVIDOR_INVENTARIO, null);
String INVENTARIO_PROCESSAMENTO_ATIVO = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.INVENTARIO_PROCESSAMENTO_ATIVO, "N");
if (INVENTARIO_PROCESSAMENTO_ATIVO != null && INVENTARIO_PROCESSAMENTO_ATIVO.equalsIgnoreCase("N")) {
MENSAGEM_PROCESSAMENTO_COMPL = "";
MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.processamentoInventarioDesativado";
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
}
semaforo.release();
iniciouDiscovery = false;
return; // Nao processa
}
List<NetMapDTO> listNetMapDto = new ArrayList<NetMapDTO>();
MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.realizandoDiscoveryIpsAtivos#(" + ipServidorInv + ")";
List<NetMapDTO> listaSincronizada = Collections.synchronizedList(new ArrayList<NetMapDTO>(MonitoraDiscoveryIP.lstAddressDiscovery));
synchronized (listaSincronizada) {
listNetMapDto.addAll(listaSincronizada);
}
DIRETORIO_ARQUIVOS_INVENTARIO = CITCorporeUtil.CAMINHO_REAL_APP + "/tempInventario";
File fX = new File(DIRETORIO_ARQUIVOS_INVENTARIO);
if (!fX.exists()) {
fX.mkdirs();
}
DIRETORIO_ARQUIVOS_INVENTARIO = DIRETORIO_ARQUIVOS_INVENTARIO + "/";
// --
recomeca = false;
if (listNetMapDto != null) {
String table = "<table width='100%'>";
table += "<tr><td colspan='4'><b>IPs descobertos at� o momento (clique em Refresh para atualizar a lista): </b></td></tr>";
for (NetMapDTO netMapDTO : listNetMapDto) {
String nameOrIp = "";
if (netMapDTO.getNome() != null) {
if (netMapDTO.getNome().indexOf("(") > -1) {
netMapDTO.setNome(netMapDTO.getNome().substring(0, netMapDTO.getNome().indexOf("(") - 1));
}
netMapDTO.setNome(netMapDTO.getNome().trim());
nameOrIp = netMapDTO.getNome();
} else {
nameOrIp = netMapDTO.getIp();
}
String td = "<td>";
if (netMapDTO.isNovoIC()) {
td += "NOVO IC";
} else {
td += " ";
}
td += "</td>";
String dataInv = "";
if (netMapDTO.getDataInventario() != null) {
dataInv = UtilDatas.dateToSTR(netMapDTO.getDataInventario()) + " " + UtilDatas.formatHoraFormatadaHHMMSSStr(netMapDTO.getDataInventario());
}
table += "<tr>";
if (netMapDTO.getStatusPing() == null || netMapDTO.getStatusPing().equalsIgnoreCase(NetMapDTO.INDEFINIDO)) {
table += "<td onclick='fazPing(\"" + nameOrIp
+ "\")' style='border:1px solid black; cursor:pointer' title='<i18n:message key=\"mostrarStatusInventario.clickAquiParaAtaulizarStatus\"/>'><img src='"
+ Constantes.getValue("CONTEXTO_APLICACAO") + "/imagens/bolacinza2.png'/></td>";
} else if (netMapDTO.getStatusPing() != null && netMapDTO.getStatusPing().equalsIgnoreCase(NetMapDTO.ATIVO)) {
table += "<td onclick='fazPing(\"" + nameOrIp
+ "\")' style='border:1px solid black; cursor:pointer' title='<i18n:message key=\"mostrarStatusInventario.clickAquiParaAtaulizarStatus\"/>'><img src='"
+ Constantes.getValue("CONTEXTO_APLICACAO") + "/imagens/bolaverde.png'/></td>";
} else if (netMapDTO.getStatusPing() != null && netMapDTO.getStatusPing().equalsIgnoreCase(NetMapDTO.INATIVO)) {
table += "<td onclick='fazPing(\"" + nameOrIp
+ "\")' style='border:1px solid black; cursor:pointer' title='<i18n:message key=\"mostrarStatusInventario.clickAquiParaAtaulizarStatus\"/>'><img src='"
+ Constantes.getValue("CONTEXTO_APLICACAO") + "/imagens/bolavermelha.png'/></td>";
}
table += "<td style='border:1px solid black'>" + nameOrIp + "</td><td style='border:1px solid black'><button type='button' onclick='inventarioAgora(\"" + nameOrIp
+ "\")'><i18n:message key=\"mostrarStatusInventario.numeroThreadsDiscovery\"/></button></td><td style='border:1px solid black'>" + dataInv + "</td>" + td + "</tr>";
}
table += "</table>";
MENSAGEM_PROCESSAMENTO_COMPL = table;
boolean temICNovo = false;
ExecutorService exService = null;
exService = Executors.newFixedThreadPool(NUMERO_THREADS);
int qtde = 0;
for (NetMapDTO netMapDTO : listNetMapDto) {
if ((netMapDTO.isNovoIC() || netMapDTO.isForce()) && netMapDTO.okTimeToProcess()) { // Primeiro prioriza os ICS novos.
// temICNovo = true;
MonitoraAtivosDiscovery.MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.verificandoStatusIp#" + netMapDTO.getIp();
IPAddress ipAddr = new IPAddress(netMapDTO.getIp());
if (ipAddr.ping()) {
netMapDTO.setStatusPing(NetMapDTO.ATIVO);
try {
ThreadProcessaInventario t = new ThreadProcessaInventario();
netMapDTO.setDateTimeControlProcessInv(UtilDatas.somaSegundos(UtilDatas.getDataHoraAtual(), 300)); // Adiciona 5 minutos de controle.
t.setNetMapDTO(netMapDTO);
exService.submit(new RunnableThread(t), "done");
qtde++;
} finally {
Thread.sleep(2000); // D� um tempo pra tudo se organizar, Garbage, etc... Da tempo entre uma chamada e outra
}
} else {
netMapDTO.setStatusPing(NetMapDTO.INATIVO);
}
if (recomeca) {
break;
}
if (qtde > QTDE_THREADS) {
qtde = 0;
try {
Thread.sleep(60000);
Thread.sleep(60000);
} catch (InterruptedException e) {
}
}
}
}
qtde = 0;
if (!temICNovo && !recomeca) {
for (NetMapDTO netMapDTO : listNetMapDto) {
if (netMapDTO.okTimeToProcess()) {
MonitoraAtivosDiscovery.MENSAGEM_PROCESSAMENTO = "mostrarStatusInventario.verificandoStatusIp#" + netMapDTO.getIp();
IPAddress ipAddr = new IPAddress(netMapDTO.getIp());
if (ipAddr.ping()) {
netMapDTO.setStatusPing(NetMapDTO.ATIVO);
try {
ThreadProcessaInventario t = new ThreadProcessaInventario();
netMapDTO.setDateTimeControlProcessInv(UtilDatas.somaSegundos(UtilDatas.getDataHoraAtual(), 300)); // Adiciona 5 minutos de controle.
t.setNetMapDTO(netMapDTO);
exService.submit(new RunnableThread(t), "done");
qtde++;
} catch (Exception e) {
e.printStackTrace();
} finally {
Thread.sleep(2000); // D� um tempo pra tudo se organizar, Garbage, etc... Da tempo entre uma chamada e outra
}
} else {
netMapDTO.setStatusPing(NetMapDTO.INATIVO);
}
if (recomeca) {
break;
}
if (qtde > QTDE_THREADS) {
qtde = 0;
try {
Thread.sleep(60000);
Thread.sleep(60000);
} catch (InterruptedException e) {
}
}
}
}
}
}
} finally {
semaforo.release();
}
}
class RunnableThread implements Runnable {
private ThreadProcessaInventario t = null;
public RunnableThread(ThreadProcessaInventario tParm) {
t = tParm;
}
@Override
public void run() {
try {
if (t != null) {
int contador = 0;
t.start();
while (!t.isFinish()) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
if (contador >= 400) {
break;
}
contador++;
}
t.setBreakThread(true);
t.setFinish(true);
Thread.sleep(3000);
t.interrupt();
t = null;
}
} catch (Exception e) {
} finally {
if (t != null) {
try {
t.setBreakThread(true);
} catch (Exception e) {
}
t.setFinish(true);
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
}
try {
t.interrupt();
} catch (Exception e) {
}
}
t = null;
}
}
}
public static void main(String[] args) {
ThreadProcessaInventario t = new ThreadProcessaInventario();
NetMapDTO netMapDTO = new NetMapDTO();
netMapDTO.setNome("10.0.1.114");
netMapDTO.setIp("10.0.1.114");
t.setNetMapDTO(netMapDTO);
SimpleDateFormat spd = new SimpleDateFormat("yyyyMMdd");
Date dataAtual = UtilDatas.getDataAtual();
String dataAtualInv = spd.format(dataAtual).trim();
t.geraInventarioAtivo("localhost", "10.0.1.114", "10.0.1.114", dataAtualInv);
/*
* SimpleDateFormat spd = new SimpleDateFormat("yyyyMMdd"); String dataAtualInv = spd.format(UtilDatas.getDataAtual()).trim(); System.out.println("INICIANDO..."); MonitoraAtivosDiscovery
* monitoraAtivosDiscovery = new MonitoraAtivosDiscovery(); monitoraAtivosDiscovery.run();
*/
/*
* NetMapDTO netMapDTO = new NetMapDTO(); netMapDTO.setNome("CITDFPC0470"); //netMapDTO.setNome("CITDFNTB001"); //netMapDTO.setNome("10.0.1.63"); //netMapDTO.setNome("localhost");
* netMapDTO.setIp("10.0.1.116"); boolean agenteLocalDOTNET = false; boolean agenteServerWindows = false; if(netMapDTO.getNome() != null){ agenteLocalDOTNET =
* monitoraAtivosDiscovery.geraInventarioAtivoAgenteLocal (netMapDTO.getNome(), dataAtualInv); }else{ agenteLocalDOTNET = monitoraAtivosDiscovery
* .geraInventarioAtivoAgenteLocal(netMapDTO.getIp(), dataAtualInv); } if (!agenteLocalDOTNET){ //Se nao tem AGENTE LOCAL .NET if(netMapDTO.getNome() != null){ agenteServerWindows =
* monitoraAtivosDiscovery .geraInventarioAtivo(IP_SERVER_WINDOWS_INVENTARIO, netMapDTO.getNome(), netMapDTO.getNome(), dataAtualInv); }else{ agenteServerWindows =
* monitoraAtivosDiscovery.geraInventarioAtivo(IP_SERVER_WINDOWS_INVENTARIO , netMapDTO.getIp(), netMapDTO.getIp(), dataAtualInv); } }
*/
System.out.println("FINALIZANDO...");
}
}