summaryrefslogtreecommitdiffstats
path: root/lib/cli/clicommand.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/cli/clicommand.hpp')
-rw-r--r--lib/cli/clicommand.hpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/lib/cli/clicommand.hpp b/lib/cli/clicommand.hpp
new file mode 100644
index 0000000..ce58b54
--- /dev/null
+++ b/lib/cli/clicommand.hpp
@@ -0,0 +1,79 @@
+/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
+
+#ifndef CLICOMMAND_H
+#define CLICOMMAND_H
+
+#include "cli/i2-cli.hpp"
+#include "base/value.hpp"
+#include "base/utility.hpp"
+#include "base/type.hpp"
+#include <vector>
+#include <boost/program_options.hpp>
+
+namespace icinga
+{
+
+std::vector<String> GetBashCompletionSuggestions(const String& type, const String& word);
+std::vector<String> GetFieldCompletionSuggestions(const Type::Ptr& type, const String& word);
+
+enum ImpersonationLevel
+{
+ ImpersonateNone,
+ ImpersonateRoot,
+ ImpersonateIcinga
+};
+
+/**
+ * A CLI command.
+ *
+ * @ingroup base
+ */
+class CLICommand : public Object
+{
+public:
+ DECLARE_PTR_TYPEDEFS(CLICommand);
+
+ typedef std::vector<String>(*ArgumentCompletionCallback)(const String&, const String&);
+
+ virtual String GetDescription() const = 0;
+ virtual String GetShortDescription() const = 0;
+ virtual int GetMinArguments() const;
+ virtual int GetMaxArguments() const;
+ virtual bool IsHidden() const;
+ virtual bool IsDeprecated() const;
+ virtual void InitParameters(boost::program_options::options_description& visibleDesc,
+ boost::program_options::options_description& hiddenDesc) const;
+ virtual ImpersonationLevel GetImpersonationLevel() const;
+ virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const = 0;
+ virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
+ virtual std::vector<String> GetPositionalSuggestions(const String& word) const;
+
+ static CLICommand::Ptr GetByName(const std::vector<String>& name);
+ static void Register(const std::vector<String>& name, const CLICommand::Ptr& command);
+ static void Unregister(const std::vector<String>& name);
+
+ static bool ParseCommand(int argc, char **argv, boost::program_options::options_description& visibleDesc,
+ boost::program_options::options_description& hiddenDesc,
+ boost::program_options::positional_options_description& positionalDesc,
+ boost::program_options::variables_map& vm, String& cmdname, CLICommand::Ptr& command, bool autocomplete);
+
+ static void ShowCommands(int argc, char **argv,
+ boost::program_options::options_description *visibleDesc = nullptr,
+ boost::program_options::options_description *hiddenDesc = nullptr,
+ ArgumentCompletionCallback globalArgCompletionCallback = nullptr,
+ bool autocomplete = false, int autoindex = -1);
+
+private:
+ static std::mutex& GetRegistryMutex();
+ static std::map<std::vector<String>, CLICommand::Ptr>& GetRegistry();
+};
+
+#define REGISTER_CLICOMMAND(name, klass) \
+ INITIALIZE_ONCE([]() { \
+ std::vector<String> vname = String(name).Split("/"); \
+ CLICommand::Register(vname, new klass()); \
+ })
+
+}
+
+#endif /* CLICOMMAND_H */