diff --git a/cacic-daemon/cacicD/cacicd.cpp b/cacic-daemon/cacicD/cacicd.cpp index d8fd6ca..57ca3d1 100644 --- a/cacic-daemon/cacicD/cacicd.cpp +++ b/cacic-daemon/cacicD/cacicd.cpp @@ -40,7 +40,7 @@ void cacicD::start() { //o valor nu_intervalo_exec vem em minutos. O valor que o timer aceita é em milisegundos,por isso 60000 Ocacictimer->setPeriodicidadeExecucao(configuracoes["nu_intervalo_exec"].toString().toInt() * 60000); Ocacictimer->iniciarTimer(); - }else{ + } else { //Iniciar com um timer default (4 horas), pra não ficar freezado pra sempre. QLogger::QLog_Error("Cacic Daemon", QString("Problemas com o arquivo getConfig.json")); QLogger::QLog_Info("Cacic Daemon", QString("Inicializando periodicidade de execução do serviço com tempo padrão.")); diff --git a/cacic-daemon/cacicD/cacictimer.cpp b/cacic-daemon/cacicD/cacictimer.cpp index d62ed36..7e8fba7 100644 --- a/cacic-daemon/cacicD/cacictimer.cpp +++ b/cacic-daemon/cacicD/cacictimer.cpp @@ -48,42 +48,44 @@ void CacicTimer::mslot(){ QLogger::QLog_Info("Cacic Daemon (Timer)", QString("Não foi possivel verificar a periodicidade no getConfig.json")); } - verificarEIniciarQMutex(); - - if(getTest()){ - QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getTeste() success.")); - if(getConfig()){ - QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getConfig() success.")); - // QStringList nomesModulos = verificarModulos(); - // if ( !nomesModulos.empty() ) { - // foreach( QString nome, nomesModulos ) { - QString nome = "gercols"; - definirDirModulo(getApplicationDirPath(), nome); - cacicthread->setCcacic(ccacic); - cacicthread->setOCacicComm(OCacicComm); - cacicthread->setNomeModulo(nome); - cacicthread->setCMutex(cMutex); - cacicthread->setModuloDirPath(getDirProgram()); - cacicthread->start(QThread::NormalPriority); -// if(nome == "gercols" ){ -// //Envio do json gerado na coleta -// bool ok = false; -// QJsonObject jsonColeta = ccacic->getJsonFromFile(this->applicationDirPath + "/coleta.json"); -// OCacicComm->comm("/ws/neo/coleta", &ok, jsonColeta , false); -// if(&ok){ -// QLogger::QLog_Info("Cacic Daemon (Timer)", QString("coleta enviada com sucesso.")); -// } -// } + //Caso verifique que a thread ainda está em execução e não consiga finalizá-la. + //Acredito que seja difícil acontecer, mas vai que... + if (verificarEIniciarQMutex()) { + if(getTest()){ + QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getTeste() success.")); + if(getConfig()){ + QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getConfig() success.")); + // QStringList nomesModulos = verificarModulos(); + // if ( !nomesModulos.empty() ) { + // foreach( QString nome, nomesModulos ) { + QString nome = "gercols"; + definirDirModulo(getApplicationDirPath(), nome); + cacicthread->setCcacic(ccacic); + cacicthread->setOCacicComm(OCacicComm); + cacicthread->setNomeModulo(nome); + cacicthread->setCMutex(cMutex); + cacicthread->setModuloDirPath(getDirProgram()); + cacicthread->start(QThread::NormalPriority); + // if(nome == "gercols" ){ + // //Envio do json gerado na coleta + // bool ok = false; + // QJsonObject jsonColeta = ccacic->getJsonFromFile(this->applicationDirPath + "/coleta.json"); + // OCacicComm->comm("/ws/neo/coleta", &ok, jsonColeta , false); + // if(&ok){ + // QLogger::QLog_Info("Cacic Daemon (Timer)", QString("coleta enviada com sucesso.")); + // } + // } + }else{ + QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na obtenção do arquivo de configuração."); + } }else{ - QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na obtenção do arquivo de configuração."); + QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na execução do getTest()."); } - }else{ - QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na execução do getTest()."); } } -void CacicTimer::verificarEIniciarQMutex(){ +bool CacicTimer::verificarEIniciarQMutex(){ if(!cacicthread->isRunning()){ cMutex->lock(); QLogger::QLog_Info("Cacic Daemon (Timer)", "Semáforo fechado com sucesso."); @@ -94,10 +96,11 @@ void CacicTimer::verificarEIniciarQMutex(){ QLogger::QLog_Info("Cacic Daemon (Timer)", "Gercols finalizado com sucesso."); }catch (...){ QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha ao finalizar gercols."); - return; + return false; } cMutex->lock(); QLogger::QLog_Info("Cacic Daemon (Timer)", "Semáforo fechado com sucesso."); + return true; } } @@ -120,7 +123,7 @@ bool CacicTimer::getTest(){ try{ ccacic->setJsonToFile(jsonresult.contains("reply") ? jsonresult["reply"].toObject() : jsonresult, this->applicationDirPath + "/getTest.json"); - return true; //acho que seria melhor retornar a variável 'ok'. Se der erro na conexão eu acho que não cai no catch. + return ok; } catch (...) { qDebug() << "Erro ao salvar o arquivo de configurações."; return false; @@ -146,7 +149,7 @@ bool CacicTimer::getConfig(){ try{ ccacic->setJsonToFile(jsonresult.contains("reply") ? jsonresult["reply"].toObject() : jsonresult, this->applicationDirPath + "/getConfigNew.json"); - return true; //mesma observação do getTest + return ok; } catch (...) { qDebug() << "Erro ao salvar o arquivo de configurações."; return false; @@ -157,47 +160,6 @@ bool CacicTimer::getConfig(){ } } -void CacicTimer::lerArquivoConfig ( const QJsonObject& jsonConfig ) -{ - /* lê json de configurações e armazena quais módulos executáveis. - * E faz o mesmo tipo de comparação de hashs, com o fim de: - * ou mantem o binário do módulo ou baixa um novo. - */ - foreach( QJsonValue individualModule, jsonConfig["modulos"].toArray() ) { - QString moduloKey, moduloValue; - - moduloKey = individualModule.toObject()["hash"].toString(); - moduloValue = individualModule.toObject()["nome"].toString(); - - moduleMap.insert(moduloKey, moduloValue); - } - - if ( jsonConfig["metodoDownload"].isArray() ) { - - foreach (QJsonValue individualMetodo, jsonConfig["metodoDownload"].toArray() ) { - QMap newEntry; - - newEntry.insert(QString("tipo"), individualMetodo.toObject()["tipo"].toString() ); - newEntry.insert(QString("url"), individualMetodo.toObject()["url"].toString() ); - newEntry.insert(QString("path"), individualMetodo.toObject()["path"].toString() ); - newEntry.insert(QString("usuario"), individualMetodo.toObject()["usario"].toString() ); - newEntry.insert(QString("senha"), individualMetodo.toObject()["senha"].toString() ); - - metodosDownload.append( newEntry ); - } - } else { - QMap newEntry; - - newEntry.insert(QString("tipo"), jsonConfig["metodoDownload"].toObject()["tipo"].toString() ); - newEntry.insert(QString("url"), jsonConfig["metodoDownload"].toObject()["url"].toString() ); - newEntry.insert(QString("path"), jsonConfig["metodoDownload"].toObject()["path"].toString() ); - newEntry.insert(QString("usuario"), jsonConfig["metodoDownload"].toObject()["usario"].toString() ); - newEntry.insert(QString("senha"), jsonConfig["metodoDownload"].toObject()["senha"].toString() ); - - metodosDownload.append( newEntry ); - } -} - QString CacicTimer::getDirProgram() const { return dirProgram; @@ -271,94 +233,3 @@ void CacicTimer::setPeriodicidadeExecucao(int value) { periodicidadeExecucao = value; } - - -QStringList CacicTimer::verificarModulos(){ - // Compara o novo arquivo de configuração com um antigo e se forem diferentes - // mantem o mais recente; caso iguais simplesmente apaga o novo. - QFile *fileOld; - QFile *fileNew; - - fileOld = new QFile(this->applicationDirPath + "/getConfig.json"); - fileNew = new QFile(this->applicationDirPath + "/getConfigNew.json"); - - if( fileOld->exists() && fileNew->exists() ){ - if( Md5IsEqual(QVariant::fromValue(fileOld), QVariant::fromValue(fileNew)) ) { - fileNew->remove(); - } else { - // Renomeia getConfigNew.json para getConfig.json - fileOld->remove(); - fileNew->rename("getConfigNew.json","getConfig.json"); - } - jsonConfig = ccacic->getJsonFromFile(this->applicationDirPath + "/getConfig.json"); - } else if( fileOld->exists() ){ - jsonConfig = ccacic->getJsonFromFile(this->applicationDirPath + "/getConfig.json"); - } else { - QLogger::QLog_Error("Cacic Daemon (Timer)", "Arquivo de configuração não criado."); - } - delete fileOld; - delete fileNew; - lerArquivoConfig(jsonConfig["agentcomputer"].toObject()); - - QStringList nomesModulos; - - int countExecNotFound = 0; - QMap::const_iterator moduloIterator = moduleMap.constBegin(); - while (moduloIterator != moduleMap.constEnd()) { - QString nomeModulo = moduloIterator.value(); - QString hashModulo = moduloIterator.key(); - // Calcula hash do binario atual -#if defined(Q_OS_WIN) - fileOld = new QFile(this->applicationDirPath + "/" + nomeModulo + ".exe"); -#else - fileOld = new QFile(this->applicationDirPath + "/" + nomeModulo); -#endif - if(!fileOld->exists()) { - QLogger::QLog_Error("Cacic Daemon (Timer)", QString("Módulo ").append(nomeModulo).append(" não encontrado.")); - countExecNotFound++; - - if( countExecNotFound == moduleMap.size() ) { - QLogger::QLog_Error("Cacic Daemon (Timer)", "Não foi possível encontrar nenhum módulo executável!"); - return QStringList(); - } - - // pula para o próximo módulo no moduloMap - moduloIterator++; - continue; - } - - QString oldMd5 = QString(QCryptographicHash::hash(fileOld->readAll(),QCryptographicHash::Md5).toHex()); - if ( oldMd5 != hashModulo ) { - -#if defined(Q_OS_WIN) - fileOld->rename(this->applicationDirPath + "/" + nomeModulo + ".exe", - this->applicationDirPath + "/" + nomeModulo + "Old.exe"); -#elif defined(Q_OS_LINUX) - fileOld->rename(this->applicationDirPath + "/" + nomeModulo, - this->applicationDirPath + "/" + nomeModulo + "Old"); -#endif - - // Download nova versão do executável - QList >::const_iterator metodosIterator = metodosDownload.constBegin(); - bool downloadSucess = false; - while ( !downloadSucess && metodosIterator != metodosDownload.constEnd() ) { - if( metodosIterator->value("tipo") == "ftp" || metodosIterator->value("tipo") == "" ) { - if ( OCacicComm->ftpDownload( metodosIterator->value("url"), metodosIterator->value("path") ) ) - downloadSucess = true; - } else if ( metodosIterator->value("tipo") == "http" ) { - if( OCacicComm->httpDownload( metodosIterator->value("url"), metodosIterator->value("path") ) ) - downloadSucess = true; - } - metodosIterator++; - } - fileOld->remove(); - delete fileOld; - } - - nomesModulos.append(nomeModulo); - - moduloIterator++; - } - - return nomesModulos; -} diff --git a/cacic-daemon/cacicD/cacictimer.h b/cacic-daemon/cacicD/cacictimer.h index 657bf4a..f186f68 100644 --- a/cacic-daemon/cacicD/cacictimer.h +++ b/cacic-daemon/cacicD/cacictimer.h @@ -35,7 +35,7 @@ public: void setPeriodicidadeExecucao(int value); private: - void verificarEIniciarQMutex(); + bool verificarEIniciarQMutex(); QStringList verificarModulos(); void reiniciarTimer(); QLogger::QLoggerManager *logManager; @@ -50,8 +50,6 @@ private: QJsonObject jsonConfig; int periodicidadeExecucao = 14400; // 4*3600. Tempo default de execução. int getPeriodicidadeExecucao() const; - QList > metodosDownload; - QMap moduleMap; // key = hash md5, value = nome do modulo private slots: void mslot(); diff --git a/cacic-teste/cacic-teste.pro b/cacic-teste/cacic-teste.pro index 3f17a71..980e106 100644 --- a/cacic-teste/cacic-teste.pro +++ b/cacic-teste/cacic-teste.pro @@ -31,7 +31,8 @@ SOURCES += \ ../src/vregistry.cpp \ ../src/ccoleta.cpp \ ../src/wmi.cpp \ - ../src/QLogger.cpp + ../src/QLogger.cpp \ + ../src/checkmodules.cpp # ../src/qtservice/src/qtservice.cpp \ # ../src/qtservice/src/qtservice_unix.cpp \ # ../src/qtservice/src/qtservice_win.cpp \ @@ -52,7 +53,8 @@ HEADERS += \ ../src/vregistry.h \ ../src/ccoleta.h \ ../src/wmi.h \ - ../src/QLogger.h + ../src/QLogger.h \ + ../src/checkmodules.h # ../src/qtservice/src/qtservice.h \ # ../src/qtservice/src/qtservice_p.h \ # ../src/qtservice/src/qtunixserversocket.h \ diff --git a/cacic-teste/testcacic.cpp b/cacic-teste/testcacic.cpp index 97fc928..c049257 100644 --- a/cacic-teste/testcacic.cpp +++ b/cacic-teste/testcacic.cpp @@ -246,18 +246,14 @@ void CTestCacic::testGetTest() QVERIFY(ok); } -void CTestCacic::testColeta() +void CTestCacic::testGetConfig() { bool ok; QJsonObject configEnvio; configEnvio["computador"] = oColeta.getOComputer().toJsonObject(); - OCacic.setJsonToFile(OCacicComm->comm("/ws/neo/config", &ok, configEnvio), "getConfig.json"); - oColeta.configuraColetas(); - oColeta.run(); - oColeta.waitToCollect(); + OCacic.setJsonToFile(OCacicComm->comm("/ws/neo/config", &ok, configEnvio)["reply"].toObject(), "getConfig.json"); - QVERIFY(!oColeta.toJsonObject()["software"].toObject().isEmpty() && - !oColeta.toJsonObject()["hardware"].toObject().isEmpty()); + QVERIFY(ok); } void CTestCacic::testLogger() @@ -334,6 +330,12 @@ void CTestCacic::testEnviaColeta() QVERIFY(ok); } +void CTestCacic::testGetModulesValues() +{ + oCheckModules = new CheckModules(QDir::currentPath()); + QVERIFY(false); +} + void CTestCacic::cleanupTestCase() { // OCacic.deleteFile("gpl-2.0.txt"); @@ -347,5 +349,5 @@ void CTestCacic::cleanupTestCase() OCacic.deleteFolder("../logs"); OCacic.deleteFile("configRequest.json"); OCacic.deleteFile("teste.json"); - OCacic.deleteFile("getConfig.json"); +// OCacic.deleteFile("getConfig.json"); } diff --git a/cacic-teste/testcacic.h b/cacic-teste/testcacic.h index f2bd704..5c9c5ab 100644 --- a/cacic-teste/testcacic.h +++ b/cacic-teste/testcacic.h @@ -18,6 +18,7 @@ #include #include #include +#include class CTestCacic : public QObject { @@ -36,6 +37,7 @@ private: QJsonObject session; QString cripTeste; CColeta oColeta; + CheckModules *oCheckModules; // cacicD OcacicD; signals: @@ -73,10 +75,11 @@ private slots: void testColetaHardware(); void testConvertDouble(); void testGetTest(); - void testColeta(); + void testGetConfig(); void testLogger(); void testFtpDownload(); void testEnviaColeta(); + void testGetModulesValues(); void cleanupTestCase(); }; diff --git a/src/checkmodules.cpp b/src/checkmodules.cpp index b1c9d40..5e7ba5c 100644 --- a/src/checkmodules.cpp +++ b/src/checkmodules.cpp @@ -1,5 +1,151 @@ #include "checkmodules.h" -CheckModules::CheckModules() +CheckModules::CheckModules(const QString &workingPath) { + QJsonObject configFile; + configFile = oCacic.getJsonFromFile(workingPath + "/getConfig.json"); + if (!configFile.isEmpty()) { + QJsonArray modulos; + modulos = configFile["agentcomputer"].toObject()["modulos"].toArray(); + foreach (QJsonValue modulo, modulos){ + modules[modulo.toObject()["nome"].toString()] = modulo.toObject()["hash"].toString(); + } + } + //TODO: Completar constructor. Agora que tenho os nomes dos módulos e os hashs, fazer a verificação. + qDebug() << modules; } + +bool CheckModules::start(){ + return true; +} + +//QStringList CheckModules::verificaModulos(){ +// // Compara o novo arquivo de configuração com um antigo e se forem diferentes +// // mantem o mais recente; caso iguais simplesmente apaga o novo. +// QFile *fileOld; +// QFile *fileNew; + +// fileOld = new QFile(this->applicationDirPath + "/getConfig.json"); +// fileNew = new QFile(this->applicationDirPath + "/getConfigNew.json"); + +// if( fileOld->exists() && fileNew->exists() ){ +// if( Md5IsEqual(QVariant::fromValue(fileOld), QVariant::fromValue(fileNew)) ) { +// fileNew->remove(); +// } else { +// // Renomeia getConfigNew.json para getConfig.json +// fileOld->remove(); +// fileNew->rename("getConfigNew.json","getConfig.json"); +// } +// jsonConfig = ccacic->getJsonFromFile(this->applicationDirPath + "/getConfig.json"); +// } else if( fileOld->exists() ){ +// jsonConfig = ccacic->getJsonFromFile(this->applicationDirPath + "/getConfig.json"); +// } else { +// QLogger::QLog_Error("Cacic Daemon (Timer)", "Arquivo de configuração não criado."); +// } +// delete fileOld; +// delete fileNew; +// lerArquivoConfig(jsonConfig["agentcomputer"].toObject()); + +// QStringList nomesModulos; + +// int countExecNotFound = 0; +// QMap::const_iterator moduloIterator = moduleMap.constBegin(); +// while (moduloIterator != moduleMap.constEnd()) { +// QString nomeModulo = moduloIterator.value(); +// QString hashModulo = moduloIterator.key(); +// // Calcula hash do binario atual +//#if defined(Q_OS_WIN) +// fileOld = new QFile(this->applicationDirPath + "/" + nomeModulo + ".exe"); +//#else +// fileOld = new QFile(this->applicationDirPath + "/" + nomeModulo); +//#endif +// if(!fileOld->exists()) { +// QLogger::QLog_Error("Cacic Daemon (Timer)", QString("Módulo ").append(nomeModulo).append(" não encontrado.")); +// countExecNotFound++; + +// if( countExecNotFound == moduleMap.size() ) { +// QLogger::QLog_Error("Cacic Daemon (Timer)", "Não foi possível encontrar nenhum módulo executável!"); +// return QStringList(); +// } + +// // pula para o próximo módulo no moduloMap +// moduloIterator++; +// continue; +// } + +// QString oldMd5 = QString(QCryptographicHash::hash(fileOld->readAll(),QCryptographicHash::Md5).toHex()); +// if ( oldMd5 != hashModulo ) { + +//#if defined(Q_OS_WIN) +// fileOld->rename(this->applicationDirPath + "/" + nomeModulo + ".exe", +// this->applicationDirPath + "/" + nomeModulo + "Old.exe"); +//#elif defined(Q_OS_LINUX) +// fileOld->rename(this->applicationDirPath + "/" + nomeModulo, +// this->applicationDirPath + "/" + nomeModulo + "Old"); +//#endif + +// // Download nova versão do executável +// QList >::const_iterator metodosIterator = metodosDownload.constBegin(); +// bool downloadSucess = false; +// while ( !downloadSucess && metodosIterator != metodosDownload.constEnd() ) { +// if( metodosIterator->value("tipo") == "ftp" || metodosIterator->value("tipo") == "" ) { +// if ( OCacicComm->ftpDownload( metodosIterator->value("url"), metodosIterator->value("path") ) ) +// downloadSucess = true; +// } else if ( metodosIterator->value("tipo") == "http" ) { +// if( OCacicComm->httpDownload( metodosIterator->value("url"), metodosIterator->value("path") ) ) +// downloadSucess = true; +// } +// metodosIterator++; +// } +// fileOld->remove(); +// delete fileOld; +// } + +// nomesModulos.append(nomeModulo); + +// moduloIterator++; +// } + +// return nomesModulos; +//} + +//void CheckModules::lerArquivoConfig ( const QJsonObject& jsonConfig ) +//{ +// /* lê json de configurações e armazena quais módulos executáveis. +// * E faz o mesmo tipo de comparação de hashs, com o fim de: +// * ou mantem o binário do módulo ou baixa um novo. +// */ +// foreach( QJsonValue individualModule, jsonConfig["modulos"].toArray() ) { +// QString moduloKey, moduloValue; + +// moduloKey = individualModule.toObject()["hash"].toString(); +// moduloValue = individualModule.toObject()["nome"].toString(); + +// moduleMap.insert(moduloKey, moduloValue); +// } + +// if ( jsonConfig["metodoDownload"].isArray() ) { + +// foreach (QJsonValue individualMetodo, jsonConfig["metodoDownload"].toArray() ) { +// QMap newEntry; + +// newEntry.insert(QString("tipo"), individualMetodo.toObject()["tipo"].toString() ); +// newEntry.insert(QString("url"), individualMetodo.toObject()["url"].toString() ); +// newEntry.insert(QString("path"), individualMetodo.toObject()["path"].toString() ); +// newEntry.insert(QString("usuario"), individualMetodo.toObject()["usario"].toString() ); +// newEntry.insert(QString("senha"), individualMetodo.toObject()["senha"].toString() ); + +// metodosDownload.append( newEntry ); +// } +// } else { +// QMap newEntry; + +// newEntry.insert(QString("tipo"), jsonConfig["metodoDownload"].toObject()["tipo"].toString() ); +// newEntry.insert(QString("url"), jsonConfig["metodoDownload"].toObject()["url"].toString() ); +// newEntry.insert(QString("path"), jsonConfig["metodoDownload"].toObject()["path"].toString() ); +// newEntry.insert(QString("usuario"), jsonConfig["metodoDownload"].toObject()["usario"].toString() ); +// newEntry.insert(QString("senha"), jsonConfig["metodoDownload"].toObject()["senha"].toString() ); + +// metodosDownload.append( newEntry ); +// } +//} diff --git a/src/checkmodules.h b/src/checkmodules.h index 009a4fa..b542881 100644 --- a/src/checkmodules.h +++ b/src/checkmodules.h @@ -1,10 +1,20 @@ #ifndef CHECKMODULES_H #define CHECKMODULES_H +#include +#include +#include + class CheckModules { public: - CheckModules(); + CheckModules(const QString &workingPath); +// QStringList verificaModulos(); + bool start(); +private: + CCacic oCacic; + QVariantMap modules; //modules["name"] = hash; +// void lerArquivoConfig(const QJsonObject& jsonConfig); }; #endif // CHECKMODULES_H -- libgit2 0.21.2