Asterisk - The Open Source Telephony Project GIT-master-f36a736
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.

Referenced by load_module().

◆ 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:1259
char * alias

References cli_alias::alias, and ast_str_hash().

Referenced by load_module().

◆ 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:2439

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 */
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:2959
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:1139
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
#define ast_str_alloca(init_len)
Definition: strings.h:848
int args
This gets set in ast_cli_register()
Definition: cli.h:185
Support for dynamic strings.
Definition: strings.h:623

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(5, "Aliased CLI command '%s' to '%s'\n", v1->name, v1->value);
240 ao2_ref(alias, -1);
241 }
242 }
243
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.
#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
@ CONFIG_FLAG_FILEUNCHANGED
#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 load_module(), and 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:666

References alias_cmp_cb(), alias_hash_cb(), AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, ARRAY_LEN, ast_cli_register_multiple, AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, cli_aliases, load_config(), MAX_ALIAS_BUCKETS, and NULL.

◆ 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 303 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 183 of file res_clialiases.c.

◆ cli_aliases

struct ao2_container* cli_aliases
static

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