From 4f9e3d6639b4ee4b8d2197ef88bf5411975baf72 Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Thu, 30 Nov 2017 02:23:39 +0300 Subject: [PATCH] implement support of new commands to clients --- .../src/QueuedTcpServerResponseHelper.cpp | 2 + .../src/QueuedTcpServerResponseHelper.h | 1 + .../src/QueuedTcpServerResponseHelperApi1.cpp | 7 ++ .../QueuedTcpServerResponseHelperOption.cpp | 3 +- .../QueuedTcpServerResponseHelperPlugins.cpp | 23 +++++ .../QueuedTcpServerResponseHelperPlugins.h | 1 + sources/queued/include/queued/QueuedCore.h | 8 +- .../queued/include/queued/QueuedCoreAdaptor.h | 10 +++ .../queued/QueuedPluginSpecification.h | 86 +++++++++++++++++++ .../include/queued/QueuedPropertyInterface.h | 9 ++ sources/queued/include/queued/QueuedResult.h | 7 ++ .../queued/private/QueuedCorePrivate.h | 4 +- sources/queued/src/QueuedCore.cpp | 4 +- sources/queued/src/QueuedCoreAdaptor.cpp | 24 ++++-- sources/queued/src/QueuedCorePrivate.cpp | 10 +-- .../queued/src/QueuedPropertyInterface.cpp | 25 ++++++ sources/queuedctl/src/QueuedctlCommon.cpp | 10 +++ sources/queuedctl/src/QueuedctlCommon.h | 6 ++ sources/queuedctl/src/QueuedctlOption.cpp | 4 +- sources/queuedctl/src/QueuedctlPlugins.cpp | 57 ++++++++++++ sources/queuedctl/src/QueuedctlPlugins.h | 4 + 21 files changed, 281 insertions(+), 24 deletions(-) diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelper.cpp b/sources/queued-server/src/QueuedTcpServerResponseHelper.cpp index df49fdb..933b378 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelper.cpp +++ b/sources/queued-server/src/QueuedTcpServerResponseHelper.cpp @@ -84,6 +84,8 @@ QueuedTcpServerResponseHelper::pathToEnum(const QString &_path) return RequestPath::Option; else if (_path == "permissions") return RequestPath::Permissions; + else if (_path == "plugin") + return RequestPath::Plugin; else if (_path == "plugins") return RequestPath::Plugins; else if (_path == "reports") diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelper.h b/sources/queued-server/src/QueuedTcpServerResponseHelper.h index 707662b..95f771c 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelper.h +++ b/sources/queued-server/src/QueuedTcpServerResponseHelper.h @@ -27,6 +27,7 @@ enum class RequestPath { Auth, Option, Permissions, + Plugin, Plugins, Reports, Status, diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperApi1.cpp b/sources/queued-server/src/QueuedTcpServerResponseHelperApi1.cpp index c7c80b0..8bc1950 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperApi1.cpp +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperApi1.cpp @@ -68,6 +68,13 @@ QVariantHash QueuedTcpServerResponseHelperApi1::getData( else output = {{"code", 405}}; break; + case QueuedTcpServerResponseHelper::RequestPath::Plugin: + if (_type == "GET") + output + = QueuedTcpServerResponseHelperPlugins::getPlugin(_arg, _token); + else + output = {{"code", 405}}; + break; case QueuedTcpServerResponseHelper::RequestPath::Plugins: if (_type == "DELETE") output = QueuedTcpServerResponseHelperPlugins::removePlugin(_arg, diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperOption.cpp b/sources/queued-server/src/QueuedTcpServerResponseHelperOption.cpp index 16a1524..9d49ae4 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperOption.cpp +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperOption.cpp @@ -30,7 +30,8 @@ QueuedTcpServerResponseHelperOption::getOption(const QString &_option, QVariantHash output; res.match( [&output](const QVariant &val) { - output = {{"code", 200}, {"token", val}}; + QVariantHash opt = {{"_option", val}}; + output = {{"code", 200}, {"properties", opt}}; }, [&output](const QueuedError &) { output = {{"code", 404}, {"message", "Option not found"}}; diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.cpp b/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.cpp index 3d5de7a..fd57645 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.cpp +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.cpp @@ -40,6 +40,29 @@ QueuedTcpServerResponseHelperPlugins::addPlugin(const QString &_name, } +QVariantHash +QueuedTcpServerResponseHelperPlugins::getPlugin(const QString &_name, + const QString &_token) +{ + qCDebug(LOG_SERV) << "Get plugin" << _name; + + auto res = QueuedCoreAdaptor::getPlugin(_name, _token); + + QVariantHash output; + res.match( + [&output](const QueuedPluginSpecification::Plugin &val) { + auto dump = QueuedPluginSpecification::dumpSpecification(val); + QVariantList plugins = {dump}; + output = {{"code", 200}, {"plugins", plugins}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + + return output; +} + + QVariantHash QueuedTcpServerResponseHelperPlugins::listPlugins() { auto res = QueuedCoreAdaptor::getOption( diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.h b/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.h index 197ac1a..269e34f 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.h +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.h @@ -23,6 +23,7 @@ namespace QueuedTcpServerResponseHelperPlugins { QVariantHash addPlugin(const QString &_name, const QString &_token); +QVariantHash getPlugin(const QString &_name, const QString &_token); QVariantHash listPlugins(); QVariantHash removePlugin(const QString &_name, const QString &_token); }; diff --git a/sources/queued/include/queued/QueuedCore.h b/sources/queued/include/queued/QueuedCore.h index 350ba62..58a61a3 100644 --- a/sources/queued/include/queued/QueuedCore.h +++ b/sources/queued/include/queued/QueuedCore.h @@ -40,6 +40,10 @@ namespace QueuedLimits { struct Limits; } +namespace QueuedPluginSpecification +{ +struct Plugin; +} /** * @brief aggregator of queued classes @@ -228,8 +232,8 @@ public: * user auth token * @return dictionary of PluginSpecification representation */ - QueuedResult plugin(const QString &_plugin, - const QString &_token); + QueuedResult + plugin(const QString &_plugin, const QString &_token); /** * @brief get plugin settings * @param _plugin diff --git a/sources/queued/include/queued/QueuedCoreAdaptor.h b/sources/queued/include/queued/QueuedCoreAdaptor.h index 61fc116..f3ba4d0 100644 --- a/sources/queued/include/queued/QueuedCoreAdaptor.h +++ b/sources/queued/include/queued/QueuedCoreAdaptor.h @@ -204,6 +204,16 @@ sendUserPermissionRemove(const long long _id, */ QueuedResult getPlugin(const QString &_plugin, const QString &_token); +/** + * @brief get plugin options + * @param _plugin + * plugin name + * @param _token + * user auth token + * @return plugin options dictionary + */ +QueuedResult getPluginOptions(const QString &_plugin, + const QString &_token); /** * @brief get option * @param _property diff --git a/sources/queued/include/queued/QueuedPluginSpecification.h b/sources/queued/include/queued/QueuedPluginSpecification.h index afa161e..2b1268b 100644 --- a/sources/queued/include/queued/QueuedPluginSpecification.h +++ b/sources/queued/include/queued/QueuedPluginSpecification.h @@ -24,6 +24,7 @@ #ifndef QUEUEDPLUGINSPECIFICATION_H #define QUEUEDPLUGINSPECIFICATION_H +#include #include @@ -51,6 +52,50 @@ struct PluginOption { QString name; QString type; }; +/** + * @brief DBus marshalling method + * @param _argument + * output DBus argument + * @param _arg + * input variant object + * @return appended argument body + */ +inline QDBusArgument &operator<<(QDBusArgument &_argument, + const PluginOption &_arg) +{ + _argument.beginStructure(); + _argument << QDBusVariant(_arg.defaultValue.isValid() ? _arg.defaultValue + : ""); + _argument << _arg.description; + _argument << _arg.name; + _argument << _arg.type; + _argument.endStructure(); + + return _argument; +}; +/** + * @brief DBus un-marshalling method + * @param _argument + * input DBus argument + * @param _arg + * output variant object + * @return source DBus argument + */ +inline const QDBusArgument &operator>>(const QDBusArgument &_argument, + PluginOption &_arg) +{ + QDBusVariant variant; + + _argument.beginStructure(); + _argument >> variant; + _arg.defaultValue = variant.variant(); + _argument >> _arg.description; + _argument >> _arg.name; + _argument >> _arg.type; + _argument.endStructure(); + + return _argument; +}; /** * @struct Plugin * @brief plugin specification structure @@ -72,6 +117,47 @@ struct Plugin { QString license; QList options; }; +/** + * @brief DBus marshalling method + * @param _argument + * output DBus argument + * @param _arg + * input variant object + * @return appended argument body + */ +inline QDBusArgument &operator<<(QDBusArgument &_argument, const Plugin &_arg) +{ + _argument.beginStructure(); + _argument << _arg.author; + _argument << _arg.description; + _argument << _arg.homepage; + _argument << _arg.license; + _argument << _arg.options; + _argument.endStructure(); + + return _argument; +}; +/** + * @brief DBus un-marshalling method + * @param _argument + * input DBus argument + * @param _arg + * output variant object + * @return source DBus argument + */ +inline const QDBusArgument &operator>>(const QDBusArgument &_argument, + Plugin &_arg) +{ + _argument.beginStructure(); + _argument >> _arg.author; + _argument >> _arg.description; + _argument >> _arg.homepage; + _argument >> _arg.license; + _argument >> _arg.options; + _argument.endStructure(); + + return _argument; +}; /** * @brief dump specification to map * @param _plugin diff --git a/sources/queued/include/queued/QueuedPropertyInterface.h b/sources/queued/include/queued/QueuedPropertyInterface.h index 1aa6aa4..b7e7582 100644 --- a/sources/queued/include/queued/QueuedPropertyInterface.h +++ b/sources/queued/include/queued/QueuedPropertyInterface.h @@ -62,6 +62,15 @@ public slots: * @return plugin properties */ QDBusVariant Plugin(const QString &plugin, const QString &token); + /** + * @brief get plugin options + * @param plugin + * plugin name + * @param token + * user auth token + * @return list of plugin options and their values + */ + QDBusVariant PluginOptions(const QString &plugin, const QString &token); /** * @brief get advanced option * @param property diff --git a/sources/queued/include/queued/QueuedResult.h b/sources/queued/include/queued/QueuedResult.h index 94565c7..e8856dd 100644 --- a/sources/queued/include/queued/QueuedResult.h +++ b/sources/queued/include/queued/QueuedResult.h @@ -28,12 +28,15 @@ #include +#include "QueuedPluginSpecification.h" + namespace QueuedEnums { enum class ReturnStatus; }; + /** * @typedef QueuedError * custom result error implementation @@ -100,7 +103,11 @@ Q_DECLARE_METATYPE(QueuedResult) Q_DECLARE_METATYPE(QueuedResult) Q_DECLARE_METATYPE(QueuedResult>) Q_DECLARE_METATYPE(QueuedResult) +Q_DECLARE_METATYPE(QueuedResult) +Q_DECLARE_METATYPE(QueuedResult) Q_DECLARE_METATYPE(QueuedResult) +Q_DECLARE_METATYPE(QueuedPluginSpecification::Plugin) +Q_DECLARE_METATYPE(QueuedPluginSpecification::PluginOption) /** * @brief DBus marshalling method * @param _argument diff --git a/sources/queued/include/queued/private/QueuedCorePrivate.h b/sources/queued/include/queued/private/QueuedCorePrivate.h index ccbd893..449a4a3 100644 --- a/sources/queued/include/queued/private/QueuedCorePrivate.h +++ b/sources/queued/include/queued/private/QueuedCorePrivate.h @@ -231,8 +231,8 @@ public: * user auth token * @return dictionary of PluginSpecification representation */ - QueuedResult plugin(const QString &_plugin, - const QString &_token); + QueuedResult + plugin(const QString &_plugin, const QString &_token); /** * @brief get plugin settings * @param _plugin diff --git a/sources/queued/src/QueuedCore.cpp b/sources/queued/src/QueuedCore.cpp index 4224451..14c5afc 100644 --- a/sources/queued/src/QueuedCore.cpp +++ b/sources/queued/src/QueuedCore.cpp @@ -211,8 +211,8 @@ QueuedCore::performanceReport(const QDateTime &_from, const QDateTime &_to, /** * @fn plugin */ -QueuedResult QueuedCore::plugin(const QString &_plugin, - const QString &_token) +QueuedResult +QueuedCore::plugin(const QString &_plugin, const QString &_token) { qCDebug(LOG_LIB) << "Get data for plugin" << _plugin; diff --git a/sources/queued/src/QueuedCoreAdaptor.cpp b/sources/queued/src/QueuedCoreAdaptor.cpp index 84e7e14..7a7b874 100644 --- a/sources/queued/src/QueuedCoreAdaptor.cpp +++ b/sources/queued/src/QueuedCoreAdaptor.cpp @@ -297,18 +297,26 @@ QueuedCoreAdaptor::getPlugin(const QString &_plugin, const QString &_token) QVariantList args = {_plugin, _token}; - auto result = sendRequest( + return sendRequest( QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_PROPERTY_PATH, QueuedConfig::DBUS_SERVICE, "Plugin", args); +} - QueuedResult output; - result.match( - [&output](const QVariantHash &res) { - output = QueuedPluginSpecification::readSpecification(res); - }, - [&output](const QueuedError &err) { output = err; }); - return output; +/** + * @fn getPluginOptions + */ +QueuedResult +QueuedCoreAdaptor::getPluginOptions(const QString &_plugin, + const QString &_token) +{ + qCDebug(LOG_DBUS) << "Get options for plugin" << _plugin; + + QVariantList args = {_plugin, _token}; + + return sendRequest( + QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_PROPERTY_PATH, + QueuedConfig::DBUS_SERVICE, "PluginOptions", args); } diff --git a/sources/queued/src/QueuedCorePrivate.cpp b/sources/queued/src/QueuedCorePrivate.cpp index 0b28f34..9edc6d6 100644 --- a/sources/queued/src/QueuedCorePrivate.cpp +++ b/sources/queued/src/QueuedCorePrivate.cpp @@ -386,19 +386,15 @@ QueuedResult> QueuedCorePrivate::performanceReport( /** * @fn plugin */ -QueuedResult QueuedCorePrivate::plugin(const QString &_plugin, - const QString &_token) +QueuedResult +QueuedCorePrivate::plugin(const QString &_plugin, const QString &_token) { bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Admin); if (!isAdmin) return QueuedError("Not allowed", QueuedEnums::ReturnStatus::InsufficientPermissions); - auto spec = m_plugins->loadSpecification(_plugin); - auto map = QueuedPluginSpecification::dumpSpecification(spec); - // do something if we need - - return map; + return m_plugins->loadSpecification(_plugin); } diff --git a/sources/queued/src/QueuedPropertyInterface.cpp b/sources/queued/src/QueuedPropertyInterface.cpp index 7ca6623..81225a5 100644 --- a/sources/queued/src/QueuedPropertyInterface.cpp +++ b/sources/queued/src/QueuedPropertyInterface.cpp @@ -44,6 +44,18 @@ QueuedPropertyInterface::QueuedPropertyInterface(QueuedCore *parent) qRegisterMetaType>("QueuedResult"); qDBusRegisterMetaType>(); + + qRegisterMetaType( + "QueuedPluginSpecification::PluginOption"); + qDBusRegisterMetaType(); + + qRegisterMetaType( + "QueuedPluginSpecification::Plugin"); + qDBusRegisterMetaType(); + + qRegisterMetaType>( + "QueuedResult"); + qDBusRegisterMetaType>(); } @@ -68,6 +80,19 @@ QDBusVariant QueuedPropertyInterface::Plugin(const QString &plugin, } +/** + * @fn PluginOptions + */ +QDBusVariant QueuedPropertyInterface::PluginOptions(const QString &plugin, + const QString &token) +{ + qCDebug(LOG_DBUS) << "Get plugin options" << plugin; + + return QueuedCoreAdaptor::toDBusVariant( + m_core->pluginSettings(plugin, token)); +} + + /** * @fn Option */ diff --git a/sources/queuedctl/src/QueuedctlCommon.cpp b/sources/queuedctl/src/QueuedctlCommon.cpp index 0cb41f8..1f00282 100644 --- a/sources/queuedctl/src/QueuedctlCommon.cpp +++ b/sources/queuedctl/src/QueuedctlCommon.cpp @@ -149,7 +149,9 @@ void QueuedctlCommon::preprocess(const QStringList &_args, QueuedctlPermissions::parser(_parser); break; case QueuedctlArgument::PluginAdd: + case QueuedctlArgument::PluginOptions: case QueuedctlArgument::PluginRemove: + case QueuedctlArgument::PluginSpecification: QueuedctlPlugins::parser(_parser); break; case QueuedctlArgument::PluginList: @@ -269,10 +271,18 @@ QueuedctlCommon::process(QCommandLineParser &_parser, const QString &_cache, result = QueuedctlPlugins::listPlugins(); break; } + case QueuedctlArgument::PluginOptions: { + result = QueuedctlPlugins::getPluginOptions(args.at(1), token); + break; + } case QueuedctlArgument::PluginRemove: { result = QueuedctlPlugins::removePlugin(args.at(1), token); break; } + case QueuedctlArgument::PluginSpecification: { + result = QueuedctlPlugins::getPlugin(args.at(1), token); + break; + } case QueuedctlArgument::Report: { result = QueuedctlUser::getReport(_parser, token); break; diff --git a/sources/queuedctl/src/QueuedctlCommon.h b/sources/queuedctl/src/QueuedctlCommon.h index 6a43247..102c429 100644 --- a/sources/queuedctl/src/QueuedctlCommon.h +++ b/sources/queuedctl/src/QueuedctlCommon.h @@ -32,7 +32,9 @@ enum class QueuedctlArgument { PermissionRemove, PluginAdd, PluginList, + PluginOptions, PluginRemove, + PluginSpecification, Report, Status, TaskAdd, @@ -63,9 +65,13 @@ const QHash QueuedctlArguments = { {QueuedctlArgument::PermissionAdd, "Sets user permission.", 3}}, {"perm-remove", {QueuedctlArgument::PermissionRemove, "Removes user permission.", 3}}, + {"plugin", + {QueuedctlArgument::PluginSpecification, "Get plugin description.", 2}}, {"plugin-add", {QueuedctlArgument::PluginAdd, "Adds plugin to load.", 2}}, {"plugin-list", {QueuedctlArgument::PluginList, "Shows enabled plugins.", 1}}, + {"plugin-options", + {QueuedctlArgument::PluginOptions, "Get plugin options.", 2}}, {"plugin-remove", {QueuedctlArgument::PluginRemove, "Removes plugin to load.", 2}}, {"report", {QueuedctlArgument::Report, "Shows usage report.", 1}}, diff --git a/sources/queuedctl/src/QueuedctlOption.cpp b/sources/queuedctl/src/QueuedctlOption.cpp index aba4f70..5cb99b9 100644 --- a/sources/queuedctl/src/QueuedctlOption.cpp +++ b/sources/queuedctl/src/QueuedctlOption.cpp @@ -45,9 +45,9 @@ QueuedctlOption::getOption(const QString &_option, const QString &_token) QueuedctlCommon::QueuedctlResult output; auto res = QueuedCoreAdaptor::getOption(_option, _token); res.match( - [&output](const QVariant &val) { + [&output, &_option](const QVariant &val) { output.status = val.isValid(); - output.output = val.toString(); + output.output = QString("%1: %2").arg(_option, val.toString()); }, [&output](const QueuedError &err) { output.output = err.message().c_str(); diff --git a/sources/queuedctl/src/QueuedctlPlugins.cpp b/sources/queuedctl/src/QueuedctlPlugins.cpp index 959faa0..fb425bc 100644 --- a/sources/queuedctl/src/QueuedctlPlugins.cpp +++ b/sources/queuedctl/src/QueuedctlPlugins.cpp @@ -37,6 +37,63 @@ QueuedctlPlugins::addPlugin(const QString &_plugin, const QString &_token) } +QueuedctlCommon::QueuedctlResult +QueuedctlPlugins::getPlugin(const QString &_plugin, const QString &_token) +{ + qCDebug(LOG_APP) << "Get plugin" << _plugin; + + auto res = QueuedCoreAdaptor::getPlugin(_plugin, _token); + + QueuedctlCommon::QueuedctlResult output; + res.match( + [&output](const QueuedPluginSpecification::Plugin &val) { + QStringList text; + text += QString("Author: %1").arg(val.author); + text += QString("Description: %1").arg(val.description); + text += QString("Homepage: %1").arg(val.homepage); + text += QString("License: %1").arg(val.license); + text += QString("Options:"); + for (auto &opt : val.options) { + text += QString(" %1").arg(opt.name); + text += QString(" description: %1").arg(opt.description); + text += QString(" type: %1").arg(opt.type); + text += QString(" default: %1") + .arg(opt.defaultValue.toString()); + } + + output.status = true; + output.output = text.join('\n'); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; +} + + +QueuedctlCommon::QueuedctlResult +QueuedctlPlugins::getPluginOptions(const QString &_plugin, + const QString &_token) +{ + qCDebug(LOG_APP) << "Get plugin options" << _plugin; + + auto res = QueuedCoreAdaptor::getPluginOptions(_plugin, _token); + + QueuedctlCommon::QueuedctlResult output; + res.match( + [&output](const QVariantHash &val) { + output.status = true; + output.output = QueuedctlCommon::hashToString(val); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; +} + + QueuedctlCommon::QueuedctlResult QueuedctlPlugins::listPlugins() { auto res = QueuedCoreAdaptor::getOption( diff --git a/sources/queuedctl/src/QueuedctlPlugins.h b/sources/queuedctl/src/QueuedctlPlugins.h index e1106d6..7bb9d6c 100644 --- a/sources/queuedctl/src/QueuedctlPlugins.h +++ b/sources/queuedctl/src/QueuedctlPlugins.h @@ -26,6 +26,10 @@ namespace QueuedctlPlugins { QueuedctlCommon::QueuedctlResult addPlugin(const QString &_plugin, const QString &_token); +QueuedctlCommon::QueuedctlResult getPlugin(const QString &_plugin, + const QString &_token); +QueuedctlCommon::QueuedctlResult getPluginOptions(const QString &_plugin, + const QString &_token); QueuedctlCommon::QueuedctlResult listPlugins(); QueuedctlCommon::QueuedctlResult removePlugin(const QString &_plugin, const QString &_token);