mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-31 18:55:19 +00:00
Add a CLI command to log out a manager user
(closes issue #13877) Reported by: eliel Patches: cli_manager_logout.patch.txt uploaded by eliel (license 64) Tested by: eliel, putnopvut git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@173028 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
2
CHANGES
2
CHANGES
@@ -295,6 +295,8 @@ IAX Changes
|
|||||||
|
|
||||||
CLI Changes
|
CLI Changes
|
||||||
-----------
|
-----------
|
||||||
|
* New CLI command, "manager logout <username> [from <ipaddress>]" that will logout a
|
||||||
|
user manager based on the username and also (optional) on the ip address.
|
||||||
* New CLI command, "config reload <file.conf>" which reloads any module that
|
* New CLI command, "config reload <file.conf>" which reloads any module that
|
||||||
references that particular configuration file. Also added "config list"
|
references that particular configuration file. Also added "config list"
|
||||||
which shows which configuration files are in use.
|
which shows which configuration files are in use.
|
||||||
|
|||||||
@@ -209,6 +209,8 @@ static AST_RWLIST_HEAD_STATIC(actions, manager_action);
|
|||||||
/*! \brief list of hooks registered */
|
/*! \brief list of hooks registered */
|
||||||
static AST_RWLIST_HEAD_STATIC(manager_hooks, manager_custom_hook);
|
static AST_RWLIST_HEAD_STATIC(manager_hooks, manager_custom_hook);
|
||||||
|
|
||||||
|
static void free_session(struct mansession *s);
|
||||||
|
|
||||||
/*! \brief Add a custom hook to be called when an event is fired */
|
/*! \brief Add a custom hook to be called when an event is fired */
|
||||||
void ast_manager_register_hook(struct manager_custom_hook *hook)
|
void ast_manager_register_hook(struct manager_custom_hook *hook)
|
||||||
{
|
{
|
||||||
@@ -646,6 +648,74 @@ static char *handle_showmanagers(struct ast_cli_entry *e, int cmd, struct ast_cl
|
|||||||
return CLI_SUCCESS;
|
return CLI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! \brief Implement CLI command 'manager logout <user>' */
|
||||||
|
static char *handle_managerlogout(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
|
||||||
|
{
|
||||||
|
struct mansession *s = NULL;
|
||||||
|
char *ret = NULL;
|
||||||
|
size_t l;
|
||||||
|
int which = 0;
|
||||||
|
/*
|
||||||
|
char *choice[] = { "from", NULL };
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch (cmd) {
|
||||||
|
case CLI_INIT:
|
||||||
|
e->command = "manager logout";
|
||||||
|
e->usage =
|
||||||
|
"Usage: manager logout <user> [from <ipaddress>]\n"
|
||||||
|
" Logout a connected manager user.\n";
|
||||||
|
return NULL;
|
||||||
|
case CLI_GENERATE:
|
||||||
|
/*
|
||||||
|
if (a->pos == 3) {
|
||||||
|
return ast_cli_complete(a->word, choice, a->n);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
if (a->pos == 2) {
|
||||||
|
l = strlen(a->word);
|
||||||
|
AST_LIST_LOCK(&sessions);
|
||||||
|
AST_LIST_TRAVERSE(&sessions, s, list) {
|
||||||
|
if (!strncasecmp(a->word, s->username, l) && ++which > a->n ) {
|
||||||
|
ret = ast_strdup(s->username);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AST_LIST_UNLOCK(&sessions);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a->argc != 3 && a->argc != 5) {
|
||||||
|
return CLI_SHOWUSAGE;
|
||||||
|
} else if (a->argc == 5 && strcasecmp(a->argv[3], "from")) {
|
||||||
|
return CLI_SHOWUSAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
AST_LIST_LOCK(&sessions);
|
||||||
|
AST_LIST_TRAVERSE_SAFE_BEGIN(&sessions, s, list) {
|
||||||
|
if (!strcasecmp(s->username, a->argv[2])) {
|
||||||
|
if (a->argc == 5) {
|
||||||
|
/* compare ip address. */
|
||||||
|
if (strcmp(ast_inet_ntoa(s->sin.sin_addr), a->argv[4])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AST_LIST_REMOVE_CURRENT(list);
|
||||||
|
ast_mutex_lock(&s->__lock);
|
||||||
|
if (s->waiting_thread != AST_PTHREADT_NULL) {
|
||||||
|
pthread_kill(s->waiting_thread, SIGURG);
|
||||||
|
}
|
||||||
|
ast_mutex_unlock(&s->__lock);
|
||||||
|
ast_atomic_fetchadd_int(&num_sessions, -1);
|
||||||
|
free_session(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AST_LIST_TRAVERSE_SAFE_END;
|
||||||
|
AST_LIST_UNLOCK(&sessions);
|
||||||
|
|
||||||
|
return CLI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/*! \brief CLI command manager list commands */
|
/*! \brief CLI command manager list commands */
|
||||||
static char *handle_showmancmds(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
|
static char *handle_showmancmds(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
|
||||||
@@ -762,6 +832,7 @@ static struct ast_cli_entry cli_manager[] = {
|
|||||||
AST_CLI_DEFINE(handle_showmanconn, "List connected manager interface users"),
|
AST_CLI_DEFINE(handle_showmanconn, "List connected manager interface users"),
|
||||||
AST_CLI_DEFINE(handle_showmaneventq, "List manager interface queued events"),
|
AST_CLI_DEFINE(handle_showmaneventq, "List manager interface queued events"),
|
||||||
AST_CLI_DEFINE(handle_showmanagers, "List configured manager users"),
|
AST_CLI_DEFINE(handle_showmanagers, "List configured manager users"),
|
||||||
|
AST_CLI_DEFINE(handle_managerlogout, "Logout a manager user"),
|
||||||
AST_CLI_DEFINE(handle_showmanager, "Display information on a specific manager user"),
|
AST_CLI_DEFINE(handle_showmanager, "Display information on a specific manager user"),
|
||||||
AST_CLI_DEFINE(handle_mandebug, "Show, enable, disable debugging of the manager code"),
|
AST_CLI_DEFINE(handle_mandebug, "Show, enable, disable debugging of the manager code"),
|
||||||
AST_CLI_DEFINE(handle_manager_reload, "Reload manager configurations"),
|
AST_CLI_DEFINE(handle_manager_reload, "Reload manager configurations"),
|
||||||
|
|||||||
Reference in New Issue
Block a user