File indexing completed on 2024-04-28 05:45:39

0001 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0002 // SPDX-FileCopyrightText: 2021-2022 Harald Sitter <sitter@kde.org>
0003 
0004 #include <QCoreApplication>
0005 #include <QJsonArray>
0006 #include <QJsonDocument>
0007 #include <QJsonObject>
0008 #include <QTextStream>
0009 
0010 #include "entries.h"
0011 
0012 QJsonObject entryToJsonObject(const Entry &entry)
0013 {
0014     return QJsonObject({
0015         {QStringLiteral("uid"), QJsonValue::fromVariant(entry.uid)},
0016         {QStringLiteral("pid"), QJsonValue::fromVariant(entry.pid)},
0017         {QStringLiteral("instances"), QJsonValue::fromVariant(entry.instances)},
0018         {QStringLiteral("watches"), QJsonValue::fromVariant(entry.watches)},
0019         {QStringLiteral("cmdline"), QJsonValue::fromVariant(entry.cmdline)},
0020     });
0021 }
0022 
0023 QJsonArray entryVectorToJsonArray(const std::vector<Entry> &entries)
0024 {
0025     QJsonArray ary;
0026     for (const auto &entry : entries) {
0027         ary.append(entryToJsonObject(entry));
0028     }
0029     return ary;
0030 }
0031 
0032 int main(int argc, char **argv)
0033 {
0034     Q_UNUSED(argc);
0035     Q_UNUSED(argv);
0036 
0037     const auto entries = collectEntries();
0038 
0039     qulonglong allInstances = 0;
0040     qulonglong allWatches = 0;
0041     for (const auto &entry : entries) {
0042         allInstances += entry.instances;
0043         allWatches += entry.watches;
0044     }
0045 
0046     const auto capacity = inotifyCapacity();
0047     constexpr auto percent = 100;
0048     const auto instancePercent = percent * allInstances / capacity.max_user_instances;
0049     const auto watchPercent = percent * allWatches / capacity.max_user_watches;
0050 
0051     const QJsonObject totalsObject({
0052         {QStringLiteral("instances"), QJsonValue::fromVariant(allInstances)},
0053         {QStringLiteral("maxInstances"), QJsonValue::fromVariant(capacity.max_user_instances)},
0054         {QStringLiteral("instancePercent"), QJsonValue::fromVariant(instancePercent)},
0055         {QStringLiteral("watches"), QJsonValue::fromVariant(allWatches)},
0056         {QStringLiteral("maxWatches"), QJsonValue::fromVariant(capacity.max_user_watches)},
0057         {QStringLiteral("watchPercent"), QJsonValue::fromVariant(watchPercent)},
0058     });
0059 
0060     QTextStream(stdout) << QJsonDocument(QJsonObject({
0061                                              {QStringLiteral("processes"), entryVectorToJsonArray(entries)},
0062                                              {QStringLiteral("totals"), totalsObject},
0063                                          }))
0064                                .toJson(QJsonDocument::JsonFormat::Indented);
0065 
0066     return 0;
0067 }