]> granicus.if.org Git - icinga2/blob - lib/cli/clicommand.hpp
add some object locking to the Dump method (which could theoreticylly suffer from...
[icinga2] / lib / cli / clicommand.hpp
1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
3 #ifndef CLICOMMAND_H
4 #define CLICOMMAND_H
5
6 #include "cli/i2-cli.hpp"
7 #include "base/value.hpp"
8 #include "base/utility.hpp"
9 #include "base/type.hpp"
10 #include <vector>
11 #include <boost/program_options.hpp>
12
13 namespace icinga
14 {
15
16 std::vector<String> GetBashCompletionSuggestions(const String& type, const String& word);
17 std::vector<String> GetFieldCompletionSuggestions(const Type::Ptr& type, const String& word);
18
19 enum ImpersonationLevel
20 {
21         ImpersonateNone,
22         ImpersonateRoot,
23         ImpersonateIcinga
24 };
25
26 /**
27  * A CLI command.
28  *
29  * @ingroup base
30  */
31 class CLICommand : public Object
32 {
33 public:
34         DECLARE_PTR_TYPEDEFS(CLICommand);
35
36         typedef std::vector<String>(*ArgumentCompletionCallback)(const String&, const String&);
37
38         virtual String GetDescription() const = 0;
39         virtual String GetShortDescription() const = 0;
40         virtual int GetMinArguments() const;
41         virtual int GetMaxArguments() const;
42         virtual bool IsHidden() const;
43         virtual bool IsDeprecated() const;
44         virtual void InitParameters(boost::program_options::options_description& visibleDesc,
45                 boost::program_options::options_description& hiddenDesc) const;
46         virtual ImpersonationLevel GetImpersonationLevel() const;
47         virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const = 0;
48         virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
49         virtual std::vector<String> GetPositionalSuggestions(const String& word) const;
50
51         static CLICommand::Ptr GetByName(const std::vector<String>& name);
52         static void Register(const std::vector<String>& name, const CLICommand::Ptr& command);
53         static void Unregister(const std::vector<String>& name);
54
55         static bool ParseCommand(int argc, char **argv, boost::program_options::options_description& visibleDesc,
56                 boost::program_options::options_description& hiddenDesc,
57                 boost::program_options::positional_options_description& positionalDesc,
58                 boost::program_options::variables_map& vm, String& cmdname, CLICommand::Ptr& command, bool autocomplete);
59
60         static void ShowCommands(int argc, char **argv,
61                 boost::program_options::options_description *visibleDesc = nullptr,
62                 boost::program_options::options_description *hiddenDesc = nullptr,
63                 ArgumentCompletionCallback globalArgCompletionCallback = nullptr,
64                 bool autocomplete = false, int autoindex = -1);
65
66 private:
67         static boost::mutex& GetRegistryMutex();
68         static std::map<std::vector<String>, CLICommand::Ptr>& GetRegistry();
69 };
70
71 #define REGISTER_CLICOMMAND(name, klass) \
72         INITIALIZE_ONCE([]() { \
73                 std::vector<String> vname = String(name).Split("/"); \
74                 CLICommand::Register(vname, new klass()); \
75         })
76
77 }
78
79 #endif /* CLICOMMAND_H */