Codename Pineapple

Home page | Mailing list | Docs

Last updated: Sat Feb 3 05:01:37 2007

Asterisk developer's documentation :: Codename Pineapple


manager.h File Reference


Detailed Description

The AMI - Asterisk Manager Interface - is a TCP protocol created to manage Asterisk with third-party software.

Manager protocol packages are text fields of the form a: b. There is always exactly one space after the colon.

The first header type is the "Event" header. Other headers vary from event to event. Headers end with standard
termination. The last line of the manager response or event is an empty line. (
)

Please try to re-use existing headers to simplify manager message parsing in clients. Don't re-use an existing header with a new meaning, please. You can find a reference of standard headers in doc/manager.txt

Definition in file manager.h.

#include <stdarg.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "asterisk/lock.h"

Include dependency graph for manager.h:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  manager_action
struct  manager_custom_hook
struct  message

Defines

#define ast_manager_register(a, b, c, d)   ast_manager_register2(a, b, c, d, NULL)
#define AST_MAX_MANHEADERS   80
#define DEFAULT_MANAGER_PORT   5038
#define EVENT_FLAG_AGENT   (1 << 5)
#define EVENT_FLAG_CALL   (1 << 1)
#define EVENT_FLAG_COMMAND   (1 << 4)
#define EVENT_FLAG_CONFIG   (1 << 7)
#define EVENT_FLAG_LOG   (1 << 2)
#define EVENT_FLAG_SYSTEM   (1 << 0)
#define EVENT_FLAG_USER   (1 << 6)
#define EVENT_FLAG_VERBOSE   (1 << 3)
#define manager_event(category, event, contents,)   __manager_event(category, event, __FILE__, __LINE__, __PRETTY_FUNCTION__, contents , ## __VA_ARGS__)

Typedefs

typedef int(* manager_hook_t )(int, const char *, char *)

Functions

void __attribute__ ((format(printf, 2, 3))) astman_append(struct mansession *s
int __attribute__ ((format(printf, 6, 7))) __manager_event(int category
int ast_manager_register2 (const char *action, int authority, int(*func)(struct mansession *s, const struct message *m), const char *synopsis, const char *description)
 register a new command with manager, including online help. This is the preferred way to register a manager command
void ast_manager_register_hook (struct manager_custom_hook *hook)
 Add a custom hook to be called when an event is fired.
int ast_manager_unregister (char *action)
void ast_manager_unregister_hook (struct manager_custom_hook *hook)
 Delete a custom hook to be called when an event is fired.
int const char const char
int const char const char
const char * 
astman_get_header (const struct message *m, char *var)
ast_variableastman_get_variables (const struct message *m)
void astman_send_ack (struct mansession *s, const struct message *m, char *msg)
void astman_send_error (struct mansession *s, const struct message *m, char *error)
void astman_send_listack (struct mansession *s, const struct message *m, char *msg, char *listflag)
void astman_send_response (struct mansession *s, const struct message *m, char *resp, char *msg)
void const char int init_manager (void)
int reload_manager (void)

Variables

int const char const char
int const char const char * 
contents
int const char * event
int const char const char * file
void const char * fmt
int const char const char
int const char * 
func
int const char const char int line


Define Documentation

#define ast_manager_register a,
b,
c,
 )     ast_manager_register2(a, b, c, d, NULL)
 

Definition at line 107 of file manager.h.

Referenced by astdb_init(), init_manager(), and load_module().

#define AST_MAX_MANHEADERS   80
 

Definition at line 60 of file manager.h.

Referenced by do_message().

#define DEFAULT_MANAGER_PORT   5038
 

Definition at line 48 of file manager.h.

Referenced by init_manager().

#define EVENT_FLAG_AGENT   (1 << 5)
 

Definition at line 55 of file manager.h.

Referenced by __login_exec(), agent_logoff_maintenance(), and load_module().

#define EVENT_FLAG_CALL   (1 << 1)
 

Definition at line 51 of file manager.h.

Referenced by ast_change_name(), ast_channel_bridge(), ast_do_masquerade(), ast_hangup(), ast_set_callerid(), ast_setstate(), fast_originate(), init_manager(), load_module(), manager_state_cb(), park_exec(), pbx_extension_helper(), post_manager_event(), realtime_exec(), and socket_process().

#define EVENT_FLAG_COMMAND   (1 << 4)
 

Definition at line 54 of file manager.h.

Referenced by init_manager().

#define EVENT_FLAG_CONFIG   (1 << 7)
 

Definition at line 57 of file manager.h.

Referenced by init_manager(), and manager_show_dialplan().

#define EVENT_FLAG_LOG   (1 << 2)
 

Definition at line 52 of file manager.h.

#define EVENT_FLAG_SYSTEM   (1 << 0)
 

Definition at line 50 of file manager.h.

Referenced by __expire_registry(), __iax2_poke_noanswer(), astdb_init(), expire_register(), handle_init_event(), handle_response_peerpoke(), handle_response_register(), iax2_ack_registry(), load_module(), logger_print_normal(), parse_register_contact(), register_verify(), reload_logger(), reload_manager(), sip_cli_and_manager_commands_register(), sip_poke_noanswer(), sip_reg_timeout(), socket_process(), ss_thread(), update_registry(), and zt_handle_event().

#define EVENT_FLAG_USER   (1 << 6)
 

Definition at line 56 of file manager.h.

Referenced by aji_log_hook(), and init_manager().

#define EVENT_FLAG_VERBOSE   (1 << 3)
 

Definition at line 53 of file manager.h.

#define manager_event category,
event,
contents   )     __manager_event(category, event, __FILE__, __LINE__, __PRETTY_FUNCTION__, contents , ## __VA_ARGS__)
 

Parameters:
category Event category, matches manager authorization
event Event name
contents Contents of event

Definition at line 138 of file manager.h.

Referenced by __expire_registry(), __iax2_poke_noanswer(), __login_exec(), agent_logoff_maintenance(), aji_log_hook(), ast_change_name(), ast_channel_bridge(), ast_do_masquerade(), ast_hangup(), ast_set_callerid(), ast_setstate(), expire_register(), fast_originate(), handle_init_event(), handle_response_peerpoke(), handle_response_register(), iax2_ack_registry(), logger_print_normal(), manager_show_dialplan(), manager_state_cb(), park_exec(), parse_register_contact(), pbx_extension_helper(), post_manager_event(), realtime_exec(), register_verify(), reload_logger(), reload_manager(), sip_poke_noanswer(), sip_reg_timeout(), socket_process(), ss_thread(), update_registry(), and zt_handle_event().


Typedef Documentation

typedef int(* manager_hook_t)(int, const char *, char *)
 

Definition at line 63 of file manager.h.


Function Documentation

void __attribute__ (format(printf, 2, 3))   ) 
 

int __attribute__ (format(printf, 6, 7))   ) 
 

void const char int init_manager void   ) 
 

Called by Asterisk initialization

Definition at line 2931 of file manager.c.

References action_challenge(), action_command(), action_events(), action_extensionstate(), action_getconfig(), action_getvar(), action_hangup(), action_listcommands(), action_login(), action_logoff(), action_mailboxcount(), action_mailboxstatus(), action_originate(), action_ping(), action_redirect(), action_sendtext(), action_setvar(), action_status(), action_timeout(), action_updateconfig(), action_userevent(), action_waitevent(), ahp, ami_desc, ami_tls_cfg, amis_desc, append_event(), AST_CERTFILE, ast_cli_register_multiple(), ast_config_load(), ast_extension_state_add(), ast_gethostbyname(), ast_log(), ast_manager_register, ast_manager_register2(), ast_strdup, ast_true(), ast_variable_browse(), tls_config::certfile, tls_config::cipher, cli_manager, DEFAULT_MANAGER_PORT, tls_config::enabled, enabled, EVENT_FLAG_CALL, EVENT_FLAG_COMMAND, EVENT_FLAG_CONFIG, EVENT_FLAG_USER, free, hp, LOG_NOTICE, manager_state_cb(), mandescr_command, mandescr_events, mandescr_extensionstate, mandescr_getconfig, mandescr_getvar, mandescr_hangup, mandescr_listcommands, mandescr_logoff, mandescr_mailboxcount, mandescr_mailboxstatus, mandescr_originate, mandescr_ping, mandescr_redirect, mandescr_sendtext, mandescr_setvar, mandescr_timeout, mandescr_updateconfig, mandescr_userevent, mandescr_waitevent, server_args::sin, and var.

Referenced by reload_manager().

02932 {
02933    struct ast_config *cfg = NULL;
02934    const char *val;
02935    char *cat = NULL;
02936    int webenabled = 0;
02937    int enabled = 0;
02938    int newhttptimeout = 60;
02939    int have_sslbindaddr = 0;
02940    struct hostent *hp;
02941    struct ast_hostent ahp;
02942    struct ast_manager_user *user = NULL;
02943    struct ast_variable *var;
02944 
02945    if (!registered) {
02946       /* Register default actions */
02947       ast_manager_register2("Ping", 0, action_ping, "Keepalive command", mandescr_ping);
02948       ast_manager_register2("Events", 0, action_events, "Control Event Flow", mandescr_events);
02949       ast_manager_register2("Logoff", 0, action_logoff, "Logoff Manager", mandescr_logoff);
02950       ast_manager_register2("Login", 0, action_login, "Login Manager", NULL);
02951       ast_manager_register2("Challenge", 0, action_challenge, "Generate Challenge for MD5 Auth", NULL);
02952       ast_manager_register2("Hangup", EVENT_FLAG_CALL, action_hangup, "Hangup Channel", mandescr_hangup);
02953       ast_manager_register("Status", EVENT_FLAG_CALL, action_status, "Lists channel status" );
02954       ast_manager_register2("Setvar", EVENT_FLAG_CALL, action_setvar, "Set Channel Variable", mandescr_setvar );
02955       ast_manager_register2("Getvar", EVENT_FLAG_CALL, action_getvar, "Gets a Channel Variable", mandescr_getvar );
02956       ast_manager_register2("GetConfig", EVENT_FLAG_CONFIG, action_getconfig, "Retrieve configuration", mandescr_getconfig);
02957       ast_manager_register2("UpdateConfig", EVENT_FLAG_CONFIG, action_updateconfig, "Update basic configuration", mandescr_updateconfig);
02958       ast_manager_register2("Redirect", EVENT_FLAG_CALL, action_redirect, "Redirect (transfer) a call", mandescr_redirect );
02959       ast_manager_register2("Originate", EVENT_FLAG_CALL, action_originate, "Originate Call", mandescr_originate);
02960       ast_manager_register2("Command", EVENT_FLAG_COMMAND, action_command, "Execute Asterisk CLI Command", mandescr_command );
02961       ast_manager_register2("ExtensionState", EVENT_FLAG_CALL, action_extensionstate, "Check Extension Status", mandescr_extensionstate );
02962       ast_manager_register2("AbsoluteTimeout", EVENT_FLAG_CALL, action_timeout, "Set Absolute Timeout", mandescr_timeout );
02963       ast_manager_register2("MailboxStatus", EVENT_FLAG_CALL, action_mailboxstatus, "Check Mailbox", mandescr_mailboxstatus );
02964       ast_manager_register2("MailboxCount", EVENT_FLAG_CALL, action_mailboxcount, "Check Mailbox Message Count", mandescr_mailboxcount );
02965       ast_manager_register2("ListCommands", 0, action_listcommands, "List available manager commands", mandescr_listcommands);
02966       ast_manager_register2("SendText", EVENT_FLAG_CALL, action_sendtext, "Send text message to channel", mandescr_sendtext);
02967       ast_manager_register2("UserEvent", EVENT_FLAG_USER, action_userevent, "Send an arbitrary event", mandescr_userevent);
02968       ast_manager_register2("WaitEvent", 0, action_waitevent, "Wait for an event to occur", mandescr_waitevent);
02969 
02970       ast_cli_register_multiple(cli_manager, sizeof(cli_manager) / sizeof(struct ast_cli_entry));
02971       ast_extension_state_add(NULL, NULL, manager_state_cb, NULL);
02972       registered = 1;
02973       /* Append placeholder event so master_eventq never runs dry */
02974       append_event("Event: Placeholder\r\n\r\n", 0);
02975    }
02976    displayconnects = 1;
02977    cfg = ast_config_load("manager.conf");
02978    if (!cfg) {
02979       ast_log(LOG_NOTICE, "Unable to open management configuration manager.conf.  Call management disabled.\n");
02980       return 0;
02981    }
02982 
02983    /* default values */
02984    memset(&ami_desc.sin, 0, sizeof(struct sockaddr_in));
02985    memset(&amis_desc.sin, 0, sizeof(amis_desc.sin));
02986    amis_desc.sin.sin_port = htons(5039);
02987    ami_desc.sin.sin_port = htons(DEFAULT_MANAGER_PORT);
02988 
02989    ami_tls_cfg.enabled = 0;
02990    if (ami_tls_cfg.certfile)
02991       free(ami_tls_cfg.certfile);
02992    ami_tls_cfg.certfile = ast_strdup(AST_CERTFILE);
02993    if (ami_tls_cfg.cipher)
02994       free(ami_tls_cfg.cipher);
02995    ami_tls_cfg.cipher = ast_strdup("");
02996 
02997    for (var = ast_variable_browse(cfg, "general"); var; var = var->next) {
02998       val = var->value;
02999       if (!strcasecmp(var->name, "ssenable"))
03000          ami_tls_cfg.enabled = ast_true(val);
03001       else if (!strcasecmp(var->name, "ssbindport"))
03002          amis_desc.sin.sin_port = htons(atoi(val));
03003       else if (!strcasecmp(var->name, "ssbindaddr")) {
03004          if ((hp = ast_gethostbyname(val, &ahp))) {
03005             memcpy(&amis_desc.sin.sin_addr, hp->h_addr, sizeof(amis_desc.sin.sin_addr));
03006             have_sslbindaddr = 1;
03007          } else {
03008             ast_log(LOG_WARNING, "Invalid bind address '%s'\n", val);
03009          }
03010       } else if (!strcasecmp(var->name, "sslcert")) {
03011          free(ami_tls_cfg.certfile);
03012          ami_tls_cfg.certfile = ast_strdup(val);
03013       } else if (!strcasecmp(var->name, "sslcipher")) {
03014          free(ami_tls_cfg.cipher);
03015          ami_tls_cfg.cipher = ast_strdup(val);
03016       } else if (!strcasecmp(var->name, "enabled")) {
03017          enabled = ast_true(val);
03018       } else if (!strcasecmp(var->name, "block-sockets")) {
03019          block_sockets = ast_true(val);
03020       } else if (!strcasecmp(var->name, "webenabled")) {
03021          webenabled = ast_true(val);
03022       } else if (!strcasecmp(var->name, "port")) {
03023          ami_desc.sin.sin_port = htons(atoi(val));
03024       } else if (!strcasecmp(var->name, "bindaddr")) {
03025          if (!inet_aton(val, &ami_desc.sin.sin_addr)) {
03026             ast_log(LOG_WARNING, "Invalid address '%s' specified, using 0.0.0.0\n", val);
03027             memset(&ami_desc.sin.sin_addr, 0, sizeof(ami_desc.sin.sin_addr));
03028          }
03029       } else if (!strcasecmp(var->name, "displayconnects")) {
03030          displayconnects = ast_true(val);
03031       } else if (!strcasecmp(var->name, "timestampevents")) {
03032          timestampevents = ast_true(val);
03033       } else if (!strcasecmp(var->name, "debug")) {
03034          manager_debug = ast_true(val);
03035       } else if (!strcasecmp(var->name, "httptimeout")) {
03036          newhttptimeout = atoi(val);
03037       } else {
03038          ast_log(LOG_NOTICE, "Invalid keyword <%s> = <%s> in manager.conf [general]\n",
03039             var->name, val);
03040       }  
03041    }
03042 
03043    if (enabled)
03044       ami_desc.sin.sin_family = AF_INET;
03045    if (!have_sslbindaddr)
03046       amis_desc.sin.sin_addr = ami_desc.sin.sin_addr;
03047    if (ami_tls_cfg.enabled)
03048       amis_desc.sin.sin_family = AF_INET;
03049 
03050    
03051    AST_LIST_LOCK(&users);
03052 
03053    while ((cat = ast_category_browse(cfg, cat))) {
03054 
03055       if (!strcasecmp(cat, "general"))
03056          continue;
03057 
03058       /* Look for an existing entry, if none found - create one and add it to the list */
03059       if (!(user = get_manager_by_name_locked(cat))) {
03060          if (!(user = ast_calloc(1, sizeof(*user))))
03061             break;
03062          /* Copy name over */
03063          ast_copy_string(user->username, cat, sizeof(user->username));
03064          /* Insert into list */
03065          AST_LIST_INSERT_TAIL(&users, user, list);
03066       }
03067 
03068       /* Make sure we keep this user and don't destroy it during cleanup */
03069       user->keep = 1;
03070 
03071       var = ast_variable_browse(cfg, cat);
03072       while (var) {
03073          if (!strcasecmp(var->name, "secret")) {
03074             if (user->secret)
03075                free(user->secret);
03076             user->secret = ast_strdup(var->value);
03077          } else if (!strcasecmp(var->name, "deny") ) {
03078             if (user->deny)
03079                free(user->deny);
03080             user->deny = ast_strdup(var->value);
03081          } else if (!strcasecmp(var->name, "permit") ) {
03082             if (user->permit)
03083                free(user->permit);
03084             user->permit = ast_strdup(var->value);
03085          }  else if (!strcasecmp(var->name, "read") ) {
03086             if (user->read)
03087                free(user->read);
03088             user->read = ast_strdup(var->value);
03089          }  else if (!strcasecmp(var->name, "write") ) {
03090             if (user->write)
03091                free(user->write);
03092             user->write = ast_strdup(var->value);
03093          }  else if (!strcasecmp(var->name, "displayconnects") )
03094             user->displayconnects = ast_true(var->value);
03095          else {
03096             if (option_debug)
03097                ast_log(LOG_DEBUG, "%s is an unknown option.\n", var->name);
03098          }
03099          var = var->next;
03100       }
03101    }
03102 
03103    /* Perform cleanup - essentially prune out old users that no longer exist */
03104    AST_LIST_TRAVERSE_SAFE_BEGIN(&users, user, list) {
03105       if (user->keep) { /* valid record. clear flag for the next round */
03106          user->keep = 0;
03107          continue;
03108       }
03109       /* We do not need to keep this user so take them out of the list */
03110       AST_LIST_REMOVE_CURRENT(&users, list);
03111       /* Free their memory now */
03112       if (user->secret)
03113          free(user->secret);
03114       if (user->deny)
03115          free(user->deny);
03116       if (user->permit)
03117          free(user->permit);
03118       if (user->read)
03119          free(user->read);
03120       if (user->write)
03121          free(user->write);
03122       free(user);
03123    }
03124    AST_LIST_TRAVERSE_SAFE_END
03125 
03126    AST_LIST_UNLOCK(&users);
03127 
03128    ast_config_destroy(cfg);
03129 
03130    if (webenabled && enabled) {
03131       if (!webregged) {
03132          ast_http_uri_link(&rawmanuri);
03133          ast_http_uri_link(&manageruri);
03134          ast_http_uri_link(&managerxmluri);
03135          webregged = 1;
03136       }
03137    } else {
03138       if (webregged) {
03139          ast_http_uri_unlink(&rawmanuri);
03140          ast_http_uri_unlink(&manageruri);
03141          ast_http_uri_unlink(&managerxmluri);
03142          webregged = 0;
03143       }
03144    }
03145 
03146    if (newhttptimeout > 0)
03147       httptimeout = newhttptimeout;
03148 
03149    server_start(&ami_desc);
03150    if (ssl_setup(amis_desc.tls_cfg))
03151       server_start(&amis_desc);
03152    return 0;
03153 }

int reload_manager void   ) 
 

Definition at line 3155 of file manager.c.

References EVENT_FLAG_SYSTEM, init_manager(), and manager_event.

03156 {
03157    manager_event(EVENT_FLAG_SYSTEM, "Reload", "Message: Reload Requested\r\n");
03158    return init_manager();
03159 }


Variable Documentation

int const char const char int const char const char* contents
 

Definition at line 141 of file manager.h.

int const char* event
 

Definition at line 141 of file manager.h.

Referenced by action_userevent(), ast_rtp_read(), handle_request_info(), handle_request_notify(), handle_request_subscribe(), handle_soft_key_event_message(), handle_stimulus_message(), process_cisco_dtmf(), and process_rfc2833().

int const char const char* file
 

Definition at line 141 of file manager.h.

Referenced by ast_smdi_mwi_set(), ast_smdi_mwi_unset(), handle_save_dialplan(), and loadModule().

void const char* fmt
 

Definition at line 157 of file manager.h.

Referenced by __oh323_new(), add_codec_to_sdp(), ast_cdr_getvar(), ast_cli_netstats(), ast_openvstream(), ast_request(), ast_rtp_write(), ast_streamfile(), get_filestream(), gtalk_new(), handle_open_receive_channel_ack_message(), iax2_request(), jingle_new(), local_new(), mgcp_new(), setformat(), sip_new(), skinny_new(), transmit_connect(), and try_suggested_sip_codec().

int const char const char int const char* func
 

Definition at line 141 of file manager.h.

Referenced by __ast_read(), ss_thread(), and zt_indicate().

int const char const char int line
 

Definition at line 141 of file manager.h.

Referenced by find_line_by_name(), and misdn_cfg_update_ptp().


Asterisk is a trademark for Digium, inc.. | Edvina.net | Asterisk.org | This documentation was generated with Doxygen