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"