Wed Jan 8 2020 09:50:18

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
 

Macros

#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. More...
 
static int alias_hash_cb (const void *obj, const int flags)
 Hashing function used for aliases. More...
 
static int alias_name_cb (void *obj, void *arg, int flags)
 Callback for finding an alias based on name. More...
 
static char * alias_show (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 CLI Command to display CLI Aliases. More...
 
static int alias_unregister_cb (void *obj, void *arg, int flags)
 Callback for unregistering an alias. More...
 
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. More...
 
static void load_config (int reload)
 Function called to load or reload the configuration file. More...
 
static int load_module (void)
 Function called to load the module. More...
 
static int reload_module (void)
 Function called to reload the module. More...
 
static int unload_module (void)
 Function called to unload the module. More...
 

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. More...
 
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.

Macro Definition Documentation

#define FORMAT   "%-50.50s %-50.50s\n"

Referenced by alias_show().

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

65 {
66  const struct cli_alias *alias0 = obj, *alias1 = arg;
67 
68  return (alias0->cli_entry.command == alias1->cli_entry.command ? CMP_MATCH | CMP_STOP : 0);
69 }
struct ast_cli_entry cli_entry
char * command
Definition: cli.h:180
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().

58 {
59  const struct cli_alias *alias = obj;
60  return ast_str_hash(alias->cli_entry.command);
61 }
char * alias
struct ast_cli_entry cli_entry
char * command
Definition: cli.h:180
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
Definition: strings.h:949
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().

85 {
86  struct cli_alias *alias = obj;
87  char *name = arg;
88 
89  return !strcmp(alias->alias, name) ? CMP_MATCH | CMP_STOP : 0;
90 }
char * alias
static const char name[]
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.

151 {
152 #define FORMAT "%-50.50s %-50.50s\n"
153  struct cli_alias *alias;
154  struct ao2_iterator i;
155 
156  switch (cmd) {
157  case CLI_INIT:
158  e->command = "cli show aliases";
159  e->usage =
160  "Usage: cli show aliases\n"
161  " Displays a list of aliased CLI commands.\n";
162  return NULL;
163  case CLI_GENERATE:
164  return NULL;
165  }
166 
167  ast_cli(a->fd, FORMAT, "Alias Command", "Real Command");
168 
170  for (; (alias = ao2_iterator_next(&i)); ao2_ref(alias, -1)) {
171  ast_cli(a->fd, FORMAT, alias->alias, alias->real_cmd);
172  }
174 
175  return CLI_SUCCESS;
176 #undef FORMAT
177 }
char * alias
#define ao2_iterator_next(arg1)
Definition: astobj2.h:1126
Definition: cli.h:146
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags)
Create an iterator for a container.
Definition: astobj2.c:818
void ast_cli(int fd, const char *fmt,...)
Definition: cli.c:105
const int fd
Definition: cli.h:153
#define ao2_ref(o, delta)
Definition: astobj2.h:472
char * real_cmd
char * command
Definition: cli.h:180
void ao2_iterator_destroy(struct ao2_iterator *i)
Destroy a container iterator.
Definition: astobj2.c:833
const char * usage
Definition: cli.h:171
#define CLI_SUCCESS
Definition: cli.h:43
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1053
#define FORMAT
static struct ao2_container * cli_aliases
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().

73 {
74  struct cli_alias *alias = obj;
75 
76  /* Unregister the CLI entry from the core */
78 
79  /* We can determine if this worked or not by looking at the cli_entry itself */
80  return !alias->cli_entry.command ? CMP_MATCH : 0;
81 }
char * alias
int ast_cli_unregister(struct ast_cli_entry *e)
Unregisters a command or an array of commands.
Definition: cli.c:2153
struct ast_cli_entry cli_entry
char * command
Definition: cli.h:180
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_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().

94 {
95  struct cli_alias *alias;
96  struct cli_alias tmp = {
98  };
99  char *generator;
100  const char *line;
101 
102  /* Try to find the alias based on the CLI entry */
103  if (!(alias = ao2_find(cli_aliases, &tmp, OBJ_POINTER))) {
104  return 0;
105  }
106 
107  switch (cmd) {
108  case CLI_INIT:
109  ao2_ref(alias, -1);
110  return NULL;
111  case CLI_GENERATE:
112  line = a->line;
113  line += (strlen(alias->alias));
114  if (!strncasecmp(alias->alias, alias->real_cmd, strlen(alias->alias))) {
115  generator = NULL;
116  } else if (!ast_strlen_zero(a->word)) {
117  struct ast_str *real_cmd = ast_str_alloca(strlen(alias->real_cmd) + strlen(line) + 1);
118  ast_str_append(&real_cmd, 0, "%s%s", alias->real_cmd, line);
119  generator = ast_cli_generator(ast_str_buffer(real_cmd), a->word, a->n);
120  } else {
121  generator = ast_cli_generator(alias->real_cmd, a->word, a->n);
122  }
123  ao2_ref(alias, -1);
124  return generator;
125  }
126 
127  /* If they gave us extra arguments we need to construct a string to pass in */
128  if (a->argc != e->args) {
129  struct ast_str *real_cmd = ast_str_alloca(2048);
130  int i;
131 
132  ast_str_append(&real_cmd, 0, "%s", alias->real_cmd);
133 
134  /* Add the additional arguments that have been passed in */
135  for (i = e->args + 1; i <= a->argc; i++) {
136  ast_str_append(&real_cmd, 0, " %s", a->argv[i - 1]);
137  }
138 
139  ast_cli_command(a->fd, ast_str_buffer(real_cmd));
140  } else {
141  ast_cli_command(a->fd, alias->real_cmd);
142  }
143 
144  ao2_ref(alias, -1);
145 
146  return CLI_SUCCESS;
147 }
char * alias
const int argc
Definition: cli.h:154
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:497
Definition: cli.h:146
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:900
#define ast_str_alloca(init_len)
Definition: strings.h:608
const char * line
Definition: cli.h:156
int args
This gets set in ast_cli_register()
Definition: cli.h:179
const int fd
Definition: cli.h:153
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:63
const int n
Definition: cli.h:159
#define ao2_ref(o, delta)
Definition: astobj2.h:472
ast_cli_command
calling arguments for new-style handlers.
Definition: cli.h:145
const char *const * argv
Definition: cli.h:155
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:364
static struct ast_generator generator
Definition: app_fax.c:361
char * real_cmd
struct ast_cli_entry cli_entry
#define ao2_find(arg1, arg2, arg3)
Definition: astobj2.h:964
char * command
Definition: cli.h:180
const char * word
Definition: cli.h:157
char * ast_cli_generator(const char *, const char *, int)
Readline madness Useful for readline, that&#39;s about it.
Definition: cli.c:2525
#define CLI_SUCCESS
Definition: cli.h:43
static struct ao2_container * cli_aliases
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().

186 {
187  struct ast_config *cfg = NULL;
188  struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
189  struct cli_alias *alias;
190  struct ast_variable *v, *v1;
191 
192  if (!(cfg = ast_config_load(config_file, config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
193  ast_log(LOG_ERROR, "res_clialiases configuration file '%s' not found\n", config_file);
194  return;
195  } else if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
196  return;
197  }
198 
199  /* Destroy any existing CLI aliases */
200  if (reload) {
202  }
203 
204  for (v = ast_variable_browse(cfg, "general"); v; v = v->next) {
205  if (strcmp(v->name, "template")) {
206  ast_log(LOG_WARNING, "%s is not a correct option in [%s]\n", v->name, "general");
207  continue;
208  }
209  /* Read in those there CLI aliases */
210  for (v1 = ast_variable_browse(cfg, v->value); v1; v1 = v1->next) {
211  struct cli_alias *existing = ao2_callback(cli_aliases, 0, alias_name_cb, (char*)v1->name);
212 
213  if (existing) {
214  ast_log(LOG_WARNING, "Alias '%s' could not be unregistered and has been retained\n",
215  existing->alias);
216  ao2_ref(existing, -1);
217  continue;
218  }
219 
220  if (!(alias = ao2_alloc((sizeof(*alias) + strlen(v1->name) + strlen(v1->value) + 2), NULL))) {
221  continue;
222  }
223  alias->alias = ((char *) alias) + sizeof(*alias);
224  alias->real_cmd = ((char *) alias->alias) + strlen(v1->name) + 1;
225  strcpy(alias->alias, v1->name);
226  strcpy(alias->real_cmd, v1->value);
228  alias->cli_entry.command = alias->alias;
229  alias->cli_entry.usage = "Aliased CLI Command\n";
230 
231  if (ast_cli_register(&alias->cli_entry)) {
232  ao2_ref(alias, -1);
233  continue;
234  }
235  ao2_link(cli_aliases, alias);
236  ast_verbose(VERBOSE_PREFIX_2 "Aliased CLI command '%s' to '%s'\n", v1->name, v1->value);
237  ao2_ref(alias, -1);
238  }
239  }
240 
241  ast_config_destroy(cfg);
242 
243  return;
244 }
#define ao2_link(arg1, arg2)
Definition: astobj2.h:785
char * alias
static int alias_name_cb(void *obj, void *arg, int flags)
Callback for finding an alias based on name.
int ast_cli_register(struct ast_cli_entry *e)
Registers a command or an array of commands.
Definition: cli.c:2159
#define LOG_WARNING
Definition: logger.h:144
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category)
Goes through variables.
Definition: config.c:597
#define ao2_callback(c, flags, cb_fn, arg)
Definition: astobj2.h:910
void ast_verbose(const char *fmt,...)
Definition: logger.c:1568
Structure for variables, used for configurations and for channel variables.
Definition: config.h:75
void ast_config_destroy(struct ast_config *config)
Destroys a config.
Definition: config.c:1037
static const char config_file[]
const char * value
Definition: config.h:79
#define VERBOSE_PREFIX_2
Definition: logger.h:42
#define ast_config_load(filename, flags)
Load a config file.
Definition: config.h:170
#define ao2_ref(o, delta)
Definition: astobj2.h:472
const char * name
Definition: config.h:77
static int reload(void)
Definition: app_amd.c:497
static int alias_unregister_cb(void *obj, void *arg, int flags)
Callback for unregistering an alias.
#define LOG_ERROR
Definition: logger.h:155
char *(* handler)(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition: cli.h:181
char * real_cmd
struct ast_cli_entry cli_entry
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:430
char * command
Definition: cli.h:180
Structure used to handle boolean flags.
Definition: utils.h:200
const char * usage
Definition: cli.h:171
struct ast_variable * next
Definition: config.h:82
#define CONFIG_STATUS_FILEINVALID
Definition: config.h:52
static struct ao2_container * 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.
#define CONFIG_STATUS_FILEUNCHANGED
Definition: config.h:51
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.

272 {
275  }
276 
277  load_config(0);
278 
280 
282 }
static void load_config(int reload)
Function called to load or reload the configuration file.
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static int alias_cmp_cb(void *obj, void *arg, int flags)
Comparison function used for aliases.
#define MAX_ALIAS_BUCKETS
#define ao2_container_alloc(arg1, arg2, arg3)
Definition: astobj2.h:734
int ast_cli_register_multiple(struct ast_cli_entry *e, int len)
Register multiple commands.
Definition: cli.c:2167
static int alias_hash_cb(const void *obj, const int flags)
Hashing function used for aliases.
static struct ao2_container * cli_aliases
static int reload_module ( void  )
static

Function called to reload the module.

Definition at line 247 of file res_clialiases.c.

References load_config().

248 {
249  load_config(1);
250  return 0;
251 }
static void load_config(int reload)
Function called to load or reload the configuration file.
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.

255 {
257 
259  ast_log(LOG_ERROR, "Could not unregister all CLI aliases\n");
260  return -1;
261  }
262 
263  ao2_ref(cli_aliases, -1);
264 
266 
267  return 0;
268 }
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
Definition: astobj2.c:470
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: cli.c:2177
#define ao2_callback(c, flags, cb_fn, arg)
Definition: astobj2.h:910
#define ao2_ref(o, delta)
Definition: astobj2.h:472
static int alias_unregister_cb(void *obj, void *arg, int flags)
Callback for unregistering an alias.
#define LOG_ERROR
Definition: logger.h:155
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
static struct ao2_container * cli_aliases

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"),
}
#define AST_CLI_DEFINE(fn, txt,...)
Definition: cli.h:191
static char * alias_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
CLI Command to display CLI 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.