From 7db67f9ca7bbfb09d5ca06ad31a200356fc255d4 Mon Sep 17 00:00:00 2001 From: Mark Michelson <mmichelson@digium.com> Date: Mon, 2 Feb 2009 23:10:47 +0000 Subject: [PATCH] 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 --- CHANGES | 2 ++ main/manager.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/CHANGES b/CHANGES index cb8b7e5e38..604b9c8e24 100644 --- a/CHANGES +++ b/CHANGES @@ -295,6 +295,8 @@ IAX 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 references that particular configuration file. Also added "config list" which shows which configuration files are in use. diff --git a/main/manager.c b/main/manager.c index 20590126af..d5119bc04a 100644 --- a/main/manager.c +++ b/main/manager.c @@ -209,6 +209,8 @@ static AST_RWLIST_HEAD_STATIC(actions, manager_action); /*! \brief list of hooks registered */ 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 */ 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; } +/*! \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 */ 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_showmaneventq, "List manager interface queued events"), 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_mandebug, "Show, enable, disable debugging of the manager code"), AST_CLI_DEFINE(handle_manager_reload, "Reload manager configurations"), -- GitLab