File indexing completed on 2024-05-19 05:49:16
0001 /* 0002 SPDX-FileCopyrightText: 2007 Nicolas Ternisien <nicolas.ternisien@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "journaldFactory.h" 0008 #include "journaldConfiguration.h" 0009 #include "journaldLocalAnalyzer.h" 0010 #include "journaldLogMode.h" 0011 #include "ksystemlog_debug.h" 0012 #include "logMode.h" 0013 #include "multipleActions.h" 0014 0015 #include <KLocalizedString> 0016 0017 QList<LogMode *> JournaldModeFactory::createLogModes() const 0018 { 0019 const QList<LogMode *> logModes{new JournaldLogMode()}; 0020 return logModes; 0021 } 0022 0023 LogModeAction *JournaldModeFactory::createLogModeAction() const 0024 { 0025 JournaldLogMode *logMode = dynamic_cast<JournaldLogMode *>(Globals::instance().findLogMode(QLatin1String(JOURNALD_LOG_MODE_ID))); 0026 0027 auto multipleActions = new MultipleActions(QIcon::fromTheme(QLatin1String(JOURNALD_MODE_ICON)), i18n("Journald"), logMode); 0028 0029 QIcon const filterIcon = QIcon::fromTheme(QLatin1String("view-filter")); 0030 QIcon const remoteIcon = QIcon::fromTheme(QLatin1String("preferences-system-network-sharing")); 0031 0032 // Do not add journald submenu actions into action collection. 0033 // There are too many of them and submenu contents sometimes gets changed. 0034 ActionData actionData; 0035 actionData.id = logMode->id(); 0036 actionData.addToActionCollection = false; 0037 0038 JournaldAnalyzerOptions analyzerOptions; 0039 analyzerOptions.analyzerType = JournaldAnalyzerType::Local; 0040 0041 actionData.analyzerOptions = QVariant::fromValue(analyzerOptions); 0042 0043 auto actionMenu = new KActionMenu(QIcon::fromTheme(QLatin1String("drive-harddisk")), i18n("Local journal"), multipleActions); 0044 0045 // Add "All messages" action. 0046 auto action = new QAction(filterIcon, i18n("All messages"), actionMenu); 0047 action->setData(QVariant::fromValue(actionData)); 0048 actionMenu->addAction(action); 0049 multipleActions->addInnerAction(action, false, true); 0050 0051 // Add separator. 0052 action = new QAction(actionMenu); 0053 action->setSeparator(true); 0054 actionMenu->addAction(action); 0055 0056 // Add filtering by systemd unit. 0057 auto filterActionMenu = new KActionMenu(filterIcon, i18n("Filter by systemd unit"), actionMenu); 0058 const QStringList units = JournaldLocalAnalyzer::unitsStatic(); 0059 for (const QString &unit : units) { 0060 action = new QAction(unit, filterActionMenu); 0061 0062 analyzerOptions.filter = QStringLiteral("_SYSTEMD_UNIT=%1").arg(unit); 0063 actionData.analyzerOptions = QVariant::fromValue(analyzerOptions); 0064 action->setData(QVariant::fromValue(actionData)); 0065 0066 filterActionMenu->addAction(action); 0067 multipleActions->addInnerAction(action, false, true); 0068 } 0069 actionMenu->addAction(filterActionMenu); 0070 0071 // Add filtering by syslog identifier. 0072 filterActionMenu = new KActionMenu(filterIcon, i18n("Filter by syslog identifier"), actionMenu); 0073 QStringList const syslogIDs = JournaldLocalAnalyzer::syslogIdentifiersStatic(); 0074 for (const QString &id : syslogIDs) { 0075 action = new QAction(id, filterActionMenu); 0076 0077 analyzerOptions.filter = QStringLiteral("SYSLOG_IDENTIFIER=%1").arg(id); 0078 actionData.analyzerOptions = QVariant::fromValue(analyzerOptions); 0079 action->setData(QVariant::fromValue(actionData)); 0080 0081 filterActionMenu->addAction(action); 0082 multipleActions->addInnerAction(action, false, true); 0083 } 0084 actionMenu->addAction(filterActionMenu); 0085 0086 multipleActions->addInnerAction(actionMenu, true, false); 0087 0088 analyzerOptions.analyzerType = JournaldAnalyzerType::Network; 0089 analyzerOptions.filter.clear(); 0090 0091 action = new QAction(multipleActions); 0092 action->setSeparator(true); 0093 multipleActions->addInnerAction(action, true, false); 0094 0095 // Create remote journal submenus. 0096 auto *configuration = logMode->logModeConfiguration<JournaldConfiguration *>(); 0097 auto remoteJournals = configuration->remoteJournals(); 0098 for (const auto &addressInfo : remoteJournals) { 0099 QString const menuText = QStringLiteral("%1:%2").arg(addressInfo.address).arg(addressInfo.port); 0100 actionMenu = new KActionMenu(remoteIcon, menuText, multipleActions); 0101 0102 action = new QAction(QIcon::fromTheme(QLatin1String("network-connect")), i18n("Connect"), actionMenu); 0103 analyzerOptions.address = addressInfo; 0104 actionData.analyzerOptions = QVariant::fromValue(analyzerOptions); 0105 action->setData(QVariant::fromValue(actionData)); 0106 actionMenu->addAction(action); 0107 multipleActions->addInnerAction(action, false, true); 0108 0109 // Add separator. 0110 action = new QAction(actionMenu); 0111 action->setSeparator(true); 0112 actionMenu->addAction(action); 0113 0114 // Add filtering by systemd unit. 0115 JournalFilters const filters = logMode->filters(addressInfo); 0116 if (!filters.systemdUnits.isEmpty()) { 0117 auto filterActionSystemdMenu = new KActionMenu(filterIcon, i18n("Filter by systemd unit"), actionMenu); 0118 0119 for (const QString &unit : filters.systemdUnits) { 0120 action = new QAction(unit, filterActionSystemdMenu); 0121 0122 analyzerOptions.filter = QStringLiteral("_SYSTEMD_UNIT=%1").arg(unit); 0123 actionData.analyzerOptions = QVariant::fromValue(analyzerOptions); 0124 action->setData(QVariant::fromValue(actionData)); 0125 0126 filterActionSystemdMenu->addAction(action); 0127 multipleActions->addInnerAction(action, false, true); 0128 } 0129 actionMenu->addAction(filterActionSystemdMenu); 0130 } 0131 0132 // Add filtering by syslog identifier. 0133 if (!filters.syslogIdentifiers.isEmpty()) { 0134 auto filterActionMenu = new KActionMenu(filterIcon, i18n("Filter by syslog identifier"), actionMenu); 0135 0136 for (const QString &id : filters.syslogIdentifiers) { 0137 action = new QAction(id, filterActionMenu); 0138 0139 analyzerOptions.filter = QStringLiteral("SYSLOG_IDENTIFIER=%1").arg(id); 0140 actionData.analyzerOptions = QVariant::fromValue(analyzerOptions); 0141 action->setData(QVariant::fromValue(actionData)); 0142 0143 filterActionMenu->addAction(action); 0144 multipleActions->addInnerAction(action, false, true); 0145 } 0146 actionMenu->addAction(filterActionMenu); 0147 } 0148 0149 multipleActions->addInnerAction(actionMenu, true, false); 0150 } 0151 0152 // Add default log action with icon. 0153 // Don't put in into the menu, but allow it to be added into action collection and placed on the toolbar. 0154 multipleActions->addInnerAction(logMode->action(), false, true); 0155 0156 return multipleActions; 0157 } 0158 0159 #include "moc_journaldFactory.cpp"