Mon Oct 8 12:39:27 2012

Asterisk developer's documentation


res_clialiases.c File Reference

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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .reload = reload_module, }
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_cli_entry cli_alias []
 CLI commands to interact with things.
static struct ao2_containercli_aliases
static const char config_file [] = "cli_aliases.conf"


Detailed Description

CLI Aliases.

Author:
Joshua Colp <jcolp@digium.com> 
This module provides the capability to create aliases to other CLI commands.

Definition in file res_clialiases.c.


Define Documentation

#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().


Function Documentation

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_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 }


Variable Documentation

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 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__ },
}
CLI commands to interact with things.

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.


Generated on Mon Oct 8 12:39:27 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7