Validate number of arguments

fixes #7442
This commit is contained in:
Gunnar Beutner 2014-10-24 13:15:21 +02:00
parent 35c75d95b5
commit 3979bd87b3
23 changed files with 86 additions and 58 deletions

View 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);
}

View 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] << "'.";

View 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;
};

View 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) {

View 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;
};

View 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;

View 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;

View 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;

View 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.");
/*

View 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;

View 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;

View 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.
*

View 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;

View 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;
}

View 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;
};

View 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();
}

View 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)) {

View 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";

View 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")) {

View 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;

View 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;

View 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;

View 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)) {