diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 67e1994fc..16a9ae9a1 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -401,6 +401,20 @@ int Main(void) if (vm.count("arg")) args = vm["arg"].as >(); + if (args.size() < command->GetMinArguments()) { + Log(LogCritical, "cli") + << "Too few arguments. Command needs at least " << command->GetMinArguments() + << " argument" << (command->GetMinArguments() != 1 ? "s" : "") << "."; + return EXIT_FAILURE; + } + + if (command->GetMaxArguments() >= 0 && args.size() > command->GetMaxArguments()) { + Log(LogCritical, "cli") + << "Too many arguments. At most " << command->GetMaxArguments() + << " argument" << (command->GetMaxArguments() != 1 ? "s" : "") << " may be specified."; + return EXIT_FAILURE; + } + rc = command->Run(vm, args); } diff --git a/lib/cli/agentaddcommand.cpp b/lib/cli/agentaddcommand.cpp index 7408c7be4..3226dd864 100644 --- a/lib/cli/agentaddcommand.cpp +++ b/lib/cli/agentaddcommand.cpp @@ -43,6 +43,11 @@ String AgentAddCommand::GetShortDescription(void) const return "add agent"; } +int AgentAddCommand::GetMinArguments(void) const +{ + return 1; +} + /** * The entry point for the "agent add" CLI command. * @@ -50,11 +55,6 @@ String AgentAddCommand::GetShortDescription(void) const */ int AgentAddCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (ap.empty()) { - Log(LogCritical, "cli", "No agent name provided."); - return 1; - } - if (!AgentUtility::AddAgent(ap[0])) { Log(LogCritical, "cli") << "Cannot add agent '" << ap[0] << "'."; diff --git a/lib/cli/agentaddcommand.hpp b/lib/cli/agentaddcommand.hpp index d1107c865..5bf1ed89b 100644 --- a/lib/cli/agentaddcommand.hpp +++ b/lib/cli/agentaddcommand.hpp @@ -37,6 +37,7 @@ public: virtual String GetDescription(void) const; virtual String GetShortDescription(void) const; + virtual int GetMinArguments(void) const; virtual int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const; }; diff --git a/lib/cli/agentremovecommand.cpp b/lib/cli/agentremovecommand.cpp index ddc3dc698..28187c836 100644 --- a/lib/cli/agentremovecommand.cpp +++ b/lib/cli/agentremovecommand.cpp @@ -48,6 +48,16 @@ std::vector AgentRemoveCommand::GetPositionalSuggestions(const String& w return AgentUtility::GetAgentCompletionSuggestions(word); } +int AgentRemoveCommand::GetMinArguments(void) const +{ + return 1; +} + +int AgentRemoveCommand::GetMaxArguments(void) const +{ + return -1; +} + /** * The entry point for the "agent remove" CLI command. * @@ -55,11 +65,6 @@ std::vector AgentRemoveCommand::GetPositionalSuggestions(const String& w */ int AgentRemoveCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (ap.empty()) { - Log(LogCritical, "cli", "No agent name provided."); - return 1; - } - bool failed = false; BOOST_FOREACH(const String& agent, ap) { diff --git a/lib/cli/agentremovecommand.hpp b/lib/cli/agentremovecommand.hpp index cb716b311..e7689341b 100644 --- a/lib/cli/agentremovecommand.hpp +++ b/lib/cli/agentremovecommand.hpp @@ -37,6 +37,8 @@ public: virtual String GetDescription(void) const; virtual String GetShortDescription(void) const; + virtual int GetMinArguments(void) const; + virtual int GetMaxArguments(void) const; virtual std::vector GetPositionalSuggestions(const String& word) const; virtual int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const; }; diff --git a/lib/cli/agentsetcommand.cpp b/lib/cli/agentsetcommand.cpp index 5fea91ef8..6238f832a 100644 --- a/lib/cli/agentsetcommand.cpp +++ b/lib/cli/agentsetcommand.cpp @@ -48,6 +48,11 @@ void AgentSetCommand::InitParameters(boost::program_options::options_description } +int AgentSetCommand::GetMinArguments(void) const +{ + return 1; +} + /** * The entry point for the "agent set" CLI command. * @@ -55,11 +60,6 @@ void AgentSetCommand::InitParameters(boost::program_options::options_description */ int AgentSetCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (ap.empty()) { - Log(LogCritical, "cli", "No agent name provided."); - return 1; - } - Log(LogWarning, "cli", "TODO: Not implemented yet."); return 0; diff --git a/lib/cli/agentsetcommand.hpp b/lib/cli/agentsetcommand.hpp index 567ad4791..ace39dafb 100644 --- a/lib/cli/agentsetcommand.hpp +++ b/lib/cli/agentsetcommand.hpp @@ -37,6 +37,7 @@ public: virtual String GetDescription(void) const; virtual String GetShortDescription(void) const; + virtual int GetMinArguments(void) const; virtual void InitParameters(boost::program_options::options_description& visibleDesc, boost::program_options::options_description& hiddenDesc) const; virtual int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const; diff --git a/lib/cli/agentupdateconfigcommand.cpp b/lib/cli/agentupdateconfigcommand.cpp index 7f2e1732a..133503eb9 100644 --- a/lib/cli/agentupdateconfigcommand.cpp +++ b/lib/cli/agentupdateconfigcommand.cpp @@ -49,11 +49,6 @@ String AgentUpdateConfigCommand::GetShortDescription(void) const */ int AgentUpdateConfigCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (!ap.empty()) { - Log(LogWarning, "cli") - << "Ignoring parameters: " << boost::algorithm::join(ap, " "); - } - Log(LogWarning, "cli", "TODO: Not implemented yet."); return 0; diff --git a/lib/cli/agentwizardcommand.cpp b/lib/cli/agentwizardcommand.cpp index 974f70db3..222b6bf0b 100644 --- a/lib/cli/agentwizardcommand.cpp +++ b/lib/cli/agentwizardcommand.cpp @@ -49,11 +49,6 @@ String AgentWizardCommand::GetShortDescription(void) const */ int AgentWizardCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (!ap.empty()) { - Log(LogWarning, "cli") - << "Ignoring parameters: " << boost::algorithm::join(ap, " "); - } - Log(LogWarning, "cli", "TODO: Not implemented yet."); /* diff --git a/lib/cli/clicommand.cpp b/lib/cli/clicommand.cpp index fab8657cf..0930be809 100644 --- a/lib/cli/clicommand.cpp +++ b/lib/cli/clicommand.cpp @@ -92,6 +92,16 @@ std::vector icinga::GetFieldCompletionSuggestions(const Type *type, cons return result; } +int CLICommand::GetMinArguments(void) const +{ + return 0; +} + +int CLICommand::GetMaxArguments(void) const +{ + return GetMinArguments(); +} + boost::mutex& CLICommand::GetRegistryMutex(void) { static boost::mutex mtx; diff --git a/lib/cli/clicommand.hpp b/lib/cli/clicommand.hpp index 3d41fadcb..562589f3d 100644 --- a/lib/cli/clicommand.hpp +++ b/lib/cli/clicommand.hpp @@ -46,6 +46,8 @@ public: virtual String GetDescription(void) const = 0; virtual String GetShortDescription(void) const = 0; + virtual int GetMinArguments(void) const; + virtual int GetMaxArguments(void) const; virtual void InitParameters(boost::program_options::options_description& visibleDesc, boost::program_options::options_description& hiddenDesc) const; virtual int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const = 0; diff --git a/lib/cli/featuredisablecommand.cpp b/lib/cli/featuredisablecommand.cpp index 9c2253388..1e135b789 100644 --- a/lib/cli/featuredisablecommand.cpp +++ b/lib/cli/featuredisablecommand.cpp @@ -41,6 +41,16 @@ std::vector FeatureDisableCommand::GetPositionalSuggestions(const String return FeatureUtility::GetFieldCompletionSuggestions(word, false); } +int FeatureDisableCommand::GetMinArguments(void) const +{ + return 1; +} + +int FeatureDisableCommand::GetMaxArguments(void) const +{ + return -1; +} + /** * The entry point for the "feature disable" CLI command. * diff --git a/lib/cli/featuredisablecommand.hpp b/lib/cli/featuredisablecommand.hpp index 48f9f8c01..1331af246 100644 --- a/lib/cli/featuredisablecommand.hpp +++ b/lib/cli/featuredisablecommand.hpp @@ -37,6 +37,8 @@ public: virtual String GetDescription(void) const; virtual String GetShortDescription(void) const; + virtual int GetMinArguments(void) const; + virtual int GetMaxArguments(void) const; virtual std::vector GetPositionalSuggestions(const String& word) const; virtual int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const; diff --git a/lib/cli/featureenablecommand.cpp b/lib/cli/featureenablecommand.cpp index 131629bde..3e7a7ee4a 100644 --- a/lib/cli/featureenablecommand.cpp +++ b/lib/cli/featureenablecommand.cpp @@ -41,6 +41,16 @@ std::vector FeatureEnableCommand::GetPositionalSuggestions(const String& return FeatureUtility::GetFieldCompletionSuggestions(word, true); } +int FeatureEnableCommand::GetMinArguments(void) const +{ + return 1; +} + +int FeatureEnableCommand::GetMaxArguments(void) const +{ + return -1; +} + /** * The entry point for the "feature enable" CLI command. * @@ -48,12 +58,5 @@ std::vector FeatureEnableCommand::GetPositionalSuggestions(const String& */ int FeatureEnableCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (ap.empty()) { - Log(LogCritical, "cli", "Cannot enable feature(s). Name(s) are missing!"); - return 0; - } - return FeatureUtility::EnableFeatures(ap); - - return 0; } diff --git a/lib/cli/featureenablecommand.hpp b/lib/cli/featureenablecommand.hpp index 8bc034168..9488e363a 100644 --- a/lib/cli/featureenablecommand.hpp +++ b/lib/cli/featureenablecommand.hpp @@ -37,6 +37,8 @@ public: virtual String GetDescription(void) const; virtual String GetShortDescription(void) const; + virtual int GetMinArguments(void) const; + virtual int GetMaxArguments(void) const; virtual std::vector GetPositionalSuggestions(const String& word) const; virtual int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const; }; diff --git a/lib/cli/featurelistcommand.cpp b/lib/cli/featurelistcommand.cpp index 7e0347fd6..7496f0489 100644 --- a/lib/cli/featurelistcommand.cpp +++ b/lib/cli/featurelistcommand.cpp @@ -48,10 +48,5 @@ String FeatureListCommand::GetShortDescription(void) const */ int FeatureListCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (!ap.empty()) { - Log(LogWarning, "cli") - << "Ignoring parameters: " << boost::algorithm::join(ap, " "); - } - return FeatureUtility::ListFeatures(); } diff --git a/lib/cli/objectlistcommand.cpp b/lib/cli/objectlistcommand.cpp index e555d3c32..63e1e7b53 100644 --- a/lib/cli/objectlistcommand.cpp +++ b/lib/cli/objectlistcommand.cpp @@ -66,11 +66,6 @@ void ObjectListCommand::InitParameters(boost::program_options::options_descripti */ int ObjectListCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (!ap.empty()) { - Log(LogWarning, "cli") - << "Ignoring parameters: " << boost::algorithm::join(ap, " "); - } - String objectfile = Application::GetObjectsPath(); if (!Utility::PathExists(objectfile)) { diff --git a/lib/cli/repositorycommitcommand.cpp b/lib/cli/repositorycommitcommand.cpp index 9667e11fc..9c5adc5d9 100644 --- a/lib/cli/repositorycommitcommand.cpp +++ b/lib/cli/repositorycommitcommand.cpp @@ -65,11 +65,6 @@ void RepositoryCommitCommand::InitParameters(boost::program_options::options_des */ int RepositoryCommitCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (!ap.empty()) { - Log(LogWarning, "cli") - << "Ignoring parameters: " << boost::algorithm::join(ap, " "); - } - if (vm.count("simulate")) { RepositoryUtility::PrintChangeLog(std::cout); std::cout << "Simulation not yet implemented.\n"; diff --git a/lib/cli/repositoryobjectcommand.cpp b/lib/cli/repositoryobjectcommand.cpp index 12311a619..ab30b9155 100644 --- a/lib/cli/repositoryobjectcommand.cpp +++ b/lib/cli/repositoryobjectcommand.cpp @@ -132,6 +132,11 @@ std::vector RepositoryObjectCommand::GetPositionalSuggestions(const Stri return CLICommand::GetPositionalSuggestions(word); } +int RepositoryObjectCommand::GetMaxArguments(void) const +{ + return -1; +} + /** * The entry point for the "repository " CLI command. * @@ -139,7 +144,6 @@ std::vector RepositoryObjectCommand::GetPositionalSuggestions(const Stri */ int RepositoryObjectCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - Dictionary::Ptr attrs = RepositoryUtility::GetArgumentAttributes(ap); if (!attrs->Contains("name")) { diff --git a/lib/cli/repositoryobjectcommand.hpp b/lib/cli/repositoryobjectcommand.hpp index 8cf33ba13..c8773d7f3 100644 --- a/lib/cli/repositoryobjectcommand.hpp +++ b/lib/cli/repositoryobjectcommand.hpp @@ -47,6 +47,7 @@ public: virtual String GetDescription(void) const; virtual String GetShortDescription(void) const; + virtual int GetMaxArguments(void) const; virtual void InitParameters(boost::program_options::options_description& visibleDesc, boost::program_options::options_description& hiddenDesc) const; virtual std::vector GetPositionalSuggestions(const String& word) const; diff --git a/lib/cli/variablegetcommand.cpp b/lib/cli/variablegetcommand.cpp index ce75846b6..c51a2e7c6 100644 --- a/lib/cli/variablegetcommand.cpp +++ b/lib/cli/variablegetcommand.cpp @@ -58,6 +58,11 @@ void VariableGetCommand::InitParameters(boost::program_options::options_descript ("current", "Uses the current value (i.e. from the running process, rather than from the vars file)"); } +int VariableGetCommand::GetMinArguments(void) const +{ + return 1; +} + /** * The entry point for the "variable get" CLI command. * @@ -65,11 +70,6 @@ void VariableGetCommand::InitParameters(boost::program_options::options_descript */ int VariableGetCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (ap.size() != 1) { - Log(LogCritical, "cli", "Missing argument: variable name"); - return 1; - } - if (vm.count("current")) { std::cout << ScriptVariable::Get(ap[0], &Empty) << "\n"; return 0; diff --git a/lib/cli/variablegetcommand.hpp b/lib/cli/variablegetcommand.hpp index 7c0562145..da72618e2 100644 --- a/lib/cli/variablegetcommand.hpp +++ b/lib/cli/variablegetcommand.hpp @@ -40,6 +40,7 @@ public: virtual String GetDescription(void) const; virtual String GetShortDescription(void) const; + virtual int GetMinArguments(void) const; void InitParameters(boost::program_options::options_description& visibleDesc, boost::program_options::options_description& hiddenDesc) const; virtual int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const; diff --git a/lib/cli/variablelistcommand.cpp b/lib/cli/variablelistcommand.cpp index a5382ac48..3deb62fc1 100644 --- a/lib/cli/variablelistcommand.cpp +++ b/lib/cli/variablelistcommand.cpp @@ -57,11 +57,6 @@ String VariableListCommand::GetShortDescription(void) const */ int VariableListCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (!ap.empty()) { - Log(LogWarning, "cli") - << "Ignoring parameters: " << boost::algorithm::join(ap, " "); - } - String varsfile = Application::GetVarsPath(); if (!Utility::PathExists(varsfile)) {