package br.com.centralit.nagios; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.Semaphore; import org.apache.commons.lang.StringUtils; import br.com.centralit.citcorpore.bean.EmpregadoDTO; import br.com.centralit.citcorpore.bean.EventoMonitoramentoDTO; import br.com.centralit.citcorpore.bean.ItemConfiguracaoDTO; import br.com.centralit.citcorpore.bean.RecursoDTO; import br.com.centralit.citcorpore.bean.ServicoContratoDTO; import br.com.centralit.citcorpore.bean.ServicoDTO; import br.com.centralit.citcorpore.bean.SolicitacaoServicoDTO; import br.com.centralit.citcorpore.bean.SolicitacaoServicoEvtMonDTO; import br.com.centralit.citcorpore.bean.UsuarioDTO; import br.com.centralit.citcorpore.mail.MensagemEmail; import br.com.centralit.citcorpore.negocio.EmpregadoServiceEjb; import br.com.centralit.citcorpore.negocio.EventoMonitoramentoServiceEjb; import br.com.centralit.citcorpore.negocio.ItemConfiguracaoServiceEjb; import br.com.centralit.citcorpore.negocio.RecursoServiceEjb; import br.com.centralit.citcorpore.negocio.ServicoContratoServiceEjb; import br.com.centralit.citcorpore.negocio.ServicoServiceEjb; import br.com.centralit.citcorpore.negocio.SolicitacaoServicoEvtMonServiceEjb; import br.com.centralit.citcorpore.negocio.SolicitacaoServicoServiceEjb; import br.com.centralit.citcorpore.negocio.UsuarioServiceEjb; import br.com.centralit.citcorpore.util.Enumerados; import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema; import br.com.centralit.citcorpore.util.ParametroUtil; import br.com.centralit.nagios.livestatus.tables.Hosts; import br.com.centralit.nagios.livestatus.tables.Services; import br.com.citframework.excecao.LogicException; import br.com.citframework.excecao.ServiceException; import br.com.citframework.util.UtilDatas; import br.com.citframework.util.UtilStrings; public class MonitoraNagios extends Thread { public static Semaphore performanceDataSemaphore = new Semaphore(1); public static PerformanceData performanceData; public static JavNag javaNagios; long lastPerformanceDump = 0; public static Map<String, String> mapaStatusHosts = new HashMap<>(); public static Map<String, Integer> mapaStatusHosts_RegIncident = new HashMap<>(); private final EmpregadoServiceEjb empregadoService = new EmpregadoServiceEjb(); private final EventoMonitoramentoServiceEjb eventoMonitoramentoService = new EventoMonitoramentoServiceEjb(); private final ItemConfiguracaoServiceEjb itemConfiguracaoServiceEjb = new ItemConfiguracaoServiceEjb(); private final RecursoServiceEjb recursoService = new RecursoServiceEjb(); private final ServicoContratoServiceEjb servicoContratoService = new ServicoContratoServiceEjb(); private final ServicoServiceEjb servicoService = new ServicoServiceEjb(); private final UsuarioServiceEjb usuarioService = new UsuarioServiceEjb(); private final SolicitacaoServicoServiceEjb solicitacaoServicoService = new SolicitacaoServicoServiceEjb(); private final SolicitacaoServicoEvtMonServiceEjb solicitacaoServicoEvtMonServiceEjb = new SolicitacaoServicoEvtMonServiceEjb(); @Override public void run() { final String habilitaMonitoramentoNagios = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.HABILITA_MONITORAMENTO_NAGIOS, "N"); if (habilitaMonitoramentoNagios != null && habilitaMonitoramentoNagios.trim().equalsIgnoreCase("S")) { performanceData = new PerformanceData(); while (true) { performanceDataSemaphore.acquireUninterruptibly(); try { System.out.println("CITSMART - Carregando informacoes do Nagios..."); javaNagios = new JavNag(); final String nagiosTipoAcesso = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.NAGIOS_TIPO_ACESSO, "1"); if (nagiosTipoAcesso != null && StringUtils.isNotBlank(nagiosTipoAcesso)) { if (nagiosTipoAcesso.trim().equalsIgnoreCase("1")) { final String conexoes = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.NAGIOS_CONEXOES_LIVESTATUS, ""); if (conexoes != null && StringUtils.isNotBlank(conexoes)) { final String[] nagiosConexoes = conexoes.split(","); for (final String conexao : nagiosConexoes) { final Hosts servidorNagios = new Hosts(conexao.trim()); try { for (final String nomeHost : servidorNagios.hosts()) { final Host host = new Host("Nagios", nomeHost); final Map<String, String> atributosHost = servidorNagios.asArrayString("hosts", "name = " + nomeHost); for (final String key : atributosHost.keySet()) { host.addParameter(key, atributosHost.get(key)); } for (final String serviceName : servidorNagios.services(nomeHost)) { final Services serviceHostLiveStatus = new Services(conexao.trim()); final Map<String, String> atributosService = serviceHostLiveStatus.asArrayString("services", "display_name = " + serviceName + "," + "host_name = " + nomeHost); for (final String keyService : atributosService.keySet()) { host.addServiceEntry(serviceName, keyService, atributosService.get(keyService)); } } javaNagios.hosts.add(host); } } catch (final Exception e1) { e1.printStackTrace(); } } } } else { if (nagiosTipoAcesso.trim().equalsIgnoreCase("2")) { String pathNagiosMon = ""; try { pathNagiosMon = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.PATH_NAGIOS_STATUS, "C:\\jboss\\jboss\\server\\default\\deploy\\status.dat.txt"); } catch (final Exception e1) { pathNagiosMon = "C:\\jboss\\jboss\\server\\default\\deploy\\status.dat.txt"; } try { javaNagios.loadNagiosData(pathNagiosMon, 3, "Nagios"); } catch (final Exception e) {} } } } try { this.collectPerformanceData(javaNagios); } catch (final Exception e) {} } finally { performanceDataSemaphore.release(); } super.run(); try { Thread.sleep(60000); } catch (final InterruptedException e) {} } } } public void generateHashLastState(final JavNag javNag) throws Exception { for (final Host currentHost : javNag.getListOfHosts()) { final List<ParameterEntry> hostEntries = currentHost.getParameters(); String current_state = currentHost.getParameter("current_state"); if (current_state.equalsIgnoreCase("1")) { current_state = "DOWN"; } else if (current_state.equalsIgnoreCase("0")) { current_state = "UP"; } else { current_state = "PENDING"; } final String last_check_str = currentHost.getParameter("last_check"); int last_check = 0; try { last_check = Integer.parseInt(last_check_str); } catch (final Exception e) {} if (current_state.equalsIgnoreCase("DOWN") || current_state.equalsIgnoreCase("CRITICAL") || current_state.equalsIgnoreCase("WARNING")) { final Integer lastRegIncidente = mapaStatusHosts_RegIncident.get(currentHost.getHostName()); if (lastRegIncidente == null || lastRegIncidente.intValue() != last_check) { final Collection col = recursoService.findByHostName(currentHost.getHostName()); if (col != null) { for (final Iterator it = col.iterator(); it.hasNext();) { RecursoDTO recursoDTO = (RecursoDTO) it.next(); if (recursoDTO.getServiceName() == null || recursoDTO.getServiceName().trim().equalsIgnoreCase("")) { try { this.generateIncidente(recursoDTO, currentHost.getHostName(), current_state, last_check, hostEntries); } catch (final Exception e) { e.printStackTrace(); } } recursoDTO = null; } } } } current_state = current_state + "#" + last_check_str; mapaStatusHosts.put(currentHost.getHostName(), current_state); } } public void generateIncidente(final RecursoDTO recursoDTO, final String hostName, final String current_state, final int last_check, final List<ParameterEntry> hostEntries) throws ServiceException, LogicException { if (recursoDTO == null) { return; } if (recursoDTO.getStatusAberturaInc() == null || recursoDTO.getStatusAberturaInc().trim().equalsIgnoreCase("")) { return; } if (recursoDTO.getStatusAberturaInc().indexOf(current_state) > -1) { // Se o status em questao estiver dentro da // lista informada no cadastro. o padrao eh DOWN,CRITICAL,... Collection colDados = null; try { colDados = solicitacaoServicoEvtMonServiceEjb.findByIdRecursoAndSolicitacaoAberta(recursoDTO.getIdRecurso()); } catch (final Exception e1) { e1.printStackTrace(); } if (colDados == null || colDados.size() == 0) { ServicoContratoDTO servicoContratoDTO = new ServicoContratoDTO(); servicoContratoDTO.setIdServicoContrato(recursoDTO.getIdServicoContrato()); try { servicoContratoDTO = (ServicoContratoDTO) servicoContratoService.restore(servicoContratoDTO); } catch (final Exception e) { e.printStackTrace(); servicoContratoDTO = null; } String nameEventSystem = ""; if (recursoDTO.getIdEventoMonitoramento() != null && recursoDTO.getIdEventoMonitoramento().intValue() > 0) { EventoMonitoramentoDTO eventoMonitoramentoDTO = new EventoMonitoramentoDTO(); eventoMonitoramentoDTO.setIdEventoMonitoramento(recursoDTO.getIdEventoMonitoramento()); eventoMonitoramentoDTO = (EventoMonitoramentoDTO) eventoMonitoramentoService.restore(eventoMonitoramentoDTO); if (eventoMonitoramentoDTO != null) { nameEventSystem = eventoMonitoramentoDTO.getNomeEvento(); } } String descr = recursoDTO.getDescricaoAbertInc(); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{dadosmonitoramento\\}", this.getInfoParameters(hostEntries)); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{hostname\\}", hostName); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{eventname\\}", nameEventSystem); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{currentstate\\}", current_state); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{dataatual\\}", UtilDatas.dateToSTR(UtilDatas.getDataAtual())); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{datahoraatual\\}", UtilDatas.dateToSTR(UtilDatas.getDataHoraAtual()) + " - " + UtilDatas.formatHoraFormatadaHHMMSSStr(UtilDatas.getDataHoraAtual())); SolicitacaoServicoDTO solicitacaoServicoDTO = new SolicitacaoServicoDTO(); solicitacaoServicoDTO.setIdSolicitante(recursoDTO.getIdSolicitante()); solicitacaoServicoDTO.setDescricao(descr); solicitacaoServicoDTO.setIdOrigem(recursoDTO.getIdOrigem()); if (servicoContratoDTO != null) { solicitacaoServicoDTO.setIdContrato(servicoContratoDTO.getIdContrato()); } solicitacaoServicoDTO.setIdServicoContrato(recursoDTO.getIdServicoContrato()); solicitacaoServicoDTO.setIdGrupoAtual(recursoDTO.getIdGrupo()); solicitacaoServicoDTO.setSituacao(Enumerados.SituacaoSolicitacaoServico.EmAndamento.name()); solicitacaoServicoDTO.setEmailcontato(recursoDTO.getEmailAberturaInc()); solicitacaoServicoDTO.setUrgencia(recursoDTO.getUrgencia()); solicitacaoServicoDTO.setImpacto(recursoDTO.getImpacto()); EmpregadoDTO empregadoDto = new EmpregadoDTO(); empregadoDto.setIdEmpregado(recursoDTO.getIdSolicitante()); try { empregadoDto = (EmpregadoDTO) empregadoService.restore(empregadoDto); } catch (final Exception e) { empregadoDto = null; } UsuarioDTO usuario = new UsuarioDTO(); if (empregadoDto != null) { solicitacaoServicoDTO.setNomecontato(empregadoDto.getNome()); solicitacaoServicoDTO.setTelefonecontato(empregadoDto.getTelefone()); solicitacaoServicoDTO.setRamal(empregadoDto.getRamal()); solicitacaoServicoDTO.setIdUnidade(empregadoDto.getIdUnidade()); usuario.setIdEmpregado(empregadoDto.getIdEmpregado()); try { usuario = usuarioService.restoreByIdEmpregado(empregadoDto.getIdEmpregado()); } catch (final Exception e) { e.printStackTrace(); } } solicitacaoServicoDTO.setObservacao("Automatically generate by monitoring system.\n" + nameEventSystem + "\nState: " + current_state); ServicoDTO servicoDTO = new ServicoDTO(); if (servicoContratoDTO != null) { servicoDTO.setIdServico(servicoContratoDTO.getIdServico()); } servicoDTO = (ServicoDTO) servicoService.restore(servicoDTO); if (servicoContratoDTO != null) { solicitacaoServicoDTO.setIdServico(servicoContratoDTO.getIdServico()); solicitacaoServicoDTO.setIdTipoDemandaServico(servicoDTO.getIdTipoDemandaServico()); } solicitacaoServicoDTO.setUsuarioDto(usuario); solicitacaoServicoDTO.setRegistradoPor(usuario.getNomeUsuario()); solicitacaoServicoDTO.setEnviaEmailCriacao("S"); solicitacaoServicoDTO.setEnviaEmailAcoes("S"); solicitacaoServicoDTO.setEnviaEmailFinalizacao("S"); if (recursoDTO.getIdItemConfiguracao() != null) { final List<ItemConfiguracaoDTO> colItensIC = new ArrayList<ItemConfiguracaoDTO>(); ItemConfiguracaoDTO itemConfiguracaoDTO = null; try { itemConfiguracaoDTO = itemConfiguracaoServiceEjb.restoreByIdItemConfiguracao(recursoDTO.getIdItemConfiguracao()); } catch (final Exception e) { e.printStackTrace(); itemConfiguracaoDTO = null; } if (itemConfiguracaoDTO != null) { colItensIC.add(itemConfiguracaoDTO); solicitacaoServicoDTO.setColItensICSerialize(colItensIC); } } final SolicitacaoServicoEvtMonDTO solicitacaoServicoEvtMonDTO = new SolicitacaoServicoEvtMonDTO(); solicitacaoServicoEvtMonDTO.setIdEventoMonitoramento(recursoDTO.getIdEventoMonitoramento()); solicitacaoServicoEvtMonDTO.setIdRecurso(recursoDTO.getIdRecurso()); solicitacaoServicoEvtMonDTO.setNomeHost(recursoDTO.getHostName()); solicitacaoServicoEvtMonDTO.setNomeService(recursoDTO.getServiceName()); solicitacaoServicoEvtMonDTO.setInfoAdd(this.getInfoParameters(hostEntries)); final List<SolicitacaoServicoEvtMonDTO> colSolicitacaoServicoEvtMon = new ArrayList<SolicitacaoServicoEvtMonDTO>(); colSolicitacaoServicoEvtMon.add(solicitacaoServicoEvtMonDTO); solicitacaoServicoDTO.setColSolicitacaoServicoEvtMon(colSolicitacaoServicoEvtMon); solicitacaoServicoDTO.setRegistroexecucao(solicitacaoServicoDTO.getObservacao()); solicitacaoServicoDTO = (SolicitacaoServicoDTO) solicitacaoServicoService.create(solicitacaoServicoDTO); mapaStatusHosts_RegIncident.put(hostName, last_check); solicitacaoServicoDTO = null; } } if (recursoDTO.getStatusAlerta().indexOf(current_state) > -1) { // Se o status em questao estiver dentro da // lista informada no cadastro. o padrao eh // DOWN,CRITICAL,... final EventoMonitoramentoServiceEjb eventoMonitoramentoService = new EventoMonitoramentoServiceEjb(); String nameEventSystem = ""; if (recursoDTO.getIdEventoMonitoramento() != null && recursoDTO.getIdEventoMonitoramento().intValue() > 0) { EventoMonitoramentoDTO eventoMonitoramentoDTO = new EventoMonitoramentoDTO(); eventoMonitoramentoDTO.setIdEventoMonitoramento(recursoDTO.getIdEventoMonitoramento()); eventoMonitoramentoDTO = (EventoMonitoramentoDTO) eventoMonitoramentoService.restore(eventoMonitoramentoDTO); if (eventoMonitoramentoDTO != null) { nameEventSystem = eventoMonitoramentoDTO.getNomeEvento(); } } String descr = recursoDTO.getDescricaoAbertInc(); descr = UtilStrings.nullToVazio(descr).replaceAll("\n", "<br>"); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{dadosmonitoramento\\}", this.getInfoParameters(hostEntries)); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{hostname\\}", hostName); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{eventname\\}", nameEventSystem); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{currentstate\\}", current_state); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{dataatual\\}", UtilDatas.dateToSTR(UtilDatas.getDataAtual())); descr = UtilStrings.nullToVazio(descr).replaceAll("\\$\\{datahoraatual\\}", UtilDatas.dateToSTR(UtilDatas.getDataHoraAtual()) + " - " + UtilDatas.formatHoraFormatadaHHMMSSStr(UtilDatas.getDataHoraAtual())); String remetente = null; try { remetente = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.RemetenteNotificacoesSolicitacao, null); } catch (final Exception e) { e.printStackTrace(); } if (remetente == null) { remetente = "citsmart@citsmart.com.br"; } final String mailsAlerta = UtilStrings.nullToVazio(recursoDTO.getEmailsAlerta()).trim(); final String[] mails = mailsAlerta.split(";"); if (mails != null) { for (final String mail : mails) { final String mailTo = UtilStrings.nullToVazio(mail).trim(); final MensagemEmail mensagemEmail = new MensagemEmail(mailTo, null, null, remetente, "CITSMART - Monitoring Alert: " + hostName + " - " + current_state + " -->> Event: " + nameEventSystem, descr); try { mensagemEmail.envia(mailTo, null, remetente); System.out.println("CITSMART - Monitoring Alert: " + current_state + " Event: " + nameEventSystem + " -->> Send mail: " + mailTo); } catch (final Exception e) { e.printStackTrace(); System.out.println("CITSMART - Monitoring Alert: " + current_state + " Event: " + nameEventSystem + " -->> PROBLEM Send mail: " + mailTo); } } } } } public String getInfoParameters(final List<ParameterEntry> hostEntries) { if (hostEntries == null) { return ""; } String ret = ""; for (final Object element : hostEntries) { final ParameterEntry parameterEntry = (ParameterEntry) element; ret = ret + parameterEntry.getParameterName() + " : " + parameterEntry.getParameterValue() + "<br>\n"; } return ret; } public void collectPerformanceData(final JavNag javNag) throws Exception { for (final Host currentHost : javNag.getListOfHosts()) { final String hostPerformanceData = currentHost.getParameter("performance_data"); final String lastHostCheck = currentHost.getParameter("last_check"); if (hostPerformanceData != null && hostPerformanceData.trim().equals("") == false) { performanceData.add(currentHost.getHostName(), hostPerformanceData, lastHostCheck); } for (final Service currentService : currentHost.getServices()) { final String servicePerformanceData = currentService.getParameter("performance_data"); final String lastServiceCheck = currentService.getParameter("last_check"); if (servicePerformanceData != null && servicePerformanceData.trim().equals("") == false) { performanceData.add(currentHost.getHostName() + " | " + currentService.getServiceName(), servicePerformanceData, lastServiceCheck); } } } this.generateHashLastState(javNag); if (System.currentTimeMillis() - lastPerformanceDump > 1800000) { this.dumpPerformanceData(javNag); lastPerformanceDump = System.currentTimeMillis(); } } public void dumpPerformanceData(final JavNag javNag) throws Exception { this.processaDump(javNag); } public void processaDump(final JavNag javNag) { for (final Host currentHost : javNag.getListOfHosts()) { String current_state = currentHost.getParameter("current_state"); current_state = UtilStrings.nullToVazio(current_state); if (current_state.equalsIgnoreCase("1")) { current_state = "DOWN"; } else if (current_state.equalsIgnoreCase("0")) { current_state = "UP"; } else { current_state = "PENDING"; } } } public static void main(final String[] args) { final MonitoraNagios monitoraNagios = new MonitoraNagios(); monitoraNagios.start(); } }