package br.com.centralit.citcorpore.componenteMaquina;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import br.com.centralit.citcorpore.bean.BaseItemConfiguracaoDTO;
import br.com.centralit.citcorpore.bean.CaracteristicaDTO;
import br.com.centralit.citcorpore.bean.EventoItemConfigDTO;
import br.com.centralit.citcorpore.bean.HistoricoTentativaDTO;
import br.com.centralit.citcorpore.negocio.BaseItemConfiguracaoService;
import br.com.centralit.citcorpore.negocio.EventoItemConfigService;
import br.com.centralit.citcorpore.negocio.HistoricoTentativaService;
import br.com.centralit.citcorpore.util.CITCorporeUtil;
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.citcorpore.util.Util;
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 ThreadDisparaEvento implements Runnable {
private final Integer idItemConfiguracao;
private final Integer idBaseItemConfiguracao;
private final Integer idEvento;
private final String tipoExecucao;
private final String linhaComando;
private final String linhaComandoLinux;
public ThreadDisparaEvento(Integer idItemConfiguracao, Integer idBaseItemConfiguracao, Integer idEvento,
String tipoExecucao, String linhaComando, String linhaComandoLinux) {
this.idItemConfiguracao = idItemConfiguracao;
this.idBaseItemConfiguracao = idBaseItemConfiguracao;
this.idEvento = idEvento;
this.tipoExecucao = tipoExecucao;
this.linhaComando = linhaComando;
this.linhaComandoLinux = linhaComandoLinux;
}
@Override
public void run() {
try {
System.out.println("Thread (Evento) iniciada!");
String caminho = "";
String comando = "";
String comandoCopia = "";
String comandoDelete = "";
// Servi�os
final EventoItemConfigService eventoItemCfgService = (EventoItemConfigService) ServiceLocator.getInstance()
.getService(EventoItemConfigService.class, null);
final BaseItemConfiguracaoService baseItemCfgService = (BaseItemConfiguracaoService) ServiceLocator
.getInstance().getService(BaseItemConfiguracaoService.class, null);
// Recuperando informa��es de rede (IP, MAC e m�scara)
System.out.println("Buscando IP do computador...");
final List<CaracteristicaDTO> colNetworks = (List<CaracteristicaDTO>) eventoItemCfgService
.pegarNetworksItemConfiguracao(idItemConfiguracao);
// TESTE COM IP ESTATICO
// String ip = "10.2.1.138";
// String mac = "08:00:27:9e:09:a0";
// String ipMask = "255.255.255.0";
String ip = "";
String mac = "";
String ipMask = "";
final CaracteristicaDTO caracteristicaDTO = new CaracteristicaDTO();
caracteristicaDTO.setTag("IPADDRESS");
int index = colNetworks.indexOf(caracteristicaDTO);
if (index > -1) {
ip = colNetworks.get(index).getValorString();
}
caracteristicaDTO.setTag("MACADDR");
index = colNetworks.indexOf(caracteristicaDTO);
if (index > -1) {
mac = colNetworks.get(index).getValorString();
}
caracteristicaDTO.setTag("IPMASK");
index = colNetworks.indexOf(caracteristicaDTO);
if (index > -1) {
ipMask = colNetworks.get(index).getValorString();
}
/*
* for (CaracteristicaDTO caracDto : colNetworks) {
* if (ip.equals("") && caracDto.getTag().equalsIgnoreCase("IPADDRESS")) {
* ip = caracDto.getValorString();
* }
* if (mac.equals("") && caracDto.getTag().equalsIgnoreCase("MACADDR")) {
* mac = caracDto.getValorString();
* }
* if (ipMask.equals("") && caracDto.getTag().equalsIgnoreCase("IPMASK")) {
* ipMask = caracDto.getValorString();
* }
* if (!ip.equals("") && !mac.equals("") && !ipMask.equals("")) {
* break;
* }
* }
*/
if (!ip.equals("")) {
System.out.println("IP encontrado: " + ip);
final boolean existeArquivo = true;
// Item Configura��o
EventoItemConfigDTO eventoItemCfgDto = new EventoItemConfigDTO();
eventoItemCfgDto.setIdEvento(idEvento);
eventoItemCfgDto = (EventoItemConfigDTO) eventoItemCfgService.restore(eventoItemCfgDto);
// Base Item Configura��o
BaseItemConfiguracaoDTO baseItemCfgDto = new BaseItemConfiguracaoDTO();
baseItemCfgDto.setId(idBaseItemConfiguracao);
baseItemCfgDto = (BaseItemConfiguracaoDTO) baseItemCfgService.restore(baseItemCfgDto);
String dominio = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.DOMINIO_REDE, ".");
// N�o est� associando valor DEFAULT, . significa dom�nio local
if (dominio == null || dominio.isEmpty()) {
dominio = ".";
}
comando = eventoItemCfgDto.getUsuario() + " " + eventoItemCfgDto.getSenha() + " " + dominio;
comandoCopia = comando;
comandoDelete = comando;
// Tipos de Evento
// Instala��o
if (tipoExecucao.equalsIgnoreCase("I")) {
// Recupera o caminho da base de itens de configura��o
caminho = ParametroUtil.getValorParametroCitSmartHashMap(
Enumerados.ParametroSistema.CaminhoBaseItemCfg, " ");
// Verifica se existe o arquivo no diret�rio
if (existeArquivo) {
if (!linhaComando.equals("")) {
// Recupera o sistema operacional utilizado
final String sO = eventoItemCfgService.pegarSistemaOperacionalItemConfiguracao(
idItemConfiguracao).toUpperCase();
// Configura as linhas de comando a serem enviadas ao interpretador de comandos de acordo com o sistema
// operacional
if (sO.indexOf("WINDOWS") >= 0) {
// O argumento /C faz com que o iterpretador de comandos feche ap�s a execu��o dos comandos
comando += " cmd.exe /C C:\\" + baseItemCfgDto.getExecutavel() + " " + linhaComando;
// Comando de c�pia do instalador (argumento /y efetua a c�pia sem pedir confirma��o)
comandoCopia += " cmd.exe /C COPY \"\\\\" + caminho.replace("/", "\\").trim() + "\\"
+ baseItemCfgDto.getExecutavel() + "\" C:\\ /y";
// Comando de remo��o do instalador
comandoDelete += " cmd.exe /C del C:\\" + baseItemCfgDto.getExecutavel();
} else { // Linux
String[] caminhoSplit = caminho.split("/");
if (caminhoSplit.length == 0) {
caminhoSplit = caminho.split("\\");
}
// Componentes do caminho
// �ndice 0 - ip da m�quina.
// �ndice 1 - pasta compartilhada.
// �ndices restantes - pastas a serem acessadas para achar a pasta de instala��o
if (caminhoSplit.length < 2) {
System.out.println("Erro com o par�metro: CAMINHO_INSTALADORES");
return;
}
String pastaSoftware = "";
for (int i = 2; i < caminhoSplit.length; i++) {
pastaSoftware += caminhoSplit[i] + "/";
}
// Seta linha de comando digitada pelo usu�rio
comando = linhaComandoLinux.replace(" ", "##") + "##/tmp/"
+ baseItemCfgDto.getExecutavel() + "##" + linhaComando.replace(" ", "##");
// Seta comando de copia do executavel
comandoCopia = "-COMANDOCOPIA-mount -t cifs //" + caminhoSplit[0].trim() + "/"
+ caminhoSplit[1] + " /mnt -o user=" + eventoItemCfgDto.getUsuario()
+ ",password=" + eventoItemCfgDto.getSenha() + "##" + "cp-SEPARADOR-/mnt/"
+ pastaSoftware + baseItemCfgDto.getExecutavel() + "-SEPARADOR-/tmp/";
// Arquivos em /tmp s�o deletados ao desligar, basta desmontar unidade
comandoDelete = "umount##/mnt";
}
}
} else {
System.out.println("###############################");
System.out.println("Arquivo " + caminho + "\\" + baseItemCfgDto.getExecutavel()
+ " n�o encontrado! ");
System.out.println("IP: " + ip + " Data: " + Util.getDataAtual());
System.out.println("###############################");
incluirHistoricoTentativa("Arquivo " + caminho + "\\" + baseItemCfgDto.getExecutavel()
+ " n�o encontrado!");
}
} else if (tipoExecucao.equalsIgnoreCase("D")) { // Desinstala��o
final String sO = eventoItemCfgService.pegarSistemaOperacionalItemConfiguracao(idItemConfiguracao)
.toUpperCase();
if (sO.indexOf("WINDOWS") >= 0) { // Windows
comando += " cmd.exe /C \"" + baseItemCfgDto.getExecutavel() + "\" " + linhaComando;
} else {
// Seta linha de comando digitada pelo usu�rio
comando = linhaComandoLinux.replace(" ", "##") + "##" + baseItemCfgDto.getExecutavel() + "##"
+ linhaComando.replace(" ", "##");
}
}
// Verifica a exist�ncia do execut�vel
if (existeArquivo) {
// Objeto que verifica o status, liga ou desliga o PC
final WakeOnLan wakeOnLan = new WakeOnLan(ip, ipMask, mac, 3, 50);
// Verifica se � para ligar o PC caso esteja desligado
if (eventoItemCfgDto.getLigarCasoDesl().equalsIgnoreCase("S")) {
if (wakeOnLan.pingar(ip)) {
System.out.println("O computador " + ip + " estava ligado!");
dispararEvento(ip, comando, comandoCopia, comandoDelete);
} else {
System.out.println("O computador " + ip + " n�o estava ligado!");
// Executa uma thread WakeOnLan para ligar o PC
wakeOnLan.start();
// Espera por 500 milisegundos at� que o PC ligue
while (wakeOnLan.getControl().equalsIgnoreCase(WakeOnLan.NONE)) {
Thread.sleep(500);
}
// Verifica se o PC est� ligado
if (wakeOnLan.getStatus()) {
System.out.println("O computador " + ip + " ligou!");
System.out.println("Aguardando subir o servi�o do agente...");
Thread.sleep(120000);
dispararEvento(ip, comando, comandoCopia, comandoDelete);
desligarMaquina(ip);
} else {
System.out.println("###############################");
System.out.println("O computador " + ip + " n�o ligou!");
System.out.println("###############################");
incluirHistoricoTentativa("O computador " + ip + " n�o ligou!");
}
}
} else {
if (wakeOnLan.pingar(ip)) {
System.out.println("O computador " + ip + " estava ligado!");
dispararEvento(ip, comando, comandoCopia, comandoDelete);
} else {
System.out.println("###############################");
System.out.println("O computador " + ip + " estava desligado!");
System.out.println("###############################");
incluirHistoricoTentativa("O computador " + ip + " estava desligado!");
}
}
Thread.sleep(5000);
}
} else {
System.out.println("###############################");
System.out.println("IP do computador n�o foi encontrado!");
System.out.println("###############################");
incluirHistoricoTentativa("IP do computador n�o foi encontrado!");
}
} catch (final Exception e) {
e.printStackTrace();
} finally {
System.out.println("Thread (Evento) finalizada!");
}
}
private void dispararEvento(String ip, String comando, String comandoCopia, String comandoDelete) {
String resposta = "";
try {
// Efetua c�pia do arquivo de instala��o
if (tipoExecucao.equalsIgnoreCase("I")) {
System.out.println("Iniciando c�pia do arquivo de instala��o...");
resposta = executaComando(ip, comandoCopia, 60);
if (resposta.equalsIgnoreCase("true")) {
System.out.println("Finalizando c�pia do arquivo de instala��o...");
Thread.sleep(5000);
} else {
System.out.println("###############################");
System.out.println("C�pia do arquivo de instala��o falhou!");
System.out.println("IP: " + ip + " Data: " + Util.getDataAtual());
System.out.println("###############################");
incluirHistoricoTentativa("C�pia do arquivo de instala��o falhou!");
return;
}
}
// Efetua execu��o espec�fica do evento
if (tipoExecucao.equalsIgnoreCase("I")) {
System.out.println("Iniciando instala��o do software...");
} else {
System.out.println("Iniciando desinstala��o do software...");
}
resposta = executaComando(ip, comando, 300);
if (resposta.equalsIgnoreCase("true")) {
if (tipoExecucao.equalsIgnoreCase("I")) {
System.out.println("Finalizando instala��o do software...");
} else {
System.out.println("Finalizando desinstala��o do software...");
}
Thread.sleep(20000);
} else {
System.out.println("###############################");
System.out.println("Execu��o falhou!");
System.out.println("IP: " + ip + " Data: " + Util.getDataAtual());
System.out.println("###############################");
incluirHistoricoTentativa("Execu��o falhou!");
}
// Efetua exclus�o do arquivo de instala��o
if (tipoExecucao.equalsIgnoreCase("I")) {
System.out.println("Iniciando exclus�o do arquivo de instala��o...");
resposta = executaComando(ip, comandoDelete, 60);
if (resposta.equalsIgnoreCase("true")) {
System.out.println("Finalizando exclus�o do arquivo de instala��o...");
Thread.sleep(5000);
} else {
System.out.println("###############################");
System.out.println("Exclus�o do arquivo de instala��o falhou!");
System.out.println("IP: " + ip + " Data: " + Util.getDataAtual());
System.out.println("###############################");
incluirHistoricoTentativa("Exclus�o do arquivo de instala��o falhou!");
}
}
} catch (final Exception e) {
e.printStackTrace();
}
}
private String executaComando(String ip, String comando, int tempo) {
Socket s = null;
ObjectOutputStream outObjects = null;
String dadoRecebido = "";
try {
// Socket que escuta por requisi��es na porta 7000
s = new Socket(ip, 7000);
// Recuperando sa�da do socket
outObjects = new ObjectOutputStream(s.getOutputStream());
final List<String> parametrosEvento = new ArrayList<String>();
parametrosEvento.add("EVENTO");
parametrosEvento.add(comando);
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();
ObjectInputStream ois = null;
signedInfo = null;
String dadoRecebidoAux = "";
int cont = 1;
boolean running = true;
while (running) {
try {
ois = new ObjectInputStream(s.getInputStream());
signedInfo = (SignedInfo) ois.readObject();
} catch (final IOException e) {
System.out.println("###############################");
System.out.println("Algum problema ocorreu para receber dados do socket.");
System.out.println("Comunica��o encerrada!");
System.out.println("IP: " + ip + " Data: " + Util.getDataAtual());
System.out.println("###############################");
e.printStackTrace();
break;
}
dadoRecebidoAux = CriptoSignedUtil.translateStringReceive(CITCorporeUtil.CAMINHO_REAL_APP
+ "/keysSec/citsmart.jks", CITCorporeUtil.CAMINHO_REAL_APP + "/keysSec/citsmartcripto.jks",
signedInfo.getStrCripto(), signedInfo.getStrSigned());
if (dadoRecebidoAux == null) {
dadoRecebidoAux = "";
}
dadoRecebido = new String(dadoRecebidoAux.getBytes());
if (dadoRecebido != null) {
running = false;
}
if (cont == tempo) {
running = false;
}
Thread.sleep(1000);
cont++;
}
} catch (final Exception e) {
System.out.println("###############################");
System.out.println("Algum problema ocorreu para receber dados do socket.");
System.out.println("Comunica��o encerrada!");
System.out.println("IP: " + ip + " Data: " + Util.getDataAtual());
System.out.println("###############################");
e.printStackTrace();
} finally {
try {
// Encerra o socket
if (s != null) {
s.close();
}
} catch (final IOException e) {
// Deixa passar!
}
}
return dadoRecebido;
}
private void desligarMaquina(String ip) {
// Socket servidor
Socket s = null;
// Stream de saida de dados
ObjectOutputStream outObjects = null;
try {
System.out.println("Iniciando desligamento do computador...");
// Cria o socket com o recurso desejado
s = new Socket(ip, 7000);
// Cria a Stream de saida de dados
outObjects = new ObjectOutputStream(s.getOutputStream());
// Imprime uma linha para a stream de sa�da de dados
final SignedInfo signedInfo = CriptoSignedUtil.generateStringToSend(CITCorporeUtil.CAMINHO_REAL_APP
+ "/keysSec/citsmart.jks", CITCorporeUtil.CAMINHO_REAL_APP + "/keysSec/citsmartcripto.jks",
"DESLIGAR");
outObjects.writeObject(signedInfo);
outObjects.flush();
} catch (final Exception e) {
System.out.println("###############################");
System.out.println("Ocorreu um erro durante o desligamento do computador!");
System.out.println("Comunica��o encerrada!");
System.out.println("IP: " + ip + " Data: " + Util.getDataAtual());
System.out.println("###############################");
e.printStackTrace();
} finally {
try {
// Encerra o socket
if (s != null) {
s.close();
}
System.out.println("O computador est� sendo desligado!");
} catch (final IOException e) {
// Deixa passar!
}
}
}
private void incluirHistoricoTentativa(String descricao) throws ServiceException, Exception {
// Cria um objeto para trafegar os dados relativos ao hist�rico de tentativas
final HistoricoTentativaDTO historicoTentativaDto = new HistoricoTentativaDTO();
historicoTentativaDto.setIdEvento(idEvento);
historicoTentativaDto.setIdItemConfiguracao(idItemConfiguracao);
historicoTentativaDto.setIdBaseItemConfiguracao(idBaseItemConfiguracao);
historicoTentativaDto.setDescricao(descricao);
historicoTentativaDto.setData(UtilDatas.getDataAtual());
historicoTentativaDto.setHora(UtilDatas.formatHoraFormatadaStr(UtilDatas.getHoraAtual()).replaceAll(":", ""));
final HistoricoTentativaService histTentService = (HistoricoTentativaService) ServiceLocator.getInstance()
.getService(HistoricoTentativaService.class, null);
histTentService.create(historicoTentativaDto);
}
}