From 20ae49ad491925cb40e09d5abc9011e8497878f3 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 11 May 2022 17:50:12 +0200 Subject: [PATCH] Introduce Command#arguments[].separator ... for letting check commands produce argv like --key=value, not just --key value. refs #6277 --- doc/09-object-types.md | 1 + itl/command-plugins.conf | 2 ++ lib/icinga/command.ti | 1 + lib/icinga/macroprocessor.cpp | 20 +++++++++++++------- lib/icinga/macroprocessor.hpp | 2 +- lib/icingadb/icingadb-objects.cpp | 2 +- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index e9562b5df..4574cf9b7 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -140,6 +140,7 @@ All available argument value entries are shown below: order | Number | Set if multiple arguments require a defined argument order. The syntax is `..., -3, -2, -1, , 1, 2, 3, ...`. [More details](03-monitoring-basics.md#command-arguments-order). repeat\_key | Boolean | If the argument value is an array, repeat the argument key, or not. Defaults to true (repeat). [More details](03-monitoring-basics.md#command-arguments-repeat-key). key | String | Optional argument key overriding the key identifier. [More details](03-monitoring-basics.md#command-arguments-key). + separator | String | Key-value separator. If given, e.g. `=`, appears between key and value like `--key=value` instead of the regular `--key` `value`. `value` and `description` are commonly used, the other entries allow to build more advanced CheckCommand objects and arguments. diff --git a/itl/command-plugins.conf b/itl/command-plugins.conf index 14501474a..4bfd5ffb6 100644 --- a/itl/command-plugins.conf +++ b/itl/command-plugins.conf @@ -1925,10 +1925,12 @@ object CheckCommand "apt" { } "--upgrade" = { value = "$apt_upgrade$" + separator = "=" description = "[Default] Perform an upgrade. If an optional OPTS argument is provided, apt-get will be run with these command line options instead of the default." } "--dist-upgrade" = { value = "$apt_dist_upgrade$" + separator = "=" description = "Perform a dist-upgrade instead of normal upgrade. Like with -U OPTS can be provided to override the default options." } "--include" = { diff --git a/lib/icinga/command.ti b/lib/icinga/command.ti index a49d6e869..227595558 100644 --- a/lib/icinga/command.ti +++ b/lib/icinga/command.ti @@ -41,6 +41,7 @@ validator Command { String set_if; Function set_if; Number order; + String separator; }; }; diff --git a/lib/icinga/macroprocessor.cpp b/lib/icinga/macroprocessor.cpp index b72e2f0b3..9d5f6425d 100644 --- a/lib/icinga/macroprocessor.cpp +++ b/lib/icinga/macroprocessor.cpp @@ -376,13 +376,17 @@ void MacroProcessor::ValidateCustomVars(const ConfigObject::Ptr& object, const D } void MacroProcessor::AddArgumentHelper(const Array::Ptr& args, const String& key, const String& value, - bool add_key, bool add_value) + bool add_key, bool add_value, const Value& separator) { - if (add_key) - args->Add(key); + if (add_key && separator.GetType() != ValueEmpty && add_value) { + args->Add(key + separator + value); + } else { + if (add_key) + args->Add(key); - if (add_value) - args->Add(value); + if (add_value) + args->Add(value); + } } Value MacroProcessor::EscapeMacroShellArg(const Value& value) @@ -412,6 +416,7 @@ struct CommandArgument bool RepeatKey{true}; bool SkipValue{false}; String Key; + Value Separator; Value AValue; bool operator<(const CommandArgument& rhs) const @@ -459,6 +464,7 @@ Value MacroProcessor::ResolveArguments(const Value& command, const Dictionary::P if (argdict->Contains("repeat_key")) arg.RepeatKey = argdict->Get("repeat_key"); arg.Order = argdict->Get("order"); + arg.Separator = argdict->Get("separator"); Value set_if = argdict->Get("set_if"); @@ -539,10 +545,10 @@ Value MacroProcessor::ResolveArguments(const Value& command, const Dictionary::P } else add_key = !arg.SkipKey && arg.RepeatKey; - AddArgumentHelper(command_arr, arg.Key, value, add_key, !arg.SkipValue); + AddArgumentHelper(command_arr, arg.Key, value, add_key, !arg.SkipValue, arg.Separator); } } else - AddArgumentHelper(command_arr, arg.Key, arg.AValue, !arg.SkipKey, !arg.SkipValue); + AddArgumentHelper(command_arr, arg.Key, arg.AValue, !arg.SkipKey, !arg.SkipValue, arg.Separator); } } diff --git a/lib/icinga/macroprocessor.hpp b/lib/icinga/macroprocessor.hpp index 1ff21efbf..d6c16107a 100644 --- a/lib/icinga/macroprocessor.hpp +++ b/lib/icinga/macroprocessor.hpp @@ -51,7 +51,7 @@ private: const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros, int recursionLevel); static void AddArgumentHelper(const Array::Ptr& args, const String& key, const String& value, - bool add_key, bool add_value); + bool add_key, bool add_value, const Value& separator); static Value EscapeMacroShellArg(const Value& value); }; diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index d5b1125cb..449046d79 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -990,7 +990,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S values = new Dictionary({{"value", kv.second}}); } - for (const char *attr : {"value", "set_if"}) { + for (const char *attr : {"value", "set_if", "separator"}) { Value value; // Stringify if set.