#ifndef LOGDOCTOR__MAINWINDOW_H #define LOGDOCTOR__MAINWINDOW_H #include #include "utilities/strings.h" #include "modules/tb.h" #include "modules/database/database.h" #include "modules/blacklists/blacklists.h" #include "modules/warnlists/warnlists.h" #include "modules/craplog/craplog.h" #include "modules/crapview/crapview.h" class Crappath; class Craphelp; class Crapup; class Crapinfo; class Crapnote; class Changelog; class CrissCross; class SnakeGame; class QCloseEvent; class QTranslator; class QTreeWidgetItem; enum class LogField; enum class ColorsScheme : unsigned char; namespace Ui { class MainWindow; } //! MainWindow /*! The parent window */ class MainWindow final : public QMainWindow { Q_OBJECT public: explicit MainWindow( QWidget* parent=nullptr ); Q_DISABLE_COPY_MOVE(MainWindow) signals: void refreshLogs(); void runCraplog( const Blacklists& blacklists ); private slots: /////////////////// //// OVERRIDES //// void closeEvent( QCloseEvent* event ) override; ////////////// //// INIT //// void waitActiveWindow(); // CUSTOM ////////////// //// TABS //// void on_button_Tab_Log_clicked(); void on_button_Tab_View_clicked(); void on_button_Tab_Conf_clicked(); //// STATS //// void on_button_Tab_StatsWarn_clicked(); void on_button_Tab_StatsSpeed_clicked(); void on_button_Tab_StatsCount_clicked(); void on_button_Tab_StatsDay_clicked(); void on_button_Tab_StatsRelat_clicked(); void on_button_Tab_StatsGlob_clicked(); ///////////////// //// CRAPLOG //// void appendToLogsList( const LogFile& log_file ); // CUSTOM void refreshFinished(); // CUSTOM void updatePerfsLabels(); // CUSTOM void craplogFinished(); // CUSTOM void afterCraplogFinished(); // CUSTOM void on_button_Logs_Down_clicked(); void on_button_Logs_Up_clicked(); void on_button_LogFiles_ViewFile_clicked(); void on_checkBox_LogFiles_CheckAll_stateChanged(int arg1); void on_button_LogFiles_RefreshList_clicked(); void on_listLogFiles_itemDoubleClicked(QTreeWidgetItem* item, int column); void on_listLogFiles_itemChanged(QTreeWidgetItem* item, int column); void on_button_LogFiles_Apache_clicked(); void on_button_LogFiles_Nginx_clicked(); void on_button_LogFiles_Iis_clicked(); void on_button_MakeStats_Start_clicked(); ////////////////// //// CRAPVIEW //// void drawStatsWarn(); // CUSTOM void drawStatsSpeed(); // CUSTOM void drawStatsCount(); // CUSTOM void drawStatsDay(); // CUSTOM void drawStatsRelat(); // CUSTOM void drawStatsGlobals(); // CUSTOM //// WARNINGS //// void on_box_StatsWarn_WebServer_currentIndexChanged(int index); void on_box_StatsWarn_Year_currentIndexChanged(int index); void on_box_StatsWarn_Month_currentIndexChanged(int index); void on_box_StatsWarn_Day_currentIndexChanged(int index); void on_checkBox_StatsWarn_Hour_stateChanged(int state); void on_box_StatsWarn_Hour_currentIndexChanged(int index); void on_button_StatsWarn_Draw_clicked(); //// SPEED //// void on_box_StatsSpeed_WebServer_currentIndexChanged(int index); void on_box_StatsSpeed_Year_currentIndexChanged(int index); void on_box_StatsSpeed_Month_currentIndexChanged(int index); void on_box_StatsSpeed_Day_currentIndexChanged(int index); void on_inLine_StatsSpeed_Protocol_textChanged(const QString& arg1); void on_inLine_StatsSpeed_Method_textChanged(const QString& arg1); void on_inLine_StatsSpeed_Uri_textChanged(const QString& arg1); void on_inLine_StatsSpeed_Query_textChanged(const QString& arg1); void on_inLine_StatsSpeed_Response_textChanged(const QString& arg1); void on_button_StatsSpeed_Draw_clicked(); //// COUNTS //// void on_box_StatsCount_WebServer_currentIndexChanged(int index); void on_box_StatsCount_Year_currentIndexChanged(int index); void on_box_StatsCount_Month_currentIndexChanged(int index); void on_box_StatsCount_Day_currentIndexChanged(int index); void on_button_StatsCount_Protocol_clicked(); void on_button_StatsCount_Method_clicked(); void on_button_StatsCount_Uri_clicked(); void on_button_StatsCount_Query_clicked(); void on_button_StatsCount_Response_clicked(); void on_button_StatsCount_Referrer_clicked(); void on_button_StatsCount_Cookie_clicked(); void on_button_StatsCount_UserAgent_clicked(); void on_button_StatsCount_Client_clicked(); //// DAY-TIME //// void on_box_StatsDay_WebServer_currentIndexChanged(int index); void on_box_StatsDay_LogsField_currentIndexChanged(int index); void on_box_StatsDay_FromYear_currentIndexChanged(int index); void on_box_StatsDay_FromMonth_currentIndexChanged(int index); void on_box_StatsDay_FromDay_currentIndexChanged(int index); void on_checkBox_StatsDay_Period_stateChanged(int state); void on_box_StatsDay_ToYear_currentIndexChanged(int index); void on_box_StatsDay_ToMonth_currentIndexChanged(int index); void on_box_StatsDay_ToDay_currentIndexChanged(int index); void on_inLine_StatsDay_Filter_textChanged(const QString& arg1); void on_button_StatsDay_Draw_clicked(); //// RELATIONAL //// void on_box_StatsRelat_WebServer_currentIndexChanged(int index); void on_box_StatsRelat_LogsField_1_currentIndexChanged(int index); void on_box_StatsRelat_LogsField_2_currentIndexChanged(int index); void on_box_StatsRelat_FromYear_currentIndexChanged(int index); void on_box_StatsRelat_FromMonth_currentIndexChanged(int index); void on_box_StatsRelat_FromDay_currentIndexChanged(int index); void on_box_StatsRelat_ToYear_currentIndexChanged(int index); void on_box_StatsRelat_ToMonth_currentIndexChanged(int index); void on_box_StatsRelat_ToDay_currentIndexChanged(int index); void on_inLine_StatsRelat_Filter_1_textChanged(const QString& arg1); void on_inLine_StatsRelat_Filter_2_textChanged(const QString& arg1); void on_button_StatsRelat_Draw_clicked(); //// GLOBALS //// void on_button_StatsGlob_Apache_clicked(); void on_button_StatsGlob_Nginx_clicked(); void on_button_StatsGlob_Iis_clicked(); ///////////////// //// CRAPSET //// void on_tree_ConfSections_itemClicked(QTreeWidgetItem *item, int column); void on_tree_ConfSections_itemDoubleClicked(QTreeWidgetItem *item, int column); //// WINDOW //// void on_checkBox_ConfWindow_Geometry_clicked(bool checked); void on_box_ConfWindow_Theme_currentIndexChanged(int index); void on_box_ConfWindow_Icons_currentIndexChanged(int index); //// DIALOGS //// void on_slider_ConfDialogs_General_sliderReleased(); void on_slider_ConfDialogs_Logs_sliderReleased(); void on_slider_ConfDialogs_Stats_sliderReleased(); //// TEXT BROWSER //// void on_box_ConfTextBrowser_Font_currentIndexChanged(int index); void on_checkBox_ConfTextBrowser_WideLines_clicked(bool checked); void on_box_ConfTextBrowser_ColorScheme_currentIndexChanged(int index); //// CHARTS //// void on_box_ConfCharts_Theme_currentIndexChanged(int index); //// DATABASES //// void on_tool_ConfDatabases_Data_Dialog_clicked(); void on_inLine_ConfDatabases_Data_Path_textChanged(const QString& arg1); void on_inLine_ConfDatabases_Data_Path_returnPressed(); void on_button_ConfDatabases_Data_Save_clicked(); void on_tool_ConfDatabases_Hashes_Dialog_clicked(); void on_inLine_ConfDatabases_Hashes_Path_textChanged(const QString& arg1); void on_inLine_ConfDatabases_Hashes_Path_returnPressed(); void on_button_ConfDatabases_Hashes_Save_clicked(); void on_checkBox_ConfDatabases_DoBackup_clicked(bool checked); void on_spinBox_ConfDatabases_NumBackups_valueChanged(int arg1); //// LOGS DEFAULTS //// void on_radio_ConfDefaults_Apache_toggled(bool checked); void on_radio_ConfDefaults_Nginx_toggled(bool checked); void on_radio_ConfDefaults_Iis_toggled(bool checked); //// LOGS CONTROL //// void on_checkBox_ConfControl_Usage_clicked(bool checked); void on_checkBox_ConfControl_Size_clicked(bool checked); void on_spinBox_ConfControl_Size_editingFinished(); //// APACHE //// void on_tool_ConfApache_Path_Dialog_clicked(); void on_inLine_ConfApache_Path_String_textChanged(const QString& arg1); void on_inLine_ConfApache_Path_String_returnPressed(); void on_button_ConfApache_Path_Save_clicked(); void on_inLine_ConfApache_Format_String_cursorPositionChanged(int arg1, int arg2); void on_inLine_ConfApache_Format_String_returnPressed(); void on_button_ConfApache_Format_Save_clicked(); void on_button_ConfApache_Format_Sample_clicked(); void on_button_ConfApache_Format_Help_clicked(); void on_box_ConfApache_Warnlist_Field_currentTextChanged(const QString& arg1); void on_checkBox_ConfApache_Warnlist_Used_clicked(bool checked); void on_inLine_ConfApache_Warnlist_String_cursorPositionChanged(int arg1, int arg2); void on_inLine_ConfApache_Warnlist_String_returnPressed(); void on_button_ConfApache_Warnlist_Add_clicked(); void on_list_ConfApache_Warnlist_List_itemSelectionChanged(); void on_button_ConfApache_Warnlist_Remove_clicked(); void on_button_ConfApache_Warnlist_Up_clicked(); void on_button_ConfApache_Warnlist_Down_clicked(); void on_box_ConfApache_Blacklist_Field_currentTextChanged(const QString& arg1); void on_checkBox_ConfApache_Blacklist_Used_clicked(bool checked); void on_inLine_ConfApache_Blacklist_String_cursorPositionChanged(int arg1, int arg2); void on_inLine_ConfApache_Blacklist_String_returnPressed(); void on_button_ConfApache_Blacklist_Add_clicked(); void on_list_ConfApache_Blacklist_List_itemSelectionChanged(); void on_button_ConfApache_Blacklist_Remove_clicked(); void on_button_ConfApache_Blacklist_Up_clicked(); void on_button_ConfApache_Blacklist_Down_clicked(); //// NGINX //// void on_tool_ConfNginx_Path_Dialog_clicked(); void on_inLine_ConfNginx_Path_String_textChanged(const QString& arg1); void on_inLine_ConfNginx_Path_String_returnPressed(); void on_button_ConfNginx_Path_Save_clicked(); void on_inLine_ConfNginx_Format_String_cursorPositionChanged(int arg1, int arg2); void on_inLine_ConfNginx_Format_String_returnPressed(); void on_button_ConfNginx_Format_Save_clicked(); void on_button_ConfNginx_Format_Sample_clicked(); void on_button_ConfNginx_Format_Help_clicked(); void on_box_ConfNginx_Warnlist_Field_currentTextChanged(const QString& arg1); void on_checkBox_ConfNginx_Warnlist_Used_clicked(bool checked); void on_inLine_ConfNginx_Warnlist_String_cursorPositionChanged(int arg1, int arg2); void on_inLine_ConfNginx_Warnlist_String_returnPressed(); void on_button_ConfNginx_Warnlist_Add_clicked(); void on_list_ConfNginx_Warnlist_List_itemSelectionChanged(); void on_button_ConfNginx_Warnlist_Remove_clicked(); void on_button_ConfNginx_Warnlist_Up_clicked(); void on_button_ConfNginx_Warnlist_Down_clicked(); void on_box_ConfNginx_Blacklist_Field_currentTextChanged(const QString& arg1); void on_checkBox_ConfNginx_Blacklist_Used_clicked(bool checked); void on_inLine_ConfNginx_Blacklist_String_cursorPositionChanged(int arg1, int arg2); void on_inLine_ConfNginx_Blacklist_String_returnPressed(); void on_button_ConfNginx_Blacklist_Add_clicked(); void on_list_ConfNginx_Blacklist_List_itemSelectionChanged(); void on_button_ConfNginx_Blacklist_Remove_clicked(); void on_button_ConfNginx_Blacklist_Up_clicked(); void on_button_ConfNginx_Blacklist_Down_clicked(); //// IIS //// void on_tool_ConfIis_Path_Dialog_clicked(); void on_inLine_ConfIis_Path_String_textChanged(const QString& arg1); void on_inLine_ConfIis_Path_String_returnPressed(); void on_button_ConfIis_Path_Save_clicked(); void on_radio_ConfIis_Format_W3C_toggled(bool checked); void on_radio_ConfIis_Format_NCSA_toggled(bool checked); void on_radio_ConfIis_Format_IIS_toggled(bool checked); void on_inLine_ConfIis_Format_String_cursorPositionChanged(int arg1, int arg2); void on_inLine_ConfIis_Format_String_returnPressed(); void on_button_ConfIis_Format_Save_clicked(); void on_button_ConfIis_Format_Sample_clicked(); void on_button_ConfIis_Format_Help_clicked(); void on_box_ConfIis_Warnlist_Field_currentTextChanged(const QString& arg1); void on_checkBox_ConfIis_Warnlist_Used_clicked(bool checked); void on_inLine_ConfIis_Warnlist_String_cursorPositionChanged(int arg1, int arg2); void on_inLine_ConfIis_Warnlist_String_returnPressed(); void on_button_ConfIis_Warnlist_Add_clicked(); void on_list_ConfIis_Warnlist_List_itemSelectionChanged(); void on_button_ConfIis_Warnlist_Remove_clicked(); void on_button_ConfIis_Warnlist_Up_clicked(); void on_button_ConfIis_Warnlist_Down_clicked(); void on_box_ConfIis_Blacklist_Field_currentTextChanged(const QString& arg1); void on_checkBox_ConfIis_Blacklist_Used_clicked(bool checked); void on_inLine_ConfIis_Blacklist_String_cursorPositionChanged(int arg1, int arg2); void on_inLine_ConfIis_Blacklist_String_returnPressed(); void on_button_ConfIis_Blacklist_Add_clicked(); void on_list_ConfIis_Blacklist_List_itemSelectionChanged(); void on_button_ConfIis_Blacklist_Remove_clicked(); void on_button_ConfIis_Blacklist_Up_clicked(); void on_button_ConfIis_Blacklist_Down_clicked(); /////////////// //// MENU //// //// LANGUAGE //// void menu_actionEnglishGb_triggered(); void menu_actionEspanolEs_triggered(); void menu_actionFrancaisFr_triggered(); void menu_actionItalianoIt_triggered(); void menu_actionJapaneseJp_triggered(); void menu_actionPortuguesBr_triggered(); //// TOOLS //// void menu_actionBlockNote_triggered(); //// UTILITIES //// void menu_actionInfos_triggered(); void menu_actionChangelog_triggered(); void menu_actionCheckUpdates_triggered(); //// GAMES //// void menu_actionCrissCross_triggered(); void menu_actionSnake_triggered(); private: QSharedPointer ui; // current version of LogDoctor const float version{ 3.00f }; QString wsFromIndex( const int index ) const; WebServer wsEnumFromIndex( const int index ) const; ////////////////////////// //// OPERATING SYSTEM //// const std::string home_path{ StringOps::rstrip( QStandardPaths::locate( QStandardPaths::HomeLocation, "", QStandardPaths::LocateDirectory ).toStdString(), '/' ) }; // 1: linux/bsd, 2:windows, 3:mac #if defined( Q_OS_MACOS ) const std::string configs_path { this->home_path + "/Lybrary/Preferences/LogDoctor/logdoctor.conf" }; const std::string logdoc_path { this->home_path + "/Lybrary/Application Support/LogDoctor" }; #elif defined( Q_OS_WINDOWS ) const std::string configs_path { this->home_path + "/AppData/Local/LogDoctor/logdoctor.conf" }; const std::string logdoc_path { this->home_path + "/AppData/Local/LogDoctor" }; #elif defined( Q_OS_LINUX ) || defined( Q_OS_BSD4 ) const std::string configs_path { this->home_path + "/.config/LogDoctor/logdoctor.conf" }; const std::string logdoc_path { "/usr/share/LogDoctor" }; #else #error "System not supported" #endif //! Defines OS specific stuff void defineOSspec(); //////////////////////// //// CONFIGURATIONS //// //////////////////////// //! Reads the configurations file and apply the resulting configuration void readConfigs(); //! Writes the current configuration on file void writeConfigs(); //! Converts a list of items to a string /*! \param list The list to stringify \param user_agents Whether to apply the special rule to parse user-agents lists or not \return The resulting string \see writeConfigs() */ std::string list2string( const std::vector& list, const bool user_agent=false ) const; //! Retrieves a list of items from the given string /*! \param list The list to stringify \param user_agents Whether to apply the special rule to parse user-agents lists or not \return The resulting list \see readConfigs() */ std::vector string2list( const std::string& string, const bool user_agent=false ) const; // string to bool and vice versa const std::unordered_map s2b{ {"true",true}, {"false",false} }; const std::unordered_map b2s{ {true,"true"}, {false,"false"} }; ////////////////// //// LANGUAGE //// QTranslator translator; std::string language{ "en_GB" }; //! Translates the UI to the selected language void updateUiLanguage(); ///////////////////////// //// WINDOW GEOMETRY //// //! Converts the window's geometry to string /*! \see writeConfigs() */ std::string geometryToString() const; //! Retrieves the window geometry from the given string /*! \see readConfigs() */ void setGeometryFromString( const std::string& geometry ); ///////////////// //// DIALOGS //// // quantoty of informational dialogs to display DialogsLevel dialogs_level{ DL_NORMAL }; //! Retrieves the dialogs level from the given string /*! \see readConfigs() */ void setDialogsLevelFromString( const std::string& dialogs_level ); //! Returns the dialogs level corresponding to the given number DialogsLevel dialogsLevelFromInt( const int dialogs_level ); //////////////////// //// WEB SERVER //// // default web server WebServer default_web_server{ WS_APACHE }; //! Retrieves the Web Server from the given string /*! \see readConfigs() */ void setWebServerFromString( const std::string& web_server ); ////////////////// //// GRAPHICS //// ////////////////// // remember window position and sizes bool remember_window{ true }; //! Auto-detects the icon-set to use depending on the current window theme void detectIconsTheme(); //! Updates the icons on the window void updateUiIcons(); //! Updates the window theme void updateUiTheme(); //! Updates the fonts on the window void updateUiFonts(); const std::vector CHARTS_THEMES{ QChart::ChartTheme::ChartThemeLight, QChart::ChartTheme::ChartThemeDark }; // color schemes const std::unordered_map> tb_colors_schemes; // colors const std::unordered_map colors; // fonts std::unordered_map fonts; int font_size { 13 }; int font_size_big { 16 }; int font_size_small { 10 }; // base font families, to build fonts from QString main_font_family; QString alternative_font_family; QString script_font_family; // fallback stylesheets QString stylesheet_lineedit; // errors stylesheets const QString stylesheet_lineedit_err{ "QLineEdit{ background-color: rgb(223, 31, 31) }" }; ///////////////////// //// GENERAL USE //// ///////////////////// QScopedPointer waiter_timer; std::chrono::system_clock::time_point waiter_timer_start; /*std::chrono::system_clock::duration waiter_timer_elapsed;*/ //! Resolves the given path and returns the canonical path std::string resolvePath( const std::string& path ) const noexcept; //! Returns the parent folder of the given path std::string parentPath( const std::string& path ) const; //////////////// //// CHECKS //// //////////////// bool initiating{ true }; //! Makes the initial integrity checks void makeInitialChecks(); /////////////////// //// DATABASES //// /////////////////// DatabaseHandler dbHandler; // true if a process edited the database and so a backup is required bool db_edited{ false }; // user-defined configuration: whether to make backups or not bool db_do_backup{ true }; // user-defined configuration: maximum number of backups to keep unsigned db_backups_number{ 3 }; //! Backs-up the logs data collection database void backupDatabase() const; std::string db_data_path; std::string db_hashes_path; // true when a process is working on a db bool db_working{ false }; //! Called when a member begins/ends performing operations on the database void setDbWorkingState( const bool working ); //! Weak check on the logs data collection database /*! Returns true if the database is free (no other process is running that may access it for read/write operations) and it exists \see checkDataDB */ bool dbUsable(); // false if the logs data collection database is invalid bool db_ok{ true }; //! Checks the integrity of the logs data collection database bool checkDataDB(); ////////////////////////////// //// BLACKLIST / WARNLIST //// ////////////////////////////// Blacklists blacklists; Warnlists warnlists; BlacklistField blacklistFieldFromString( const QString& str ); WarnlistField warnlistFieldFromString( const QString& str ); ////////////////// //// CRAPTABS //// ////////////////// void switchMainTab( const int new_index ); ///////////////// //// CRAPLOG //// ///////////////// Craplog craplog; void craplogStarted(); void checkMakeStats_Makable(); ////////////// //// LOGS //// bool loading_LogsList{ false }; void disableAllButtons_LogFiles_WS(); void enableAllButtons_LogFiles_WS(); bool hide_used_files{ false }; bool refreshing_list{ false }; ////////////////////// //// TEXT BROWSER //// TextBrowser TB; ////////////////////////// //// LOGS PERFORMANCE //// void resetPerfsLabels(); bool force_updating_labels{ false }; ////////////////// //// CRAPVIEW //// ////////////////// Crapview crapview; QScopedPointer crapview_timer; // change tab void switchStatsTab( const int new_index ); //! Queries the available dates from the db and apply to the tabs /*! \see Crapview::refreshDates() */ void refreshStatsDates(); // check if drawing conditions are met void checkStatsWarnDrawable(); void checkStatsSpeedDrawable(); void checkStatsCountDrawable(); void checkStatsDayDrawable(); void checkStatsRelatDrawable(); // count QString count_fld; void makeStatsCount(); void resetStatsCountButtons(); // day-time LogField getStatsDayLogField() const; std::optional getStatsDayParsedFilter() const; // relational LogField getStatsRelatLogField( const int filter_num ) const; std::optional getStatsRelatParsedFilter( const int filter_num ) const; // globals QString glob_ws; void makeStatsGlob(); void resetStatsGlob(); ///////////////// //// CRAPSET //// ///////////////// void refreshTextBrowserPreview(); void refreshChartsPreview(); IISLogsModule getIisLogsModule() const; ////////////////// //// CRAPPATH //// ////////////////// QSharedPointer crappath; ////////////////// //// CRAPHELP //// ////////////////// QSharedPointer craphelp; void showHelp( const std::string& file_name ); //////////////// //// CRAPUP //// //////////////// QSharedPointer crapup; ////////////////// //// CRAPNOTE //// ////////////////// QSharedPointer crapnote; ////////////////// //// CRAPINFO //// ////////////////// QSharedPointer crapinfo; /////////////////// //// CRANGELOG //// /////////////////// QSharedPointer changelog; /////////////////// //// CRAPGAMES //// /////////////////// QSharedPointer crisscross; QSharedPointer snake; }; #endif // LOGDOCTOR__MAINWINDOW_H