#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 = "88eaa8f5c1bd988bedd71113385e0886" , .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" |
Joshua Colp <jcolp@digium.com>
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().
00065 { 00066 const struct cli_alias *alias0 = obj, *alias1 = arg; 00067 00068 return (alias0->cli_entry.command == alias1->cli_entry.command ? CMP_MATCH | CMP_STOP : 0); 00069 }
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, and ast_cli_unregister().
Referenced by load_config().
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 return; 00080 }
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, and ast_str_hash().
Referenced by load_module().
00058 { 00059 const struct cli_alias *alias = obj; 00060 return ast_str_hash(alias->cli_entry.command); 00061 }
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_aliases, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, FORMAT, cli_alias::real_cmd, and ast_cli_entry::usage.
00141 { 00142 #define FORMAT "%-50.50s %-50.50s\n" 00143 struct cli_alias *alias; 00144 struct ao2_iterator i; 00145 00146 switch (cmd) { 00147 case CLI_INIT: 00148 e->command = "cli show aliases"; 00149 e->usage = 00150 "Usage: cli show aliases\n" 00151 " Displays a list of aliased CLI commands.\n"; 00152 return NULL; 00153 case CLI_GENERATE: 00154 return NULL; 00155 } 00156 00157 ast_cli(a->fd, FORMAT, "Alias Command", "Real Command"); 00158 00159 i = ao2_iterator_init(cli_aliases, 0); 00160 for (; (alias = ao2_iterator_next(&i)); ao2_ref(alias, -1)) { 00161 ast_cli(a->fd, FORMAT, alias->alias, alias->real_cmd); 00162 } 00163 ao2_iterator_destroy(&i); 00164 00165 return CLI_SUCCESS; 00166 #undef FORMAT 00167 }
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_command, ast_cli_generator(), ast_str_alloca, ast_str_append(), ast_str_buffer(), ast_strlen_zero(), cli_aliases, 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.
00084 { 00085 struct cli_alias *alias; 00086 struct cli_alias tmp = { 00087 .cli_entry.command = e->command, 00088 }; 00089 char *generator; 00090 const char *line; 00091 00092 /* Try to find the alias based on the CLI entry */ 00093 if (!(alias = ao2_find(cli_aliases, &tmp, OBJ_POINTER))) { 00094 return 0; 00095 } 00096 00097 switch (cmd) { 00098 case CLI_INIT: 00099 ao2_ref(alias, -1); 00100 return NULL; 00101 case CLI_GENERATE: 00102 line = a->line; 00103 line += (strlen(alias->alias)); 00104 if (!strncasecmp(alias->alias, alias->real_cmd, strlen(alias->alias))) { 00105 generator = NULL; 00106 } else if (!ast_strlen_zero(a->word)) { 00107 struct ast_str *real_cmd = ast_str_alloca(strlen(alias->real_cmd) + strlen(line) + 1); 00108 ast_str_append(&real_cmd, 0, "%s%s", alias->real_cmd, line); 00109 generator = ast_cli_generator(ast_str_buffer(real_cmd), a->word, a->n); 00110 } else { 00111 generator = ast_cli_generator(alias->real_cmd, a->word, a->n); 00112 } 00113 ao2_ref(alias, -1); 00114 return generator; 00115 } 00116 00117 /* If they gave us extra arguments we need to construct a string to pass in */ 00118 if (a->argc != e->args) { 00119 struct ast_str *real_cmd = ast_str_alloca(2048); 00120 int i; 00121 00122 ast_str_append(&real_cmd, 0, "%s", alias->real_cmd); 00123 00124 /* Add the additional arguments that have been passed in */ 00125 for (i = e->args + 1; i <= a->argc; i++) { 00126 ast_str_append(&real_cmd, 0, " %s", a->argv[i - 1]); 00127 } 00128 00129 ast_cli_command(a->fd, ast_str_buffer(real_cmd)); 00130 } else { 00131 ast_cli_command(a->fd, alias->real_cmd); 00132 } 00133 00134 ao2_ref(alias, -1); 00135 00136 return CLI_SUCCESS; 00137 }
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, ast_config_load, ast_log(), ast_variable_browse(), cli_alias, cli_aliases, CONFIG_FLAG_FILEUNCHANGED, config_flags, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, LOG_ERROR, LOG_WARNING, ast_variable::name, ast_variable::next, OBJ_MULTIPLE, OBJ_NODATA, OBJ_UNLINK, and ast_variable::value.
00176 { 00177 struct ast_config *cfg = NULL; 00178 struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 }; 00179 struct cli_alias *alias; 00180 struct ast_variable *v, *v1; 00181 00182 if (!(cfg = ast_config_load(config_file, config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) { 00183 ast_log(LOG_ERROR, "res_clialiases configuration file '%s' not found\n", config_file); 00184 return; 00185 } else if (cfg == CONFIG_STATUS_FILEUNCHANGED) { 00186 return; 00187 } 00188 00189 /* Destroy any existing CLI aliases */ 00190 if (reload) { 00191 ao2_callback(cli_aliases, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL); 00192 } 00193 00194 for (v = ast_variable_browse(cfg, "general"); v; v = v->next) { 00195 if (strcmp(v->name, "template")) { 00196 ast_log(LOG_WARNING, "%s is not a correct option in [%s]\n", v->name, "general"); 00197 continue; 00198 } 00199 /* Read in those there CLI aliases */ 00200 for (v1 = ast_variable_browse(cfg, v->value); v1; v1 = v1->next) { 00201 if (!(alias = ao2_alloc((sizeof(*alias) + strlen(v1->name) + strlen(v1->value) + 2), alias_destroy))) { 00202 continue; 00203 } 00204 alias->alias = ((char *) alias) + sizeof(*alias); 00205 alias->real_cmd = ((char *) alias->alias) + strlen(v1->name) + 1; 00206 strcpy(alias->alias, v1->name); 00207 strcpy(alias->real_cmd, v1->value); 00208 alias->cli_entry.handler = cli_alias_passthrough; 00209 alias->cli_entry.command = alias->alias; 00210 alias->cli_entry.usage = "Aliased CLI Command\n"; 00211 00212 ast_cli_register(&alias->cli_entry); 00213 ao2_link(cli_aliases, alias); 00214 ast_verbose(VERBOSE_PREFIX_2 "Aliased CLI command '%s' to '%s'\n", v1->name, v1->value); 00215 ao2_ref(alias, -1); 00216 } 00217 } 00218 00219 ast_config_destroy(cfg); 00220 00221 return; 00222 }
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, cli_aliases, load_config(), and MAX_ALIAS_BUCKETS.
00243 { 00244 if (!(cli_aliases = ao2_container_alloc(MAX_ALIAS_BUCKETS, alias_hash_cb, alias_cmp_cb))) { 00245 return AST_MODULE_LOAD_DECLINE; 00246 } 00247 00248 load_config(0); 00249 00250 ast_cli_register_multiple(cli_alias, ARRAY_LEN(cli_alias)); 00251 00252 return AST_MODULE_LOAD_SUCCESS; 00253 }
static int reload_module | ( | void | ) | [static] |
Function called to reload the module.
Definition at line 225 of file res_clialiases.c.
References load_config().
Referenced by load_module().
00226 { 00227 load_config(1); 00228 return 0; 00229 }
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, ast_cli_unregister_multiple(), and cli_aliases.
00233 { 00234 ao2_ref(cli_aliases, -1); 00235 00236 ast_cli_unregister_multiple(cli_alias, ARRAY_LEN(cli_alias)); 00237 00238 return 0; 00239 }
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 = "88eaa8f5c1bd988bedd71113385e0886" , .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] |
Initial value:
{ { .handler = alias_show , .summary = "Show CLI command aliases" ,__VA_ARGS__ }, }
Definition at line 170 of file res_clialiases.c.
Referenced by load_config().
struct ao2_container* cli_aliases [static] |
Definition at line 54 of file res_clialiases.c.
Referenced by alias_show(), cli_alias_passthrough(), load_config(), load_module(), and unload_module().
const char config_file[] = "cli_aliases.conf" [static] |
Configuration file used for this application
Definition at line 46 of file res_clialiases.c.