CLI Aliases. More...
#include "asterisk.h"#include "asterisk/module.h"#include "asterisk/config.h"#include "asterisk/cli.h"#include "asterisk/astobj2.h"
Go to the source code of this file.
Data Structures | |
| struct | cli_alias |
Defines | |
| #define | FORMAT "%-50.50s %-50.50s\n" |
| #define | MAX_ALIAS_BUCKETS 53 |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static int | alias_cmp_cb (void *obj, void *arg, int flags) |
| Comparison function used for aliases. | |
| static void | alias_destroy (void *obj) |
| Destruction function used for aliases. | |
| static int | alias_hash_cb (const void *obj, const int flags) |
| Hashing function used for aliases. | |
| static char * | alias_show (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| CLI Command to display CLI Aliases. | |
| static char * | cli_alias_passthrough (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| Function which passes through an aliased CLI command to the real one. | |
| static void | load_config (int reload) |
| Function called to load or reload the configuration file. | |
| static int | load_module (void) |
| Function called to load the module. | |
| static int | reload_module (void) |
| Function called to reload the module. | |
| static int | unload_module (void) |
| Function called to unload the module. | |
Variables | |
| static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "CLI Aliases" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload_module, } |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static struct ast_cli_entry | cli_alias [] |
| CLI commands to interact with things. | |
| static struct ao2_container * | cli_aliases |
| static const char | config_file [] = "cli_aliases.conf" |
CLI Aliases.
This module provides the capability to create aliases to other CLI commands.
Definition in file res_clialiases.c.
| #define FORMAT "%-50.50s %-50.50s\n" |
| #define MAX_ALIAS_BUCKETS 53 |
Maximum number of buckets for CLI aliases
Definition at line 43 of file res_clialiases.c.
Referenced by load_module().
| static void __reg_module | ( | void | ) | [static] |
Definition at line 259 of file res_clialiases.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 259 of file res_clialiases.c.
| static int alias_cmp_cb | ( | void * | obj, |
| void * | arg, | ||
| int | flags | ||
| ) | [static] |
Comparison function used for aliases.
Definition at line 64 of file res_clialiases.c.
References cli_alias::cli_entry, CMP_MATCH, CMP_STOP, and ast_cli_entry::command.
Referenced by load_module().
| static void alias_destroy | ( | void * | obj | ) | [static] |
Destruction function used for aliases.
Definition at line 72 of file res_clialiases.c.
References cli_alias::alias, ast_cli_unregister(), and cli_alias::cli_entry.
Referenced by load_config().
{
struct cli_alias *alias = obj;
/* Unregister the CLI entry from the core */
ast_cli_unregister(&alias->cli_entry);
return;
}
| static int alias_hash_cb | ( | const void * | obj, |
| const int | flags | ||
| ) | [static] |
Hashing function used for aliases.
Definition at line 57 of file res_clialiases.c.
References cli_alias::alias, ast_str_hash(), cli_alias::cli_entry, and ast_cli_entry::command.
Referenced by load_module().
{
const struct cli_alias *alias = obj;
return ast_str_hash(alias->cli_entry.command);
}
| static char* alias_show | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
CLI Command to display CLI Aliases.
Definition at line 140 of file res_clialiases.c.
References cli_alias::alias, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_cli(), CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, FORMAT, cli_alias::real_cmd, and ast_cli_entry::usage.
{
#define FORMAT "%-50.50s %-50.50s\n"
struct cli_alias *alias;
struct ao2_iterator i;
switch (cmd) {
case CLI_INIT:
e->command = "cli show aliases";
e->usage =
"Usage: cli show aliases\n"
" Displays a list of aliased CLI commands.\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
ast_cli(a->fd, FORMAT, "Alias Command", "Real Command");
i = ao2_iterator_init(cli_aliases, 0);
for (; (alias = ao2_iterator_next(&i)); ao2_ref(alias, -1)) {
ast_cli(a->fd, FORMAT, alias->alias, alias->real_cmd);
}
ao2_iterator_destroy(&i);
return CLI_SUCCESS;
#undef FORMAT
}
| static char* cli_alias_passthrough | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Function which passes through an aliased CLI command to the real one.
Definition at line 83 of file res_clialiases.c.
References cli_alias::alias, ao2_find, ao2_ref, ast_cli_args::argc, ast_cli_entry::args, ast_cli_args::argv, ast_cli_generator(), ast_str_alloca, ast_str_append(), ast_str_buffer(), ast_strlen_zero(), cli_alias::cli_entry, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, generator, ast_cli_args::line, ast_cli_args::n, OBJ_POINTER, cli_alias::real_cmd, and ast_cli_args::word.
Referenced by load_config().
{
struct cli_alias *alias;
struct cli_alias tmp = {
.cli_entry.command = e->command,
};
char *generator;
const char *line;
/* Try to find the alias based on the CLI entry */
if (!(alias = ao2_find(cli_aliases, &tmp, OBJ_POINTER))) {
return 0;
}
switch (cmd) {
case CLI_INIT:
ao2_ref(alias, -1);
return NULL;
case CLI_GENERATE:
line = a->line;
line += (strlen(alias->alias));
if (!strncasecmp(alias->alias, alias->real_cmd, strlen(alias->alias))) {
generator = NULL;
} else if (!ast_strlen_zero(a->word)) {
struct ast_str *real_cmd = ast_str_alloca(strlen(alias->real_cmd) + strlen(line) + 1);
ast_str_append(&real_cmd, 0, "%s%s", alias->real_cmd, line);
generator = ast_cli_generator(ast_str_buffer(real_cmd), a->word, a->n);
} else {
generator = ast_cli_generator(alias->real_cmd, a->word, a->n);
}
ao2_ref(alias, -1);
return generator;
}
/* If they gave us extra arguments we need to construct a string to pass in */
if (a->argc != e->args) {
struct ast_str *real_cmd = ast_str_alloca(2048);
int i;
ast_str_append(&real_cmd, 0, "%s", alias->real_cmd);
/* Add the additional arguments that have been passed in */
for (i = e->args + 1; i <= a->argc; i++) {
ast_str_append(&real_cmd, 0, " %s", a->argv[i - 1]);
}
ast_cli_command(a->fd, ast_str_buffer(real_cmd));
} else {
ast_cli_command(a->fd, alias->real_cmd);
}
ao2_ref(alias, -1);
return CLI_SUCCESS;
}
| static void load_config | ( | int | reload | ) | [static] |
Function called to load or reload the configuration file.
Definition at line 175 of file res_clialiases.c.
References cli_alias::alias, alias_destroy(), ao2_alloc, ao2_callback, ao2_link, ao2_ref, ast_cli_register(), ast_config_destroy(), ast_config_load, ast_log(), ast_variable_browse(), ast_verbose(), cli_alias_passthrough(), cli_alias::cli_entry, ast_cli_entry::command, CONFIG_FLAG_FILEUNCHANGED, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, ast_cli_entry::handler, LOG_ERROR, LOG_WARNING, ast_variable::name, ast_variable::next, OBJ_MULTIPLE, OBJ_NODATA, OBJ_UNLINK, cli_alias::real_cmd, ast_cli_entry::usage, ast_variable::value, and VERBOSE_PREFIX_2.
Referenced by load_module(), and reload_module().
{
struct ast_config *cfg = NULL;
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
struct cli_alias *alias;
struct ast_variable *v, *v1;
if (!(cfg = ast_config_load(config_file, config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "res_clialiases configuration file '%s' not found\n", config_file);
return;
} else if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
return;
}
/* Destroy any existing CLI aliases */
if (reload) {
ao2_callback(cli_aliases, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL);
}
for (v = ast_variable_browse(cfg, "general"); v; v = v->next) {
if (strcmp(v->name, "template")) {
ast_log(LOG_WARNING, "%s is not a correct option in [%s]\n", v->name, "general");
continue;
}
/* Read in those there CLI aliases */
for (v1 = ast_variable_browse(cfg, v->value); v1; v1 = v1->next) {
if (!(alias = ao2_alloc((sizeof(*alias) + strlen(v1->name) + strlen(v1->value) + 2), alias_destroy))) {
continue;
}
alias->alias = ((char *) alias) + sizeof(*alias);
alias->real_cmd = ((char *) alias->alias) + strlen(v1->name) + 1;
strcpy(alias->alias, v1->name);
strcpy(alias->real_cmd, v1->value);
alias->cli_entry.handler = cli_alias_passthrough;
alias->cli_entry.command = alias->alias;
alias->cli_entry.usage = "Aliased CLI Command\n";
ast_cli_register(&alias->cli_entry);
ao2_link(cli_aliases, alias);
ast_verbose(VERBOSE_PREFIX_2 "Aliased CLI command '%s' to '%s'\n", v1->name, v1->value);
ao2_ref(alias, -1);
}
}
ast_config_destroy(cfg);
return;
}
| static int load_module | ( | void | ) | [static] |
Function called to load the module.
Definition at line 242 of file res_clialiases.c.
References alias_cmp_cb(), alias_hash_cb(), ao2_container_alloc, ARRAY_LEN, ast_cli_register_multiple(), AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, load_config(), and MAX_ALIAS_BUCKETS.
{
if (!(cli_aliases = ao2_container_alloc(MAX_ALIAS_BUCKETS, alias_hash_cb, alias_cmp_cb))) {
return AST_MODULE_LOAD_DECLINE;
}
load_config(0);
ast_cli_register_multiple(cli_alias, ARRAY_LEN(cli_alias));
return AST_MODULE_LOAD_SUCCESS;
}
| static int reload_module | ( | void | ) | [static] |
Function called to reload the module.
Definition at line 225 of file res_clialiases.c.
References load_config().
{
load_config(1);
return 0;
}
| static int unload_module | ( | void | ) | [static] |
Function called to unload the module.
Definition at line 232 of file res_clialiases.c.
References ao2_ref, ARRAY_LEN, and ast_cli_unregister_multiple().
{
ao2_ref(cli_aliases, -1);
ast_cli_unregister_multiple(cli_alias, ARRAY_LEN(cli_alias));
return 0;
}
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "CLI Aliases" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload_module, } [static] |
Definition at line 259 of file res_clialiases.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 259 of file res_clialiases.c.
struct ast_cli_entry cli_alias[] [static] |
{
AST_CLI_DEFINE(alias_show, "Show CLI command aliases"),
}
CLI commands to interact with things.
Definition at line 170 of file res_clialiases.c.
struct ao2_container* cli_aliases [static] |
Definition at line 54 of file res_clialiases.c.
const char config_file[] = "cli_aliases.conf" [static] |
Configuration file used for this application
Definition at line 46 of file res_clialiases.c.