]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Add a "console active" CLI command, which lets you find out which console device
authorRussell Bryant <russell@russellbryant.com>
Sun, 20 Jan 2008 07:28:23 +0000 (07:28 +0000)
committerRussell Bryant <russell@russellbryant.com>
Sun, 20 Jan 2008 07:28:23 +0000 (07:28 +0000)
is currently active for the Asterisk CLI, or to set it.  Also, knock multiple device
support off of the to-do list.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@99248 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_console.c

index 59bdcac269dbf439e665f805248037189c81a932..cd6170e98f5a4b8b25ad78defca0c9dcf6549c6f 100644 (file)
@@ -41,8 +41,6 @@
  * in at least one of the other console channel drivers that are not yet
  * implemented here are:
  *
- * - Multiple device support
- *   - with "active" CLI command
  * - Set Auto-answer from the dialplan
  * - transfer CLI command
  * - boost CLI command and .conf option
@@ -1129,6 +1127,87 @@ static char *cli_console_sendtext(struct ast_cli_entry *e, int cmd, struct ast_c
        return CLI_SUCCESS;
 }
 
+static void set_active(struct console_pvt *pvt, const char *value)
+{
+       if (pvt == &globals) {
+               ast_log(LOG_ERROR, "active is only valid as a per-device setting\n");
+               return;
+       }
+
+       if (!ast_true(value))
+               return;
+
+       ast_rwlock_wrlock(&active_lock);
+       if (active_pvt)
+               unref_pvt(active_pvt);
+       active_pvt = ref_pvt(pvt);
+       ast_rwlock_unlock(&active_lock);
+}
+
+static char *cli_console_active(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+       struct console_pvt *pvt;
+
+       switch (cmd) {
+       case CLI_INIT:
+               e->command = "console active";
+               e->usage =
+                       "Usage: console active [device]\n"
+                       "       If no device is specified.  The active console device will be shown.\n"
+                       "Otherwise, the specified device will become the console device active for\n"
+                       "the Asterisk CLI.\n";
+               return NULL;
+       case CLI_GENERATE:
+               if (a->pos == e->args) {
+                       struct ao2_iterator i;
+                       int x = 0;
+                       char *res = NULL;
+                       i = ao2_iterator_init(pvts, 0);
+                       while ((pvt = ao2_iterator_next(&i))) {
+                               if (++x > a->n && !strncasecmp(pvt->name, a->word, strlen(a->word)))
+                                       res = ast_strdup(pvt->name);
+                               unref_pvt(pvt);
+                               if (res)
+                                       return res;
+                       }
+               }
+               return NULL;
+       }
+
+       if (a->argc < e->args)
+               return CLI_SHOWUSAGE;
+
+       if (a->argc == e->args) {
+               pvt = get_active_pvt();
+
+               if (!pvt)
+                       ast_cli(a->fd, "No device is currently set as the active console device.\n");
+               else {
+                       console_pvt_lock(pvt);
+                       ast_cli(a->fd, "The active console device is '%s'.\n", pvt->name);
+                       console_pvt_unlock(pvt);
+                       pvt = unref_pvt(pvt);
+               }
+
+               return CLI_SUCCESS;
+       }
+
+       if (!(pvt = find_pvt(a->argv[e->args]))) {
+               ast_cli(a->fd, "Could not find a device called '%s'.\n", a->argv[e->args]);
+               return CLI_FAILURE;
+       }
+
+       set_active(pvt, "yes");
+
+       console_pvt_lock(pvt);
+       ast_cli(a->fd, "The active console device has been set to '%s'\n", pvt->name);
+       console_pvt_unlock(pvt);
+
+       unref_pvt(pvt);
+
+       return CLI_SUCCESS;
+}
+
 static struct ast_cli_entry cli_console[] = {
        AST_CLI_DEFINE(cli_console_dial,       "Dial an extension from the console"),
        AST_CLI_DEFINE(cli_console_hangup,     "Hangup a call on the console"),
@@ -1139,6 +1218,7 @@ static struct ast_cli_entry cli_console[] = {
        AST_CLI_DEFINE(cli_console_autoanswer, "Turn autoanswer on or off"),
        AST_CLI_DEFINE(cli_list_available,     "List available devices"),
        AST_CLI_DEFINE(cli_list_devices,       "List configured devices"),
+       AST_CLI_DEFINE(cli_console_active,     "View or Set the active console device"),
 };
 
 /*!
@@ -1187,23 +1267,6 @@ static void store_callerid(struct console_pvt *pvt, const char *value)
        ast_string_field_set(pvt, cid_num, cid_num);
 }
 
-static void set_active(struct console_pvt *pvt, const char *value)
-{
-       if (pvt == &globals) {
-               ast_log(LOG_ERROR, "active is only valid as a per-device setting\n");
-               return;
-       }
-
-       if (!ast_true(value))
-               return;
-
-       ast_rwlock_wrlock(&active_lock);
-       if (active_pvt)
-               unref_pvt(active_pvt);
-       active_pvt = ref_pvt(pvt);
-       ast_rwlock_unlock(&active_lock);
-}
-
 /*!
  * \brief Store a configuration parameter in a pvt struct
  *