Commit ebd01e4b5cbb0c20d7bdfd1ab0faf5db6b16f9b3
1 parent
df1422ff
Exists in
master
Modificação do esquema de verificação dos módulos. (Não funcional ainda)
Showing
8 changed files
with
214 additions
and
182 deletions
Show diff stats
cacic-daemon/cacicD/cacicd.cpp
| @@ -40,7 +40,7 @@ void cacicD::start() { | @@ -40,7 +40,7 @@ void cacicD::start() { | ||
| 40 | //o valor nu_intervalo_exec vem em minutos. O valor que o timer aceita é em milisegundos,por isso 60000 | 40 | //o valor nu_intervalo_exec vem em minutos. O valor que o timer aceita é em milisegundos,por isso 60000 |
| 41 | Ocacictimer->setPeriodicidadeExecucao(configuracoes["nu_intervalo_exec"].toString().toInt() * 60000); | 41 | Ocacictimer->setPeriodicidadeExecucao(configuracoes["nu_intervalo_exec"].toString().toInt() * 60000); |
| 42 | Ocacictimer->iniciarTimer(); | 42 | Ocacictimer->iniciarTimer(); |
| 43 | - }else{ | 43 | + } else { |
| 44 | //Iniciar com um timer default (4 horas), pra não ficar freezado pra sempre. | 44 | //Iniciar com um timer default (4 horas), pra não ficar freezado pra sempre. |
| 45 | QLogger::QLog_Error("Cacic Daemon", QString("Problemas com o arquivo getConfig.json")); | 45 | QLogger::QLog_Error("Cacic Daemon", QString("Problemas com o arquivo getConfig.json")); |
| 46 | QLogger::QLog_Info("Cacic Daemon", QString("Inicializando periodicidade de execução do serviço com tempo padrão.")); | 46 | QLogger::QLog_Info("Cacic Daemon", QString("Inicializando periodicidade de execução do serviço com tempo padrão.")); |
cacic-daemon/cacicD/cacictimer.cpp
| @@ -48,42 +48,44 @@ void CacicTimer::mslot(){ | @@ -48,42 +48,44 @@ void CacicTimer::mslot(){ | ||
| 48 | QLogger::QLog_Info("Cacic Daemon (Timer)", QString("Não foi possivel verificar a periodicidade no getConfig.json")); | 48 | QLogger::QLog_Info("Cacic Daemon (Timer)", QString("Não foi possivel verificar a periodicidade no getConfig.json")); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | - verificarEIniciarQMutex(); | ||
| 52 | - | ||
| 53 | - if(getTest()){ | ||
| 54 | - QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getTeste() success.")); | ||
| 55 | - if(getConfig()){ | ||
| 56 | - QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getConfig() success.")); | ||
| 57 | - // QStringList nomesModulos = verificarModulos(); | ||
| 58 | - // if ( !nomesModulos.empty() ) { | ||
| 59 | - // foreach( QString nome, nomesModulos ) { | ||
| 60 | - QString nome = "gercols"; | ||
| 61 | - definirDirModulo(getApplicationDirPath(), nome); | ||
| 62 | - cacicthread->setCcacic(ccacic); | ||
| 63 | - cacicthread->setOCacicComm(OCacicComm); | ||
| 64 | - cacicthread->setNomeModulo(nome); | ||
| 65 | - cacicthread->setCMutex(cMutex); | ||
| 66 | - cacicthread->setModuloDirPath(getDirProgram()); | ||
| 67 | - cacicthread->start(QThread::NormalPriority); | ||
| 68 | -// if(nome == "gercols" ){ | ||
| 69 | -// //Envio do json gerado na coleta | ||
| 70 | -// bool ok = false; | ||
| 71 | -// QJsonObject jsonColeta = ccacic->getJsonFromFile(this->applicationDirPath + "/coleta.json"); | ||
| 72 | -// OCacicComm->comm("/ws/neo/coleta", &ok, jsonColeta , false); | ||
| 73 | -// if(&ok){ | ||
| 74 | -// QLogger::QLog_Info("Cacic Daemon (Timer)", QString("coleta enviada com sucesso.")); | ||
| 75 | -// } | ||
| 76 | -// } | 51 | + //Caso verifique que a thread ainda está em execução e não consiga finalizá-la. |
| 52 | + //Acredito que seja difícil acontecer, mas vai que... | ||
| 53 | + if (verificarEIniciarQMutex()) { | ||
| 54 | + if(getTest()){ | ||
| 55 | + QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getTeste() success.")); | ||
| 56 | + if(getConfig()){ | ||
| 57 | + QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getConfig() success.")); | ||
| 58 | + // QStringList nomesModulos = verificarModulos(); | ||
| 59 | + // if ( !nomesModulos.empty() ) { | ||
| 60 | + // foreach( QString nome, nomesModulos ) { | ||
| 61 | + QString nome = "gercols"; | ||
| 62 | + definirDirModulo(getApplicationDirPath(), nome); | ||
| 63 | + cacicthread->setCcacic(ccacic); | ||
| 64 | + cacicthread->setOCacicComm(OCacicComm); | ||
| 65 | + cacicthread->setNomeModulo(nome); | ||
| 66 | + cacicthread->setCMutex(cMutex); | ||
| 67 | + cacicthread->setModuloDirPath(getDirProgram()); | ||
| 68 | + cacicthread->start(QThread::NormalPriority); | ||
| 69 | + // if(nome == "gercols" ){ | ||
| 70 | + // //Envio do json gerado na coleta | ||
| 71 | + // bool ok = false; | ||
| 72 | + // QJsonObject jsonColeta = ccacic->getJsonFromFile(this->applicationDirPath + "/coleta.json"); | ||
| 73 | + // OCacicComm->comm("/ws/neo/coleta", &ok, jsonColeta , false); | ||
| 74 | + // if(&ok){ | ||
| 75 | + // QLogger::QLog_Info("Cacic Daemon (Timer)", QString("coleta enviada com sucesso.")); | ||
| 76 | + // } | ||
| 77 | + // } | ||
| 78 | + }else{ | ||
| 79 | + QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na obtenção do arquivo de configuração."); | ||
| 80 | + } | ||
| 77 | }else{ | 81 | }else{ |
| 78 | - QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na obtenção do arquivo de configuração."); | 82 | + QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na execução do getTest()."); |
| 79 | } | 83 | } |
| 80 | - }else{ | ||
| 81 | - QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na execução do getTest()."); | ||
| 82 | } | 84 | } |
| 83 | } | 85 | } |
| 84 | 86 | ||
| 85 | 87 | ||
| 86 | -void CacicTimer::verificarEIniciarQMutex(){ | 88 | +bool CacicTimer::verificarEIniciarQMutex(){ |
| 87 | if(!cacicthread->isRunning()){ | 89 | if(!cacicthread->isRunning()){ |
| 88 | cMutex->lock(); | 90 | cMutex->lock(); |
| 89 | QLogger::QLog_Info("Cacic Daemon (Timer)", "Semáforo fechado com sucesso."); | 91 | QLogger::QLog_Info("Cacic Daemon (Timer)", "Semáforo fechado com sucesso."); |
| @@ -94,10 +96,11 @@ void CacicTimer::verificarEIniciarQMutex(){ | @@ -94,10 +96,11 @@ void CacicTimer::verificarEIniciarQMutex(){ | ||
| 94 | QLogger::QLog_Info("Cacic Daemon (Timer)", "Gercols finalizado com sucesso."); | 96 | QLogger::QLog_Info("Cacic Daemon (Timer)", "Gercols finalizado com sucesso."); |
| 95 | }catch (...){ | 97 | }catch (...){ |
| 96 | QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha ao finalizar gercols."); | 98 | QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha ao finalizar gercols."); |
| 97 | - return; | 99 | + return false; |
| 98 | } | 100 | } |
| 99 | cMutex->lock(); | 101 | cMutex->lock(); |
| 100 | QLogger::QLog_Info("Cacic Daemon (Timer)", "Semáforo fechado com sucesso."); | 102 | QLogger::QLog_Info("Cacic Daemon (Timer)", "Semáforo fechado com sucesso."); |
| 103 | + return true; | ||
| 101 | } | 104 | } |
| 102 | } | 105 | } |
| 103 | 106 | ||
| @@ -120,7 +123,7 @@ bool CacicTimer::getTest(){ | @@ -120,7 +123,7 @@ bool CacicTimer::getTest(){ | ||
| 120 | try{ | 123 | try{ |
| 121 | ccacic->setJsonToFile(jsonresult.contains("reply") ? jsonresult["reply"].toObject() : jsonresult, | 124 | ccacic->setJsonToFile(jsonresult.contains("reply") ? jsonresult["reply"].toObject() : jsonresult, |
| 122 | this->applicationDirPath + "/getTest.json"); | 125 | this->applicationDirPath + "/getTest.json"); |
| 123 | - 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. | 126 | + return ok; |
| 124 | } catch (...) { | 127 | } catch (...) { |
| 125 | qDebug() << "Erro ao salvar o arquivo de configurações."; | 128 | qDebug() << "Erro ao salvar o arquivo de configurações."; |
| 126 | return false; | 129 | return false; |
| @@ -146,7 +149,7 @@ bool CacicTimer::getConfig(){ | @@ -146,7 +149,7 @@ bool CacicTimer::getConfig(){ | ||
| 146 | try{ | 149 | try{ |
| 147 | ccacic->setJsonToFile(jsonresult.contains("reply") ? jsonresult["reply"].toObject() : jsonresult, | 150 | ccacic->setJsonToFile(jsonresult.contains("reply") ? jsonresult["reply"].toObject() : jsonresult, |
| 148 | this->applicationDirPath + "/getConfigNew.json"); | 151 | this->applicationDirPath + "/getConfigNew.json"); |
| 149 | - return true; //mesma observação do getTest | 152 | + return ok; |
| 150 | } catch (...) { | 153 | } catch (...) { |
| 151 | qDebug() << "Erro ao salvar o arquivo de configurações."; | 154 | qDebug() << "Erro ao salvar o arquivo de configurações."; |
| 152 | return false; | 155 | return false; |
| @@ -157,47 +160,6 @@ bool CacicTimer::getConfig(){ | @@ -157,47 +160,6 @@ bool CacicTimer::getConfig(){ | ||
| 157 | } | 160 | } |
| 158 | } | 161 | } |
| 159 | 162 | ||
| 160 | -void CacicTimer::lerArquivoConfig ( const QJsonObject& jsonConfig ) | ||
| 161 | -{ | ||
| 162 | - /* lê json de configurações e armazena quais módulos executáveis. | ||
| 163 | - * E faz o mesmo tipo de comparação de hashs, com o fim de: | ||
| 164 | - * ou mantem o binário do módulo ou baixa um novo. | ||
| 165 | - */ | ||
| 166 | - foreach( QJsonValue individualModule, jsonConfig["modulos"].toArray() ) { | ||
| 167 | - QString moduloKey, moduloValue; | ||
| 168 | - | ||
| 169 | - moduloKey = individualModule.toObject()["hash"].toString(); | ||
| 170 | - moduloValue = individualModule.toObject()["nome"].toString(); | ||
| 171 | - | ||
| 172 | - moduleMap.insert(moduloKey, moduloValue); | ||
| 173 | - } | ||
| 174 | - | ||
| 175 | - if ( jsonConfig["metodoDownload"].isArray() ) { | ||
| 176 | - | ||
| 177 | - foreach (QJsonValue individualMetodo, jsonConfig["metodoDownload"].toArray() ) { | ||
| 178 | - QMap<QString, QString> newEntry; | ||
| 179 | - | ||
| 180 | - newEntry.insert(QString("tipo"), individualMetodo.toObject()["tipo"].toString() ); | ||
| 181 | - newEntry.insert(QString("url"), individualMetodo.toObject()["url"].toString() ); | ||
| 182 | - newEntry.insert(QString("path"), individualMetodo.toObject()["path"].toString() ); | ||
| 183 | - newEntry.insert(QString("usuario"), individualMetodo.toObject()["usario"].toString() ); | ||
| 184 | - newEntry.insert(QString("senha"), individualMetodo.toObject()["senha"].toString() ); | ||
| 185 | - | ||
| 186 | - metodosDownload.append( newEntry ); | ||
| 187 | - } | ||
| 188 | - } else { | ||
| 189 | - QMap<QString, QString> newEntry; | ||
| 190 | - | ||
| 191 | - newEntry.insert(QString("tipo"), jsonConfig["metodoDownload"].toObject()["tipo"].toString() ); | ||
| 192 | - newEntry.insert(QString("url"), jsonConfig["metodoDownload"].toObject()["url"].toString() ); | ||
| 193 | - newEntry.insert(QString("path"), jsonConfig["metodoDownload"].toObject()["path"].toString() ); | ||
| 194 | - newEntry.insert(QString("usuario"), jsonConfig["metodoDownload"].toObject()["usario"].toString() ); | ||
| 195 | - newEntry.insert(QString("senha"), jsonConfig["metodoDownload"].toObject()["senha"].toString() ); | ||
| 196 | - | ||
| 197 | - metodosDownload.append( newEntry ); | ||
| 198 | - } | ||
| 199 | -} | ||
| 200 | - | ||
| 201 | QString CacicTimer::getDirProgram() const | 163 | QString CacicTimer::getDirProgram() const |
| 202 | { | 164 | { |
| 203 | return dirProgram; | 165 | return dirProgram; |
| @@ -271,94 +233,3 @@ void CacicTimer::setPeriodicidadeExecucao(int value) | @@ -271,94 +233,3 @@ void CacicTimer::setPeriodicidadeExecucao(int value) | ||
| 271 | { | 233 | { |
| 272 | periodicidadeExecucao = value; | 234 | periodicidadeExecucao = value; |
| 273 | } | 235 | } |
| 274 | - | ||
| 275 | - | ||
| 276 | -QStringList CacicTimer::verificarModulos(){ | ||
| 277 | - // Compara o novo arquivo de configuração com um antigo e se forem diferentes | ||
| 278 | - // mantem o mais recente; caso iguais simplesmente apaga o novo. | ||
| 279 | - QFile *fileOld; | ||
| 280 | - QFile *fileNew; | ||
| 281 | - | ||
| 282 | - fileOld = new QFile(this->applicationDirPath + "/getConfig.json"); | ||
| 283 | - fileNew = new QFile(this->applicationDirPath + "/getConfigNew.json"); | ||
| 284 | - | ||
| 285 | - if( fileOld->exists() && fileNew->exists() ){ | ||
| 286 | - if( Md5IsEqual(QVariant::fromValue(fileOld), QVariant::fromValue(fileNew)) ) { | ||
| 287 | - fileNew->remove(); | ||
| 288 | - } else { | ||
| 289 | - // Renomeia getConfigNew.json para getConfig.json | ||
| 290 | - fileOld->remove(); | ||
| 291 | - fileNew->rename("getConfigNew.json","getConfig.json"); | ||
| 292 | - } | ||
| 293 | - jsonConfig = ccacic->getJsonFromFile(this->applicationDirPath + "/getConfig.json"); | ||
| 294 | - } else if( fileOld->exists() ){ | ||
| 295 | - jsonConfig = ccacic->getJsonFromFile(this->applicationDirPath + "/getConfig.json"); | ||
| 296 | - } else { | ||
| 297 | - QLogger::QLog_Error("Cacic Daemon (Timer)", "Arquivo de configuração não criado."); | ||
| 298 | - } | ||
| 299 | - delete fileOld; | ||
| 300 | - delete fileNew; | ||
| 301 | - lerArquivoConfig(jsonConfig["agentcomputer"].toObject()); | ||
| 302 | - | ||
| 303 | - QStringList nomesModulos; | ||
| 304 | - | ||
| 305 | - int countExecNotFound = 0; | ||
| 306 | - QMap<QString, QString>::const_iterator moduloIterator = moduleMap.constBegin(); | ||
| 307 | - while (moduloIterator != moduleMap.constEnd()) { | ||
| 308 | - QString nomeModulo = moduloIterator.value(); | ||
| 309 | - QString hashModulo = moduloIterator.key(); | ||
| 310 | - // Calcula hash do binario atual | ||
| 311 | -#if defined(Q_OS_WIN) | ||
| 312 | - fileOld = new QFile(this->applicationDirPath + "/" + nomeModulo + ".exe"); | ||
| 313 | -#else | ||
| 314 | - fileOld = new QFile(this->applicationDirPath + "/" + nomeModulo); | ||
| 315 | -#endif | ||
| 316 | - if(!fileOld->exists()) { | ||
| 317 | - QLogger::QLog_Error("Cacic Daemon (Timer)", QString("Módulo ").append(nomeModulo).append(" não encontrado.")); | ||
| 318 | - countExecNotFound++; | ||
| 319 | - | ||
| 320 | - if( countExecNotFound == moduleMap.size() ) { | ||
| 321 | - QLogger::QLog_Error("Cacic Daemon (Timer)", "Não foi possível encontrar nenhum módulo executável!"); | ||
| 322 | - return QStringList(); | ||
| 323 | - } | ||
| 324 | - | ||
| 325 | - // pula para o próximo módulo no moduloMap | ||
| 326 | - moduloIterator++; | ||
| 327 | - continue; | ||
| 328 | - } | ||
| 329 | - | ||
| 330 | - QString oldMd5 = QString(QCryptographicHash::hash(fileOld->readAll(),QCryptographicHash::Md5).toHex()); | ||
| 331 | - if ( oldMd5 != hashModulo ) { | ||
| 332 | - | ||
| 333 | -#if defined(Q_OS_WIN) | ||
| 334 | - fileOld->rename(this->applicationDirPath + "/" + nomeModulo + ".exe", | ||
| 335 | - this->applicationDirPath + "/" + nomeModulo + "Old.exe"); | ||
| 336 | -#elif defined(Q_OS_LINUX) | ||
| 337 | - fileOld->rename(this->applicationDirPath + "/" + nomeModulo, | ||
| 338 | - this->applicationDirPath + "/" + nomeModulo + "Old"); | ||
| 339 | -#endif | ||
| 340 | - | ||
| 341 | - // Download nova versão do executável | ||
| 342 | - QList<QMap<QString,QString> >::const_iterator metodosIterator = metodosDownload.constBegin(); | ||
| 343 | - bool downloadSucess = false; | ||
| 344 | - while ( !downloadSucess && metodosIterator != metodosDownload.constEnd() ) { | ||
| 345 | - if( metodosIterator->value("tipo") == "ftp" || metodosIterator->value("tipo") == "" ) { | ||
| 346 | - if ( OCacicComm->ftpDownload( metodosIterator->value("url"), metodosIterator->value("path") ) ) | ||
| 347 | - downloadSucess = true; | ||
| 348 | - } else if ( metodosIterator->value("tipo") == "http" ) { | ||
| 349 | - if( OCacicComm->httpDownload( metodosIterator->value("url"), metodosIterator->value("path") ) ) | ||
| 350 | - downloadSucess = true; | ||
| 351 | - } | ||
| 352 | - metodosIterator++; | ||
| 353 | - } | ||
| 354 | - fileOld->remove(); | ||
| 355 | - delete fileOld; | ||
| 356 | - } | ||
| 357 | - | ||
| 358 | - nomesModulos.append(nomeModulo); | ||
| 359 | - | ||
| 360 | - moduloIterator++; | ||
| 361 | - } | ||
| 362 | - | ||
| 363 | - return nomesModulos; | ||
| 364 | -} |
cacic-daemon/cacicD/cacictimer.h
| @@ -35,7 +35,7 @@ public: | @@ -35,7 +35,7 @@ public: | ||
| 35 | void setPeriodicidadeExecucao(int value); | 35 | void setPeriodicidadeExecucao(int value); |
| 36 | 36 | ||
| 37 | private: | 37 | private: |
| 38 | - void verificarEIniciarQMutex(); | 38 | + bool verificarEIniciarQMutex(); |
| 39 | QStringList verificarModulos(); | 39 | QStringList verificarModulos(); |
| 40 | void reiniciarTimer(); | 40 | void reiniciarTimer(); |
| 41 | QLogger::QLoggerManager *logManager; | 41 | QLogger::QLoggerManager *logManager; |
| @@ -50,8 +50,6 @@ private: | @@ -50,8 +50,6 @@ private: | ||
| 50 | QJsonObject jsonConfig; | 50 | QJsonObject jsonConfig; |
| 51 | int periodicidadeExecucao = 14400; // 4*3600. Tempo default de execução. | 51 | int periodicidadeExecucao = 14400; // 4*3600. Tempo default de execução. |
| 52 | int getPeriodicidadeExecucao() const; | 52 | int getPeriodicidadeExecucao() const; |
| 53 | - QList<QMap<QString,QString> > metodosDownload; | ||
| 54 | - QMap<QString, QString> moduleMap; // key = hash md5, value = nome do modulo | ||
| 55 | 53 | ||
| 56 | private slots: | 54 | private slots: |
| 57 | void mslot(); | 55 | void mslot(); |
cacic-teste/cacic-teste.pro
| @@ -31,7 +31,8 @@ SOURCES += \ | @@ -31,7 +31,8 @@ SOURCES += \ | ||
| 31 | ../src/vregistry.cpp \ | 31 | ../src/vregistry.cpp \ |
| 32 | ../src/ccoleta.cpp \ | 32 | ../src/ccoleta.cpp \ |
| 33 | ../src/wmi.cpp \ | 33 | ../src/wmi.cpp \ |
| 34 | - ../src/QLogger.cpp | 34 | + ../src/QLogger.cpp \ |
| 35 | + ../src/checkmodules.cpp | ||
| 35 | # ../src/qtservice/src/qtservice.cpp \ | 36 | # ../src/qtservice/src/qtservice.cpp \ |
| 36 | # ../src/qtservice/src/qtservice_unix.cpp \ | 37 | # ../src/qtservice/src/qtservice_unix.cpp \ |
| 37 | # ../src/qtservice/src/qtservice_win.cpp \ | 38 | # ../src/qtservice/src/qtservice_win.cpp \ |
| @@ -52,7 +53,8 @@ HEADERS += \ | @@ -52,7 +53,8 @@ HEADERS += \ | ||
| 52 | ../src/vregistry.h \ | 53 | ../src/vregistry.h \ |
| 53 | ../src/ccoleta.h \ | 54 | ../src/ccoleta.h \ |
| 54 | ../src/wmi.h \ | 55 | ../src/wmi.h \ |
| 55 | - ../src/QLogger.h | 56 | + ../src/QLogger.h \ |
| 57 | + ../src/checkmodules.h | ||
| 56 | # ../src/qtservice/src/qtservice.h \ | 58 | # ../src/qtservice/src/qtservice.h \ |
| 57 | # ../src/qtservice/src/qtservice_p.h \ | 59 | # ../src/qtservice/src/qtservice_p.h \ |
| 58 | # ../src/qtservice/src/qtunixserversocket.h \ | 60 | # ../src/qtservice/src/qtunixserversocket.h \ |
cacic-teste/testcacic.cpp
| @@ -246,18 +246,14 @@ void CTestCacic::testGetTest() | @@ -246,18 +246,14 @@ void CTestCacic::testGetTest() | ||
| 246 | QVERIFY(ok); | 246 | QVERIFY(ok); |
| 247 | } | 247 | } |
| 248 | 248 | ||
| 249 | -void CTestCacic::testColeta() | 249 | +void CTestCacic::testGetConfig() |
| 250 | { | 250 | { |
| 251 | bool ok; | 251 | bool ok; |
| 252 | QJsonObject configEnvio; | 252 | QJsonObject configEnvio; |
| 253 | configEnvio["computador"] = oColeta.getOComputer().toJsonObject(); | 253 | configEnvio["computador"] = oColeta.getOComputer().toJsonObject(); |
| 254 | - OCacic.setJsonToFile(OCacicComm->comm("/ws/neo/config", &ok, configEnvio), "getConfig.json"); | ||
| 255 | - oColeta.configuraColetas(); | ||
| 256 | - oColeta.run(); | ||
| 257 | - oColeta.waitToCollect(); | 254 | + OCacic.setJsonToFile(OCacicComm->comm("/ws/neo/config", &ok, configEnvio)["reply"].toObject(), "getConfig.json"); |
| 258 | 255 | ||
| 259 | - QVERIFY(!oColeta.toJsonObject()["software"].toObject().isEmpty() && | ||
| 260 | - !oColeta.toJsonObject()["hardware"].toObject().isEmpty()); | 256 | + QVERIFY(ok); |
| 261 | } | 257 | } |
| 262 | 258 | ||
| 263 | void CTestCacic::testLogger() | 259 | void CTestCacic::testLogger() |
| @@ -334,6 +330,12 @@ void CTestCacic::testEnviaColeta() | @@ -334,6 +330,12 @@ void CTestCacic::testEnviaColeta() | ||
| 334 | QVERIFY(ok); | 330 | QVERIFY(ok); |
| 335 | } | 331 | } |
| 336 | 332 | ||
| 333 | +void CTestCacic::testGetModulesValues() | ||
| 334 | +{ | ||
| 335 | + oCheckModules = new CheckModules(QDir::currentPath()); | ||
| 336 | + QVERIFY(false); | ||
| 337 | +} | ||
| 338 | + | ||
| 337 | void CTestCacic::cleanupTestCase() | 339 | void CTestCacic::cleanupTestCase() |
| 338 | { | 340 | { |
| 339 | // OCacic.deleteFile("gpl-2.0.txt"); | 341 | // OCacic.deleteFile("gpl-2.0.txt"); |
| @@ -347,5 +349,5 @@ void CTestCacic::cleanupTestCase() | @@ -347,5 +349,5 @@ void CTestCacic::cleanupTestCase() | ||
| 347 | OCacic.deleteFolder("../logs"); | 349 | OCacic.deleteFolder("../logs"); |
| 348 | OCacic.deleteFile("configRequest.json"); | 350 | OCacic.deleteFile("configRequest.json"); |
| 349 | OCacic.deleteFile("teste.json"); | 351 | OCacic.deleteFile("teste.json"); |
| 350 | - OCacic.deleteFile("getConfig.json"); | 352 | +// OCacic.deleteFile("getConfig.json"); |
| 351 | } | 353 | } |
cacic-teste/testcacic.h
| @@ -18,6 +18,7 @@ | @@ -18,6 +18,7 @@ | ||
| 18 | #include <QJsonObject> | 18 | #include <QJsonObject> |
| 19 | #include <ccoleta.h> | 19 | #include <ccoleta.h> |
| 20 | #include <QLogger.h> | 20 | #include <QLogger.h> |
| 21 | +#include <checkmodules.h> | ||
| 21 | 22 | ||
| 22 | class CTestCacic : public QObject | 23 | class CTestCacic : public QObject |
| 23 | { | 24 | { |
| @@ -36,6 +37,7 @@ private: | @@ -36,6 +37,7 @@ private: | ||
| 36 | QJsonObject session; | 37 | QJsonObject session; |
| 37 | QString cripTeste; | 38 | QString cripTeste; |
| 38 | CColeta oColeta; | 39 | CColeta oColeta; |
| 40 | + CheckModules *oCheckModules; | ||
| 39 | // cacicD OcacicD; | 41 | // cacicD OcacicD; |
| 40 | 42 | ||
| 41 | signals: | 43 | signals: |
| @@ -73,10 +75,11 @@ private slots: | @@ -73,10 +75,11 @@ private slots: | ||
| 73 | void testColetaHardware(); | 75 | void testColetaHardware(); |
| 74 | void testConvertDouble(); | 76 | void testConvertDouble(); |
| 75 | void testGetTest(); | 77 | void testGetTest(); |
| 76 | - void testColeta(); | 78 | + void testGetConfig(); |
| 77 | void testLogger(); | 79 | void testLogger(); |
| 78 | void testFtpDownload(); | 80 | void testFtpDownload(); |
| 79 | void testEnviaColeta(); | 81 | void testEnviaColeta(); |
| 82 | + void testGetModulesValues(); | ||
| 80 | void cleanupTestCase(); | 83 | void cleanupTestCase(); |
| 81 | }; | 84 | }; |
| 82 | 85 |
src/checkmodules.cpp
| 1 | #include "checkmodules.h" | 1 | #include "checkmodules.h" |
| 2 | 2 | ||
| 3 | -CheckModules::CheckModules() | 3 | +CheckModules::CheckModules(const QString &workingPath) |
| 4 | { | 4 | { |
| 5 | + QJsonObject configFile; | ||
| 6 | + configFile = oCacic.getJsonFromFile(workingPath + "/getConfig.json"); | ||
| 7 | + if (!configFile.isEmpty()) { | ||
| 8 | + QJsonArray modulos; | ||
| 9 | + modulos = configFile["agentcomputer"].toObject()["modulos"].toArray(); | ||
| 10 | + foreach (QJsonValue modulo, modulos){ | ||
| 11 | + modules[modulo.toObject()["nome"].toString()] = modulo.toObject()["hash"].toString(); | ||
| 12 | + } | ||
| 13 | + } | ||
| 14 | + //TODO: Completar constructor. Agora que tenho os nomes dos módulos e os hashs, fazer a verificação. | ||
| 15 | + qDebug() << modules; | ||
| 5 | } | 16 | } |
| 17 | + | ||
| 18 | +bool CheckModules::start(){ | ||
| 19 | + return true; | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +//QStringList CheckModules::verificaModulos(){ | ||
| 23 | +// // Compara o novo arquivo de configuração com um antigo e se forem diferentes | ||
| 24 | +// // mantem o mais recente; caso iguais simplesmente apaga o novo. | ||
| 25 | +// QFile *fileOld; | ||
| 26 | +// QFile *fileNew; | ||
| 27 | + | ||
| 28 | +// fileOld = new QFile(this->applicationDirPath + "/getConfig.json"); | ||
| 29 | +// fileNew = new QFile(this->applicationDirPath + "/getConfigNew.json"); | ||
| 30 | + | ||
| 31 | +// if( fileOld->exists() && fileNew->exists() ){ | ||
| 32 | +// if( Md5IsEqual(QVariant::fromValue(fileOld), QVariant::fromValue(fileNew)) ) { | ||
| 33 | +// fileNew->remove(); | ||
| 34 | +// } else { | ||
| 35 | +// // Renomeia getConfigNew.json para getConfig.json | ||
| 36 | +// fileOld->remove(); | ||
| 37 | +// fileNew->rename("getConfigNew.json","getConfig.json"); | ||
| 38 | +// } | ||
| 39 | +// jsonConfig = ccacic->getJsonFromFile(this->applicationDirPath + "/getConfig.json"); | ||
| 40 | +// } else if( fileOld->exists() ){ | ||
| 41 | +// jsonConfig = ccacic->getJsonFromFile(this->applicationDirPath + "/getConfig.json"); | ||
| 42 | +// } else { | ||
| 43 | +// QLogger::QLog_Error("Cacic Daemon (Timer)", "Arquivo de configuração não criado."); | ||
| 44 | +// } | ||
| 45 | +// delete fileOld; | ||
| 46 | +// delete fileNew; | ||
| 47 | +// lerArquivoConfig(jsonConfig["agentcomputer"].toObject()); | ||
| 48 | + | ||
| 49 | +// QStringList nomesModulos; | ||
| 50 | + | ||
| 51 | +// int countExecNotFound = 0; | ||
| 52 | +// QMap<QString, QString>::const_iterator moduloIterator = moduleMap.constBegin(); | ||
| 53 | +// while (moduloIterator != moduleMap.constEnd()) { | ||
| 54 | +// QString nomeModulo = moduloIterator.value(); | ||
| 55 | +// QString hashModulo = moduloIterator.key(); | ||
| 56 | +// // Calcula hash do binario atual | ||
| 57 | +//#if defined(Q_OS_WIN) | ||
| 58 | +// fileOld = new QFile(this->applicationDirPath + "/" + nomeModulo + ".exe"); | ||
| 59 | +//#else | ||
| 60 | +// fileOld = new QFile(this->applicationDirPath + "/" + nomeModulo); | ||
| 61 | +//#endif | ||
| 62 | +// if(!fileOld->exists()) { | ||
| 63 | +// QLogger::QLog_Error("Cacic Daemon (Timer)", QString("Módulo ").append(nomeModulo).append(" não encontrado.")); | ||
| 64 | +// countExecNotFound++; | ||
| 65 | + | ||
| 66 | +// if( countExecNotFound == moduleMap.size() ) { | ||
| 67 | +// QLogger::QLog_Error("Cacic Daemon (Timer)", "Não foi possível encontrar nenhum módulo executável!"); | ||
| 68 | +// return QStringList(); | ||
| 69 | +// } | ||
| 70 | + | ||
| 71 | +// // pula para o próximo módulo no moduloMap | ||
| 72 | +// moduloIterator++; | ||
| 73 | +// continue; | ||
| 74 | +// } | ||
| 75 | + | ||
| 76 | +// QString oldMd5 = QString(QCryptographicHash::hash(fileOld->readAll(),QCryptographicHash::Md5).toHex()); | ||
| 77 | +// if ( oldMd5 != hashModulo ) { | ||
| 78 | + | ||
| 79 | +//#if defined(Q_OS_WIN) | ||
| 80 | +// fileOld->rename(this->applicationDirPath + "/" + nomeModulo + ".exe", | ||
| 81 | +// this->applicationDirPath + "/" + nomeModulo + "Old.exe"); | ||
| 82 | +//#elif defined(Q_OS_LINUX) | ||
| 83 | +// fileOld->rename(this->applicationDirPath + "/" + nomeModulo, | ||
| 84 | +// this->applicationDirPath + "/" + nomeModulo + "Old"); | ||
| 85 | +//#endif | ||
| 86 | + | ||
| 87 | +// // Download nova versão do executável | ||
| 88 | +// QList<QMap<QString,QString> >::const_iterator metodosIterator = metodosDownload.constBegin(); | ||
| 89 | +// bool downloadSucess = false; | ||
| 90 | +// while ( !downloadSucess && metodosIterator != metodosDownload.constEnd() ) { | ||
| 91 | +// if( metodosIterator->value("tipo") == "ftp" || metodosIterator->value("tipo") == "" ) { | ||
| 92 | +// if ( OCacicComm->ftpDownload( metodosIterator->value("url"), metodosIterator->value("path") ) ) | ||
| 93 | +// downloadSucess = true; | ||
| 94 | +// } else if ( metodosIterator->value("tipo") == "http" ) { | ||
| 95 | +// if( OCacicComm->httpDownload( metodosIterator->value("url"), metodosIterator->value("path") ) ) | ||
| 96 | +// downloadSucess = true; | ||
| 97 | +// } | ||
| 98 | +// metodosIterator++; | ||
| 99 | +// } | ||
| 100 | +// fileOld->remove(); | ||
| 101 | +// delete fileOld; | ||
| 102 | +// } | ||
| 103 | + | ||
| 104 | +// nomesModulos.append(nomeModulo); | ||
| 105 | + | ||
| 106 | +// moduloIterator++; | ||
| 107 | +// } | ||
| 108 | + | ||
| 109 | +// return nomesModulos; | ||
| 110 | +//} | ||
| 111 | + | ||
| 112 | +//void CheckModules::lerArquivoConfig ( const QJsonObject& jsonConfig ) | ||
| 113 | +//{ | ||
| 114 | +// /* lê json de configurações e armazena quais módulos executáveis. | ||
| 115 | +// * E faz o mesmo tipo de comparação de hashs, com o fim de: | ||
| 116 | +// * ou mantem o binário do módulo ou baixa um novo. | ||
| 117 | +// */ | ||
| 118 | +// foreach( QJsonValue individualModule, jsonConfig["modulos"].toArray() ) { | ||
| 119 | +// QString moduloKey, moduloValue; | ||
| 120 | + | ||
| 121 | +// moduloKey = individualModule.toObject()["hash"].toString(); | ||
| 122 | +// moduloValue = individualModule.toObject()["nome"].toString(); | ||
| 123 | + | ||
| 124 | +// moduleMap.insert(moduloKey, moduloValue); | ||
| 125 | +// } | ||
| 126 | + | ||
| 127 | +// if ( jsonConfig["metodoDownload"].isArray() ) { | ||
| 128 | + | ||
| 129 | +// foreach (QJsonValue individualMetodo, jsonConfig["metodoDownload"].toArray() ) { | ||
| 130 | +// QMap<QString, QString> newEntry; | ||
| 131 | + | ||
| 132 | +// newEntry.insert(QString("tipo"), individualMetodo.toObject()["tipo"].toString() ); | ||
| 133 | +// newEntry.insert(QString("url"), individualMetodo.toObject()["url"].toString() ); | ||
| 134 | +// newEntry.insert(QString("path"), individualMetodo.toObject()["path"].toString() ); | ||
| 135 | +// newEntry.insert(QString("usuario"), individualMetodo.toObject()["usario"].toString() ); | ||
| 136 | +// newEntry.insert(QString("senha"), individualMetodo.toObject()["senha"].toString() ); | ||
| 137 | + | ||
| 138 | +// metodosDownload.append( newEntry ); | ||
| 139 | +// } | ||
| 140 | +// } else { | ||
| 141 | +// QMap<QString, QString> newEntry; | ||
| 142 | + | ||
| 143 | +// newEntry.insert(QString("tipo"), jsonConfig["metodoDownload"].toObject()["tipo"].toString() ); | ||
| 144 | +// newEntry.insert(QString("url"), jsonConfig["metodoDownload"].toObject()["url"].toString() ); | ||
| 145 | +// newEntry.insert(QString("path"), jsonConfig["metodoDownload"].toObject()["path"].toString() ); | ||
| 146 | +// newEntry.insert(QString("usuario"), jsonConfig["metodoDownload"].toObject()["usario"].toString() ); | ||
| 147 | +// newEntry.insert(QString("senha"), jsonConfig["metodoDownload"].toObject()["senha"].toString() ); | ||
| 148 | + | ||
| 149 | +// metodosDownload.append( newEntry ); | ||
| 150 | +// } | ||
| 151 | +//} |
src/checkmodules.h
| 1 | #ifndef CHECKMODULES_H | 1 | #ifndef CHECKMODULES_H |
| 2 | #define CHECKMODULES_H | 2 | #define CHECKMODULES_H |
| 3 | 3 | ||
| 4 | +#include <ccacic.h> | ||
| 5 | +#include <cacic_comm.h> | ||
| 6 | +#include <cacic_computer.h> | ||
| 7 | + | ||
| 4 | class CheckModules | 8 | class CheckModules |
| 5 | { | 9 | { |
| 6 | public: | 10 | public: |
| 7 | - CheckModules(); | 11 | + CheckModules(const QString &workingPath); |
| 12 | +// QStringList verificaModulos(); | ||
| 13 | + bool start(); | ||
| 14 | +private: | ||
| 15 | + CCacic oCacic; | ||
| 16 | + QVariantMap modules; //modules["name"] = hash; | ||
| 17 | +// void lerArquivoConfig(const QJsonObject& jsonConfig); | ||
| 8 | }; | 18 | }; |
| 9 | 19 | ||
| 10 | #endif // CHECKMODULES_H | 20 | #endif // CHECKMODULES_H |