Skip to content

Commit 271ee30

Browse files
committed
mi: add which_aliases command
1 parent 2d0d8db commit 271ee30

4 files changed

Lines changed: 122 additions & 6 deletions

File tree

‎docs/manual/Interface-CoreMI.md‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,38 @@ Examples of usage:
348348

349349
```
350350
351+
### which_aliases
352+
353+
Lists all registered MI command aliases and the canonical command each alias
354+
resolves to.
355+
356+
**Arguments**:
357+
* *alias* (optional) - an MI alias to resolve to its canonical command
358+
359+
**Output**: without an argument, an array of objects containing `alias` and
360+
`command`; with an *alias*, the canonical command name as a string.
361+
362+
Example of usage:
363+
```bash
364+
365+
$ opensips-mi which_aliases
366+
[
367+
{
368+
"alias": "ul_dump",
369+
"command": "usrloc:ul_dump"
370+
}
371+
]
372+
373+
```
374+
375+
Resolve one alias:
376+
```bash
377+
378+
$ opensips-mi which_aliases ps
379+
"core:ps"
380+
381+
```
382+
351383
### xlog_level [level]
352384
Get or set the global xlogging level in OpenSIPS processes. If no argument is passed to the **xlog_level** command, it will print the current **xlog_level**. If a logging **level** is given, it will be globally set for all OpenSIPS processes.
353385

‎mi/mi.c‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,6 @@ struct mi_mod_group {
6060
int end;
6161
};
6262

63-
struct mi_cmd_alias {
64-
int id;
65-
str name;
66-
int cmd_idx;
67-
};
68-
6963
static struct mi_mod_group *mi_mod_groups = 0;
7064
static int mi_mod_groups_no = 0;
7165
static struct mi_cmd_alias *mi_cmd_aliases = 0;
@@ -647,6 +641,12 @@ void get_mi_cmds( struct mi_cmd** cmds, int *size)
647641
*size = mi_cmds_no;
648642
}
649643

644+
void get_mi_cmd_aliases(struct mi_cmd_alias **aliases, int *size)
645+
{
646+
*aliases = mi_cmd_aliases;
647+
*size = mi_cmd_aliases_no;
648+
}
649+
650650
int parse_mi_request(const char *req, const char **end_ptr, mi_request_t *parsed)
651651
{
652652
mi_item_t *req_jsonrpc;

‎mi/mi.h‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@ struct mi_cmd {
100100
volatile unsigned char* trace_mask;
101101
};
102102

103+
struct mi_cmd_alias {
104+
int id;
105+
str name;
106+
int cmd_idx;
107+
};
108+
103109
typedef struct mi_export_ {
104110
char *name;
105111
char *help;
@@ -143,6 +149,7 @@ mi_response_t *w_mi_help_1(const mi_params_t *params,
143149
struct mi_handler *async_hdl);
144150

145151
void get_mi_cmds(struct mi_cmd **cmds, int *size);
152+
void get_mi_cmd_aliases(struct mi_cmd_alias **aliases, int *size);
146153

147154
void _init_mi_shm_mem_hooks(void);
148155
void _init_mi_pkg_mem_hooks(void);

‎mi/mi_core.c‎

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,78 @@ static mi_response_t *mi_which(const mi_params_t *params, struct mi_handler *asy
302302
return resp;
303303
}
304304

305+
static mi_response_t *mi_which_aliases(const mi_params_t *params,
306+
struct mi_handler *async_hdl)
307+
{
308+
mi_response_t *resp;
309+
mi_item_t *resp_arr, *alias_obj;
310+
struct mi_cmd *cmds;
311+
struct mi_cmd_alias *aliases;
312+
int cmds_no, aliases_no;
313+
int i;
314+
315+
resp = init_mi_result_array(&resp_arr);
316+
if (!resp)
317+
return 0;
318+
319+
get_mi_cmds(&cmds, &cmds_no);
320+
get_mi_cmd_aliases(&aliases, &aliases_no);
321+
for (i = 0; i < aliases_no; i++) {
322+
if (aliases[i].cmd_idx < 0 || aliases[i].cmd_idx >= cmds_no) {
323+
LM_ERR("invalid MI alias command index %d\n",
324+
aliases[i].cmd_idx);
325+
free_mi_response(resp);
326+
return 0;
327+
}
328+
329+
alias_obj = add_mi_object(resp_arr, NULL, 0);
330+
if (!alias_obj ||
331+
add_mi_string(alias_obj, MI_SSTR("alias"),
332+
aliases[i].name.s, aliases[i].name.len) < 0 ||
333+
add_mi_string(alias_obj, MI_SSTR("command"),
334+
cmds[aliases[i].cmd_idx].name.s,
335+
cmds[aliases[i].cmd_idx].name.len) < 0) {
336+
LM_ERR("failed to add MI alias item\n");
337+
free_mi_response(resp);
338+
return 0;
339+
}
340+
}
341+
342+
return resp;
343+
}
344+
345+
static mi_response_t *mi_which_alias(const mi_params_t *params,
346+
struct mi_handler *async_hdl)
347+
{
348+
struct mi_cmd *cmds;
349+
struct mi_cmd_alias *aliases;
350+
str alias;
351+
int cmds_no, aliases_no;
352+
int cmd_idx = -1;
353+
int i;
354+
355+
if (get_mi_string_param(params, "alias", &alias.s, &alias.len) < 0)
356+
return init_mi_param_error();
357+
358+
get_mi_cmds(&cmds, &cmds_no);
359+
get_mi_cmd_aliases(&aliases, &aliases_no);
360+
for (i = 0; i < aliases_no; i++) {
361+
if (aliases[i].name.len != alias.len ||
362+
memcmp(aliases[i].name.s, alias.s, alias.len) != 0)
363+
continue;
364+
if (cmd_idx >= 0 && cmd_idx != aliases[i].cmd_idx)
365+
return init_mi_error(JSONRPC_AMBIG_METHOD_CODE,
366+
MI_SSTR(JSONRPC_AMBIG_METHOD_MSG));
367+
cmd_idx = aliases[i].cmd_idx;
368+
}
369+
370+
if (cmd_idx < 0 || cmd_idx >= cmds_no)
371+
return init_mi_error(404, MI_SSTR("unknown MI alias"));
372+
373+
return init_mi_result_string(cmds[cmd_idx].name.s,
374+
cmds[cmd_idx].name.len);
375+
}
376+
305377

306378
static mi_response_t *mi_ps(const mi_params_t *params,
307379
struct mi_handler *async_hdl)
@@ -1014,6 +1086,11 @@ static const mi_export_t mi_core_cmds[] = {
10141086
{mi_which_cmd, {"command", 0}},
10151087
{EMPTY_MI_RECIPE}}, {0}
10161088
},
1089+
{ "which_aliases", "lists all MI command aliases and their canonical commands", 0, 0, {
1090+
{mi_which_aliases, {0}},
1091+
{mi_which_alias, {"alias", 0}},
1092+
{EMPTY_MI_RECIPE}}, {0}
1093+
},
10171094
{ "ps", "lists all processes used by OpenSIPS", 0, 0, {
10181095
{mi_ps, {0}},
10191096
{EMPTY_MI_RECIPE}}, {0}

0 commit comments

Comments
 (0)