]> granicus.if.org Git - icinga2/commitdiff
Validate number of arguments
authorGunnar Beutner <gunnar@beutner.name>
Fri, 24 Oct 2014 11:15:21 +0000 (13:15 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Fri, 24 Oct 2014 11:19:00 +0000 (13:19 +0200)
fixes #7442

23 files changed:
icinga-app/icinga.cpp
lib/cli/agentaddcommand.cpp
lib/cli/agentaddcommand.hpp
lib/cli/agentremovecommand.cpp
lib/cli/agentremovecommand.hpp
lib/cli/agentsetcommand.cpp
lib/cli/agentsetcommand.hpp
lib/cli/agentupdateconfigcommand.cpp
lib/cli/agentwizardcommand.cpp
lib/cli/clicommand.cpp
lib/cli/clicommand.hpp
lib/cli/featuredisablecommand.cpp
lib/cli/featuredisablecommand.hpp
lib/cli/featureenablecommand.cpp
lib/cli/featureenablecommand.hpp
lib/cli/featurelistcommand.cpp
lib/cli/objectlistcommand.cpp
lib/cli/repositorycommitcommand.cpp
lib/cli/repositoryobjectcommand.cpp
lib/cli/repositoryobjectcommand.hpp
lib/cli/variablegetcommand.cpp
lib/cli/variablegetcommand.hpp
lib/cli/variablelistcommand.cpp

index 67e1994fcb4abdd5672832c5d60f403bfd45df5b..16a9ae9a11d34f334af0ea7e5b628eed2bc448a9 100644 (file)
@@ -401,6 +401,20 @@ int Main(void)
                if (vm.count("arg"))
                        args = vm["arg"].as<std::vector<std::string> >();
 
+               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);
        }
 
index 7408c7be4f63ffd6ad8fcf3aca72582822c9b962..3226dd864a06529a4f7eeddc9cf96e5000595796 100644 (file)
@@ -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<std::string>& 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] << "'.";
index d1107c8655e2fcb73caa8a5867e1c3815d49957d..5bf1ed89b5b755a46dc6890724c3abcb2d7da869 100644 (file)
@@ -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<std::string>& ap) const;
 };
 
index ddc3dc69897bb31dc2bd3c9624187608868541cc..28187c83631b29a05deb3b373eafa832e50104e1 100644 (file)
@@ -48,6 +48,16 @@ std::vector<String> 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<String> AgentRemoveCommand::GetPositionalSuggestions(const String& w
  */
 int AgentRemoveCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
 {
-       if (ap.empty()) {
-               Log(LogCritical, "cli", "No agent name provided.");
-               return 1;
-       }
-
        bool failed = false;
 
        BOOST_FOREACH(const String& agent, ap) {
index cb716b311a0171d184beff1b1ac8cb0f2e3c9495..e7689341b743e245e9e9abdb9b42876a704feddb 100644 (file)
@@ -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<String> GetPositionalSuggestions(const String& word) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 };
index 5fea91ef85b703fc30e93f1d9d363b3aedc0749c..6238f832a6853dccb9b94c8dc96082d4ea8d2e05 100644 (file)
@@ -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<std::string>& ap) const
 {
-       if (ap.empty()) {
-               Log(LogCritical, "cli", "No agent name provided.");
-               return 1;
-       }
-
        Log(LogWarning, "cli", "TODO: Not implemented yet.");
 
        return 0;
index 567ad4791d6bfa70e979f74ebabb071cecf126f5..ace39dafb1cdac85af18d664ef45b6cc240432a7 100644 (file)
@@ -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<std::string>& ap) const;
index 7f2e1732a7623f5346605f2201805f43107c8807..133503eb9b7914e75e53e81a7a04ffc1af0e54f3 100644 (file)
@@ -49,11 +49,6 @@ String AgentUpdateConfigCommand::GetShortDescription(void) const
  */
 int AgentUpdateConfigCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
 {
-       if (!ap.empty()) {
-               Log(LogWarning, "cli")
-                   << "Ignoring parameters: " << boost::algorithm::join(ap, " ");
-       }
-
        Log(LogWarning, "cli", "TODO: Not implemented yet.");
 
        return 0;
index 974f70db324227c388997b465f9ff76ab8821286..222b6bf0b19113a1c76bb12ef4a7c76692ec4b19 100644 (file)
@@ -49,11 +49,6 @@ String AgentWizardCommand::GetShortDescription(void) const
  */
 int AgentWizardCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
 {
-       if (!ap.empty()) {
-               Log(LogWarning, "cli")
-                   << "Ignoring parameters: " << boost::algorithm::join(ap, " ");
-       }
-
        Log(LogWarning, "cli", "TODO: Not implemented yet.");
 
        /*
index fab8657cf57af1104c1b46795b616fd4ecbe477b..0930be8097e72c0416d04eafa4908e3603c00db1 100644 (file)
@@ -92,6 +92,16 @@ std::vector<String> 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;
index 3d41fadcb668a6e800286f3f261d6ccd9cdbabe1..562589f3d2a6f73b0b1a2ba984b5281103626c67 100644 (file)
@@ -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<std::string>& ap) const = 0;
index 9c2253388fcfa98269bd30c39af94725e9afd109..1e135b789e2dc92b814f6038cd70ad58742fd5a1 100644 (file)
@@ -41,6 +41,16 @@ std::vector<String> 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.
  *
index 48f9f8c01724a597dc67de6af3b53086d0288cb5..1331af24617a9acb8826ffa686c6378be6598d30 100644 (file)
@@ -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<String> GetPositionalSuggestions(const String& word) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 
index 131629bde1e5d3b6a6c39ffd4219d798d0ef5fe4..3e7a7ee4a742d170e9e64f6d10e3f539563f90d7 100644 (file)
@@ -41,6 +41,16 @@ std::vector<String> 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<String> FeatureEnableCommand::GetPositionalSuggestions(const String&
  */
 int FeatureEnableCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
 {
-       if (ap.empty()) {
-               Log(LogCritical, "cli", "Cannot enable feature(s). Name(s) are missing!");
-               return 0;
-       }
-
        return FeatureUtility::EnableFeatures(ap);
-
-       return 0;
 }
index 8bc0341681f62139e2374a2ad5cbeae5d03f586a..9488e363a2f81ed6506fe2bd93cfc8124d3a37b7 100644 (file)
@@ -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<String> GetPositionalSuggestions(const String& word) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 };
index 7e0347fd6a03589d5fe8aaae9b1bf9ee3c16b3f0..7496f048976241e6292abdc18296e49df1cc8233 100644 (file)
@@ -48,10 +48,5 @@ String FeatureListCommand::GetShortDescription(void) const
  */
 int FeatureListCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
 {
-       if (!ap.empty()) {
-               Log(LogWarning, "cli")
-                   << "Ignoring parameters: " << boost::algorithm::join(ap, " ");
-       }
-
        return FeatureUtility::ListFeatures();
 }
index e555d3c323c864864d7e8c3db74b2475922c6675..63e1e7b53fb4e021f7ab1f8c186033eb1c20cf10 100644 (file)
@@ -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<std::string>& ap) const
 {
-       if (!ap.empty()) {
-               Log(LogWarning, "cli")
-                   << "Ignoring parameters: " << boost::algorithm::join(ap, " ");
-       }
-
        String objectfile = Application::GetObjectsPath();
 
        if (!Utility::PathExists(objectfile)) {
index 9667e11fc93f643b899ac20d0efe24d5d428c4cc..9c5adc5d974d3278626564a257206df51a47e345 100644 (file)
@@ -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<std::string>& 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";
index 12311a6197304e2c5773beea70eba0396ad51353..ab30b9155b21f5e331ea76a05d4116a52c7077a2 100644 (file)
@@ -132,6 +132,11 @@ std::vector<String> RepositoryObjectCommand::GetPositionalSuggestions(const Stri
                return CLICommand::GetPositionalSuggestions(word);
 }
 
+int RepositoryObjectCommand::GetMaxArguments(void) const
+{
+       return -1;
+}
+
 /**
  * The entry point for the "repository <type> <add/remove/list>" CLI command.
  *
@@ -139,7 +144,6 @@ std::vector<String> RepositoryObjectCommand::GetPositionalSuggestions(const Stri
  */
 int RepositoryObjectCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
 {
-
        Dictionary::Ptr attrs = RepositoryUtility::GetArgumentAttributes(ap);
 
        if (!attrs->Contains("name")) {
index 8cf33ba13b5a4f8ec7b6e991753e648fe6affa26..c8773d7f36fb139bb11b64616da933597d644dda 100644 (file)
@@ -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<String> GetPositionalSuggestions(const String& word) const;
index ce75846b6b4d9e96f84bff3a835d3ec5b5ea4a05..c51a2e7c66791126ef530316ba6dc71ff464db22 100644 (file)
@@ -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<std::string>& 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;
index 7c05621454bc85511275f9cb4f6289e865a03959..da72618e2f1cbc1a36b0115e8bdd766143799224 100644 (file)
@@ -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<std::string>& ap) const;
index a5382ac4809a6c9c90d1cddadbe4918532a70631..3deb62fc142c2900c5d1f91a1f3e15ccd331d14f 100644 (file)
@@ -57,11 +57,6 @@ String VariableListCommand::GetShortDescription(void) const
  */
 int VariableListCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
 {
-       if (!ap.empty()) {
-               Log(LogWarning, "cli")
-                   << "Ignoring parameters: " << boost::algorithm::join(ap, " ");
-       }
-
        String varsfile = Application::GetVarsPath();
 
        if (!Utility::PathExists(varsfile)) {