From b5c2081aeed76e9bdfefb4975671450a73a2b09f Mon Sep 17 00:00:00 2001 From: HaseenaSainul Date: Wed, 25 Sep 2024 04:33:08 -0400 Subject: [PATCH] SetEnv: JSON parameter passing through command is changed --- Source/Thunder/IRemoteInstantiation.h | 2 +- Source/Thunder/PluginServer.h | 16 +++++++---- Source/ThunderPlugin/Process.cpp | 41 ++++++++++++++++----------- Source/com/Communicator.h | 10 +++---- Source/plugins/Configuration.h | 1 + Source/plugins/IShell.h | 2 +- 6 files changed, 42 insertions(+), 30 deletions(-) diff --git a/Source/Thunder/IRemoteInstantiation.h b/Source/Thunder/IRemoteInstantiation.h index b52c19ac3..988ab4e58 100644 --- a/Source/Thunder/IRemoteInstantiation.h +++ b/Source/Thunder/IRemoteInstantiation.h @@ -57,7 +57,7 @@ namespace PluginHost { const uint8_t threads, const int8_t priority, const string configuration, - const string environments) = 0; + const std::vector& environments) = 0; }; } } diff --git a/Source/Thunder/PluginServer.h b/Source/Thunder/PluginServer.h index 341e2799a..5e6a29049 100644 --- a/Source/Thunder/PluginServer.h +++ b/Source/Thunder/PluginServer.h @@ -1277,22 +1277,26 @@ namespace PluginHost { string Substitute(const string& input) const override { return (_administrator.Configuration().Substitute(input, PluginHost::Service::Configuration())); } - string SubstituteList(const string& envList) const override { - string envs; + std::vector SubstituteList(const string& envs) const override { + + std::vector environmentList;; Plugin::Config::EnvironmentList environments; - environments.FromString(envList); + environments.FromString(envs); if (environments.IsSet() == true) { Core::JSON::ArrayType::Iterator index(environments.Elements()); while (index.Next() == true) { if ((index.Current().Key.IsSet() == true) && (index.Current().Value.IsSet() == true)) { index.Current().Value = Substitute(index.Current().Value.Value()); + string env = index.Current().Key.Value() + Plugin::Config::EnvFieldSeparator + + index.Current().Value.Value() + Plugin::Config::EnvFieldSeparator + + ((index.Current().Override.Value() == true) ? "1" : "0"); + environmentList.push_back(env); } else { SYSLOG(Logging::Startup, (_T("Failure in Substituting Value of Key:Value:[%s]:[%s]\n"), index.Current().Key.Value().c_str(), index.Current().Value.Value().c_str())); } } - environments.ToString(envs); } - return envs; + return environmentList; } Core::hresult Metadata(string& info /* @out */) const override { Metadata::Service result; @@ -2421,7 +2425,7 @@ namespace PluginHost { const uint8_t threads, const int8_t priority, const string configuration, - const string environments) override + const std::vector& environments) override { string persistentPath(_comms.PersistentPath()); string dataPath(_comms.DataPath()); diff --git a/Source/ThunderPlugin/Process.cpp b/Source/ThunderPlugin/Process.cpp index bae63d4ab..b21fd5de3 100644 --- a/Source/ThunderPlugin/Process.cpp +++ b/Source/ThunderPlugin/Process.cpp @@ -159,7 +159,7 @@ POP_WARNING() class ConsoleOptions : public Core::Options { public: ConsoleOptions(int argumentCount, TCHAR* arguments[]) - : Core::Options(argumentCount, arguments, _T("h:l:c:C:r:p:s:d:a:m:i:u:g:t:e:x:V:v:P:S:f:e:")) + : Core::Options(argumentCount, arguments, _T("h:l:c:C:r:p:s:d:a:m:i:u:g:t:x:V:v:P:S:f:e:")) , Locator(nullptr) , ClassName(nullptr) , Callsign(nullptr) @@ -202,7 +202,7 @@ POP_WARNING() string ProxyStubPath; string PostMortemPath; string SystemRootPath; - string Environments; + std::vector Environments; const TCHAR* User; const TCHAR* Group; uint8_t Threads; @@ -251,8 +251,8 @@ POP_WARNING() case 'S': SystemRootPath = Core::Directory::Normalize(Strip(argument)); break; - case 'E': - Environments = Strip(argument); + case 'e': + Environments.push_back(Strip(argument)); break; case 'v': VolatilePath = Core::Directory::Normalize(Strip(argument)); @@ -669,20 +669,27 @@ int main(int argc, char** argv) Core::ProcessCurrent().User(string(options.User)); } - if (options.Environments.empty() != true) { - Core::JSON::ArrayType Environments; - Environments.FromString(options.Environments); - if (Environments.IsSet() == true) { - Core::JSON::ArrayType::Iterator index(Environments.Elements()); - while (index.Next() == true) { - if ((index.Current().Key.IsSet() == true) && (index.Current().Value.IsSet() == true)) { - uint32_t status = Core::SystemInfo::SetEnvironment(index.Current().Key.Value(), index.Current().Value.Value(), index.Current().Override.Value()); - if (status != true) { - SYSLOG(Logging::Startup, (_T("Failure in setting Key:Value:[%s]:[%s]\n"), index.Current().Key.Value().c_str(), index.Current().Value.Value().c_str())); - } + for (const string& env : options.Environments) { + size_t start = env.find_first_of(Plugin::Config::EnvFieldSeparator); + size_t end = env.find_last_of(start, Plugin::Config::EnvFieldSeparator); + if ((start != string::npos) && (end != string::npos)) { + string key = env.substr(start); + string value = env.substr(start + 1, end); + string overrideStr = env.substr(end + 1); + + bool toOverride = ((overrideStr.size() == 1) && (overrideStr == "1")) ? true: false; + + if ((key.empty() != true) && (value.empty() != true)) { + uint32_t status = Core::SystemInfo::SetEnvironment(key, value, toOverride); + if (status != true) { + SYSLOG(Logging::Startup, (_T("Failure in setting Key:Value:[%s]:[%s]\n"), key, value)); } - } - } + } else { + SYSLOG(Logging::Startup, (_T("Environment key:value fromat is invalid :[%s]:[%s]\n"), key, value)); + } + } else { + SYSLOG(Logging::Startup, (_T("Invalid Enviroment value :[%s]\n"), env)); + } } process.Startup(options.Threads, remoteNode, callsign); diff --git a/Source/com/Communicator.h b/Source/com/Communicator.h index 5572a217a..bedaf6731 100644 --- a/Source/com/Communicator.h +++ b/Source/com/Communicator.h @@ -115,7 +115,7 @@ namespace RPC { const string& systemRootPath, const string& remoteAddress, const string& configuration, - const string& environments) + const std::vector& environments) : _locator(locator) , _className(className) , _callsign(callsign) @@ -235,7 +235,7 @@ namespace RPC { { return (_configuration); } - inline const string& Environments() const + inline const std::vector& Environments() const { return (_environments); } @@ -254,7 +254,7 @@ namespace RPC { string _systemRootPath; string _remoteAddress; string _configuration; - string _environments; + std::vector _environments; }; class EXTERNAL Config { @@ -527,8 +527,8 @@ namespace RPC { if (instance.Threads() > 1) { _options.Add(_T("-t")).Add(Core::NumberType(instance.Threads()).Text()); } - if (instance.Environments().empty() == false) { - _options.Add(_T("-E")).Add('"' + instance.Environments() + '"'); + for (auto const& env : instance.Environments()) { + _options.Add(_T("-e")).Add('"' + env + '"'); } _priority = instance.Priority(); } diff --git a/Source/plugins/Configuration.h b/Source/plugins/Configuration.h index 8ca91834e..440f27387 100644 --- a/Source/plugins/Configuration.h +++ b/Source/plugins/Configuration.h @@ -92,6 +92,7 @@ namespace Plugin { Core::JSON::Boolean Override; }; using EnvironmentList = Core::JSON::ArrayType; + static constexpr const TCHAR EnvFieldSeparator = _T(';'); class EXTERNAL RootConfig : public Core::JSON::Container { private: diff --git a/Source/plugins/IShell.h b/Source/plugins/IShell.h index 9a3452268..9dd3206ad 100644 --- a/Source/plugins/IShell.h +++ b/Source/plugins/IShell.h @@ -236,7 +236,7 @@ namespace PluginHost { virtual string Substitute(const string& input) const = 0; //! Substituted environments list - virtual string SubstituteList(const string& environments) const = 0; + virtual std::vector SubstituteList(const string& environments) const = 0; virtual bool Resumed() const = 0; virtual Core::hresult Resumed(const bool value) = 0;