opts="${COMP_WORDS[*]}"
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=($(icinga2 --autocomplete $COMP_CWORD ${COMP_WORDS[*]} < /dev/null))
- [[ $COMPREPLY = */ ]] && compopt -o nospace
+ case $COMPREPLY in
+ */|*=)
+ compopt -o nospace
+ ;;
+ esac
+
return 0
}
SERVICE_STATUS_HANDLE l_SvcStatusHandle;
#endif /* _WIN32 */
-static std::vector<String> LogLevelCompletion(const String& arg)
+static std::vector<String> GetLogLevelCompletionSuggestions(const String& arg)
{
std::vector<String> result;
return result;
}
+static std::vector<String> GlobalArgumentCompletion(const String& argument, const String& word)
+{
+ if (argument == "include")
+ return GetBashCompletionSuggestions("directory", word);
+ else if (argument == "log-level")
+ return GetLogLevelCompletionSuggestions(word);
+ else
+ return std::vector<String>();
+}
+
int Main(void)
{
int argc = Application::GetArgC();
po::positional_options_description positionalDesc;
positionalDesc.add("arg", -1);
- ArgumentCompletionDescription argDesc;
- argDesc["include"] = BashArgumentCompletion("directory");
- argDesc["log-level"] = LogLevelCompletion;
-
String cmdname;
CLICommand::Ptr command;
po::variables_map vm;
try {
- CLICommand::ParseCommand(argc, argv, visibleDesc, hiddenDesc, positionalDesc, argDesc, vm, cmdname, command, autocomplete);
+ CLICommand::ParseCommand(argc, argv, visibleDesc, hiddenDesc, positionalDesc,
+ vm, cmdname, command, autocomplete);
} catch (const std::exception& ex) {
std::ostringstream msgbuf;
msgbuf << "Error while parsing command-line options: " << ex.what();
int rc = 1;
if (autocomplete) {
- CLICommand::ShowCommands(argc, argv, &visibleDesc, &hiddenDesc, &argDesc, true, autoindex);
+ CLICommand::ShowCommands(argc, argv, &visibleDesc, &hiddenDesc,
+ &GlobalArgumentCompletion, true, autoindex);
rc = 0;
} else if (command) {
#ifndef _WIN32
boost::mutex l_RegistryMutex;
std::map<std::vector<String>, CLICommand::Ptr> l_Registry;
-static std::vector<String> BashArgumentCompletionHelper(const String& type, const String& arg)
+std::vector<String> icinga::GetBashCompletionSuggestions(const String& type, const String& word)
{
std::vector<String> result;
#ifndef _WIN32
- String bashArg = "compgen -A " + Utility::EscapeShellArg(type) + " " + Utility::EscapeShellArg(arg);
+ String bashArg = "compgen -A " + Utility::EscapeShellArg(type) + " " + Utility::EscapeShellArg(word);
String cmd = "bash -c " + Utility::EscapeShellArg(bashArg);
FILE *fp = popen(cmd.CStr(), "r");
return result;
}
-void icinga::AddTypeFields(const Type *type, boost::program_options::options_description& desc)
+std::vector<String> icinga::GetFieldCompletionSuggestions(const Type *type, const String& word)
{
+ std::vector<String> result;
+
for (int i = 0; i < type->GetFieldCount(); i++) {
Field field = type->GetFieldInfo(i);
- if (strcmp(field.Name, "__name") == 0)
+ if (!(field.Attributes & FAConfig))
continue;
- if (!(field.Attributes & FAConfig))
+ String fname = field.Name;
+
+ if (fname == "__name" || fname == "templates")
continue;
- desc.add_options()
- (field.Name, po::value<std::string>(), field.Name);
+ String suggestion = fname + "=";
+
+ if (suggestion.Find(word) == 0)
+ result.push_back(suggestion);
}
-}
-ArgumentCompletionCallback icinga::BashArgumentCompletion(const String& type)
-{
- return boost::bind(BashArgumentCompletionHelper, type, _1);
+ return result;
}
CLICommand::Ptr CLICommand::GetByName(const std::vector<String>& name)
CLICommand::Register(vname, command);
}
+std::vector<String> CLICommand::GetArgumentSuggestions(const String& argument, const String& word) const
+{
+ return std::vector<String>();
+}
+
+std::vector<String> CLICommand::GetPositionalSuggestions(const String& word) const
+{
+ return std::vector<String>();
+}
+
+void CLICommand::InitParameters(boost::program_options::options_description& visibleDesc,
+ boost::program_options::options_description& hiddenDesc) const
+{ }
+
bool CLICommand::ParseCommand(int argc, char **argv, po::options_description& visibleDesc,
po::options_description& hiddenDesc,
po::positional_options_description& positionalDesc,
- ArgumentCompletionDescription& argCompletionDesc,
po::variables_map& vm, String& cmdname, CLICommand::Ptr& command, bool autocomplete)
{
boost::mutex::scoped_lock lock(l_RegistryMutex);
po::options_description vdesc("Command options");
if (command)
- command->InitParameters(vdesc, hiddenDesc, argCompletionDesc);
+ command->InitParameters(vdesc, hiddenDesc);
visibleDesc.add(vdesc);
}
void CLICommand::ShowCommands(int argc, char **argv, po::options_description *visibleDesc,
- po::options_description *hiddenDesc, ArgumentCompletionDescription *argCompletionDesc,
+ po::options_description *hiddenDesc,
+ ArgumentCompletionCallback globalArgCompletionCallback,
bool autocomplete, int autoindex)
{
boost::mutex::scoped_lock lock(l_RegistryMutex);
if (command && autocomplete) {
String aname, prefix, pword;
- ArgumentCompletionDescription::const_iterator it;
const po::option_description *odesc;
if (autoindex - 2 >= 0 && strcmp(argv[autoindex - 1], "=") == 0 && strstr(argv[autoindex - 2], "--") == argv[autoindex - 2]) {
if (odesc->semantic()->min_tokens() == 0)
goto complete_option;
-
- it = argCompletionDesc->find(odesc->long_name());
-
- if (it == argCompletionDesc->end())
- return;
-
- BOOST_FOREACH(const String& suggestion, it->second(pword)) {
+
+ BOOST_FOREACH(const String& suggestion, globalArgCompletionCallback(aname, pword)) {
+ std::cout << prefix << suggestion << "\n";
+ }
+
+ BOOST_FOREACH(const String& suggestion, command->GetArgumentSuggestions(aname, pword)) {
std::cout << prefix << suggestion << "\n";
}
if (cname.Find(aword) == 0)
std::cout << cname << "\n";
}
+
+ BOOST_FOREACH(const String& suggestion, command->GetPositionalSuggestions(aword)) {
+ std::cout << suggestion << "\n";
+ }
}
return;
namespace icinga
{
-typedef boost::function<std::vector<String> (const String&)> ArgumentCompletionCallback;
-typedef std::map<String, ArgumentCompletionCallback> ArgumentCompletionDescription;
-
-I2_BASE_API ArgumentCompletionCallback BashArgumentCompletion(const String& type);
-I2_BASE_API void AddTypeFields(const Type *type, boost::program_options::options_description& desc);
+I2_BASE_API std::vector<String> GetBashCompletionSuggestions(const String& type, const String& word);
+I2_BASE_API std::vector<String> GetFieldCompletionSuggestions(const Type *type, const String& word);
/**
* A CLI command.
public:
DECLARE_PTR_TYPEDEFS(CLICommand);
+ typedef std::vector<String>(*ArgumentCompletionCallback)(const String&, const String&);
+
virtual String GetDescription(void) const = 0;
virtual String GetShortDescription(void) const = 0;
virtual void InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const = 0;
+ 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;
+ 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 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,
- ArgumentCompletionDescription& argCompletionDesc,
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 = NULL,
boost::program_options::options_description *hiddenDesc = NULL,
- ArgumentCompletionDescription *argCompletionDesc = NULL,
+ ArgumentCompletionCallback globalArgCompletionCallback = NULL,
bool autocomplete = false, int autoindex = -1);
};
}
void DaemonCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const
+ boost::program_options::options_description& hiddenDesc) const
{
visibleDesc.add_options()
("config,c", po::value<std::vector<std::string> >(), "parse a configuration file")
hiddenDesc.add_options()
("reload-internal", po::value<int>(), "used internally to implement config reload: do not call manually, send SIGHUP instead");
#endif /* _WIN32 */
+}
- argCompletionDesc["config"] = BashArgumentCompletion("file");
- argCompletionDesc["errorlog"] = BashArgumentCompletion("file");
+std::vector<String> DaemonCommand::GetArgumentSuggestions(const String& argument, const String& word) const
+{
+ if (argument == "config" || argument == "errorlog")
+ return GetBashCompletionSuggestions("file", word);
+ else
+ return CLICommand::GetArgumentSuggestions(argument, word);
}
/**
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;
+ boost::program_options::options_description& hiddenDesc) const;
+ virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
};
}
void FeatureDisableCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const
+ boost::program_options::options_description& hiddenDesc) const
{
/* Command doesn't support any parameters. */
}
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;
+ boost::program_options::options_description& hiddenDesc) const;
virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
};
}
void FeatureEnableCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const
+ boost::program_options::options_description& hiddenDesc) const
{
/* Command doesn't support any parameters. */
}
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;
+ boost::program_options::options_description& hiddenDesc) const;
virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
};
return "lists all enabled features";
}
-void FeatureListCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const
-{
- /* Command doesn't support any parameters. */
-}
-
/**
* The entry point for the "feature list" CLI 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<std::string>& ap) const;
private:
}
void ObjectListCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const
+ boost::program_options::options_description& hiddenDesc) const
{
visibleDesc.add_options()
("count,c", "display object counts by types")
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;
+ boost::program_options::options_description& hiddenDesc) const;
virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
private:
return "sets up a new CA";
}
-void PKINewCACommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const
-{
- /* Command doesn't support any parameters. */
-}
-
/**
* The entry point for the "pki new-ca" CLI 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<std::string>& ap) const;
};
}
void PKINewCertCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const
+ boost::program_options::options_description& hiddenDesc) const
{
visibleDesc.add_options()
("cn", po::value<std::string>(), "Common Name")
("keyfile", po::value<std::string>(), "Key file path (output")
("csrfile", po::value<std::string>(), "CSR file path (optional, output)")
("certfile", po::value<std::string>(), "Certificate file path (optional, output)");
+}
- argCompletionDesc["keyfile"] = BashArgumentCompletion("file");
- argCompletionDesc["csrfile"] = BashArgumentCompletion("file");
- argCompletionDesc["certfile"] = BashArgumentCompletion("file");
+std::vector<String> PKINewCertCommand::GetArgumentSuggestions(const String& argument, const String& word) const
+{
+ if (argument == "keyfile" || argument == "csrfile" || argument == "certfile")
+ return GetBashCompletionSuggestions("file", word);
+ else
+ return CLICommand::GetArgumentSuggestions(argument, word);
}
/**
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;
+ boost::program_options::options_description& hiddenDesc) const;
+ virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
};
}
void PKIRequestCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const
+ boost::program_options::options_description& hiddenDesc) const
{
visibleDesc.add_options()
("keyfile", po::value<std::string>(), "Key file path")
("host", po::value<std::string>(), "Icinga 2 host")
("port", po::value<std::string>(), "Icinga 2 port")
("ticket", po::value<std::string>(), "Icinga 2 PKI ticket");
+}
- argCompletionDesc["keyfile"] = BashArgumentCompletion("file");
- argCompletionDesc["certfile"] = BashArgumentCompletion("file");
- argCompletionDesc["cafile"] = BashArgumentCompletion("file");
- argCompletionDesc["host"] = BashArgumentCompletion("hostname");
- argCompletionDesc["port"] = BashArgumentCompletion("service");
+std::vector<String> PKIRequestCommand::GetArgumentSuggestions(const String& argument, const String& word) const
+{
+ if (argument == "keyfile" || argument == "certfile" || argument == "cafile")
+ return GetBashCompletionSuggestions("file", word);
+ else if (argument == "host")
+ return GetBashCompletionSuggestions("hostname", word);
+ else if (argument == "port")
+ return GetBashCompletionSuggestions("service", word);
+ else
+ return CLICommand::GetArgumentSuggestions(argument, word);
}
/**
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;
+ boost::program_options::options_description& hiddenDesc) const;
+ virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
};
}
void PKISignCSRCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const
+ boost::program_options::options_description& hiddenDesc) const
{
visibleDesc.add_options()
("csrfile", po::value<std::string>(), "CSR file path (input)")
("certfile", po::value<std::string>(), "Certificate file path (output)");
+}
- argCompletionDesc["csrfile"] = BashArgumentCompletion("file");
- argCompletionDesc["certfile"] = BashArgumentCompletion("file");
+std::vector<String> PKISignCSRCommand::GetArgumentSuggestions(const String& argument, const String& word) const
+{
+ if (argument == "csrfile" || argument == "certfile")
+ return GetBashCompletionSuggestions("file", word);
+ else
+ return CLICommand::GetArgumentSuggestions(argument, word);
}
/**
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;
+ boost::program_options::options_description& hiddenDesc) const;
+ virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
};
}
void PKITicketCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const
+ boost::program_options::options_description& hiddenDesc) const
{
visibleDesc.add_options()
("cn", po::value<std::string>(), "Certificate common name")
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;
+ boost::program_options::options_description& hiddenDesc) const;
virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
};
}
void RepositoryObjectCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc,
- ArgumentCompletionDescription& argCompletionDesc) const
+ boost::program_options::options_description& hiddenDesc) const
{
visibleDesc.add_options()
("name", po::value<std::string>(), "The name of the object");
+}
- if (m_Command == RepositoryCommandAdd) {
- const Type *ptype = Type::GetByName(m_Type);
- ASSERT(ptype);
- AddTypeFields(ptype, visibleDesc);
- }
+std::vector<String> RepositoryObjectCommand::GetPositionalSuggestions(const String& word) const
+{
+ const Type *ptype = Type::GetByName(m_Type);
+ ASSERT(ptype);
+ return GetFieldCompletionSuggestions(ptype, word);
}
/**
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;
+ boost::program_options::options_description& hiddenDesc) 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;
private: