From e839db71078b58ddbf462c99b8faba4be8452aa2 Mon Sep 17 00:00:00 2001 From: Andrey Prygunkov Date: Mon, 20 Mar 2017 20:59:34 +0100 Subject: [PATCH] #50: pass not yet saved options to script --- daemon/extension/CommandScript.cpp | 9 ++++++++- daemon/extension/CommandScript.h | 4 +++- daemon/remote/XmlRpc.cpp | 18 ++++++++++++++++-- daemon/util/Script.cpp | 5 +++-- daemon/util/Script.h | 1 + webui/config.js | 17 +++++++++++------ 6 files changed, 42 insertions(+), 12 deletions(-) diff --git a/daemon/extension/CommandScript.cpp b/daemon/extension/CommandScript.cpp index a0f6867a..b85ae2ff 100644 --- a/daemon/extension/CommandScript.cpp +++ b/daemon/extension/CommandScript.cpp @@ -27,12 +27,14 @@ static const int COMMANDPROCESS_SUCCESS = 93; static const int COMMANDPROCESS_ERROR = 94; -void CommandScriptController::StartScript(const char* scriptName, const char* command) +void CommandScriptController::StartScript(const char* scriptName, const char* command, + std::unique_ptr modifiedOptions) { CommandScriptController* scriptController = new CommandScriptController(); scriptController->m_script = scriptName; scriptController->m_command = command; scriptController->m_logId = g_CommandScriptLog->Reset(); + scriptController->m_modifiedOptions = std::move(modifiedOptions); scriptController->SetAutoDestroy(true); @@ -87,6 +89,11 @@ void CommandScriptController::PrepareParams(const char* scriptName) PrepareEnvScript(nullptr, scriptName); } +const char* CommandScriptController::GetOptValue(const char* name, const char* value) +{ + Options::OptEntry* entry = m_modifiedOptions->FindOption(name); + return entry ? entry->GetValue() : value; +} void CommandScriptController::AddMessage(Message::EKind kind, const char * text) { diff --git a/daemon/extension/CommandScript.h b/daemon/extension/CommandScript.h index 451abcef..7e1634a8 100644 --- a/daemon/extension/CommandScript.h +++ b/daemon/extension/CommandScript.h @@ -28,16 +28,18 @@ class CommandScriptController : public Thread, public NzbScriptController { public: virtual void Run(); - static void StartScript(const char* scriptName, const char* command); + static void StartScript(const char* scriptName, const char* command, std::unique_ptr modifiedOptions); protected: virtual void ExecuteScript(ScriptConfig::Script* script); virtual void AddMessage(Message::EKind kind, const char* text); + virtual const char* GetOptValue(const char* name, const char* value); private: CString m_script; CString m_command; int m_logId; + std::unique_ptr m_modifiedOptions; void PrepareParams(const char* scriptName); }; diff --git a/daemon/remote/XmlRpc.cpp b/daemon/remote/XmlRpc.cpp index 03c4d4c4..207f8076 100644 --- a/daemon/remote/XmlRpc.cpp +++ b/daemon/remote/XmlRpc.cpp @@ -3381,7 +3381,7 @@ void TestServerXmlCommand::PrintError(const char* errMsg) } } -// bool startscript(string script, string command); +// bool startscript(string script, string command, struct[] options); void StartScriptXmlCommand::Execute() { if (!CheckSafeMethod()) @@ -3397,7 +3397,21 @@ void StartScriptXmlCommand::Execute() return; } - CommandScriptController::StartScript(script, command); + std::unique_ptr optEntries = std::make_unique(); + + char* name; + char* value; + char* dummy; + while ((IsJson() && NextParamAsStr(&dummy) && NextParamAsStr(&name) && + NextParamAsStr(&dummy) && NextParamAsStr(&value)) || + (!IsJson() && NextParamAsStr(&name) && NextParamAsStr(&value))) + { + DecodeStr(name); + DecodeStr(value); + optEntries->emplace_back(name, value); + } + + CommandScriptController::StartScript(script, command, std::move(optEntries)); BuildBoolResponse(true); } diff --git a/daemon/util/Script.cpp b/daemon/util/Script.cpp index 1a489755..8da4322e 100644 --- a/daemon/util/Script.cpp +++ b/daemon/util/Script.cpp @@ -198,14 +198,15 @@ void ScriptController::PrepareEnvOptions(const char* stripPrefix) for (Options::OptEntry& optEntry : g_Options->GuardOptEntries()) { + const char* value = GetOptValue(optEntry.GetName(), optEntry.GetValue()); if (stripPrefix && !strncmp(optEntry.GetName(), stripPrefix, prefixLen) && (int)strlen(optEntry.GetName()) > prefixLen) { - SetEnvVarSpecial("NZBPO", optEntry.GetName() + prefixLen, optEntry.GetValue()); + SetEnvVarSpecial("NZBPO", optEntry.GetName() + prefixLen, value); } else if (!stripPrefix) { - SetEnvVarSpecial("NZBOP", optEntry.GetName(), optEntry.GetValue()); + SetEnvVarSpecial("NZBOP", optEntry.GetName(), value); } } } diff --git a/daemon/util/Script.h b/daemon/util/Script.h index f21ebd95..e2dd91d6 100644 --- a/daemon/util/Script.h +++ b/daemon/util/Script.h @@ -78,6 +78,7 @@ protected: void ResetEnv(); void PrepareEnvOptions(const char* stripPrefix); void PrepareArgs(); + virtual const char* GetOptValue(const char* name, const char* value) { return value; } int StartProcess(); int WaitProcess(); #ifdef WIN32 diff --git a/webui/config.js b/webui/config.js index faa1eb96..a4a3de35 100644 --- a/webui/config.js +++ b/webui/config.js @@ -1504,7 +1504,8 @@ var Config = (new function($) var option = findOptionById(optFormId); var script = option.name.substr(0, option.name.indexOf(':')); var command = option.name.substr(option.name.indexOf(':') + 1, 1000); - RPC.call('startscript', [script, command], + var changedOptions = prepareSaveRequest(true, false, true); + RPC.call('startscript', [script, command, changedOptions], function (result) { if (result) @@ -1655,7 +1656,7 @@ var Config = (new function($) return false; } - function prepareSaveRequest(onlyUserChanges, webSettings) + function prepareSaveRequest(onlyUserChanges, webSettings, onlyChangedOptions) { var modified = false; var request = []; @@ -1682,14 +1683,18 @@ var Config = (new function($) { if (onlyUserChanges) { - modified = modified || (oldValue != newValue && oldValue !== null); + var optmodified = oldValue != newValue && oldValue !== null; } else { - modified = modified || (oldValue != newValue) || (option.value === null); + var optmodified = (oldValue != newValue) || (option.value === null); + } + modified = modified || optmodified; + if (optmodified || !onlyChangedOptions) + { + var opt = {Name: option.name, Value: newValue}; + request.push(opt); } - var opt = {Name: option.name, Value: newValue}; - request.push(opt); } } modified = modified || section.modified;