Asterisk - The Open Source Telephony Project  GIT-master-a24979a
Data Structures | Macros | Functions | Variables
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"
Include dependency graph for res_clialiases.c:

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...
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
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)
 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 = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, }
 
static const 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

◆ FORMAT

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

◆ MAX_ALIAS_BUCKETS

#define MAX_ALIAS_BUCKETS   53

Maximum number of buckets for CLI aliases

Definition at line 50 of file res_clialiases.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 303 of file res_clialiases.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 303 of file res_clialiases.c.

◆ alias_cmp_cb()

static int alias_cmp_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Comparison function used for aliases.

Definition at line 71 of file res_clialiases.c.

72 {
73  const struct cli_alias *alias0 = obj, *alias1 = arg;
74 
75  return (alias0->cli_entry.command == alias1->cli_entry.command ? CMP_MATCH | CMP_STOP : 0);
76 }
@ CMP_MATCH
Definition: astobj2.h:1027
@ CMP_STOP
Definition: astobj2.h:1028
char * command
Definition: cli.h:186
struct ast_cli_entry cli_entry

References cli_alias::cli_entry, CMP_MATCH, CMP_STOP, and ast_cli_entry::command.

◆ alias_hash_cb()

static int alias_hash_cb ( const void *  obj,
const int  flags 
)
static

Hashing function used for aliases.

Definition at line 64 of file res_clialiases.c.

65 {
66  const struct cli_alias *alias = obj;
67  return ast_str_hash(alias->cli_entry.command);
68 }
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
Definition: strings.h:1237
char * alias

References cli_alias::alias, and ast_str_hash().

◆ alias_name_cb()

static int alias_name_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Callback for finding an alias based on name.

Definition at line 91 of file res_clialiases.c.

92 {
93  struct cli_alias *alias = obj;
94  char *name = arg;
95 
96  return !strcmp(alias->alias, name) ? CMP_MATCH | CMP_STOP : 0;
97 }
static const char name[]
Definition: format_mp3.c:68

References cli_alias::alias, CMP_MATCH, CMP_STOP, and name.

Referenced by load_config().

◆ alias_show()

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

154 {
155 #define FORMAT "%-50.50s %-50.50s\n"
156  struct cli_alias *alias;
157  struct ao2_iterator i;
158 
159  switch (cmd) {
160  case CLI_INIT:
161  e->command = "cli show aliases";
162  e->usage =
163  "Usage: cli show aliases\n"
164  " Displays a list of aliased CLI commands.\n";
165  return NULL;
166  case CLI_GENERATE:
167  return NULL;
168  }
169 
170  ast_cli(a->fd, FORMAT, "Alias Command", "Real Command");
171 
173  for (; (alias = ao2_iterator_next(&i)); ao2_ref(alias, -1)) {
174  ast_cli(a->fd, FORMAT, alias->alias, alias->real_cmd);
175  }
177 
178  return CLI_SUCCESS;
179 #undef FORMAT
180 }
#define ao2_iterator_next(iter)
Definition: astobj2.h:1911
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define CLI_SUCCESS
Definition: cli.h:44
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
@ CLI_INIT
Definition: cli.h:152
@ CLI_GENERATE
Definition: cli.h:153
static struct ao2_container * cli_aliases
#define FORMAT
#define NULL
Definition: resample.c:96
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1821
const char * usage
Definition: cli.h:177
char * real_cmd
static struct test_val a

References a, 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, FORMAT, NULL, cli_alias::real_cmd, and ast_cli_entry::usage.

◆ alias_unregister_cb()

static int alias_unregister_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Callback for unregistering an alias.

Definition at line 79 of file res_clialiases.c.

80 {
81  struct cli_alias *alias = obj;
82 
83  /* Unregister the CLI entry from the core */
84  ast_cli_unregister(&alias->cli_entry);
85 
86  /* We can determine if this worked or not by looking at the cli_entry itself */
87  return !alias->cli_entry.command ? CMP_MATCH : 0;
88 }
int ast_cli_unregister(struct ast_cli_entry *e)
Unregisters a command or an array of commands.
Definition: main/cli.c:2431

References cli_alias::alias, ast_cli_unregister(), and CMP_MATCH.

Referenced by load_config(), and unload_module().

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 303 of file res_clialiases.c.

◆ cli_alias_passthrough()

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

101 {
102  struct cli_alias *alias;
103  struct cli_alias tmp = {
104  .cli_entry.command = e->command,
105  };
106  char *generator = NULL;
107  const char *line;
108 
109  /* Try to find the alias based on the CLI entry */
110  if (!(alias = ao2_find(cli_aliases, &tmp, OBJ_POINTER))) {
111  return 0;
112  }
113 
114  switch (cmd) {
115  case CLI_INIT:
116  ao2_ref(alias, -1);
117  return NULL;
118  case CLI_GENERATE:
119  line = a->line;
120  line += (strlen(alias->alias));
121  if (strncasecmp(alias->alias, alias->real_cmd, strlen(alias->alias))) {
122  struct ast_str *real_cmd = ast_str_alloca(strlen(alias->real_cmd) + strlen(line) + 1);
123  ast_str_append(&real_cmd, 0, "%s%s", alias->real_cmd, line);
124  generator = ast_cli_generator(ast_str_buffer(real_cmd), a->word, a->n);
125  }
126  ao2_ref(alias, -1);
127  return generator;
128  }
129 
130  /* If they gave us extra arguments we need to construct a string to pass in */
131  if (a->argc != e->args) {
132  struct ast_str *real_cmd = ast_str_alloca(2048);
133  int i;
134 
135  ast_str_append(&real_cmd, 0, "%s", alias->real_cmd);
136 
137  /* Add the additional arguments that have been passed in */
138  for (i = e->args + 1; i <= a->argc; i++) {
139  ast_str_append(&real_cmd, 0, " %s", a->argv[i - 1]);
140  }
141 
142  ast_cli_command(a->fd, ast_str_buffer(real_cmd));
143  } else {
144  ast_cli_command(a->fd, alias->real_cmd);
145  }
146 
147  ao2_ref(alias, -1);
148 
149  return CLI_SUCCESS;
150 }
#define OBJ_POINTER
Definition: astobj2.h:1150
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1736
static int tmp()
Definition: bt_open.c:389
char * ast_cli_generator(const char *, const char *, int)
Readline madness Useful for readline, that's about it.
Definition: main/cli.c:2951
ast_cli_command
calling arguments for new-style handlers.
Definition: cli.h:151
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:1117
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:739
#define ast_str_alloca(init_len)
Definition: strings.h:826
int args
This gets set in ast_cli_register()
Definition: cli.h:185
Support for dynamic strings.
Definition: strings.h:604

References a, cli_alias::alias, ao2_find, ao2_ref, ast_cli_entry::args, ast_cli_generator(), ast_str_alloca, ast_str_append(), ast_str_buffer(), cli_aliases, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, NULL, OBJ_POINTER, cli_alias::real_cmd, and tmp().

Referenced by load_config().

◆ load_config()

static void load_config ( int  reload)
static

Function called to load or reload the configuration file.

Definition at line 188 of file res_clialiases.c.

189 {
190  struct ast_config *cfg = NULL;
191  struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
192  struct cli_alias *alias;
193  struct ast_variable *v, *v1;
194 
195  if (!(cfg = ast_config_load(config_file, config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
196  ast_log(LOG_ERROR, "res_clialiases configuration file '%s' not found\n", config_file);
197  return;
198  } else if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
199  return;
200  }
201 
202  /* Destroy any existing CLI aliases */
203  if (reload) {
205  }
206 
207  for (v = ast_variable_browse(cfg, "general"); v; v = v->next) {
208  if (strcmp(v->name, "template")) {
209  ast_log(LOG_WARNING, "%s is not a correct option in [%s]\n", v->name, "general");
210  continue;
211  }
212  /* Read in those there CLI aliases */
213  for (v1 = ast_variable_browse(cfg, v->value); v1; v1 = v1->next) {
214  struct cli_alias *existing = ao2_callback(cli_aliases, 0, alias_name_cb, (char*)v1->name);
215 
216  if (existing) {
217  ast_log(LOG_WARNING, "Alias '%s' could not be unregistered and has been retained\n",
218  existing->alias);
219  ao2_ref(existing, -1);
220  continue;
221  }
222 
223  if (!(alias = ao2_alloc((sizeof(*alias) + strlen(v1->name) + strlen(v1->value) + 2), NULL))) {
224  continue;
225  }
226  alias->alias = ((char *) alias) + sizeof(*alias);
227  alias->real_cmd = ((char *) alias->alias) + strlen(v1->name) + 1;
228  strcpy(alias->alias, v1->name);
229  strcpy(alias->real_cmd, v1->value);
230  alias->cli_entry.handler = cli_alias_passthrough;
231  alias->cli_entry.command = alias->alias;
232  alias->cli_entry.usage = "Aliased CLI Command\n";
233 
234  if (ast_cli_register(&alias->cli_entry)) {
235  ao2_ref(alias, -1);
236  continue;
237  }
239  ast_verb(2, "Aliased CLI command '%s' to '%s'\n", v1->name, v1->value);
240  ao2_ref(alias, -1);
241  }
242  }
243 
244  ast_config_destroy(cfg);
245 
246  return;
247 }
#define ast_log
Definition: astobj2.c:42
#define ao2_link(container, obj)
Add an object to a container.
Definition: astobj2.h:1532
#define ao2_callback(c, flags, cb_fn, arg)
ao2_callback() is a generic function that applies cb_fn() to all objects in a container,...
Definition: astobj2.h:1693
@ OBJ_NODATA
Definition: astobj2.h:1044
@ OBJ_MULTIPLE
Definition: astobj2.h:1049
@ OBJ_UNLINK
Definition: astobj2.h:1039
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:409
#define ast_cli_register(e)
Registers a command or an array of commands.
Definition: cli.h:256
#define ast_config_load(filename, flags)
Load a config file.
@ CONFIG_FLAG_FILEUNCHANGED
#define CONFIG_STATUS_FILEUNCHANGED
#define CONFIG_STATUS_FILEINVALID
void ast_config_destroy(struct ast_config *cfg)
Destroys a config.
Definition: extconf.c:1289
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
Definition: extconf.c:1215
#define LOG_ERROR
#define ast_verb(level,...)
#define LOG_WARNING
static int alias_name_cb(void *obj, void *arg, int flags)
Callback for finding an alias based on name.
static const char config_file[]
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 int alias_unregister_cb(void *obj, void *arg, int flags)
Callback for unregistering an alias.
static int reload(void)
Structure used to handle boolean flags.
Definition: utils.h:199
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next

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_verb, cli_alias_passthrough(), cli_aliases, config_file, CONFIG_FLAG_FILEUNCHANGED, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, LOG_ERROR, LOG_WARNING, ast_variable::name, ast_variable::next, NULL, OBJ_MULTIPLE, OBJ_NODATA, OBJ_UNLINK, reload(), and ast_variable::value.

Referenced by reload_module().

◆ load_module()

static int load_module ( void  )
static

Load the module.

Module loading including tests for configuration or dependencies. This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE, or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails tests return AST_MODULE_LOAD_FAILURE. If the module can not load the configuration file or other non-critical problem return AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.

Definition at line 283 of file res_clialiases.c.

284 {
287  if (!cli_aliases) {
289  }
290 
291  load_config(0);
292 
294 
296 }
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition: astobj2.h:363
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
Definition: astobj2.h:1303
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
@ AST_MODULE_LOAD_SUCCESS
Definition: module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
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 void load_config(int reload)
Function called to load or reload the configuration file.
#define MAX_ALIAS_BUCKETS
#define ARRAY_LEN(a)
Definition: utils.h:661

◆ reload_module()

static int reload_module ( void  )
static

Function called to reload the module.

Definition at line 250 of file res_clialiases.c.

251 {
252  load_config(1);
253  return 0;
254 }

References load_config().

◆ unload_module()

static int unload_module ( void  )
static

Function called to unload the module.

Definition at line 257 of file res_clialiases.c.

258 {
260 
262  ast_log(LOG_ERROR, "Could not unregister all CLI aliases\n");
263  return -1;
264  }
265 
266  ao2_ref(cli_aliases, -1);
267 
269 
270  return 0;
271 }
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30

References alias_unregister_cb(), ao2_callback, ao2_container_count(), ao2_ref, ARRAY_LEN, ast_cli_unregister_multiple(), ast_log, cli_aliases, LOG_ERROR, NULL, OBJ_MULTIPLE, OBJ_NODATA, and OBJ_UNLINK.

Variable Documentation

◆ __mod_info

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 = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, }
static

Definition at line 283 of file res_clialiases.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 303 of file res_clialiases.c.

◆ cli_alias

struct ast_cli_entry cli_alias[]
static
Initial value:
= {
{ .handler = alias_show , .summary = "Show CLI command aliases" ,},
}
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 153 of file res_clialiases.c.

◆ cli_aliases

struct ao2_container* cli_aliases
static

Definition at line 61 of file res_clialiases.c.

Referenced by alias_show(), cli_alias_passthrough(), load_config(), and unload_module().

◆ config_file

const char config_file[] = "cli_aliases.conf"
static

Configuration file used for this application

Definition at line 53 of file res_clialiases.c.

Referenced by load_config().