#include <stdarg.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <asterisk/lock.h>Go to the source code of this file.
Defines | |
| #define | DEFAULT_MANAGER_PORT 5038 |
| #define | EVENT_FLAG_SYSTEM (1 << 0) |
| #define | EVENT_FLAG_CALL (1 << 1) |
| #define | EVENT_FLAG_LOG (1 << 2) |
| #define | EVENT_FLAG_VERBOSE (1 << 3) |
| #define | EVENT_FLAG_COMMAND (1 << 4) |
| #define | EVENT_FLAG_AGENT (1 << 5) |
| #define | EVENT_FLAG_USER (1 << 6) |
| #define | MAX_HEADERS 80 |
| #define | MAX_LEN 256 |
| #define | ast_manager_register(a, b, c, d) ast_manager_register2(a, b, c, d, NULL) |
Functions | |
| int | ast_carefulwrite (int fd, char *s, int len, int timeoutms) |
| int | ast_manager_register2 (char *action, int authority, int(*func)(struct mansession *s, struct message *m), char *synopsis, char *description) |
| int | ast_manager_unregister (char *action) |
| int | manager_event (int category, char *event, char *contents,...) __attribute__((format(printf |
| int char * | astman_get_header (struct message *m, char *var) |
| void | astman_send_error (struct mansession *s, struct message *m, char *error) |
| void | astman_send_response (struct mansession *s, struct message *m, char *resp, char *msg) |
| void | astman_send_ack (struct mansession *s, struct message *m, char *msg) |
| int | init_manager (void) |
| int | reload_manager (void) |
|
|
Definition at line 97 of file manager.h. Referenced by init_manager(). |
|
|
Definition at line 42 of file manager.h. Referenced by init_manager(). |
|
|
|
|
|
Definition at line 45 of file manager.h. Referenced by ast_change_name(), ast_channel_bridge(), ast_do_masquerade(), ast_hangup(), ast_request(), ast_set_callerid(), ast_setstate(), and init_manager(). |
|
|
Definition at line 48 of file manager.h. Referenced by init_manager(). |
|
|
|
|
|
Definition at line 44 of file manager.h. Referenced by reload_manager(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
Definition at line 91 of file manager.c. References pollfd::events, pollfd::fd, poll(), and POLLOUT. Referenced by ast_cli(), and manager_event(). 00092 {
00093 /* Try to write string, but wait no more than ms milliseconds
00094 before timing out */
00095 int res=0;
00096 struct pollfd fds[1];
00097 while(len) {
00098 res = write(fd, s, len);
00099 if ((res < 0) && (errno != EAGAIN)) {
00100 return -1;
00101 }
00102 if (res < 0) res = 0;
00103 len -= res;
00104 s += res;
00105 fds[0].fd = fd;
00106 fds[0].events = POLLOUT;
00107 /* Wait until writable again */
00108 res = poll(fds, 1, timeoutms);
00109 if (res < 1)
00110 return -1;
00111 }
00112 return res;
00113 }
|
|
||||||||||||||||||||||||
|
Definition at line 1584 of file manager.c. References manager_action::action, ast_log(), ast_mutex_unlock, manager_action::authority, manager_action::description, manager_action::func, LOG_WARNING, malloc, manager_action::next, and manager_action::synopsis. Referenced by init_manager(). 01585 {
01586 struct manager_action *cur;
01587
01588 cur = malloc(sizeof(struct manager_action));
01589 if (!cur) {
01590 ast_log(LOG_WARNING, "Manager: out of memory trying to register action\n");
01591 ast_mutex_unlock(&actionlock);
01592 return -1;
01593 }
01594 cur->action = action;
01595 cur->authority = auth;
01596 cur->func = func;
01597 cur->synopsis = synopsis;
01598 cur->description = description;
01599 cur->next = NULL;
01600
01601 ast_manager_register_struct(cur);
01602
01603 return 0;
01604 }
|
|
|
Definition at line 1516 of file manager.c. References manager_action::action, ast_mutex_lock, ast_mutex_unlock, ast_verbose(), free, manager_action::next, option_verbose, and VERBOSE_PREFIX_2. 01516 {
01517 struct manager_action *cur = first_action, *prev = first_action;
01518
01519 ast_mutex_lock(&actionlock);
01520 while( cur ) {
01521 if (!strcasecmp(action, cur->action)) {
01522 prev->next = cur->next;
01523 free(cur);
01524 if (option_verbose > 1)
01525 ast_verbose(VERBOSE_PREFIX_2 "Manager unregistered action %s\n", action);
01526 ast_mutex_unlock(&actionlock);
01527 return 0;
01528 }
01529 prev = cur;
01530 cur = cur->next;
01531 }
01532 ast_mutex_unlock(&actionlock);
01533 return 0;
01534 }
|
|
||||||||||||
|
Definition at line 262 of file manager.c. References message::headers. Referenced by astman_send_error(), and astman_send_response(). 00263 {
00264 char cmp[80];
00265 int x;
00266 snprintf(cmp, sizeof(cmp), "%s: ", var);
00267 for (x=0;x<m->hdrcount;x++)
00268 if (!strncasecmp(cmp, m->headers[x], strlen(cmp)))
00269 return m->headers[x] + strlen(cmp);
00270 return "";
00271 }
|
|
||||||||||||||||
|
Definition at line 298 of file manager.c. References astman_send_response(). 00299 {
00300 astman_send_response(s, m, "Success", msg);
00301 }
|
|
||||||||||||||||
|
Definition at line 273 of file manager.c. References ast_cli(), ast_mutex_lock, ast_mutex_unlock, astman_get_header(), mansession::fd, and mansession::lock. 00274 {
00275 char *id = astman_get_header(m,"ActionID");
00276 ast_mutex_lock(&s->lock);
00277 ast_cli(s->fd, "Response: Error\r\n");
00278 if (id && !ast_strlen_zero(id))
00279 ast_cli(s->fd, "ActionID: %s\r\n",id);
00280 ast_cli(s->fd, "Message: %s\r\n\r\n", error);
00281 ast_mutex_unlock(&s->lock);
00282 }
|
|
||||||||||||||||||||
|
Definition at line 284 of file manager.c. References ast_cli(), ast_mutex_lock, ast_mutex_unlock, astman_get_header(), mansession::fd, and mansession::lock. Referenced by astman_send_ack(). 00285 {
00286 char *id = astman_get_header(m,"ActionID");
00287 ast_mutex_lock(&s->lock);
00288 ast_cli(s->fd, "Response: %s\r\n", resp);
00289 if (id && !ast_strlen_zero(id))
00290 ast_cli(s->fd, "ActionID: %s\r\n",id);
00291 if (msg)
00292 ast_cli(s->fd, "Message: %s\r\n\r\n", msg);
00293 else
00294 ast_cli(s->fd, "\r\n");
00295 ast_mutex_unlock(&s->lock);
00296 }
|
|
|
Definition at line 1608 of file manager.c. References ast_cli_register(), ast_destroy(), ast_extension_state_add(), ast_load(), ast_log(), ast_manager_register, ast_manager_register2(), ast_pthread_create(), ast_true(), ast_variable_retrieve(), ast_verbose(), DEFAULT_MANAGER_PORT, EVENT_FLAG_CALL, EVENT_FLAG_COMMAND, LOG_NOTICE, LOG_WARNING, and option_verbose. Referenced by main(), and reload_manager(). 01609 {
01610 struct ast_config *cfg;
01611 char *val;
01612 int oldportno = portno;
01613 static struct sockaddr_in ba;
01614 int x = 1;
01615 if (!registered) {
01616 /* Register default actions */
01617 ast_manager_register2("Ping", 0, action_ping, "Ping", mandescr_ping);
01618 ast_manager_register2("Events", 0, action_events, "Contol Event Flow", mandescr_events);
01619 ast_manager_register2("Logoff", 0, action_logoff, "Logoff Manager", mandescr_logoff);
01620 ast_manager_register2("Hangup", EVENT_FLAG_CALL, action_hangup, "Hangup Channel", mandescr_hangup);
01621 ast_manager_register( "Status", EVENT_FLAG_CALL, action_status, "Status" );
01622 ast_manager_register2( "Setvar", EVENT_FLAG_CALL, action_setvar, "Set Channel Variable", mandescr_setvar );
01623 ast_manager_register2( "Getvar", EVENT_FLAG_CALL, action_getvar, "Gets a Channel Variable", mandescr_getvar );
01624 ast_manager_register( "Redirect", EVENT_FLAG_CALL, action_redirect, "Redirect" );
01625 ast_manager_register2("Originate", EVENT_FLAG_CALL, action_originate, "Originate Call", mandescr_originate);
01626 ast_manager_register2( "Command", EVENT_FLAG_COMMAND, action_command, "Execute Command", mandescr_command );
01627 ast_manager_register2( "ExtensionState", EVENT_FLAG_CALL, action_extensionstate, "Check Extension Status", mandescr_extensionstate );
01628 ast_manager_register2( "AbsoluteTimeout", EVENT_FLAG_CALL, action_timeout, "Set Absolute Timeout", mandescr_timeout );
01629 ast_manager_register2( "MailboxStatus", EVENT_FLAG_CALL, action_mailboxstatus, "Check Mailbox", mandescr_mailboxstatus );
01630 ast_manager_register2( "MailboxCount", EVENT_FLAG_CALL, action_mailboxcount, "Check Mailbox Message Count", mandescr_mailboxcount );
01631 ast_manager_register2( "DBget", EVENT_FLAG_CALL, action_dbget, "Retrieve a value from astdb", mandescr_dbget );
01632 ast_manager_register2( "DBput", EVENT_FLAG_CALL, action_dbput, "Store a value in astdb", mandescr_dbput );
01633 ast_manager_register2( "DBdel", EVENT_FLAG_CALL, action_dbdel, "Delete a key from astdb", mandescr_dbdel );
01634 ast_manager_register2("ListCommands", 0, action_listcommands, "List available manager commands", mandescr_listcommands);
01635
01636 ast_cli_register(&show_mancmd_cli);
01637 ast_cli_register(&show_mancmds_cli);
01638 ast_cli_register(&show_manconn_cli);
01639 ast_extension_state_add(NULL, NULL, manager_state_cb, NULL);
01640 registered = 1;
01641 }
01642 portno = DEFAULT_MANAGER_PORT;
01643 cfg = ast_load("manager.conf");
01644 if (!cfg) {
01645 ast_log(LOG_NOTICE, "Unable to open management configuration manager.conf. Call management disabled.\n");
01646 return 0;
01647 }
01648 memset(&ba, 0, sizeof(ba));
01649 val = ast_variable_retrieve(cfg, "general", "enabled");
01650 if (val)
01651 enabled = ast_true(val);
01652
01653 val = ast_variable_retrieve(cfg, "general", "block-sockets");
01654 if(val)
01655 block_sockets = ast_true(val);
01656
01657 if ((val = ast_variable_retrieve(cfg, "general", "port"))) {
01658 if (sscanf(val, "%d", &portno) != 1) {
01659 ast_log(LOG_WARNING, "Invalid port number '%s'\n", val);
01660 portno = DEFAULT_MANAGER_PORT;
01661 }
01662 } else if ((val = ast_variable_retrieve(cfg, "general", "portno"))) {
01663 if (sscanf(val, "%d", &portno) != 1) {
01664 ast_log(LOG_WARNING, "Invalid port number '%s'\n", val);
01665 portno = DEFAULT_MANAGER_PORT;
01666 }
01667 ast_log(LOG_NOTICE, "Use of portno in manager.conf deprecated. Please use 'port=%s' instead.\n", val);
01668 }
01669
01670 ba.sin_family = AF_INET;
01671 ba.sin_port = htons(portno);
01672 memset(&ba.sin_addr, 0, sizeof(ba.sin_addr));
01673
01674 if ((val = ast_variable_retrieve(cfg, "general", "bindaddr"))) {
01675 if (!inet_aton(val, &ba.sin_addr)) {
01676 ast_log(LOG_WARNING, "Invalid address '%s' specified, using 0.0.0.0\n", val);
01677 memset(&ba.sin_addr, 0, sizeof(ba.sin_addr));
01678 }
01679 }
01680
01681 if ((asock > -1) && ((portno != oldportno) || !enabled)) {
01682 #if 0
01683 /* Can't be done yet */
01684 close(asock);
01685 asock = -1;
01686 #else
01687 ast_log(LOG_WARNING, "Unable to change management port / enabled\n");
01688 #endif
01689 }
01690 ast_destroy(cfg);
01691
01692 /* If not enabled, do nothing */
01693 if (!enabled) {
01694 return 0;
01695 }
01696 if (asock < 0) {
01697 asock = socket(AF_INET, SOCK_STREAM, 0);
01698 if (asock < 0) {
01699 ast_log(LOG_WARNING, "Unable to create socket: %s\n", strerror(errno));
01700 return -1;
01701 }
01702 setsockopt(asock, SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x));
01703 if (bind(asock, (struct sockaddr *)&ba, sizeof(ba))) {
01704 ast_log(LOG_WARNING, "Unable to bind socket: %s\n", strerror(errno));
01705 close(asock);
01706 asock = -1;
01707 return -1;
01708 }
01709 if (listen(asock, 2)) {
01710 ast_log(LOG_WARNING, "Unable to listen on socket: %s\n", strerror(errno));
01711 close(asock);
01712 asock = -1;
01713 return -1;
01714 }
01715 if (option_verbose)
01716 ast_verbose("Asterisk Management interface listening on port %d\n", portno);
01717 ast_pthread_create(&t, NULL, accept_thread, NULL);
01718 }
01719 return 0;
01720 }
|
|
||||||||||||||||||||
|
|
|
|
Definition at line 1722 of file manager.c. References EVENT_FLAG_SYSTEM, init_manager(), and manager_event(). Referenced by ast_module_reload(), and main(). 01723 {
01724 manager_event(EVENT_FLAG_SYSTEM, "Reload", "Message: Reload Requested\r\n");
01725 return init_manager();
01726 }
|
1.4.2