package br.com.centralit.citcorpore.comm.server;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ConnectException;
import java.net.Socket;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import br.com.centralit.citcorpore.bean.InventarioXMLDTO;
import br.com.centralit.citcorpore.bean.ItemConfiguracaoDTO;
import br.com.centralit.citcorpore.bean.NetMapDTO;
import br.com.centralit.citcorpore.bean.ParametroCorporeDTO;
import br.com.centralit.citcorpore.negocio.InventarioXMLService;
import br.com.centralit.citcorpore.negocio.ItemConfiguracaoService;
import br.com.centralit.citcorpore.negocio.NetMapService;
import br.com.centralit.citcorpore.util.CITCorporeUtil;
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;
import br.com.citframework.util.UtilDatas;
import br.com.citframework.util.cripto.CriptoSignedUtil;
import br.com.citframework.util.cripto.SignedInfo;
public class Servidor implements Runnable, ClientServer {
static List<NetMapDTO> listnetMap = null;
static ParametroCorporeDTO paramentroDTO = null;
private String diretorioXmlAgente = "";
private NetMapDTO netMapDTO;
static List<NetMapDTO> listNetMapErro = new ArrayList<NetMapDTO>();
public Servidor() {}
public Servidor(final NetMapDTO netMapDTO) {
this.netMapDTO = netMapDTO;
try {
diretorioXmlAgente = ParametroUtil.getValorParametroCitSmartHashMap(
Enumerados.ParametroSistema.DiretorioXmlAgente, " ");
} catch (final Exception e) {
e.printStackTrace();
}
}
public List<NetMapDTO> carregarListaIP(final List<NetMapDTO> listNetMapDTO) throws InterruptedException {
listnetMap = listNetMapDTO;
listNetMapErro = new ArrayList<NetMapDTO>();
for (final NetMapDTO netMapDTO : listNetMapDTO) {
final Thread server = new Thread(new Servidor(netMapDTO));
server.start();
server.join();
}
return listNetMapErro;
}
public List<NetMapDTO> carregarIP(final NetMapDTO listNetMapDTO) throws InterruptedException {
listnetMap = new ArrayList<NetMapDTO>();
listNetMapErro = new ArrayList<NetMapDTO>();
final Thread server = new Thread(new Servidor(netMapDTO));
server.start();
server.join();
return listNetMapErro;
}
public static void executarPesquisaIPGerarInvenario() throws ServiceException, Exception {
final NetMapService netMapService = serviceNetMapService();
Integer dias = 0;
final String diasInventario = ParametroUtil.getValorParametroCitSmartHashMap(
Enumerados.ParametroSistema.DiasInventario, " ");
try {
dias = Integer.parseInt(diasInventario);
} catch (final NumberFormatException ex) {
System.err.println(ex);
}
final Date dataInventario = UtilDatas.getSqlDate(UtilDatas.incrementaDiasEmData(Util.getDataAtual(),
-new Integer(dias)));
// Pesquisa ips para geracao de iventario, passa data como
// parametro, para identificar apartir de que data ser� iventariado.
listnetMap = netMapService.listIpByDataInventario(dataInventario);
for (final NetMapDTO netMapDTO : listnetMap) {
final Thread server = new Thread(new Servidor(netMapDTO));
server.start();
server.join();
}
}
private static NetMapService serviceNetMapService() throws ServiceException, Exception {
final NetMapService netMapService = (NetMapService) ServiceLocator.getInstance().getService(
NetMapService.class, null);
return netMapService;
}
@Override
public void run() {
try {
// Declaro o socket cliente
Socket s = null;
// Declaro a Stream de saida de dados
ObjectOutputStream outObjects = null;
try {
// Cria o socket com o recurso desejado
System.out.println("Conectando a " + netMapDTO.getIp() + "... ");
s = new Socket(netMapDTO.getIp(), SERVER_PORT);
s.setSoTimeout(90000);
// Cria a Stream de saida de dados
outObjects = new ObjectOutputStream(s.getOutputStream());
final List<String> parametrosEvento = new ArrayList<String>();
parametrosEvento.add("INVENTORY");
// Imprime uma linha para a stream de sa�da de dados
SignedInfo signedInfo = CriptoSignedUtil.generateStringToSend(CITCorporeUtil.CAMINHO_REAL_APP
+ "/keysSec/citsmart.jks", CITCorporeUtil.CAMINHO_REAL_APP + "/keysSec/citsmartcripto.jks",
parametrosEvento.toString());
outObjects.writeObject(signedInfo);
outObjects.flush();
boolean running = true;
while (running) {
String dadoRecebido = "";
try {
System.out.println("Recebendo dados do Socket..");
final ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
signedInfo = (SignedInfo) ois.readObject();
} catch (final IOException e) {
System.out.println("Problema ao receber dados pelo socket: " + e);
e.printStackTrace();
listNetMapErro.add(netMapDTO);
running = false;
break;
}
String dadoRecebidoAux = "";
try {
dadoRecebidoAux = CriptoSignedUtil.translateStringReceive(CITCorporeUtil.CAMINHO_REAL_APP
+ "/keysSec/citsmart.jks", CITCorporeUtil.CAMINHO_REAL_APP
+ "/keysSec/citsmartcripto.jks", signedInfo.getStrCripto(), signedInfo.getStrSigned());
} catch (final Exception e) {
System.out.println("Problema ao descriptografar o texto de inventario: " + e);
e.printStackTrace();
}
if (dadoRecebidoAux.equals("") || dadoRecebidoAux.equals("false")) {
dadoRecebidoAux = null;
}
dadoRecebido = dadoRecebidoAux != null ? new String(dadoRecebidoAux.getBytes()) : null;
if (dadoRecebido != null) {
try {
getGravarItemConfiguracao(dadoRecebido);
getGravarInventarioXml(dadoRecebido);
} catch (final Exception e) {
System.out.println("Problema ao gravar o inventario: " + e);
e.printStackTrace();
listNetMapErro.add(netMapDTO);
final BufferedWriter br = new BufferedWriter(new FileWriter(new File(diretorioXmlAgente
+ getNomeArquivo() + ".xml")));
br.write(dadoRecebido);
br.close();
running = false;
}
running = false;
} else {
running = false;
listNetMapErro.add(netMapDTO);
System.out.println("Mensagem n�o pode ser lida..");
}
}
} catch (final ConnectException e) {
System.out.println("Conex�o recusada..");
listNetMapErro.add(netMapDTO);
} finally {
try {
// Encerra o ServerSocket
if (s != null && !s.isClosed()) {
s.close();
}
} catch (final IOException e) {
System.out.println("Problema ao encerrar o socket: " + e);
e.printStackTrace();
}
}
} catch (final Exception e) {
System.out.println("Problema ao gerar inventario manualmente: " + e);
e.printStackTrace();
}
}
private void getGravarInventarioXml(final String dadoRecebido) {
try {
InventarioXMLDTO inventarioXMLDTO = new InventarioXMLDTO();
final InventarioXMLService inventarioXmlService = (InventarioXMLService) ServiceLocator.getInstance()
.getService(InventarioXMLService.class, null);
inventarioXMLDTO.setIdNetMap(netMapDTO.getIdNetMap());
inventarioXMLDTO.setConteudo(dadoRecebido);
inventarioXMLDTO.setDatainicial(UtilDatas.getDataAtual());
inventarioXMLDTO.setNome(getNomeArquivo());
// Grava Xml Completo.
inventarioXMLDTO = inventarioXmlService.create(inventarioXMLDTO);
} catch (final Exception e) {
System.out.println("Problema ao gravar o inventario: " + e);
e.printStackTrace();
}
}
public void getGravarItemConfiguracao(final String dadoRecebido) throws ServiceException, LogicException, Exception {
final XmlReadDtdAgente xmlReadDtdAgente = new XmlReadDtdAgente();
final List<ItemConfiguracaoDTO> list = xmlReadDtdAgente.XmlReadDtdAgent(dadoRecebido);
final ItemConfiguracaoService serviceItem = (ItemConfiguracaoService) ServiceLocator.getInstance().getService(
ItemConfiguracaoService.class, null);
for (final ItemConfiguracaoDTO itemConfiguracaoDTO : list) {
serviceItem.createItemConfiguracao(itemConfiguracaoDTO, null);
}
}
private String getNomeArquivo() {
String nomeArquivo = netMapDTO.getIp() + "__" + netMapDTO.getMac() + "__" + UtilDatas.getDataAtual() + "__"
+ UtilDatas.getHoraAtual();
nomeArquivo = nomeArquivo.replace(".", "-");
nomeArquivo = nomeArquivo.replace(":", "-");
nomeArquivo = nomeArquivo.replace("-", "-");
return nomeArquivo;
}
}