Commit 48bd8e5a7d5a3b08241c8e6eaa6fb662bfd22890

Authored by Thiago Rocha
1 parent fb84683c
Exists in master

Modificações para adequar ao JSON de configuração definido.

cacic-daemon/cacicD/cacicd.cpp
@@ -15,6 +15,7 @@ cacicD::cacicD(int argc, char **argv) : QtService<QCoreApplication>(argc, argv, @@ -15,6 +15,7 @@ cacicD::cacicD(int argc, char **argv) : QtService<QCoreApplication>(argc, argv,
15 logManager->addDestination(application()->applicationDirPath() + "/cacicLog.txt","Cacic Daemon",QLogger::ErrorLevel); 15 logManager->addDestination(application()->applicationDirPath() + "/cacicLog.txt","Cacic Daemon",QLogger::ErrorLevel);
16 } catch (...){ 16 } catch (...){
17 qCritical() << "Error desconhecido no construtor."; 17 qCritical() << "Error desconhecido no construtor.";
  18 + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido no construtor."));
18 } 19 }
19 } 20 }
20 21
@@ -24,51 +25,49 @@ cacicD::~cacicD() @@ -24,51 +25,49 @@ cacicD::~cacicD()
24 logManager->closeLogger(); 25 logManager->closeLogger();
25 application()->exit(); 26 application()->exit();
26 } catch (...){ 27 } catch (...){
27 - qCritical() << "Error desconhecido no desconstrutor."; 28 + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido no destrutor."));
28 } 29 }
29 } 30 }
30 31
31 void cacicD::start() { 32 void cacicD::start() {
32 try{ 33 try{
33 - qDebug() << "Inicio do daemon";  
34 - qDebug() << "\nServiço iniciado em" << application()->applicationDirPath();  
35 QLogger::QLog_Info("Cacic Daemon", QString("Servico iniciado em ").append(application()->applicationDirPath()).append(".")); 34 QLogger::QLog_Info("Cacic Daemon", QString("Servico iniciado em ").append(application()->applicationDirPath()).append("."));
36 QJsonObject result = ccacic->getJsonFromFile(application()->applicationDirPath().append("/getConfig.json")); 35 QJsonObject result = ccacic->getJsonFromFile(application()->applicationDirPath().append("/getConfig.json"));
37 if(!result.contains("error") && !result.isEmpty()){ 36 if(!result.contains("error") && !result.isEmpty()){
38 Ocacictimer->iniciarTimer(result["codestatus"].toInt()); 37 Ocacictimer->iniciarTimer(result["codestatus"].toInt());
39 }else{ 38 }else{
40 - qDebug() << "getConfig.json não encontrado."; 39 + QLogger::QLog_Error("Cacic Daemon", QString("getConfig.json não encontrado."));
41 } 40 }
42 //QLogger::QLog_Info("Cacic Daemon", "Serviço finalizado."); 41 //QLogger::QLog_Info("Cacic Daemon", "Serviço finalizado.");
43 }catch (...){ 42 }catch (...){
44 - qCritical() << "Error desconhecido ao iniciar o serviço."; 43 + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido ao iniciar o serviço."));
45 } 44 }
46 } 45 }
47 46
48 void cacicD::pause() 47 void cacicD::pause()
49 { 48 {
50 try{ 49 try{
51 - qDebug() << "Serviço pausado."; 50 + QLogger::QLog_Info("Cacic Daemon", QString("Serviço pausado."));
52 } catch (...){ 51 } catch (...){
53 - qCritical() << "Error desconhecido ao pausar o serviço."; 52 + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido ao pausar o serviço."));
54 } 53 }
55 } 54 }
56 55
57 void cacicD::resume() 56 void cacicD::resume()
58 { 57 {
59 try{ 58 try{
60 - qDebug() << "Serviço resumido."; 59 + QLogger::QLog_Info("Cacic Daemon", QString("Serviço resumido."));
61 } catch (...){ 60 } catch (...){
62 - qCritical() << "Error desconhecido ao resumir o serviço."; 61 + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido ao resumir o serviço."));
63 } 62 }
64 } 63 }
65 64
66 void cacicD::stop() 65 void cacicD::stop()
67 { 66 {
68 try{ 67 try{
69 - qDebug() << "Serviço parado."; 68 + QLogger::QLog_Info("Cacic Daemon", QString("Serviço parado."));
70 } catch (...){ 69 } catch (...){
71 - qCritical() << "Error desconhecido ao parar o serviço."; 70 + QLogger::QLog_Error("Cacic Daemon", QString("Erro desconhecido ao parar o serviço."));
72 } 71 }
73 } 72 }
74 73
cacic-daemon/cacicD/cacictimer.cpp
@@ -25,117 +25,106 @@ void CacicTimer::mslot(){ @@ -25,117 +25,106 @@ void CacicTimer::mslot(){
25 QLogger::QLog_Info("Cacic Daemon (Timer)", QString("mslot();")); 25 QLogger::QLog_Info("Cacic Daemon (Timer)", QString("mslot();"));
26 cMutex->lock(); 26 cMutex->lock();
27 QLogger::QLog_Info("Cacic Daemon (Timer)", QString("Semáforo fechado.")); 27 QLogger::QLog_Info("Cacic Daemon (Timer)", QString("Semáforo fechado."));
28 - //if(getTest()){  
29 - // QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getTeste() success."));  
30 - // if(getConfig()){  
31 - // QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getConfig() success."));  
32 - iniciarGercols();  
33 - // }  
34 - // } 28 +
  29 + if(getTest()){
  30 + QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getTeste() success."));
  31 +
  32 + if(getConfig()){
  33 + QLogger::QLog_Info("Cacic Daemon (Timer)", QString("getConfig() success."));
  34 +
  35 + // Compara o novo arquivo de configuração com um antigo e se forem diferentes
  36 + // mantem o mais recente; caso iguais simplesmente apaga o novo.
  37 + QFile *fileOld;
  38 + QFile *fileNew;
  39 +
  40 + fileOld = new QFile(getApplicationDirPath().append("/getConfig.json"));
  41 + fileNew = new QFile(getApplicationDirPath().append("/getConfigNew.json"));
  42 + if( fileOld->exists() && fileNew->exists() ){
  43 + if( Md5IsEqual(QVariant::fromValue(fileOld), QVariant::fromValue(fileNew)) ) {
  44 + fileNew->remove();
  45 + } else {
  46 + // Renomeia getConfigNew.json para getConfig.json
  47 + fileOld->remove();
  48 + fileNew->rename("getConfigNew.json","getConfig.json");
  49 + }
  50 + jsonConfig = ccacic->getJsonFromFile(getApplicationDirPath().append("/getConfig.json"));
  51 + } else if( fileOld->exists() ){
  52 + jsonConfig = ccacic->getJsonFromFile(getApplicationDirPath().append("/getConfig.json"));
  53 + } else {
  54 + QLogger::QLog_Error("Cacic Daemon (Timer)", "Arquivo de configuração não criado.");
  55 + }
  56 + delete fileOld;
  57 + delete fileNew;
  58 +
  59 + lerArquivoConfig(jsonConfig);
  60 +
  61 + int countExecNotFound = 0;
  62 + QMap<QString, QString>::const_iterator mapIterator = moduleMap.constBegin();
  63 + while (mapIterator != moduleMap.constEnd()) {
  64 + QString nomeModulo = mapIterator.value();
  65 + QString hashModulo = mapIterator.key();
  66 +
  67 + // Calcula hash do binario atual
  68 +#if defined(Q_OS_WIN)
  69 + fileOld = new QFile(getApplicationDirPath().append("/").append(modulo).append(".exe"));
  70 +#else
  71 + fileOld = new QFile(getApplicationDirPath().append("/").append(nomeModulo));
  72 +#endif
  73 + if(!fileOld->exists()) {
  74 + QLogger::QLog_Error("Cacic Daemon (Timer)", QString("Módulo ").append(nomeModulo).append(" não encontrado."));
  75 +
  76 + countExecNotFound++;
  77 + if( countExecNotFound == moduleMap.size() ) {
  78 + QLogger::QLog_Error("Cacic Daemon (Timer)", "Não foi possível encontrar nenhum módulo executável!");
  79 + return;
  80 + }
  81 + continue;
  82 + }
  83 +
  84 + QString oldMd5 = QString(QCryptographicHash::hash(fileOld->readAll(),QCryptographicHash::Md5).toHex());
  85 +
  86 + if ( oldMd5 != hashModulo ) {
  87 +
  88 + fileOld->rename(getApplicationDirPath().append("/").append(nomeModulo),
  89 + getApplicationDirPath().append("/").append("nomeModulo").append("Old") );
  90 +
  91 + // Download nova versão do executável
  92 + QList<QMap<QString,QString> >::const_iterator metodosIterator = metodosDownload.constBegin();
  93 + bool downloadSucess = false;
  94 + while ( !downloadSucess && metodosIterator != metodosDownload.constEnd() ) {
  95 +
  96 + if( metodosIterator->value("tipo") == "ftp" || metodosIterator->value("tipo") == "" ) {
  97 + if ( OCacicComm->ftpDownload( metodosIterator->value("url"), metodosIterator->value("path") ) )
  98 + downloadSucess = true;
  99 +
  100 + } else if ( metodosIterator->value("tipo") == "http" ) {
  101 + if( OCacicComm->httpDownload( metodosIterator->value("url"), metodosIterator->value("path") ) )
  102 + downloadSucess = true;
  103 + }
  104 + metodosIterator++;
  105 + }
  106 + fileOld->remove();
  107 + delete fileOld;
  108 + }
  109 +
  110 + mapIterator++;
  111 + }
  112 + }else{
  113 + qDebug() << "getConfig() failed. - " + QDateTime::currentDateTime().toLocalTime().toString();
  114 + QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na obtenção do arquivo de configuração.");
  115 + }
  116 + }else{
  117 + qDebug() << "getTest() failed. - " + QDateTime::currentDateTime().toLocalTime().toString();
  118 + QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na execução do getTest().");
  119 + }
  120 +
35 cMutex->unlock(); 121 cMutex->unlock();
36 QLogger::QLog_Info("Cacic Daemon (Timer)", QString("Semáforo aberto.")); 122 QLogger::QLog_Info("Cacic Daemon (Timer)", QString("Semáforo aberto."));
37 } 123 }
38 124
39 -// QLogger::QLog_Info("Cacic Timer", QString("semáforo aberto."));  
40 -// qDebug() << "getConfig() success. - " + QDateTime::currentDateTime().toLocalTime().toString();  
41 -// QLogger::QLog_Info("Cacic Daemon (Timer)", "getConfig() executado com sucesso.");  
42 -  
43 -// // Compara o novo arquivo de configuração com um antigo e se forem diferentes  
44 -// // mantem o mais recente; caso iguais simplesmente apaga o novo.  
45 -// QFile *fileOld;  
46 -// QFile *fileNew;  
47 -  
48 -// fileOld = new QFile(getApplicationDirPath().append("/getConfig.json"));  
49 -// fileNew = new QFile(getApplicationDirPath().append("/getConfigNew.json"));  
50 -// if( fileOld->exists() && fileNew->exists() ){  
51 -// if( Md5IsEqual(QVariant::fromValue(fileOld), QVariant::fromValue(fileNew)) ) {  
52 -// fileNew->remove();  
53 -// } else {  
54 -// // Renomeia getConfigNew.json para getConfig.json  
55 -// fileOld->remove();  
56 -// fileNew->rename("getConfigNew.json","getConfig.json");  
57 -// }  
58 -// jsonConfig = ccacic->getJsonFromFile(getApplicationDirPath().append("/getConfig.json"));  
59 -// } else if( fileOld->exists() ){  
60 -// jsonConfig = ccacic->getJsonFromFile(getApplicationDirPath().append("/getConfig.json"));  
61 -// } else {  
62 -// QLogger::QLog_Error("Cacic Daemon (Timer)", "Arquivo de configuração não criado.");  
63 -// }  
64 -// delete fileOld;  
65 -// delete fileNew;  
66 -  
67 -// /* lê json de configurações e armazena quais módulos executáveis.  
68 -// * E faz o mesmo tipo de comparação de hashs, com o fim de:  
69 -// * ou mantem o binário do módulo ou baixa um novo.  
70 -// */  
71 -  
72 -// /* Aqui estou assumindo um formato do .json em que:  
73 -// * há a key modulos contem uma lista com o nome dos executaveis e os seus valores hash md5  
74 -// * há a key metodo que explicita o método de download dos executaveis  
75 -// */  
76 -// foreach( QJsonValue moduloValues, jsonConfig["modulos"].toArray() ) {  
77 -// QString moduloKey, moduloValue;  
78 -  
79 -// moduloKey = moduloValues.toObject()["md5"].toString();  
80 -// moduloValue = moduloValues.toObject()["nome"].toString();  
81 -  
82 -// moduleMap.insert(moduloKey, moduloValue);  
83 -// }  
84 -// metodoDownload = jsonConfig["metodo"].toString();  
85 -  
86 -// int countExecNotFound = 0;  
87 -// QMap<QString, QString>::const_iterator mapIterator = moduleMap.constBegin();  
88 -// while (mapIterator != moduleMap.constEnd()) {  
89 -// QString nomeModulo = mapIterator.value();  
90 -// QString hashModulo = mapIterator.key();  
91 -  
92 -// // Calcula hash do binario atual  
93 -//#if defined(Q_OS_WIN)  
94 -// fileOld = new QFile(getApplicationDirPath().append("/").append(modulo).append(".exe"));  
95 -//#else  
96 -// fileOld = new QFile(getApplicationDirPath().append("/").append(nomeModulo));  
97 -//#endif  
98 -// if(!fileOld->exists()) {  
99 -// QLogger::QLog_Error("Cacic Daemon (Timer)", QString("Módulo ").append(nomeModulo).append(" não encontrado."));  
100 -  
101 -// countExecNotFound++;  
102 -// if( countExecNotFound == moduleMap.size() ) {  
103 -// QLogger::QLog_Error("Cacic Daemon (Timer)", "Não foi possível encontrar nenhum módulo executável!");  
104 -// return;  
105 -// }  
106 -// continue;  
107 -// }  
108 -  
109 -// QString oldMd5 = QString(QCryptographicHash::hash(fileOld->readAll(),QCryptographicHash::Md5).toHex());  
110 -  
111 -// if ( oldMd5 != hashModulo ) {  
112 -  
113 -// fileOld->rename(getApplicationDirPath().append("/").append(nomeModulo),  
114 -// getApplicationDirPath().append("/").append("nomeModulo").append("Old") );  
115 -  
116 -// // Download nova versão do executável  
117 -// if(metodoDownload == "ftp" || metodoDownload == "") {  
118 -// // OCacicComm->ftpDownload( QString("/ws/get/").append(nomeModulo) );  
119 -// }  
120 -  
121 -  
122 -// fileOld->remove();  
123 -// delete fileOld;  
124 -// }  
125 -  
126 -// mapIterator++;  
127 -// }  
128 -// }else{  
129 -// qDebug() << "getConfig() failed. - " + QDateTime::currentDateTime().toLocalTime().toString();  
130 -// QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na obtenção do arquivo de configuração.");  
131 -// }  
132 -// }else{  
133 -// qDebug() << "getTest() failed. - " + QDateTime::currentDateTime().toLocalTime().toString();  
134 -// QLogger::QLog_Error("Cacic Daemon (Timer)", "Falha na execução do getTest().");  
135 -// }  
136 -// }  
137 -// }  
138 -//} 125 +QString CacicTimer::getApplicationDirPath() {
  126 + return applicationDirPath;
  127 +}
139 128
140 bool CacicTimer::getTest(){ 129 bool CacicTimer::getTest(){
141 try{ 130 try{
@@ -181,7 +170,37 @@ bool CacicTimer::getConfig(){ @@ -181,7 +170,37 @@ bool CacicTimer::getConfig(){
181 } 170 }
182 } 171 }
183 172
184 -void CacicTimer::registraInicio() 173 +void CacicTimer::lerArquivoConfig ( const QJsonObject& jsonConfig )
  174 +{
  175 + /* lê json de configurações e armazena quais módulos executáveis.
  176 + * E faz o mesmo tipo de comparação de hashs, com o fim de:
  177 + * ou mantem o binário do módulo ou baixa um novo.
  178 + *
  179 + * Aqui estou assumindo um formato do .json em que:
  180 + * há a key modulos contem uma lista com o nome dos executaveis e os seus valores hash md5
  181 + * há a key metodo que explicita o método de download dos executaveis
  182 + */
  183 + foreach( QJsonValue individualModule, jsonConfig["modulos"].toArray() ) {
  184 + QString moduloKey, moduloValue;
  185 +
  186 + moduloKey = individualModule.toObject()["hash"].toString();
  187 + moduloValue = individualModule.toObject()["nome"].toString();
  188 +
  189 + moduleMap.insert(moduloKey, moduloValue);
  190 + }
  191 +
  192 + foreach (QJsonValue individualMetodo, jsonConfig["metodoDownload"].toArray() ) {
  193 + QMap<QString, QString> newEntry;
  194 +
  195 + newEntry.insert(QString("tipo"), individualMetodo.toObject()["tipo"].toString() );
  196 + newEntry.insert(QString("url"), individualMetodo.toObject()["url"].toString() );
  197 + newEntry.insert(QString("path"), individualMetodo.toObject()["path"].toString() );
  198 +
  199 + metodosDownload.append( newEntry );
  200 + }
  201 +}
  202 +
  203 +void CacicTimer::registraInicioColeta()
185 { 204 {
186 QLogger::QLog_Info("Cacic Daemon (Timer)","Coleta iniciada em: " + QDateTime::currentDateTime().toLocalTime().toString()); 205 QLogger::QLog_Info("Cacic Daemon (Timer)","Coleta iniciada em: " + QDateTime::currentDateTime().toLocalTime().toString());
187 } 206 }
@@ -199,17 +218,17 @@ void CacicTimer::setDirProgram(const QString &amp;value) @@ -199,17 +218,17 @@ void CacicTimer::setDirProgram(const QString &amp;value)
199 218
200 void CacicTimer::iniciarGercols() 219 void CacicTimer::iniciarGercols()
201 { 220 {
202 - registraInicio(); 221 + registraInicioColeta();
203 QDir::setCurrent(this->applicationDirPath); 222 QDir::setCurrent(this->applicationDirPath);
204 QProcess proc; 223 QProcess proc;
205 proc.setWorkingDirectory(this->applicationDirPath); 224 proc.setWorkingDirectory(this->applicationDirPath);
206 proc.execute(getDirProgram()); 225 proc.execute(getDirProgram());
207 if((proc.atEnd()) && (proc.exitStatus() == QProcess::NormalExit)){ 226 if((proc.atEnd()) && (proc.exitStatus() == QProcess::NormalExit)){
208 - registraFim("SUCESSO"); 227 + registraFimColeta("SUCESSO");
209 }else{ 228 }else{
210 proc.waitForFinished(120000); 229 proc.waitForFinished(120000);
211 if((!proc.atEnd()) || (proc.exitStatus() == QProcess::CrashExit)){ 230 if((!proc.atEnd()) || (proc.exitStatus() == QProcess::CrashExit)){
212 - registraFim("ERRO"); 231 + registraFimColeta("ERRO");
213 proc.kill(); 232 proc.kill();
214 } 233 }
215 } 234 }
@@ -221,7 +240,7 @@ void CacicTimer::setApplicationDirPath(const QString &amp;value) @@ -221,7 +240,7 @@ void CacicTimer::setApplicationDirPath(const QString &amp;value)
221 } 240 }
222 241
223 242
224 -void CacicTimer::registraFim(QString msg) 243 +void CacicTimer::registraFimColeta(QString msg)
225 { 244 {
226 QLogger::QLog_Info("Cacic Daemon (Timer)","Coleta finalizada com " + msg + " em: " + QDateTime::currentDateTime().toLocalTime().toString()); 245 QLogger::QLog_Info("Cacic Daemon (Timer)","Coleta finalizada com " + msg + " em: " + QDateTime::currentDateTime().toLocalTime().toString());
227 } 246 }
cacic-daemon/cacicD/cacictimer.h
@@ -24,16 +24,18 @@ public: @@ -24,16 +24,18 @@ public:
24 CACIC_Computer OCacic_Computer; 24 CACIC_Computer OCacic_Computer;
25 CCacic *ccacic; 25 CCacic *ccacic;
26 QMutex *cMutex; 26 QMutex *cMutex;
  27 +
27 void iniciarTimer(int x); 28 void iniciarTimer(int x);
28 bool getTest(); 29 bool getTest();
29 bool getConfig(); 30 bool getConfig();
30 bool Md5IsEqual(QVariant document01,QVariant document02); 31 bool Md5IsEqual(QVariant document01,QVariant document02);
31 void setApplicationDirPath(const QString &value); 32 void setApplicationDirPath(const QString &value);
  33 + QString getApplicationDirPath();
32 void setDirProgram(const QString &value); 34 void setDirProgram(const QString &value);
33 35
34 private: 36 private:
35 - void registraFim(QString msg);  
36 - void registraInicio(); 37 + void registraFimColeta(QString msg);
  38 + void registraInicioColeta();
37 QLogger::QLoggerManager *logManager; 39 QLogger::QLoggerManager *logManager;
38 QString dirProgram; 40 QString dirProgram;
39 //QProcess *myProcess; 41 //QProcess *myProcess;
@@ -41,9 +43,11 @@ private: @@ -41,9 +43,11 @@ private:
41 QString getDirProgram() const; 43 QString getDirProgram() const;
42 void iniciarGercols(); 44 void iniciarGercols();
43 void iniciarInstancias(); 45 void iniciarInstancias();
  46 + void lerArquivoConfig( const QJsonObject &jsonConfig);
44 void definirDirGercols(QString appDirPath); 47 void definirDirGercols(QString appDirPath);
45 QJsonObject jsonConfig; 48 QJsonObject jsonConfig;
46 - QString metodoDownload; 49 +
  50 + QList<QMap<QString,QString> > metodosDownload;
47 QMap<QString, QString> moduleMap; // key = hash md5, value = nome do modulo 51 QMap<QString, QString> moduleMap; // key = hash md5, value = nome do modulo
48 52
49 private slots: 53 private slots:
src/cacic_comm.h
@@ -161,6 +161,19 @@ public: @@ -161,6 +161,19 @@ public:
161 url.setScheme("ftp"); 161 url.setScheme("ftp");
162 url.setPath(path); 162 url.setPath(path);
163 163
  164 + return false;
  165 + }
  166 +
  167 + bool ftpDownload(QString urlServer, QString path){
  168 + QUrl url(urlServer);
  169 + url.setScheme("ftp");
  170 + url.setPath(path);
  171 +
  172 + return false;
  173 + }
  174 +
  175 + bool httpDownload( QString urlServer, QString path ){
  176 + return false;
164 } 177 }
165 178
166 QString getUrlSsl (){ 179 QString getUrlSsl (){