package br.com.centralit.citcorpore.comm.server; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; import br.com.centralit.citcorpore.bean.ItemConfiguracaoDTO; import br.com.centralit.citcorpore.bean.NetMapDTO; import br.com.centralit.citcorpore.negocio.ItemConfiguracaoService; import br.com.centralit.citcorpore.negocio.NetMapService; import br.com.centralit.citcorpore.util.Enumerados; import br.com.centralit.citcorpore.util.ParametroUtil; import br.com.centralit.citcorpore.util.Util; import br.com.citframework.excecao.LogicException; import br.com.citframework.excecao.ServiceException; import br.com.citframework.service.ServiceLocator; /** * @author Maycon.Fernandes * */ public class NetDiscover implements Runnable { private NetMapDTO netMapDto = new NetMapDTO(); private List<NetMapDTO> listNetMap = new ArrayList<NetMapDTO>(); public static void main(final String[] args) throws IOException { new Thread(new NetDiscover()).start(); } public List<NetMapDTO> listaIpsAtivos() throws ServiceException, Exception, LogicException { List<NetMapDTO> lstIpsAtivos = this.getListNetMap(); lstIpsAtivos = this.gravarDados(lstIpsAtivos); return lstIpsAtivos; } /** * @return valor do atributo listNetMapAux. * @throws Exception * @throws ServiceException */ public List<NetMapDTO> getListNetMap() throws ServiceException, LogicException, Exception { Integer i = 0; final List<NetMapDTO> listaRetorno = new ArrayList<NetMapDTO>(); final List<String> listaVmapFiles = new ArrayList<String>(); File arqv; try { Process exec = null; String caminhoNetMap = this.getParametroCaminhoArquivoNmap() == null ? "" : this.getParametroCaminhoArquivoNmap().trim(); if (new File(caminhoNetMap).isDirectory()) { caminhoNetMap += File.separator; String[] arrayFaixaIp = {}; arrayFaixaIp = this.getParametroFaixaIPNmap(); for (final String faixaIp : arrayFaixaIp) { arqv = new File(caminhoNetMap + "nmapFile" + i); if (arqv.exists()) { arqv.delete(); } try { System.out.println("Realizando port scan..." + faixaIp.trim()); exec = Runtime.getRuntime().exec(new String[] { this.getParametroCaminhoNmap(), "-sP", faixaIp.trim(), "-oN", caminhoNetMap + "nmapFile" + i }); exec.waitFor(); listaVmapFiles.add(caminhoNetMap + "nmapFile" + i); i++; } catch (final IOException er) { throw new LogicException("Par�mentro de Configura��o do Caminho nmap inv�lido"); } } // Pega Arquivo Gerado pelo nmap for (final String nmapFile : listaVmapFiles) { arqv = new File(nmapFile); if (arqv.exists()) { boolean flag = true; arqv = new File(nmapFile); Scanner arq = new Scanner(arqv); while (flag) { final String linha = arq.nextLine(); // Flag para identificar fim do arquivo ser encontrar // retorna false if (linha.substring(0, 11).equalsIgnoreCase("# Nmap done")) { flag = false; } if (!arq.hasNext()) { arq.close(); arq = null; Thread.sleep(1000); arqv = new File(nmapFile); arq = new Scanner(arqv); } } // Chama metodo que ir� fazer leitura de arquivo nmap // Pegar lista Preenchida pelo metodo netDiscover listaRetorno.addAll(this.readFile(arqv)); arq.close(); } } } else { throw new LogicException("Par�mentro de Configura��o de Diret�rio Arquivo NetMap n�o Encontrado"); } } catch (final Exception e) { e.printStackTrace(); } return listaRetorno; } /** * metodo para percorre arquivo e preencher obj netmap * * @param file * diretorio do arquivo */ public List<NetMapDTO> readFile(final File file) { try { listNetMap = new ArrayList<NetMapDTO>(); final Scanner arq = new Scanner(file); while (arq.hasNext()) { final String linha = arq.nextLine(); if (linha.length() > 0) { // Identifica se � o final do arquivo if (!linha.substring(0, 11).equalsIgnoreCase("# Nmap done")) { // Verifica se � ip if (linha.substring(0, 9).equalsIgnoreCase("Nmap scan")) { this.getNetMapDto(); if (linha.length() > 38) { final String texto = linha.toString(); final Pattern p = Pattern.compile("\\(.*\\)$"); final Matcher m = p.matcher(texto); String ip; if (m.find()) { ip = m.group(); ip = ip.replace('(', ' ').replace(')', ' ').replaceAll(" ", ""); ip = ip.trim(); netMapDto.setIp(ip); } } else { netMapDto.setIp(linha.substring(21, linha.length()).replaceAll("[^0-9.]", "")); } netMapDto.setNome(linha.substring(21, linha.length())); listNetMap.add(netMapDto); // Veririca se mac } else if (linha.substring(0, 11).equalsIgnoreCase("MAC Address")) { netMapDto.setMac(linha.substring(13, 30)); this.getNetMapDto(); } } } } arq.close(); } catch (final IOException e) { e.printStackTrace(); } file.getFreeSpace(); return listNetMap; } /** * Grava a lista de dados obtidos do NMap. Se os dados ja estiverem gravados eles serao atualizados. * * @param lst * Lista de dados NMap */ private List<NetMapDTO> gravarDados(final List<NetMapDTO> lst) { final List<NetMapDTO> lstRetorno = new ArrayList<NetMapDTO>(); try { final ItemConfiguracaoService itemConfService = (ItemConfiguracaoService) ServiceLocator.getInstance().getService(ItemConfiguracaoService.class, null); if (lst != null) { for (final NetMapDTO netMapDTO : lst) { final NetMapService netMapService = (NetMapService) ServiceLocator.getInstance().getService(NetMapService.class, null); ItemConfiguracaoDTO itemConfiguracaoDTO = new ItemConfiguracaoDTO(); final List<NetMapDTO> lstNetMap = netMapService.verificarExistenciaIp(netMapDTO); netMapDTO.setDate(Util.getSqlDataAtual()); // Verifica existencia, se existir faz update se nao grava if (lstNetMap != null && !lstNetMap.isEmpty()) { NetMapDTO mapDTO = new NetMapDTO(); mapDTO = lstNetMap.get(0); mapDTO.setDate(Util.getSqlDataAtual()); mapDTO.setMac(netMapDTO.getMac()); netMapDTO.setIcNovo("false"); netMapService.update(mapDTO); } else { netMapDTO.setIcNovo("true"); netMapService.create(netMapDTO); itemConfiguracaoDTO.setIdentificacao(netMapDTO.getIp()); itemConfiguracaoDTO.setDataInicio(netMapDTO.getDate()); itemConfiguracaoDTO = itemConfService.obterICFilhoPorIdentificacaoIdPaiEIdTipo(itemConfiguracaoDTO); if (itemConfiguracaoDTO.getIdItemConfiguracao() == null) { itemConfService.create(itemConfiguracaoDTO); } } lstRetorno.add(netMapDTO); } } else { System.out.println("N�o foi encontrado IP na rede!"); } } catch (final Exception e) { System.out.println("Problema ao gravar dados NetMap: " + e.getMessage()); e.printStackTrace(); } return lstRetorno; } public NetMapDTO getNetMapDto() { return netMapDto = new NetMapDTO(); } @Override public void run() { try { final NetDiscover netDiscover = new NetDiscover(); final List<NetMapDTO> lst = netDiscover.getListNetMap(); // Metodo Gravar dados this.gravarDados(lst); } catch (final Exception e) { System.out.println("Problema ao obter a lista NetMap: " + e.getMessage()); e.printStackTrace(); } } private String[] getParametroFaixaIPNmap() throws ServiceException, LogicException, Exception { String faixaIp = ""; String[] arrayIp = { "" }; if (this.getParametroFaixaIp() != null && !this.getParametroFaixaIp().equalsIgnoreCase("")) { faixaIp = this.getParametroFaixaIp(); if (faixaIp.trim().indexOf(";") != -1) { arrayIp = faixaIp.split(";"); } else { throw new LogicException("Par�mentro de Configura��o de Faixa de IP inv�lido"); } return arrayIp; } else { System.out.println("Caminho Nmap n�o definida em Par�metro de Sistema 'Faixa Ip'!"); } return null; } private String getParametroFaixaIp() throws Exception { final String faixaIp = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.FaixaIp, " "); return faixaIp; } private String getParametroCaminhoArquivoNmap() throws Exception { final String caminhoArquivoNetMap = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.CaminhoArquivoNetMap, " "); return caminhoArquivoNetMap; } private String getParametroCaminhoNmap() throws Exception { final String caminhoNmap = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.CaminhoNmap, " "); return caminhoNmap; } }