File indexing completed on 2024-05-12 05:48:39

0001 /*
0002     SPDX-FileCopyrightText: 2007 Nicolas Ternisien <nicolas.ternisien@gmail.com>
0003     SPDX-FileCopyrightText: 2015 Vyacheslav Matyushin
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #pragma once
0009 
0010 #include "journaldAnalyzer.h"
0011 
0012 #include <QFutureWatcher>
0013 #include <QSocketNotifier>
0014 
0015 #include <systemd/sd-journal.h>
0016 
0017 class JournaldLocalAnalyzer : public JournaldAnalyzer
0018 {
0019     Q_OBJECT
0020 
0021 public:
0022     explicit JournaldLocalAnalyzer(LogMode *mode, QString filter = QString());
0023 
0024     ~JournaldLocalAnalyzer() override;
0025 
0026     void watchLogFiles(bool enabled) override;
0027 
0028     QStringList units() const override;
0029 
0030     QStringList syslogIdentifiers() const override;
0031 
0032     static QStringList unitsStatic();
0033 
0034     static QStringList syslogIdentifiersStatic();
0035 
0036 private Q_SLOTS:
0037     void readJournalInitialFinished();
0038     void readJournalUpdateFinished();
0039     void journalDescriptorUpdated(int fd);
0040 
0041 private:
0042     using JournalWatcher = QFutureWatcher<QList<JournalEntry>>;
0043 
0044     void readJournalFinished(ReadingMode readingMode);
0045     QList<JournalEntry> readJournal(const QStringList &filters);
0046     bool prepareJournalReading(sd_journal *journal, const QStringList &filters);
0047     JournalEntry readJournalEntry(sd_journal *journal) const;
0048 
0049     static QStringList getUniqueFieldValues(const QString &id, int flags = 0);
0050 
0051     QStringList mFilters;
0052     QString mFilterName;
0053     sd_journal *mJournal = nullptr;
0054     int mJournalFlags = 0;
0055     QString mCurrentBootID;
0056 
0057     char *mCursor = nullptr;
0058     QMutex mWorkerMutex;
0059     QSocketNotifier *mJournalNotifier = nullptr;
0060 
0061     bool mForgetWatchers = true;
0062     QList<JournalWatcher *> mJournalWatchers;
0063 };