1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
|
// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later
#ifndef DISPLAYCONTENT_H
#define DISPLAYCONTENT_H
#include "filtercontent.h" //add by Airy
#include "logdetailinfowidget.h"
#include "logfileparser.h"
#include "logiconbutton.h"
#include "logspinnerwidget.h"
#include "logtreeview.h"
#include "structdef.h"
#include "qtcompat.h"
#include <DGuiApplicationHelper>
#include <DIconButton>
#include <DLabel>
#include <DSpinner>
#include <DTableView>
#include <DTextBrowser>
#include <QStandardItemModel>
#include <QWidget>
#include <QDateTime>
class ExportProgressDlg;
class LogBackend;
/**
* @brief The DisplayContent class 主显示数据区域控件,包括数据表格和详情页
*/
class DisplayContent : public Dtk::Widget::DWidget
{
Q_OBJECT
/**
* @brief The LOAD_STATE enum 主表部分的显示状态
*/
enum LOAD_STATE {
DATA_LOADING = 0, //正在加载
DATA_COMPLETE, //加载完成
DATA_LOADING_K, //内核日志正在加载
DATA_NO_SEARCH_RESULT, //搜索无记录
DATA_NOT_AUDIT_ADMIN, // 提示不是审计管理员
DATA_NO_AUDIT_LOG, // 提示没有审计日志
COREDUMPCTL_NOT_INSTALLED, //未安装coredumpctl工具
DATA_NO_PERMISSION //没有权限查看
};
enum OOC_TYPE {
OOC_OTHER = 0, // 其他日志
OOC_CUSTOM // 自定义日志
};
public:
explicit DisplayContent(QWidget *parent = nullptr);
~DisplayContent();
LogTreeView *mainLogTableView();
private:
void initUI();
void initMap();
void initTableView();
void setTableViewData();
void initConnections();
// 基于Json数据的建表接口
void createLogTable(const QList<QString>& list, LOG_FLAG type);
void insertLogTable(const QList<QString>& list, int start, int end, LOG_FLAG type);
void parseListToModel(const QList<QString>& list, QStandardItemModel *oPModel, LOG_FLAG type);
int loadSegementPage(bool bNext = true, bool bReset = true);
void generateJournalFile(int id, int lId, const QString &iSearchStr = "");
void createJournalTableStart(const QList<LOG_MSG_JOURNAL> &list);
void createJournalTableForm();
void generateDpkgFile(int id, const QString &iSearchStr = "");
void createDpkgTableStart(const QList<LOG_MSG_DPKG> &list);
void createDpkgTableForm();
void generateKernFile(int id, const QString &iSearchStr = "");
void createKernTableForm();
void createKernTable(const QList<LOG_MSG_JOURNAL> &list);
void generateAppFile(const QString &app, int id, int lId, const QString &iSearchStr = "");
void createAppTableForm();
void createAppTable(const QList<LOG_MSG_APPLICATOIN> &list);
void createBootTableForm();
void createBootTable(const QList<LOG_MSG_BOOT> &list);
void generateBootFile();
void createXorgTableForm();
void createXorgTable(const QList<LOG_MSG_XORG> &list);
void generateXorgFile(int id); // add by Airy for peroid
void createKwinTableForm();
void creatKwinTable(const QList<LOG_MSG_KWIN> &list);
void generateKwinFile(const KWIN_FILTERS &iFilters);
void createNormalTableForm();
void createNormalTable(const QList<LOG_MSG_NORMAL> &list); // add by Airy
void generateNormalFile(int id); // add by Airy for peroid
//其他日志或者自定义日志
void generateOOCFile(const QString &path);
void generateOOCLogs(const OOC_TYPE &type, const QString &iSearchStr = "");
void createOOCTableForm();
void createOOCTable(const QList<LOG_FILE_OTHERORCUSTOM> &list);
// 审计日志
void generateAuditFile(int id, int lId, const QString &iSearchStr = "");
void createAuditTableForm();
void createAuditTable(const QList<LOG_MSG_AUDIT> &list);
//coredump log
void generateCoredumpFile(int id, const QString &iSearchStr = "");
void createCoredumpTableForm();
void createCoredumpTable(const QList<LOG_MSG_COREDUMP> &list);
void insertJournalTable(QList<LOG_MSG_JOURNAL> logList, int start, int end);
void insertApplicationTable(const QList<LOG_MSG_APPLICATOIN> &list, int start, int end);
void insertKernTable(const QList<LOG_MSG_JOURNAL> &list, int start,
int end); // add by Airy for bug 12263
void insertDpkgTable(const QList<LOG_MSG_DPKG> &list, int start, int end);
void insertXorgTable(const QList<LOG_MSG_XORG> &list, int start, int end);
void insertBootTable(const QList<LOG_MSG_BOOT> &list, int start, int end);
void insertKwinTable(const QList<LOG_MSG_KWIN> &list, int start, int end);
void insertNormalTable(const QList<LOG_MSG_NORMAL> &list, int start, int end);
void insertOOCTable(const QList<LOG_FILE_OTHERORCUSTOM> &list, int start, int end);
void insertAuditTable(const QList<LOG_MSG_AUDIT> &list, int start, int end);
void insertCoredumpTable(const QList<LOG_MSG_COREDUMP> &list, int start, int end);
QString getAppName(const QString &filePath);
bool isAuthProcessAlive();
void generateJournalBootFile(int lId, const QString &iSearchStr = "");
void createJournalBootTableStart(const QList<LOG_MSG_JOURNAL> &list);
void createJournalBootTableForm();
void insertJournalBootTable(QList<LOG_MSG_JOURNAL> logList, int start, int end);
void generateDnfFile(BUTTONID iDate, DNFPRIORITY iLevel);
void createDnfTable(const QList<LOG_MSG_DNF> &list);
void generateDmesgFile(BUTTONID iDate, PRIORITY iLevel);
void createDmesgTable(const QList<LOG_MSG_DMESG> &list);
void createDnfForm();
void createDmesgForm();
void insertDmesgTable(const QList<LOG_MSG_DMESG> &list, int start, int end);
void insertDnfTable(const QList<LOG_MSG_DNF> &list, int start, int end);
signals:
void loadMoreInfo();
/**
* @brief sigDetailInfo 选中treeview显示详情页信号
* @param index 当前选中的index
* @param pModel 当前的model指针
* @param name 当前应用日志选择的日志名称
*/
void sigDetailInfo(QModelIndex index, QStandardItemModel *pModel, QString name, const int error = 0);
/**
* @brief setExportEnable 是否允许导出信号
* @param iEnable 是否允许导出
*/
void setExportEnable(bool iEnable);
void sigCoredumpDetailInfo(QList<LOG_MSG_COREDUMP> cList);
public slots:
void slot_valueChanged_dConfig_or_gSetting(const QString &key);
void slot_requestShowRightMenu(const QPoint &pos);
void slot_tableItemClicked(const QModelIndex &index);
void slot_BtnSelected(int btnId, int lId, QModelIndex idx);
void slot_appLogs(int btnId, const QString &app);
void slot_logCatelogueClicked(const QModelIndex &index);
void slot_exportClicked();
void slot_statusChagned(const QString &status);
// Json格式的日志数据处理接口
void slot_parseFinished(LOG_FLAG type, int status);
void slot_logData(const QList<QString> &list, LOG_FLAG type);
void slot_clearTable();
void slot_dpkgFinished();
void slot_dpkgData(const QList<LOG_MSG_DPKG> &list);
void slot_XorgFinished();
void slot_xorgData(const QList<LOG_MSG_XORG> &list);
void slot_bootFinished();
void slot_bootData(const QList<LOG_MSG_BOOT> &list);
void slot_kernFinished();
void slot_kernData(const QList<LOG_MSG_JOURNAL> &list);
void slot_kwinFinished();
void slot_kwinData(const QList<LOG_MSG_KWIN> &list);
void slot_dnfFinished(const QList<LOG_MSG_DNF> &list);
void slot_dmesgFinished(const QList<LOG_MSG_DMESG> &list);
void slot_journalFinished();
void slot_journalBootFinished();
void slot_journalBootData(const QList<LOG_MSG_JOURNAL> &list);
void slot_journalData(const QList<LOG_MSG_JOURNAL> &list);
void slot_applicationFinished();
void slot_applicationData(const QList<LOG_MSG_APPLICATOIN> &list);
void slot_normalFinished();
void slot_normalData(const QList<LOG_MSG_NORMAL> &list);
void slot_OOCFinished(int error = 0);
void slot_OOCData(const QString &data);
void slot_auditFinished(bool bShowTip = false);
void slot_auditData(const QList<LOG_MSG_AUDIT> &list);
void slot_coredumpFinished();
void slot_coredumpData(const QList<LOG_MSG_COREDUMP> &list, bool newData);
void slot_logLoadFailed(const QString &iError);
void slot_vScrollValueChanged(int valuePixel);
void slot_searchResult(const QString &str);
void slot_getSubmodule(int tcbx);
void slot_getLogtype(int tcbx); // add by Airy
void slot_getAuditType(int tcbx);
void slot_refreshClicked(const QModelIndex &index); //add by Airy for adding refresh
void slot_dnfLevel(DNFPRIORITY iLevel);
//导出前把当前要导出的当前信息的Qlist转换成QStandardItemModel便于导出
void parseListToModel(const QList<LOG_MSG_DPKG> &iList, QStandardItemModel *oPModel);
void parseListToModel(const QList<LOG_MSG_BOOT> &iList, QStandardItemModel *oPModel);
void parseListToModel(QList<LOG_MSG_APPLICATOIN> iList, QStandardItemModel *oPModel);
void parseListToModel(QList<LOG_MSG_XORG> iList, QStandardItemModel *oPModel);
void parseListToModel(QList<LOG_MSG_JOURNAL> iList, QStandardItemModel *oPModel);
void parseListToModel(QList<LOG_MSG_NORMAL> iList, QStandardItemModel *oPModel);
void parseListToModel(QList<LOG_MSG_KWIN> iList, QStandardItemModel *oPModel);
void parseListToModel(QList<LOG_MSG_DNF> iList, QStandardItemModel *oPModel);
void parseListToModel(QList<LOG_MSG_DMESG> iList, QStandardItemModel *oPModel);
void parseListToModel(QList<LOG_FILE_OTHERORCUSTOM> iList, QStandardItemModel *oPModel);
void parseListToModel(QList<LOG_MSG_AUDIT> iList, QStandardItemModel *oPModel);
void parseListToModel(QList<LOG_MSG_COREDUMP> iList, QStandardItemModel *oPModel);
QString getIconByname(const QString &str);
void setLoadState(LOAD_STATE iState, bool bSearching = false);
void onExportProgress(int nCur, int nTotal);
void onExportResult(bool isSuccess);
void onExportFakeCloseDlg();
void clearAllDatas();
private:
void resizeEvent(QResizeEvent *event);
private:
/**
* @brief m_treeView 主数据表控件件
*/
LogTreeView *m_treeView;
/**
* @brief m_pModel 主数据表的model
*/
QStandardItemModel *m_pModel;
//分割布局
Dtk::Widget::DSplitter *m_splitter;
//详情页控件
logDetailInfoWidget *m_detailWgt {nullptr};
//搜索无结果时显示无搜索结果提示的label
Dtk::Widget::DLabel *noResultLabel {nullptr};
// 不是审计管理员提示的label
Dtk::Widget::DLabel *notAuditLabel {nullptr};
Dtk::Widget::DLabel *noCoredumpctlLabel {nullptr};
Dtk::Widget::DLabel *noPermissionLabel {nullptr};
//当前选中的日志类型的index
QModelIndex m_curListIdx;
//当前选中的treeview的index
QModelIndex m_curTreeIndex;
//日志等级的显示文本和代码内文本的转换map
QMap<QString, QString> m_transDict;
//分页加载时,当前加载到的页数
int m_limitTag {0};
/**
* @brief m_spinnerWgt 加载数据时转轮控件
*/
LogSpinnerWidget *m_spinnerWgt;
/**
* @brief m_spinnerWgt_K 加载内核日志数据时转轮控件
*/
LogSpinnerWidget *m_spinnerWgt_K; // add by Airy
// 列表右键菜单
QMenu *m_menu{ nullptr };
QAction *m_act_openForder{ nullptr };
QAction *m_act_refresh{ nullptr };
/**
* @brief m_curAppLog 当前选中的应用的项目名称
*/
QString m_curApp;
// 当前选中的时间筛选选项
int m_curBtnId {ALL};
// 当前选中的等级筛选选项
int m_curLevel {INF};
// 当前选中的审计类型选项
int m_curAuditType {0};
// 当前选中的开关机事件类型选项
int m_curNormalEventType{0};
//当前加载的日志类型
LOG_FLAG m_flag {NONE};
// 日志后端 解析、接收和转发日志数据
LogBackend* m_pLogBackend;
/**
* @brief m_iconPrefix 图标资源文件路径前缀
*/
QString m_iconPrefix = ICONPREFIX;
/**
* @brief m_icon_name_map 日志等级对应图标资源文件名的map
*/
QMap<QString, QString> m_icon_name_map;
//导出进度条弹框
ExportProgressDlg *m_exportDlg {nullptr};
//是否为第一次加载完成后收到数据,journalctl获取方式专用
bool m_firstLoadPageData = false;
//上次treeview滚筒条的值
int m_treeViewLastScrollValue = -1;
//当前的显示加载状态
DisplayContent::LOAD_STATE m_state;
//系统日志上次获取的时间
QDateTime m_lastJournalGetTime { DATE_FOTIME(0) };
/**
* @brief m_journalFilter 当前系统日志筛选条件
*/
JOURNAL_FILTERS m_journalFilter;
QMap<QString, QString> m_dnfIconNameMap;
DNFPRIORITY m_curDnfLevel {INFO};
bool m_isDataLoadComplete {false};
//筛选条件
QString selectFilter;
};
#endif // DISPLAYCONTENT_H
|