Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

manager.h File Reference

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


Define Documentation

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

Definition at line 97 of file manager.h.

Referenced by init_manager().

#define DEFAULT_MANAGER_PORT   5038
 

Definition at line 42 of file manager.h.

Referenced by init_manager().

#define EVENT_FLAG_AGENT   (1 << 5)
 

Definition at line 49 of file manager.h.

#define EVENT_FLAG_CALL   (1 << 1)
 

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().

#define EVENT_FLAG_COMMAND   (1 << 4)
 

Definition at line 48 of file manager.h.

Referenced by init_manager().

#define EVENT_FLAG_LOG   (1 << 2)
 

Definition at line 46 of file manager.h.

#define EVENT_FLAG_SYSTEM   (1 << 0)
 

Definition at line 44 of file manager.h.

Referenced by reload_manager().

#define EVENT_FLAG_USER   (1 << 6)
 

Definition at line 50 of file manager.h.

#define EVENT_FLAG_VERBOSE   (1 << 3)
 

Definition at line 47 of file manager.h.

#define MAX_HEADERS   80
 

Definition at line 53 of file manager.h.

#define MAX_LEN   256
 

Definition at line 54 of file manager.h.


Function Documentation

int ast_carefulwrite int  fd,
char *  s,
int  len,
int  timeoutms
 

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 }

int ast_manager_register2 char *  action,
int  authority,
int(*)(struct mansession *s, struct message *m)  func,
char *  synopsis,
char *  description
 

Definition at line 1582 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().

01583 {
01584    struct manager_action *cur;
01585 
01586    cur = malloc(sizeof(struct manager_action));
01587    if (!cur) {
01588       ast_log(LOG_WARNING, "Manager: out of memory trying to register action\n");
01589       ast_mutex_unlock(&actionlock);
01590       return -1;
01591    }
01592    cur->action = action;
01593    cur->authority = auth;
01594    cur->func = func;
01595    cur->synopsis = synopsis;
01596    cur->description = description;
01597    cur->next = NULL;
01598 
01599    ast_manager_register_struct(cur);
01600 
01601    return 0;
01602 }

int ast_manager_unregister char *  action  ) 
 

Definition at line 1514 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.

01514                                            {
01515    struct manager_action *cur = first_action, *prev = first_action;
01516 
01517    ast_mutex_lock(&actionlock);
01518    while( cur ) {       
01519       if (!strcasecmp(action, cur->action)) {
01520          prev->next = cur->next;
01521          free(cur);
01522          if (option_verbose > 1) 
01523             ast_verbose(VERBOSE_PREFIX_2 "Manager unregistered action %s\n", action);
01524          ast_mutex_unlock(&actionlock);
01525          return 0;
01526       }
01527       prev = cur;
01528       cur = cur->next;
01529    }
01530    ast_mutex_unlock(&actionlock);
01531    return 0;
01532 }

int char* astman_get_header struct message m,
char *  var
 

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 }

void astman_send_ack struct mansession s,
struct message m,
char *  msg
 

Definition at line 298 of file manager.c.

References astman_send_response().

00299 {
00300    astman_send_response(s, m, "Success", msg);
00301 }

void astman_send_error struct mansession s,
struct message m,
char *  error
 

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 }

void astman_send_response struct mansession s,
struct message m,
char *  resp,
char *  msg
 

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 }

int init_manager void   ) 
 

Definition at line 1606 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().

01607 {
01608    struct ast_config *cfg;
01609    char *val;
01610    int oldportno = portno;
01611    static struct sockaddr_in ba;
01612    int x = 1;
01613    if (!registered) {
01614       /* Register default actions */
01615       ast_manager_register2("Ping", 0, action_ping, "Ping", mandescr_ping);
01616       ast_manager_register2("Events", 0, action_events, "Contol Event Flow", mandescr_events);
01617       ast_manager_register2("Logoff", 0, action_logoff, "Logoff Manager", mandescr_logoff);
01618       ast_manager_register2("Hangup", EVENT_FLAG_CALL, action_hangup, "Hangup Channel", mandescr_hangup);
01619       ast_manager_register( "Status", EVENT_FLAG_CALL, action_status, "Status" );
01620       ast_manager_register2( "Setvar", EVENT_FLAG_CALL, action_setvar, "Set Channel Variable", mandescr_setvar );
01621       ast_manager_register2( "Getvar", EVENT_FLAG_CALL, action_getvar, "Gets a Channel Variable", mandescr_getvar );
01622       ast_manager_register( "Redirect", EVENT_FLAG_CALL, action_redirect, "Redirect" );
01623       ast_manager_register2("Originate", EVENT_FLAG_CALL, action_originate, "Originate Call", mandescr_originate);
01624       ast_manager_register2( "Command", EVENT_FLAG_COMMAND, action_command, "Execute Command", mandescr_command );
01625       ast_manager_register2( "ExtensionState", EVENT_FLAG_CALL, action_extensionstate, "Check Extension Status", mandescr_extensionstate );
01626       ast_manager_register2( "AbsoluteTimeout", EVENT_FLAG_CALL, action_timeout, "Set Absolute Timeout", mandescr_timeout );
01627       ast_manager_register2( "MailboxStatus", EVENT_FLAG_CALL, action_mailboxstatus, "Check Mailbox", mandescr_mailboxstatus );
01628       ast_manager_register2( "MailboxCount", EVENT_FLAG_CALL, action_mailboxcount, "Check Mailbox Message Count", mandescr_mailboxcount );
01629       ast_manager_register2( "DBget", EVENT_FLAG_CALL, action_dbget, "Retrieve a value from astdb", mandescr_dbget );
01630       ast_manager_register2( "DBput", EVENT_FLAG_CALL, action_dbput, "Store a value in astdb", mandescr_dbput );
01631       ast_manager_register2( "DBdel", EVENT_FLAG_CALL, action_dbdel, "Delete a key from astdb", mandescr_dbdel );
01632       ast_manager_register2("ListCommands", 0, action_listcommands, "List available manager commands", mandescr_listcommands);
01633 
01634       ast_cli_register(&show_mancmd_cli);
01635       ast_cli_register(&show_mancmds_cli);
01636       ast_cli_register(&show_manconn_cli);
01637       ast_extension_state_add(NULL, NULL, manager_state_cb, NULL);
01638       registered = 1;
01639    }
01640    portno = DEFAULT_MANAGER_PORT;
01641    cfg = ast_load("manager.conf");
01642    if (!cfg) {
01643       ast_log(LOG_NOTICE, "Unable to open management configuration manager.conf.  Call management disabled.\n");
01644       return 0;
01645    }
01646    memset(&ba, 0, sizeof(ba));
01647    val = ast_variable_retrieve(cfg, "general", "enabled");
01648    if (val)
01649       enabled = ast_true(val);
01650 
01651    val = ast_variable_retrieve(cfg, "general", "block-sockets");
01652    if(val)
01653       block_sockets = ast_true(val);
01654 
01655    if ((val = ast_variable_retrieve(cfg, "general", "port"))) {
01656       if (sscanf(val, "%d", &portno) != 1) {
01657          ast_log(LOG_WARNING, "Invalid port number '%s'\n", val);
01658          portno = DEFAULT_MANAGER_PORT;
01659       }
01660    } else if ((val = ast_variable_retrieve(cfg, "general", "portno"))) {
01661       if (sscanf(val, "%d", &portno) != 1) {
01662          ast_log(LOG_WARNING, "Invalid port number '%s'\n", val);
01663          portno = DEFAULT_MANAGER_PORT;
01664       }
01665       ast_log(LOG_NOTICE, "Use of portno in manager.conf deprecated.  Please use 'port=%s' instead.\n", val);
01666    }
01667    
01668    ba.sin_family = AF_INET;
01669    ba.sin_port = htons(portno);
01670    memset(&ba.sin_addr, 0, sizeof(ba.sin_addr));
01671    
01672    if ((val = ast_variable_retrieve(cfg, "general", "bindaddr"))) {
01673       if (!inet_aton(val, &ba.sin_addr)) { 
01674          ast_log(LOG_WARNING, "Invalid address '%s' specified, using 0.0.0.0\n", val);
01675          memset(&ba.sin_addr, 0, sizeof(ba.sin_addr));
01676       }
01677    }
01678    
01679    if ((asock > -1) && ((portno != oldportno) || !enabled)) {
01680 #if 0
01681       /* Can't be done yet */
01682       close(asock);
01683       asock = -1;
01684 #else
01685       ast_log(LOG_WARNING, "Unable to change management port / enabled\n");
01686 #endif
01687    }
01688    ast_destroy(cfg);
01689    
01690    /* If not enabled, do nothing */
01691    if (!enabled) {
01692       return 0;
01693    }
01694    if (asock < 0) {
01695       asock = socket(AF_INET, SOCK_STREAM, 0);
01696       if (asock < 0) {
01697          ast_log(LOG_WARNING, "Unable to create socket: %s\n", strerror(errno));
01698          return -1;
01699       }
01700       setsockopt(asock, SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x));
01701       if (bind(asock, (struct sockaddr *)&ba, sizeof(ba))) {
01702          ast_log(LOG_WARNING, "Unable to bind socket: %s\n", strerror(errno));
01703          close(asock);
01704          asock = -1;
01705          return -1;
01706       }
01707       if (listen(asock, 2)) {
01708          ast_log(LOG_WARNING, "Unable to listen on socket: %s\n", strerror(errno));
01709          close(asock);
01710          asock = -1;
01711          return -1;
01712       }
01713       if (option_verbose)
01714          ast_verbose("Asterisk Management interface listening on port %d\n", portno);
01715       ast_pthread_create(&t, NULL, accept_thread, NULL);
01716    }
01717    return 0;
01718 }

int manager_event int  category,
char *  event,
char *  contents,
  ...
 

int reload_manager void   ) 
 

Definition at line 1720 of file manager.c.

References EVENT_FLAG_SYSTEM, init_manager(), and manager_event().

Referenced by ast_module_reload(), and main().

01721 {
01722    manager_event(EVENT_FLAG_SYSTEM, "Reload", "Message: Reload Requested\r\n");
01723    return init_manager();
01724 }


Generated on Sat Nov 25 19:10:11 2006 for Asterisk by  doxygen 1.4.2