From 48bd8e5a7d5a3b08241c8e6eaa6fb662bfd22890 Mon Sep 17 00:00:00 2001 From: Thiago Rocha Date: Tue, 16 Sep 2014 11:32:52 -0300 Subject: [PATCH] Modificações para adequar ao JSON de configuração definido. --- cacic-daemon/cacicD/cacicd.cpp | 21 ++++++++++----------- cacic-daemon/cacicD/cacictimer.cpp | 243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------- cacic-daemon/cacicD/cacictimer.h | 10 +++++++--- src/cacic_comm.h | 13 +++++++++++++ 4 files changed, 161 insertions(+), 126 deletions(-) diff --git a/cacic-daemon/cacicD/cacicd.cpp b/cacic-daemon/cacicD/cacicd.cpp index e46a9fd..97b31f0 100644 --- a/cacic-daemon/cacicD/cacicd.cpp +++ b/cacic-daemon/cacicD/cacicd.cpp @@ -15,6 +15,7 @@ cacicD::cacicD(int argc, char **argv) : QtService(argc, argv, logManager->addDestination(application()->applicationDirPath() + "/cacicLog.txt","Cacic Daemon",QLogger::ErrorLevel); } catch (...){ qCritical() << "Error desconhecido no construtor."; + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido no construtor.")); } } @@ -24,51 +25,49 @@ cacicD::~cacicD() logManager->closeLogger(); application()->exit(); } catch (...){ - qCritical() << "Error desconhecido no desconstrutor."; + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido no destrutor.")); } } void cacicD::start() { try{ - qDebug() << "Inicio do daemon"; - qDebug() << "\nServiço iniciado em" << application()->applicationDirPath(); QLogger::QLog_Info("Cacic Daemon", QString("Servico iniciado em ").append(application()->applicationDirPath()).append(".")); QJsonObject result = ccacic->getJsonFromFile(application()->applicationDirPath().append("/getConfig.json")); if(!result.contains("error") && !result.isEmpty()){ Ocacictimer->iniciarTimer(result["codestatus"].toInt()); }else{ - qDebug() << "getConfig.json não encontrado."; + QLogger::QLog_Error("Cacic Daemon", QString("getConfig.json não encontrado.")); } //QLogger::QLog_Info("Cacic Daemon", "Serviço finalizado."); }catch (...){ - qCritical() << "Error desconhecido ao iniciar o serviço."; + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido ao iniciar o serviço.")); } } void cacicD::pause() { try{ - qDebug() << "Serviço pausado."; + QLogger::QLog_Info("Cacic Daemon", QString("Serviço pausado.")); } catch (...){ - qCritical() << "Error desconhecido ao pausar o serviço."; + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido ao pausar o serviço.")); } } void cacicD::resume() { try{ - qDebug() << "Serviço resumido."; + QLogger::QLog_Info("Cacic Daemon", QString("Serviço resumido.")); } catch (...){ - qCritical() << "Error desconhecido ao resumir o serviço."; + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido ao resumir o serviço.")); } } void cacicD::stop() { try{ - qDebug() << "Serviço parado."; + QLogger::QLog_Info("Cacic Daemon", QString("Serviço parado.")); } catch (...){ - qCritical() << "Error desconhecido ao parar o serviço."; + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido ao parar o serviço.")); } } diff --git a/cacic-daemon/cacicD/cacictimer.cpp b/cacic-daemon/cacicD/cacictimer.cpp index cfb8b86..e11f8c5 100644 --- a/cacic-daemon/cacicD/cacictimer.cpp +++ b/cacic-daemon/cacicD/cacictimer.cpp @@ -25,117 +25,106 @@ void CacicTimer::mslot(){ QLogger::QLog_Info("Cacic Daemon (Timer)", QString("mslot();")); cMutex->lock(); QLogger::QLog_Info("Cacic Daemon (Timer)", QString("Semáforo fechado.")); - //if(getTest()){ - // QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getTeste() success.")); - // if(getConfig()){ - // QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getConfig() success.")); - iniciarGercols(); - // } - // } + + if(getTest()){ + QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getTeste() success.")); + + if(getConfig()){ + QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getConfig() success.")); + + // 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(getApplicationDirPath().append("/getConfig.json")); + fileNew = new QFile(getApplicationDirPath().append("/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(getApplicationDirPath().append("/getConfig.json")); + } else if( fileOld->exists() ){ + jsonConfig = ccacic->getJsonFromFile(getApplicationDirPath().append("/getConfig.json")); + } else { + QLogger::QLog_Error("Cacic Daemon (Timer)", "Arquivo de configuração não criado."); + } + delete fileOld; + delete fileNew; + + lerArquivoConfig(jsonConfig); + + int countExecNotFound = 0; + QMap::const_iterator mapIterator = moduleMap.constBegin(); + while (mapIterator != moduleMap.constEnd()) { + QString nomeModulo = mapIterator.value(); + QString hashModulo = mapIterator.key(); + + // Calcula hash do binario atual +#if defined(Q_OS_WIN) + fileOld = new QFile(getApplicationDirPath().append("/").append(modulo).append(".exe")); +#else + fileOld = new QFile(getApplicationDirPath().append("/").append(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; + } + continue; + } + + QString oldMd5 = QString(QCryptographicHash::hash(fileOld->readAll(),QCryptographicHash::Md5).toHex()); + + if ( oldMd5 != hashModulo ) { + + fileOld->rename(getApplicationDirPath().append("/").append(nomeModulo), + getApplicationDirPath().append("/").append("nomeModulo").append("Old") ); + + // 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; + } + + mapIterator++; + } + }else{ + qDebug() << "getConfig() failed. - " + QDateTime::currentDateTime().toLocalTime().toString(); + QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na obtenção do arquivo de configuração."); + } + }else{ + qDebug() << "getTest() failed. - " + QDateTime::currentDateTime().toLocalTime().toString(); + QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na execução do getTest()."); + } + cMutex->unlock(); QLogger::QLog_Info("Cacic Daemon (Timer)", QString("Semáforo aberto.")); } -// QLogger::QLog_Info("Cacic Timer", QString("semáforo aberto.")); -// qDebug() << "getConfig() success. - " + QDateTime::currentDateTime().toLocalTime().toString(); -// QLogger::QLog_Info("Cacic Daemon (Timer)", "getConfig() executado com sucesso."); - -// // 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(getApplicationDirPath().append("/getConfig.json")); -// fileNew = new QFile(getApplicationDirPath().append("/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(getApplicationDirPath().append("/getConfig.json")); -// } else if( fileOld->exists() ){ -// jsonConfig = ccacic->getJsonFromFile(getApplicationDirPath().append("/getConfig.json")); -// } else { -// QLogger::QLog_Error("Cacic Daemon (Timer)", "Arquivo de configuração não criado."); -// } -// delete fileOld; -// delete fileNew; - -// /* 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. -// */ - -// /* Aqui estou assumindo um formato do .json em que: -// * há a key modulos contem uma lista com o nome dos executaveis e os seus valores hash md5 -// * há a key metodo que explicita o método de download dos executaveis -// */ -// foreach( QJsonValue moduloValues, jsonConfig["modulos"].toArray() ) { -// QString moduloKey, moduloValue; - -// moduloKey = moduloValues.toObject()["md5"].toString(); -// moduloValue = moduloValues.toObject()["nome"].toString(); - -// moduleMap.insert(moduloKey, moduloValue); -// } -// metodoDownload = jsonConfig["metodo"].toString(); - -// int countExecNotFound = 0; -// QMap::const_iterator mapIterator = moduleMap.constBegin(); -// while (mapIterator != moduleMap.constEnd()) { -// QString nomeModulo = mapIterator.value(); -// QString hashModulo = mapIterator.key(); - -// // Calcula hash do binario atual -//#if defined(Q_OS_WIN) -// fileOld = new QFile(getApplicationDirPath().append("/").append(modulo).append(".exe")); -//#else -// fileOld = new QFile(getApplicationDirPath().append("/").append(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; -// } -// continue; -// } - -// QString oldMd5 = QString(QCryptographicHash::hash(fileOld->readAll(),QCryptographicHash::Md5).toHex()); - -// if ( oldMd5 != hashModulo ) { - -// fileOld->rename(getApplicationDirPath().append("/").append(nomeModulo), -// getApplicationDirPath().append("/").append("nomeModulo").append("Old") ); - -// // Download nova versão do executável -// if(metodoDownload == "ftp" || metodoDownload == "") { -// // OCacicComm->ftpDownload( QString("/ws/get/").append(nomeModulo) ); -// } - - -// fileOld->remove(); -// delete fileOld; -// } - -// mapIterator++; -// } -// }else{ -// qDebug() << "getConfig() failed. - " + QDateTime::currentDateTime().toLocalTime().toString(); -// QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na obtenção do arquivo de configuração."); -// } -// }else{ -// qDebug() << "getTest() failed. - " + QDateTime::currentDateTime().toLocalTime().toString(); -// QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na execução do getTest()."); -// } -// } -// } -//} +QString CacicTimer::getApplicationDirPath() { + return applicationDirPath; +} bool CacicTimer::getTest(){ try{ @@ -181,7 +170,37 @@ bool CacicTimer::getConfig(){ } } -void CacicTimer::registraInicio() +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. + * + * Aqui estou assumindo um formato do .json em que: + * há a key modulos contem uma lista com o nome dos executaveis e os seus valores hash md5 + * há a key metodo que explicita o método de download dos executaveis + */ + foreach( QJsonValue individualModule, jsonConfig["modulos"].toArray() ) { + QString moduloKey, moduloValue; + + moduloKey = individualModule.toObject()["hash"].toString(); + moduloValue = individualModule.toObject()["nome"].toString(); + + moduleMap.insert(moduloKey, moduloValue); + } + + 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() ); + + metodosDownload.append( newEntry ); + } +} + +void CacicTimer::registraInicioColeta() { QLogger::QLog_Info("Cacic Daemon (Timer)","Coleta iniciada em: " + QDateTime::currentDateTime().toLocalTime().toString()); } @@ -199,17 +218,17 @@ void CacicTimer::setDirProgram(const QString &value) void CacicTimer::iniciarGercols() { - registraInicio(); + registraInicioColeta(); QDir::setCurrent(this->applicationDirPath); QProcess proc; proc.setWorkingDirectory(this->applicationDirPath); proc.execute(getDirProgram()); if((proc.atEnd()) && (proc.exitStatus() == QProcess::NormalExit)){ - registraFim("SUCESSO"); + registraFimColeta("SUCESSO"); }else{ proc.waitForFinished(120000); if((!proc.atEnd()) || (proc.exitStatus() == QProcess::CrashExit)){ - registraFim("ERRO"); + registraFimColeta("ERRO"); proc.kill(); } } @@ -221,7 +240,7 @@ void CacicTimer::setApplicationDirPath(const QString &value) } -void CacicTimer::registraFim(QString msg) +void CacicTimer::registraFimColeta(QString msg) { QLogger::QLog_Info("Cacic Daemon (Timer)","Coleta finalizada com " + msg + " em: " + QDateTime::currentDateTime().toLocalTime().toString()); } diff --git a/cacic-daemon/cacicD/cacictimer.h b/cacic-daemon/cacicD/cacictimer.h index 18623e9..7b915dc 100644 --- a/cacic-daemon/cacicD/cacictimer.h +++ b/cacic-daemon/cacicD/cacictimer.h @@ -24,16 +24,18 @@ public: CACIC_Computer OCacic_Computer; CCacic *ccacic; QMutex *cMutex; + void iniciarTimer(int x); bool getTest(); bool getConfig(); bool Md5IsEqual(QVariant document01,QVariant document02); void setApplicationDirPath(const QString &value); + QString getApplicationDirPath(); void setDirProgram(const QString &value); private: - void registraFim(QString msg); - void registraInicio(); + void registraFimColeta(QString msg); + void registraInicioColeta(); QLogger::QLoggerManager *logManager; QString dirProgram; //QProcess *myProcess; @@ -41,9 +43,11 @@ private: QString getDirProgram() const; void iniciarGercols(); void iniciarInstancias(); + void lerArquivoConfig( const QJsonObject &jsonConfig); void definirDirGercols(QString appDirPath); QJsonObject jsonConfig; - QString metodoDownload; + + QList > metodosDownload; QMap moduleMap; // key = hash md5, value = nome do modulo private slots: diff --git a/src/cacic_comm.h b/src/cacic_comm.h index 6c2c36d..f9c237e 100644 --- a/src/cacic_comm.h +++ b/src/cacic_comm.h @@ -161,6 +161,19 @@ public: url.setScheme("ftp"); url.setPath(path); + return false; + } + + bool ftpDownload(QString urlServer, QString path){ + QUrl url(urlServer); + url.setScheme("ftp"); + url.setPath(path); + + return false; + } + + bool httpDownload( QString urlServer, QString path ){ + return false; } QString getUrlSsl (){ -- libgit2 0.21.2