From 793d833d55985be904f8475d5d642426e04edde4 Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Thu, 23 Mar 2017 23:11:05 +0300 Subject: [PATCH] add plugin interaction --- .../queued/QueuedPluginManagerInterface.h | 66 +++++++++++++++++++ .../include/queued/QueuedProcessManager.h | 2 + sources/queued/src/QueuedCore.cpp | 51 ++++++++++++-- .../{queued-daemon.1 => queuedctl.1} | 0 sources/queuedctl/src/QueuedctlTask.cpp | 9 ++- 5 files changed, 119 insertions(+), 9 deletions(-) rename sources/queuedctl/{queued-daemon.1 => queuedctl.1} (100%) diff --git a/sources/queued/include/queued/QueuedPluginManagerInterface.h b/sources/queued/include/queued/QueuedPluginManagerInterface.h index 5d54fe2..cc61121 100644 --- a/sources/queued/include/queued/QueuedPluginManagerInterface.h +++ b/sources/queued/include/queued/QueuedPluginManagerInterface.h @@ -46,6 +46,72 @@ public: virtual ~QueuedPluginManagerInterface(){}; signals: + /** + * @brief signal which emits on plugin addition + * @param _plugin + * plugin name + */ + void onAddPlugin(const QString &_plugin); + /** + * @brief signal which emits on task addition + * @param _id + * generated task ID + */ + void onAddTask(const long long _id); + /** + * @brief signal which emits on user addition + * @param _id + * generated user ID + */ + void onAddUser(const long long _id); + /** + * @brief signal which emits on user authorization + * @param _user + * user name + */ + void onAuthorization(const QString &_user); + /** + * @brief signal which emits on option edition + * @param _option + * option name + * @param _value + * option value + */ + void onEditOption(const QString &_option, const QVariant &_value); + /** + * @brief signal which emits on task edition + * @param _id + * task ID + * @param _taskData + * new task data + */ + void onEditTask(const long long _id, const QVariantHash &_taskData); + /** + * @brief signal which emits on user edition + * @param _id + * user ID + * @param _userData + * new user data + */ + void onEditUser(const long long _id, const QVariantHash &_userData); + /** + * @brief signal which emits on plugin removal + * @param _plugin + * plugin name + */ + void onRemovePlugin(const QString &_plugin); + /** + * @brief signal which emits on task starting + * @param _id + * started task ID + */ + void onStartTask(const long long _id); + /** + * @brief signal which emits on task stoping + * @param _id + * stopped task ID + */ + void onStopTask(const long long _id); }; diff --git a/sources/queued/include/queued/QueuedProcessManager.h b/sources/queued/include/queued/QueuedProcessManager.h index 4847795..12db13c 100644 --- a/sources/queued/include/queued/QueuedProcessManager.h +++ b/sources/queued/include/queued/QueuedProcessManager.h @@ -32,6 +32,8 @@ #include "QueuedProcess.h" +class QueuedPluginManagerInterface; + /** * @brief implementation over QProcess to run processes */ diff --git a/sources/queued/src/QueuedCore.cpp b/sources/queued/src/QueuedCore.cpp index 9ac6020..6b4efee 100644 --- a/sources/queued/src/QueuedCore.cpp +++ b/sources/queued/src/QueuedCore.cpp @@ -683,10 +683,16 @@ void QueuedCore::updateTaskTime(const long long _id, << _endTime; QVariantHash record; - if (_startTime.isValid()) + if (_startTime.isValid()) { record[QString("startTime")] = _startTime.toString(Qt::ISODateWithMs); - if (_endTime.isValid()) + if (m_plugins) + emit(m_plugins->interface()->onStartTask(_id)); + } + if (_endTime.isValid()) { record[QString("endTime")] = _endTime.toString(Qt::ISODateWithMs); + if (m_plugins) + emit(m_plugins->interface()->onStopTask(_id)); + } bool status = m_database->modify(QueuedDB::TASKS_TABLE, _id, record); if (!status) @@ -925,6 +931,10 @@ long long QueuedCore::addTaskPrivate(const QString &_command, // add to child object m_processes->add(properties, id); + // notify plugins + if (m_plugins) + emit(m_plugins->interface()->onAddTask(id)); + return id; } @@ -955,6 +965,10 @@ long long QueuedCore::addUserPrivate(const QString &_name, // add to child object m_users->add(properties, id); + // notify plugins + if (m_plugins) + emit(m_plugins->interface()->onAddUser(id)); + return id; } @@ -984,8 +998,12 @@ bool QueuedCore::editOptionPrivate(const QString &_key, const QVariant &_value) // add to child object if (status) { m_advancedSettings->set(_key, _value); - // notify plugin if required + // TODO notify plugin if required + // notify plugins + if (m_plugins) + emit(m_plugins->interface()->onEditOption(_key, _value)); } + return status; } @@ -1003,13 +1021,28 @@ bool QueuedCore::editPluginPrivate(const QString &_plugin, const bool _add) .split('\n'); bool status = false; - if (_add && !pluginList.contains(_plugin)) + if (_add && !pluginList.contains(_plugin)) { status = m_plugins->loadPlugin(_plugin, pluginSettings(_plugin)); - else if (!_add && pluginList.contains(_plugin)) + pluginList.append(_plugin); + } else if (!_add && pluginList.contains(_plugin)) { status = m_plugins->unloadPlugin(_plugin); - else + pluginList.removeAll(_plugin); + } else { qCDebug(LOG_LIB) << "Plugin" << _plugin << "not loaded or already loaded"; + } + + if (status) { + editOptionPrivate(m_advancedSettings->internalId( + QueuedConfig::QueuedSettings::Plugins), + pluginList.join('\n')); + // notify plugins + if (_add) + if (m_plugins) + emit(m_plugins->interface()->onAddPlugin(_plugin)); + else if (m_plugins) + emit(m_plugins->interface()->onRemovePlugin(_plugin)); + } return status; } @@ -1040,6 +1073,9 @@ bool QueuedCore::editTaskPrivate(const long long _id, // modify values stored in memory for (auto &property : _taskData.keys()) task->setProperty(qPrintable(property), _taskData[property]); + // notify plugins + if (m_plugins) + emit(m_plugins->interface()->onEditTask(_id, _taskData)); return true; } @@ -1070,6 +1106,9 @@ bool QueuedCore::editUserPrivate(const long long _id, // modify values stored in memory for (auto &property : _userData.keys()) userObj->setProperty(qPrintable(property), _userData[property]); + // notify plugins + if (m_plugins) + emit(m_plugins->interface()->onEditUser(_id, _userData)); return true; } diff --git a/sources/queuedctl/queued-daemon.1 b/sources/queuedctl/queuedctl.1 similarity index 100% rename from sources/queuedctl/queued-daemon.1 rename to sources/queuedctl/queuedctl.1 diff --git a/sources/queuedctl/src/QueuedctlTask.cpp b/sources/queuedctl/src/QueuedctlTask.cpp index e861d58..4dc0f3a 100644 --- a/sources/queuedctl/src/QueuedctlTask.cpp +++ b/sources/queuedctl/src/QueuedctlTask.cpp @@ -58,7 +58,8 @@ QueuedctlTask::getDefinitions(const QCommandLineParser &_parser, = _parser.value("task-user").isEmpty() ? 0 : QueuedctlUser::getUserId(_parser.value("task-user")); - definitions.workingDirectory = _parser.value("directory"); + definitions.workingDirectory + = QFileInfo(_parser.value("directory")).absoluteFilePath(); // limits now QueuedLimits::Limits limits( _parser.value("limit-cpu").toLongLong(), @@ -70,7 +71,8 @@ QueuedctlTask::getDefinitions(const QCommandLineParser &_parser, // all options if (_expandAll) { - definitions.command = _parser.value("program"); + definitions.command + = QFileInfo(_parser.value("program")).absoluteFilePath(); definitions.endTime = QDateTime::fromString(_parser.value("stop"), Qt::ISODateWithMs); definitions.gid = _parser.value("gid").toUInt(); @@ -79,7 +81,8 @@ QueuedctlTask::getDefinitions(const QCommandLineParser &_parser, definitions.uid = _parser.value("uid").toUInt(); } else { // queuedctl -- task-add /path/to/application - definitions.command = _parser.positionalArguments().at(1); + definitions.command + = QFileInfo(_parser.positionalArguments().at(1)).absoluteFilePath(); } return definitions;