From 4632b93b89a1bfde2b80052a7379cb48234f327b Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 17 Oct 2014 14:13:31 +0200 Subject: [PATCH] Add "repository " commands refs #7255 --- lib/base/clicommand.cpp | 11 +-- lib/base/clicommand.hpp | 2 +- lib/cli/CMakeLists.txt | 1 + lib/cli/repositoryobjectcommand.cpp | 127 ++++++++++++++++++++++++++++ lib/cli/repositoryobjectcommand.hpp | 78 +++++++++++++++++ 5 files changed, 210 insertions(+), 9 deletions(-) create mode 100644 lib/cli/repositoryobjectcommand.cpp create mode 100644 lib/cli/repositoryobjectcommand.hpp diff --git a/lib/base/clicommand.cpp b/lib/base/clicommand.cpp index 9f70967ae..3e52024ce 100644 --- a/lib/base/clicommand.cpp +++ b/lib/base/clicommand.cpp @@ -69,15 +69,10 @@ static std::vector BashArgumentCompletionHelper(const String& type, cons return result; } -void icinga::AddTypeFields(const String& type, boost::program_options::options_description& desc) +void icinga::AddTypeFields(const Type *type, boost::program_options::options_description& desc) { - const Type *ptype = Type::GetByName(type); - - if (!ptype) - return; - - for (int i = 0; i < ptype->GetFieldCount(); i++) { - Field field = ptype->GetFieldInfo(i); + for (int i = 0; i < type->GetFieldCount(); i++) { + Field field = type->GetFieldInfo(i); if (strcmp(field.Name, "__name") == 0) continue; diff --git a/lib/base/clicommand.hpp b/lib/base/clicommand.hpp index a5f4153af..a75dc85e8 100644 --- a/lib/base/clicommand.hpp +++ b/lib/base/clicommand.hpp @@ -33,7 +33,7 @@ typedef boost::function (const String&)> ArgumentCompletionC typedef std::map ArgumentCompletionDescription; I2_BASE_API ArgumentCompletionCallback BashArgumentCompletion(const String& type); -I2_BASE_API void AddTypeFields(const String& type, boost::program_options::options_description& desc); +I2_BASE_API void AddTypeFields(const Type *type, boost::program_options::options_description& desc); /** * A CLI command. diff --git a/lib/cli/CMakeLists.txt b/lib/cli/CMakeLists.txt index b97c10df3..c369c50ca 100644 --- a/lib/cli/CMakeLists.txt +++ b/lib/cli/CMakeLists.txt @@ -19,6 +19,7 @@ set(cli_SOURCES featureenablecommand.cpp featuredisablecommand.cpp featurelistcommand.cpp objectlistcommand.cpp pkinewcacommand.cpp pkinewcertcommand.cpp pkisigncsrcommand.cpp pkirequestcommand.cpp pkiticketcommand.cpp + repositoryobjectcommand.cpp daemoncommand.cpp ) diff --git a/lib/cli/repositoryobjectcommand.cpp b/lib/cli/repositoryobjectcommand.cpp new file mode 100644 index 000000000..db999e135 --- /dev/null +++ b/lib/cli/repositoryobjectcommand.cpp @@ -0,0 +1,127 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#include "cli/repositoryobjectcommand.hpp" +#include "base/logger_fwd.hpp" +#include "base/clicommand.hpp" +#include "base/application.hpp" +#include "base/tlsutility.hpp" +#include +#include + +using namespace icinga; + +REGISTER_REPOSITORY_CLICOMMAND("Host"); +REGISTER_REPOSITORY_CLICOMMAND("Service"); +REGISTER_REPOSITORY_CLICOMMAND("Zone"); +REGISTER_REPOSITORY_CLICOMMAND("Endpoint"); + +RegisterRepositoryCLICommandHelper::RegisterRepositoryCLICommandHelper(const String& type) +{ + String ltype = type; + boost::algorithm::to_lower(ltype); + + std::vector name; + name.push_back("repository"); + name.push_back(ltype); + name.push_back("add"); + CLICommand::Register(name, make_shared(type, RepositoryCommandAdd)); + + name[2] = "remove"; + CLICommand::Register(name, make_shared(type, RepositoryCommandRemove)); + + name[2] = "list"; + CLICommand::Register(name, make_shared(type, RepositoryCommandList)); +} + +RepositoryObjectCommand::RepositoryObjectCommand(const String& type, RepositoryCommandType command) + : m_Type(type), m_Command(command) +{ } + +String RepositoryObjectCommand::GetDescription(void) const +{ + String description; + + switch (m_Command) { + case RepositoryCommandAdd: + description = "Adds a new"; + break; + case RepositoryCommandRemove: + description = "Removes a"; + break; + case RepositoryCommandList: + description = "Lists all"; + break; + } + + description += " " + m_Type + " object"; + + if (m_Command == RepositoryCommandList) + description += "s"; + + return description; +} + +String RepositoryObjectCommand::GetShortDescription(void) const +{ + String description; + + switch (m_Command) { + case RepositoryCommandAdd: + description = "adds a new"; + break; + case RepositoryCommandRemove: + description = "removes a"; + break; + case RepositoryCommandList: + description = "lists all"; + break; + } + + description += " " + m_Type + " object"; + + if (m_Command == RepositoryCommandList) + description += "s"; + + return description; +} + +void RepositoryObjectCommand::InitParameters(boost::program_options::options_description& visibleDesc, + boost::program_options::options_description& hiddenDesc, + ArgumentCompletionDescription& argCompletionDesc) const +{ + visibleDesc.add_options() + ("name", po::value(), "The name of the object"); + + if (m_Command == RepositoryCommandAdd) { + const Type *ptype = Type::GetByName(m_Type); + ASSERT(ptype); + AddTypeFields(ptype, visibleDesc); + } +} + +/** + * The entry point for the "repository " CLI command. + * + * @returns An exit status. + */ +int RepositoryObjectCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const +{ + return 0; +} diff --git a/lib/cli/repositoryobjectcommand.hpp b/lib/cli/repositoryobjectcommand.hpp new file mode 100644 index 000000000..03600d83e --- /dev/null +++ b/lib/cli/repositoryobjectcommand.hpp @@ -0,0 +1,78 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#ifndef REPOSITORYOBJECTCOMMAND_H +#define REPOSITORYOBJECTCOMMAND_H + +#include "base/qstring.hpp" +#include "base/clicommand.hpp" + +namespace icinga +{ + +enum RepositoryCommandType +{ + RepositoryCommandAdd, + RepositoryCommandRemove, + RepositoryCommandList +}; + +/** + * The "repository " command. + * + * @ingroup cli + */ +class RepositoryObjectCommand : public CLICommand +{ +public: + DECLARE_PTR_TYPEDEFS(RepositoryObjectCommand); + + RepositoryObjectCommand(const String& type, RepositoryCommandType command); + + virtual String GetDescription(void) const; + virtual String GetShortDescription(void) const; + virtual void InitParameters(boost::program_options::options_description& visibleDesc, + boost::program_options::options_description& hiddenDesc, + ArgumentCompletionDescription& argCompletionDesc) const; + virtual int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const; + +private: + String m_Type; + RepositoryCommandType m_Command; +}; + +/** + * Helper class for registering repository CLICommand implementation classes. + * + * @ingroup cli + */ +class I2_BASE_API RegisterRepositoryCLICommandHelper +{ +public: + RegisterRepositoryCLICommandHelper(const String& type); +}; + +#define REGISTER_REPOSITORY_CLICOMMAND(type) \ + namespace { namespace UNIQUE_NAME(cli) { \ + I2_EXPORT icinga::RegisterRepositoryCLICommandHelper l_RegisterRepositoryCLICommand(type); \ + } } + +} + +#endif /* REPOSITORYOBJECTCOMMAND_H */ -- 2.40.0