diff --git a/logdoctor/tools/craplog/craplog.cpp b/logdoctor/tools/craplog/craplog.cpp index f196b82c..899fbfd1 100644 --- a/logdoctor/tools/craplog/craplog.cpp +++ b/logdoctor/tools/craplog/craplog.cpp @@ -397,7 +397,7 @@ const Craplog::LogFile& Craplog::getLogFileItem( const QString& file_name ) // return the path of the file matching the given name -const std::string& Craplog::getLogFilePath( const QString& file_name ) +/*const std::string& Craplog::getLogFilePath( const QString& file_name ) { for ( const Craplog::LogFile& item : this->logs_list ) { if ( item.name == file_name ) { @@ -406,7 +406,7 @@ const std::string& Craplog::getLogFilePath( const QString& file_name ) } // should be unreachable throw GenericException("File item not found"); -} +}*/ // set a file as selected const bool Craplog::setLogFileSelected( const QString& file_name ) @@ -465,16 +465,11 @@ void Craplog::scanLogsDir() try { // read 32 random lines IOutils::randomLines( path, content, 32 ); - } catch (const std::ios_base::failure& err) { - // failed reading - successful = false; - // >> err.what() << // - DialogSec::errFailedReadFile( nullptr, name ); - } catch (...) { - // failed somehow - successful = false; - QString err_msg = DialogSec::tr("An error occured while handling the file"); - DialogSec::errGeneric( nullptr, err_msg +":\n"+ name ); + + } catch (GenericException& e) { + // failed closing gzip file pointer + DialogSec::errGeneric( nullptr, e.what() ); + continue; } if ( content.size() == 0 ) { @@ -484,37 +479,42 @@ void Craplog::scanLogsDir() continue; } - if ( successful ) { - LogOps::LogType log_type = this->logOps.defineFileType( - name.toStdString(), content, this->logs_formats.at( this->current_WS ) ); - content.clear(); - if ( log_type == LogOps::LogType::Failed ) { - // failed to get the log type, do not append - DialogSec::errFailedDefiningLogType( nullptr, name ); - continue; - } else if ( log_type == LogOps::LogType::Discarded ) { - // skip - continue; - } - - // match only valid files names - if ( ! this->isFileNameValid( name.toStdString() ) ) { - continue; - } - - std::string hash = this->hashOps.digestFile( path ); - - LogFile logfile = { - .selected = false, - .used_already = this->hashOps.hasBeenUsed( hash, this->current_WS ), - .size = size, - .name = name, - .hash = hash, - .path = path - }; - // push in the list - this->logs_list.push_back( logfile ); + LogOps::LogType log_type = this->logOps.defineFileType( + name.toStdString(), content, this->logs_formats.at( this->current_WS ) ); + content.clear(); + if ( log_type == LogOps::LogType::Failed ) { + // failed to get the log type, do not append + DialogSec::errFailedDefiningLogType( nullptr, name ); + continue; + } else if ( log_type == LogOps::LogType::Discarded ) { + // skip + continue; } + + // match only valid files names + if ( ! this->isFileNameValid( name.toStdString() ) ) { + continue; + } + + std::string hash; + try { + hash = this->hashOps.digestFile( path ); + } catch (GenericException& e) { + // failed to digest + DialogSec::errGeneric( nullptr, e.what() ); + continue; + } + + LogFile logfile = { + .selected = false, + .used_already = this->hashOps.hasBeenUsed( hash, this->current_WS ), + .size = size, + .name = name, + .hash = hash, + .path = path + }; + // push in the list + this->logs_list.push_back( logfile ); } } } @@ -531,7 +531,7 @@ void Craplog::changeIisLogsBaseNames( const int& module_id ) this->logs_base_names.at( 13 ).contains = "_in"; break; default: // shouldn't be reachable - throw GenericException( "Unexpected LogFormatModule ID: "+std::to_string( module_id ) ); + throw GenericException( "Unexpected LogFormatModule ID: "+std::to_string( module_id ), true ); // leave un-catched } } const bool Craplog::isFileNameValid( const std::string& name ) @@ -646,7 +646,6 @@ void Craplog::stopWorking() { this->working = false; this->parsing = false; - this->used_files_hashes.clear(); } const bool& Craplog::isWorking() { @@ -662,33 +661,33 @@ const bool& Craplog::editedDatabase() } // performances -const int& Craplog::getPerfSize() +const unsigned& Craplog::getPerfSize() { return this->perf_size; } -void Craplog::sumPerfSize( const int& size ) +void Craplog::sumPerfSize( const unsigned& size ) { this->perf_size += size; this->parsed_size += size; } -const int& Craplog::getTotalSize() +const unsigned& Craplog::getTotalSize() { return this->total_size; } -const int& Craplog::getParsedSize() +const unsigned& Craplog::getParsedSize() { return this->parsed_size; } -const int& Craplog::getParsedLines() +const unsigned& Craplog::getParsedLines() { return this->parsed_lines; } -void Craplog::sumWarningsSize( const int& size ) +void Craplog::sumWarningsSize( const unsigned& size ) { this->warnlisted_size += size; } -void Craplog::sumBlacklistededSize( const int& size ) +void Craplog::sumBlacklistededSize( const unsigned& size ) { this->blacklisted_size += size; } @@ -709,35 +708,42 @@ void Craplog::clearDataCollection() void Craplog::run() { this->startWorking(); - - if ( this->proceed ) { - // collect log lines - this->joinLogLines(); - } - if ( this->proceed ) { - // parse the log lines to fill the collection - this->parseLogLines(); - // finished parsing logs - this->parsing = false; - this->parsed_size = this->logOps.getSize(); - this->parsed_lines = this->logOps.getLines(); - this->perf_size = this->parsed_size; - } - // clear log lines data - this->logs_lines.clear(); - - if ( this->proceed ) { - // store the new data - this->storeLogLines(); - } - - if ( this->proceed ) { - // succesfully updated the database - if ( this->parsed_size > 0 ) { - this->db_edited = true; + try { + if ( this->proceed ) { + // collect log lines + this->joinLogLines(); } - // insert the hashes of the used files - this->hashOps.insertUsedHashes( this->db_hashes_path, this->used_files_hashes, this->current_WS ); + if ( this->proceed ) { + // parse the log lines to fill the collection + this->parseLogLines(); + // finished parsing logs + this->parsing = false; + this->parsed_size = this->logOps.getSize(); + this->parsed_lines = this->logOps.getLines(); + this->perf_size = this->parsed_size; + } + // clear log lines data + this->logs_lines.clear(); + + if ( this->proceed ) { + // store the new data + this->storeLogLines(); + } + + if ( this->proceed ) { + // succesfully updated the database + if ( this->parsed_size > 0 ) { + this->db_edited = true; + } + // insert the hashes of the used files + this->hashOps.insertUsedHashes( this->db_hashes_path, this->used_files_hashes, this->current_WS ); + } + this->used_files_hashes.clear(); + + // only catch generic, leave others un-catched + } catch (GenericException& e) { + DialogSec::errGeneric( nullptr, e.what() ); + this->proceed = false;; } this->stopWorking(); @@ -856,7 +862,7 @@ void Craplog::joinLogLines() // try as gzip compressed archive first GZutils::readFile( file.path, aux ); - } catch (GenericException& e) { + } catch (const GenericException& e) { // failed closing file pointer throw e; @@ -871,15 +877,28 @@ void Craplog::joinLogLines() if ( this->current_WS == this->IIS_ID ) { this->logOps.cleanLines( content ); } + + // re-catched in run() + } catch (const GenericException) { + // failed closing gzip file pointer + throw GenericException( QString("%1:\n%2").arg( + DialogSec::tr("An error accured while reading the gzipped file"), + QString::fromStdString( file.path ) + ).toStdString() ); + } catch (const std::ios_base::failure& err) { - // failed reading - // >> err.what() << // - DialogSec::errFailedReadFile( nullptr, file.name, true ); - continue; + // failed reading as text + throw GenericException( QString("%1:\n%2").arg( + DialogSec::tr("An error accured while reading the file"), + QString::fromStdString( file.path ) + ).toStdString() ); + } catch (...) { // failed somehow - DialogSec::errFailedReadFile( nullptr, file.name, true ); - continue; + throw GenericException( QString("%1:\n%2").arg( + DialogSec::tr("Something failed while handling the file"), + QString::fromStdString( file.path ) + ).toStdString() ); } // append to the relative list @@ -985,8 +1004,9 @@ void Craplog::storeLogLines() } if ( ! err_shown ) { // show a message - QString msg = DialogSec::tr("An error occured while working on the database\n\nAborting"); - DialogSec::errGeneric( nullptr, msg ); + DialogSec::errGeneric( nullptr, QString("%1\n\n%2").arg( + DialogSec::tr("An error occured while working on the database"), + DialogSec::tr( f_ABORTING.c_str() ) ) ); } } @@ -996,7 +1016,7 @@ void Craplog::storeLogLines() } -const QString Craplog::printableSize( const int& bytes ) +const QString Craplog::printableSize( const unsigned& bytes ) { std::string size_str, size_sfx=" B"; float size = (float)bytes; @@ -1020,7 +1040,7 @@ const QString Craplog::printableSize( const int& bytes ) if ( cut_index != 0 ) { cut_index ++; } - int n_decimals = 3; + short n_decimals = 3; if ( size >= 100 ) { n_decimals = 2; if ( size >= 1000 ) { diff --git a/logdoctor/tools/craplog/craplog.h b/logdoctor/tools/craplog/craplog.h index b39bec3f..fc2e6eac 100644 --- a/logdoctor/tools/craplog/craplog.h +++ b/logdoctor/tools/craplog/craplog.h @@ -58,7 +58,7 @@ public: const int getLogsListSize(); // log file related const LogFile& getLogFileItem( const QString& file_name ); - const std::string& getLogFilePath( const QString& file_name ); + /*const std::string& getLogFilePath( const QString& file_name );*/ // set a file in the list as selected, to be used for the stats const bool setLogFileSelected( const QString& file_name ); // check if a file name respects the one set @@ -107,16 +107,17 @@ public: & isParsing(); // job performancea void collectPerfData(), - sumWarningsSize( const int& size ), - sumBlacklistededSize( const int& size ), - sumPerfSize( const int& size ); - const int& getPerfSize(), - & getTotalSize(), - & getParsedSize(), - & getParsedLines(); - /*& getAccessSize(), - & getErrorSize(), - & getBlacklistedSize( const int& log_type );*/ + sumWarningsSize( const unsigned& size ), + sumBlacklistededSize( const unsigned& size ), + sumPerfSize( const unsigned& size ); + const unsigned + & getPerfSize(), + & getTotalSize(), + & getParsedSize(), + & getParsedLines(); + /*& getAccessSize(), + & getErrorSize(), + & getBlacklistedSize( const int& log_type );*/ private: // quantity of informational dialogs to display @@ -135,7 +136,8 @@ private: parsing = false, proceed = false; // perf related - int total_lines = 0, + unsigned + total_lines = 0, parsed_lines = 0, perf_size = 0, total_size = 0, @@ -143,7 +145,7 @@ private: warnlisted_size = 0, blacklisted_size = 0; // chart related - const QString printableSize( const int& bytes ); + const QString printableSize( const unsigned& bytes ); // data collection, each item results from a log line /* structure