#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 }
|