Mon Aug 31 12:30:43 2015

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

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

00085 {
00086    struct cli_alias *alias = obj;
00087    char *name = arg;
00088 
00089    return !strcmp(alias->alias, name) ? CMP_MATCH | CMP_STOP : 0;
00090 }

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


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 288 of file res_clialiases.c.

Definition at line 288 of file res_clialiases.c.

struct ast_cli_entry cli_alias[] [static]
Initial value:
 {
   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.


Generated on 31 Aug 2015 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1