Index: apps/app_agents.c =================================================================== --- apps/app_agents.c (revisión: 143073) +++ apps/app_agents.c (copia de trabajo) @@ -105,6 +105,14 @@ " AgentCall2(Agent Name):\n" "Attempts to talk to the given agent. Always returns -1."; +static const char mandescr_agents2[] = +"Description: Will list info about all possible agents.\n" +"Variables: NONE\n"; + +static const char mandescr_agents2_available[] = +"Description: Will list info about all available agents.\n" +"Variables: NONE\n"; + /*! \brief State that the agent should be in */ enum agent2_state { AGENT2_STATE_NONE = 0, /*!< Agent is not present */ @@ -920,9 +928,104 @@ return CLI_SUCCESS; } +/*! \brief CLI command to show all available agents */ +static char *agents2_show_available(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + struct agent2_agent *agent; + struct ao2_iterator i; + int total_available = 0; + + switch (cmd) { + case CLI_INIT: + e->command = "agents2 show available"; + e->usage = + "Usage: agents2 show available\n" + " Provides a list of all available agents.\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + i = ao2_iterator_init(agents, 0); + + for (; (agent = ao2_iterator_next(&i)); ao2_ref(agent, -1)) { + if (!(agent->state == AGENT2_STATE_NONE || agent->state == AGENT2_STATE_HANGUP)) { + ast_cli(a->fd, "%s(%s) %s\n", agent->name, agent2_type2text(agent->type), agent2_state2text(agent->state)); + total_available++; + } + } + + ast_cli(a->fd, "%d agents available\n\n", total_available); + + return CLI_SUCCESS; +} + +/*! \brief Lists agents and their status to the Manager API. */ +static int action_agents2(struct mansession *s, const struct message *m) +{ + struct agent2_agent *agent; + struct ao2_iterator i; + const char *id = astman_get_header(m,"ActionID"); + char idText[256] = ""; + + if (!ast_strlen_zero(id)) + snprintf(idText, sizeof(idText) ,"ActionID: %s\r\n", id); + astman_send_ack(s, m, "Agents2 will follow"); + + i = ao2_iterator_init(agents, 0); + + for (; (agent = ao2_iterator_next(&i)); ao2_ref(agent, -1)) { + astman_append(s, "Event: Agents2\r\n" + "Agent: %s\r\n" + "Type: %s\r\n" + "Status: %s\r\n" + "%s" + "\r\n", + agent->name, agent2_type2text(agent->type), agent2_state2text(agent->state), idText); + } + + astman_append(s, "Event: Agents2Complete\r\n" + "%s" + "\r\n",idText); + return 0; +} + +/*! \brief Lists available agents and their status to the Manager API. */ +static int action_agents2_available(struct mansession *s, const struct message *m) +{ + struct agent2_agent *agent; + struct ao2_iterator i; + const char *id = astman_get_header(m,"ActionID"); + char idText[256] = ""; + + if (!ast_strlen_zero(id)) + snprintf(idText, sizeof(idText) ,"ActionID: %s\r\n", id); + astman_send_ack(s, m, "Agents2Available will follow"); + + i = ao2_iterator_init(agents, 0); + + for (; (agent = ao2_iterator_next(&i)); ao2_ref(agent, -1)) { + if (!(agent->state == AGENT2_STATE_NONE || agent->state == AGENT2_STATE_HANGUP)) { + astman_append(s, "Event: Agents2Available\r\n" + "Agent: %s\r\n" + "Type: %s\r\n" + "Status: %s\r\n" + "%s" + "\r\n", + agent->name, agent2_type2text(agent->type), agent2_state2text(agent->state), idText); + } + } + + astman_append(s, "Event: Agents2AvailableComplete\r\n" + "%s" + "\r\n",idText); + return 0; +} + /*! \brief CLI commands to interact with things */ static struct ast_cli_entry cli_agents2[] = { AST_CLI_DEFINE(agents2_show, "Show status of agents"), + AST_CLI_DEFINE(agents2_show_available, "Show status of available agents"), }; /*! \brief Function called when module should be reloaded */ @@ -946,6 +1049,9 @@ ast_register_application(app, agent2_login, synopsis, descrip); ast_register_application(app2, agent2_call, synopsis2, descrip2); + ast_manager_register2("Agents2", EVENT_FLAG_AGENT, action_agents2, "Lists agents and their status", mandescr_agents2); + ast_manager_register2("Agents2Available", EVENT_FLAG_AGENT, action_agents2_available, "Lists available agents and their status", mandescr_agents2_available); + ast_cli_register_multiple(cli_agents2, sizeof(cli_agents2) / sizeof(struct ast_cli_entry)); return AST_MODULE_LOAD_SUCCESS; @@ -957,6 +1063,8 @@ ast_cli_unregister_multiple(cli_agents2, sizeof(cli_agents2) / sizeof(struct ast_cli_entry)); ast_unregister_application(app); ast_unregister_application(app2); + ast_manager_unregister("Agents2"); + ast_manager_unregister("Agents2Available"); ast_devstate_prov_del("Agent"); ao2_ref(agents, -1);