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 int | alias_hash_cb (const void *obj, const int flags) |
Hashing function used for aliases. | |
static int | alias_name_cb (void *obj, void *arg, int flags) |
Callback for finding an alias based on name. | |
static char * | alias_show (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
CLI Command to display CLI Aliases. | |
static int | alias_unregister_cb (void *obj, void *arg, int flags) |
Callback for unregistering an alias. | |
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 = "ac1f6a56484a8820659555499174e588" , .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 288 of file res_clialiases.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 288 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 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().
00058 { 00059 const struct cli_alias *alias = obj; 00060 return ast_str_hash(alias->cli_entry.command); 00061 }
static int alias_name_cb | ( | void * | obj, | |
void * | arg, | |||
int | flags | |||
) | [static] |
Callback for finding an alias based on name.
Definition at line 84 of file res_clialiases.c.
References cli_alias::alias, CMP_MATCH, CMP_STOP, and name.
Referenced by load_config().
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 150 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.
00151 { 00152 #define FORMAT "%-50.50s %-50.50s\n" 00153 struct cli_alias *alias; 00154 struct ao2_iterator i; 00155 00156 switch (cmd) { 00157 case CLI_INIT: 00158 e->command = "cli show aliases"; 00159 e->usage = 00160 "Usage: cli show aliases\n" 00161 " Displays a list of aliased CLI commands.\n"; 00162 return NULL; 00163 case CLI_GENERATE: 00164 return NULL; 00165 } 00166 00167 ast_cli(a->fd, FORMAT, "Alias Command", "Real Command"); 00168 00169 i = ao2_iterator_init(cli_aliases, 0); 00170 for (; (alias = ao2_iterator_next(&i)); ao2_ref(alias, -1)) { 00171 ast_cli(a->fd, FORMAT, alias->alias, alias->real_cmd); 00172 } 00173 ao2_iterator_destroy(&i); 00174 00175 return CLI_SUCCESS; 00176 #undef FORMAT 00177 }
static int alias_unregister_cb | ( | void * | obj, | |
void * | arg, | |||
int | flags | |||
) | [static] |
Callback for unregistering an alias.
Definition at line 72 of file res_clialiases.c.
References cli_alias::alias, ast_cli_unregister(), cli_alias::cli_entry, CMP_MATCH, and ast_cli_entry::command.
Referenced by load_config(), and unload_module().
00073 { 00074 struct cli_alias *alias = obj; 00075 00076 /* Unregister the CLI entry from the core */ 00077 ast_cli_unregister(&alias->cli_entry); 00078 00079 /* We can determine if this worked or not by looking at the cli_entry itself */ 00080 return !alias->cli_entry.command ? CMP_MATCH : 0; 00081 }
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 93 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_command, 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().
00094 { 00095 struct cli_alias *alias; 00096 struct cli_alias tmp = { 00097 .cli_entry.command = e->command, 00098 }; 00099 char *generator; 00100 const char *line; 00101 00102 /* Try to find the alias based on the CLI entry */ 00103 if (!(alias = ao2_find(cli_aliases, &tmp, OBJ_POINTER))) { 00104 return 0; 00105 } 00106 00107 switch (cmd) { 00108 case CLI_INIT: 00109 ao2_ref(alias, -1); 00110 return NULL; 00111 case CLI_GENERATE: 00112 line = a->line; 00113 line += (strlen(alias->alias)); 00114 if (!strncasecmp(alias->alias, alias->real_cmd, strlen(alias->alias))) { 00115 generator = NULL; 00116 } else if (!ast_strlen_zero(a->word)) { 00117 struct ast_str *real_cmd = ast_str_alloca(strlen(alias->real_cmd) + strlen(line) + 1); 00118 ast_str_append(&real_cmd, 0, "%s%s", alias->real_cmd, line); 00119 generator = ast_cli_generator(ast_str_buffer(real_cmd), a->word, a->n); 00120 } else { 00121 generator = ast_cli_generator(alias->real_cmd, a->word, a->n); 00122 } 00123 ao2_ref(alias, -1); 00124 return generator; 00125 } 00126 00127 /* If they gave us extra arguments we need to construct a string to pass in */ 00128 if (a->argc != e->args) { 00129 struct ast_str *real_cmd = ast_str_alloca(2048); 00130 int i; 00131 00132 ast_str_append(&real_cmd, 0, "%s", alias->real_cmd); 00133 00134 /* Add the additional arguments that have been passed in */ 00135 for (i = e->args + 1; i <= a->argc; i++) { 00136 ast_str_append(&real_cmd, 0, " %s", a->argv[i - 1]); 00137 } 00138 00139 ast_cli_command(a->fd, ast_str_buffer(real_cmd)); 00140 } else { 00141 ast_cli_command(a->fd, alias->real_cmd); 00142 } 00143 00144 ao2_ref(alias, -1); 00145 00146 return CLI_SUCCESS; 00147 }
static void load_config | ( | int | reload | ) | [static] |
Function called to load or reload the configuration file.
Definition at line 185 of file res_clialiases.c.
References cli_alias::alias, alias_name_cb(), alias_unregister_cb(), 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().
00186 { 00187 struct ast_config *cfg = NULL; 00188 struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 }; 00189 struct cli_alias *alias; 00190 struct ast_variable *v, *v1; 00191 00192 if (!(cfg = ast_config_load(config_file, config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) { 00193 ast_log(LOG_ERROR, "res_clialiases configuration file '%s' not found\n", config_file); 00194 return; 00195 } else if (cfg == CONFIG_STATUS_FILEUNCHANGED) { 00196 return; 00197 } 00198 00199 /* Destroy any existing CLI aliases */ 00200 if (reload) { 00201 ao2_callback(cli_aliases, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, alias_unregister_cb, NULL); 00202 } 00203 00204 for (v = ast_variable_browse(cfg, "general"); v; v = v->next) { 00205 if (strcmp(v->name, "template")) { 00206 ast_log(LOG_WARNING, "%s is not a correct option in [%s]\n", v->name, "general"); 00207 continue; 00208 } 00209 /* Read in those there CLI aliases */ 00210 for (v1 = ast_variable_browse(cfg, v->value); v1; v1 = v1->next) { 00211 struct cli_alias *existing = ao2_callback(cli_aliases, 0, alias_name_cb, (char*)v1->name); 00212 00213 if (existing) { 00214 ast_log(LOG_WARNING, "Alias '%s' could not be unregistered and has been retained\n", 00215 existing->alias); 00216 ao2_ref(existing, -1); 00217 continue; 00218 } 00219 00220 if (!(alias = ao2_alloc((sizeof(*alias) + strlen(v1->name) + strlen(v1->value) + 2), NULL))) { 00221 continue; 00222 } 00223 alias->alias = ((char *) alias) + sizeof(*alias); 00224 alias->real_cmd = ((char *) alias->alias) + strlen(v1->name) + 1; 00225 strcpy(alias->alias, v1->name); 00226 strcpy(alias->real_cmd, v1->value); 00227 alias->cli_entry.handler = cli_alias_passthrough; 00228 alias->cli_entry.command = alias->alias; 00229 alias->cli_entry.usage = "Aliased CLI Command\n"; 00230 00231 if (ast_cli_register(&alias->cli_entry)) { 00232 ao2_ref(alias, -1); 00233 continue; 00234 } 00235 ao2_link(cli_aliases, alias); 00236 ast_verbose(VERBOSE_PREFIX_2 "Aliased CLI command '%s' to '%s'\n", v1->name, v1->value); 00237 ao2_ref(alias, -1); 00238 } 00239 } 00240 00241 ast_config_destroy(cfg); 00242 00243 return; 00244 }
static int load_module | ( | void | ) | [static] |
Function called to load the module.
Definition at line 271 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.
00272 { 00273 if (!(cli_aliases = ao2_container_alloc(MAX_ALIAS_BUCKETS, alias_hash_cb, alias_cmp_cb))) { 00274 return AST_MODULE_LOAD_DECLINE; 00275 } 00276 00277 load_config(0); 00278 00279 ast_cli_register_multiple(cli_alias, ARRAY_LEN(cli_alias)); 00280 00281 return AST_MODULE_LOAD_SUCCESS; 00282 }
static int reload_module | ( | void | ) | [static] |
Function called to reload the module.
Definition at line 247 of file res_clialiases.c.
References load_config().
00248 { 00249 load_config(1); 00250 return 0; 00251 }
static int unload_module | ( | void | ) | [static] |
Function called to unload the module.
Definition at line 254 of file res_clialiases.c.
References alias_unregister_cb(), ao2_callback, ao2_container_count(), ao2_ref, ARRAY_LEN, ast_cli_unregister_multiple(), ast_log(), LOG_ERROR, OBJ_MULTIPLE, OBJ_NODATA, and OBJ_UNLINK.
00255 { 00256 ao2_callback(cli_aliases, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, alias_unregister_cb, NULL); 00257 00258 if (ao2_container_count(cli_aliases)) { 00259 ast_log(LOG_ERROR, "Could not unregister all CLI aliases\n"); 00260 return -1; 00261 } 00262 00263 ao2_ref(cli_aliases, -1); 00264 00265 ast_cli_unregister_multiple(cli_alias, ARRAY_LEN(cli_alias)); 00266 00267 return 0; 00268 }
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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .reload = reload_module, } [static] |
Definition at line 288 of file res_clialiases.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 288 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 180 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.