Asterisk - The Open Source Telephony Project GIT-master-7988d11
Loading...
Searching...
No Matches
Data Structures | Macros | Enumerations | Functions | Variables
manager.c File Reference

The Asterisk Management Interface - AMI. More...

#include "asterisk.h"
#include "asterisk/paths.h"
#include <ctype.h>
#include <sys/time.h>
#include <signal.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <regex.h>
#include "asterisk/channel.h"
#include "asterisk/file.h"
#include "asterisk/manager.h"
#include "asterisk/module.h"
#include "asterisk/config.h"
#include "asterisk/callerid.h"
#include "asterisk/core_local.h"
#include "asterisk/lock.h"
#include "asterisk/cli.h"
#include "asterisk/app.h"
#include "asterisk/mwi.h"
#include "asterisk/pbx.h"
#include "asterisk/md5.h"
#include "asterisk/acl.h"
#include "asterisk/utils.h"
#include "asterisk/tcptls.h"
#include "asterisk/http.h"
#include "asterisk/ast_version.h"
#include "asterisk/threadstorage.h"
#include "asterisk/linkedlists.h"
#include "asterisk/term.h"
#include "asterisk/astobj2.h"
#include "asterisk/features.h"
#include "asterisk/security_events.h"
#include "asterisk/aoc.h"
#include "asterisk/strings.h"
#include "asterisk/stringfields.h"
#include "asterisk/presencestate.h"
#include "asterisk/stasis_message_router.h"
#include "asterisk/stasis_channels.h"
#include "asterisk/stasis_bridges.h"
#include "asterisk/test.h"
#include "asterisk/json.h"
#include "asterisk/bridge.h"
#include "asterisk/bridge_after.h"
#include "asterisk/features_config.h"
#include "asterisk/rtp_engine.h"
#include "asterisk/format_cache.h"
#include "asterisk/translate.h"
#include "asterisk/taskprocessor.h"
#include "asterisk/message.h"
Include dependency graph for manager.c:

Go to the source code of this file.

Data Structures

struct  actions
 list of actions registered More...
 
struct  all_events
 
struct  ast_manager_user
 user descriptor, as read from the config file. More...
 
struct  event_filter_entry
 
struct  eventqent
 
struct  fast_originate_helper
 helper function for originate More...
 
struct  manager_hooks
 list of hooks registered More...
 
struct  mansession
 In case you didn't read that giant block of text above the mansession_session struct, the mansession is named this solely to keep the API the same in Asterisk. This structure really represents data that is different from Manager action to Manager action. The mansession_session pointer contained within points to session-specific data. More...
 
struct  mansession_session::mansession_datastores
 
struct  mansession_session
 
struct  originate_permissions_entry
 
struct  permalias
 
struct  users
 list of users found in the config file More...
 
struct  variable_count
 

Macros

#define any_manager_listeners(sessions)    ((sessions && ao2_container_count(sessions)) || !AST_RWLIST_EMPTY(&manager_hooks))
 
#define ASTMAN_APPEND_BUF_INITSIZE   256
 initial allocated size for the astman_append_buf and astman_send_*_va
 
#define DEFAULT_REALM   "asterisk"
 
#define EVENT_FLAG_SHUTDOWN   -1
 Fake event class used to end sessions at shutdown.
 
#define FORMAT   " %-25.25s %-15.55s\n"
 
#define FORMAT2   " %-25.25s %-15d\n"
 
#define FORMAT3   " %-25.25s %s\n"
 
#define GET_HEADER_FIRST_MATCH   0
 
#define GET_HEADER_LAST_MATCH   1
 
#define GET_HEADER_SKIP_EMPTY   2
 
#define HSMC_FORMAT   " %-*.*s %-.*s\n"
 
#define HSMCONN_FORMAT1   " %-15.15s %-55.55s %-10.10s %-10.10s %-8.8s %-8.8s %-10.10s %-10.10s\n"
 
#define HSMCONN_FORMAT2   " %-15.15s %-55.55s %-10d %-10d %-8d %-8d %-10.10d %-10.10d\n"
 
#define MANAGER_EVENT_BUF_INITSIZE   256
 
#define manager_event_sessions(sessions, category, event, contents, ...)    __manager_event_sessions(sessions, category, event, 0, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__, contents , ## __VA_ARGS__)
 
#define MAX_AUTH_PERM_STRING   150
 
#define MAX_BLACKLIST_CMD_LEN   2
 Descriptor for a manager session, either on the AMI socket or over HTTP.
 
#define MAX_VARS   128
 
#define MGR_SHOW_TERMINAL_WIDTH   80
 
#define MSG_MOREDATA   ((char *)astman_send_response)
 
#define ROW_FMT   "<tr><td colspan=\"2\" bgcolor=\"#f1f1ff\">%s</td></tr>\r\n"
 
#define TEST_STRING    "<form action=\"manager\" method=\"post\">\n\ Action: <select name=\"action\">\n\ <option value=\"\">-----&gt;</option>\n\ <option value=\"login\">login</option>\n\ <option value=\"command\">Command</option>\n\ <option value=\"waitevent\">waitevent</option>\n\ <option value=\"listcommands\">listcommands</option>\n\ </select>\n\ or <input name=\"action\"><br/>\n\ CLI Command <input name=\"command\"><br>\n\ user <input name=\"username\"> pass <input type=\"password\" name=\"secret\"><br>\n\ <input type=\"submit\">\n</form>\n"
 

Enumerations

enum  add_filter_result { FILTER_SUCCESS = 0 , FILTER_ALLOC_FAILED , FILTER_COMPILE_FAIL , FILTER_FORMAT_ERROR }
 
enum  error_type {
  UNKNOWN_ACTION = 1 , UNKNOWN_CATEGORY , UNSPECIFIED_CATEGORY , UNSPECIFIED_ARGUMENT ,
  FAILURE_ALLOCATION , FAILURE_NEWCAT , FAILURE_DELCAT , FAILURE_EMPTYCAT ,
  FAILURE_UPDATE , FAILURE_DELETE , FAILURE_APPEND , FAILURE_TEMPLATE
}
 
enum  event_filter_match_type {
  FILTER_MATCH_REGEX = 0 , FILTER_MATCH_EXACT , FILTER_MATCH_STARTS_WITH , FILTER_MATCH_ENDS_WITH ,
  FILTER_MATCH_CONTAINS , FILTER_MATCH_NONE
}
 
enum  mansession_message_parsing { MESSAGE_OKAY , MESSAGE_LINE_TOO_LONG }
 
enum  output_format { FORMAT_RAW , FORMAT_HTML , FORMAT_XML }
 

Functions

int __ast_manager_event_multichan (int category, const char *event, int chancount, struct ast_channel **chans, const char *file, int line, const char *func, const char *fmt,...)
 
static const char * __astman_get_header (const struct message *m, char *var, int mode)
 Return a matching header value.
 
static int __init_manager (int reload, int by_external_config)
 
static int __manager_event_sessions (struct ao2_container *sessions, int category, const char *event, int chancount, struct ast_channel **chans, const char *file, int line, const char *func, const char *fmt,...)
 
static int __manager_event_sessions_va (struct ao2_container *sessions, int category, const char *event, int chancount, struct ast_channel **chans, const char *file, int line, const char *func, const char *fmt, va_list ap)
 
static void __reg_module (void)
 
static void __unreg_module (void)
 
static void acl_change_stasis_cb (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 
static void acl_change_stasis_subscribe (void)
 
static void acl_change_stasis_unsubscribe (void)
 
static struct ast_aoc_decodedaction_aoc_de_message (struct mansession *s, const struct message *m)
 
static struct ast_aoc_decodedaction_aoc_s_message (struct mansession *s, const struct message *m)
 
static int action_aoc_s_submessage (struct mansession *s, const struct message *m, struct ast_aoc_decoded *decoded)
 
static int action_aocmessage (struct mansession *s, const struct message *m)
 
static int action_atxfer (struct mansession *s, const struct message *m)
 
static int action_blind_transfer (struct mansession *s, const struct message *m)
 
static int action_cancel_atxfer (struct mansession *s, const struct message *m)
 
static int action_challenge (struct mansession *s, const struct message *m)
 
static int action_command (struct mansession *s, const struct message *m)
 Manager command "command" - execute CLI command.
 
static int action_coresettings (struct mansession *s, const struct message *m)
 Show PBX core settings information.
 
static int action_coreshowchannelmap (struct mansession *s, const struct message *m)
 Manager command "CoreShowChannelMap" - Lists all channels connected to the specified channel.
 
static int action_coreshowchannels (struct mansession *s, const struct message *m)
 Manager command "CoreShowChannels" - List currently defined channels and some information about them.
 
static int action_corestatus (struct mansession *s, const struct message *m)
 Show PBX core status information.
 
static int action_createconfig (struct mansession *s, const struct message *m)
 
static void action_destroy (void *obj)
 
static int action_events (struct mansession *s, const struct message *m)
 
static int action_extensionstate (struct mansession *s, const struct message *m)
 
static int action_filter (struct mansession *s, const struct message *m)
 Manager command to add an event filter to a manager session.
 
static struct manager_actionaction_find (const char *name)
 
static int action_getconfig (struct mansession *s, const struct message *m)
 
static int action_getconfigjson (struct mansession *s, const struct message *m)
 
static int action_getvar (struct mansession *s, const struct message *m)
 
static int action_hangup (struct mansession *s, const struct message *m)
 
static int action_listcategories (struct mansession *s, const struct message *m)
 
static int action_listcommands (struct mansession *s, const struct message *m)
 
static int action_loggerrotate (struct mansession *s, const struct message *m)
 Manager command "LoggerRotate" - reloads and rotates the logger in the same manner as the CLI command 'logger rotate'.
 
static int action_login (struct mansession *s, const struct message *m)
 
static int action_logoff (struct mansession *s, const struct message *m)
 
static int action_mailboxcount (struct mansession *s, const struct message *m)
 
static int action_mailboxstatus (struct mansession *s, const struct message *m)
 
static int action_originate (struct mansession *s, const struct message *m)
 
static int action_ping (struct mansession *s, const struct message *m)
 
static int action_presencestate (struct mansession *s, const struct message *m)
 
static int action_redirect (struct mansession *s, const struct message *m)
 action_redirect: The redirect manager command
 
static int action_reload (struct mansession *s, const struct message *m)
 Send a reload event.
 
static int action_sendtext (struct mansession *s, const struct message *m)
 
static int action_setvar (struct mansession *s, const struct message *m)
 
static int action_status (struct mansession *s, const struct message *m)
 Manager "status" command to show channels.
 
static int action_timeout (struct mansession *s, const struct message *m)
 
static int action_updateconfig (struct mansession *s, const struct message *m)
 
static int action_userevent (struct mansession *s, const struct message *m)
 
static int action_waitevent (struct mansession *s, const struct message *m)
 
static struct eventqentadvance_event (struct eventqent *e)
 
static AO2_GLOBAL_OBJ_STATIC (event_docs)
 A container of event documentation nodes.
 
static AO2_GLOBAL_OBJ_STATIC (mgr_sessions)
 
 AO2_STRING_FIELD_SORT_FN (ast_xml_doc_item, name)
 
static int aocmessage_get_unit_entry (const struct message *m, struct ast_aoc_unit_entry *entry, unsigned int entry_num)
 
static int app_match (const char *app, const char *data, const char *search)
 
static int appdata_match (const char *app, const char *data, const char *search)
 
static void append_channel_vars (struct ast_str **pbuf, struct ast_channel *chan)
 
static int append_event (const char *str, int event_name_hash, int category)
 events are appended to a queue from where they can be dispatched to clients.
 
int ast_hook_send_action (struct manager_custom_hook *hook, const char *msg)
 access for hooks to send action messages to ami
 
static int ast_instring (const char *bigstr, const char *smallstr, const char delim)
 
int ast_manager_check_enabled (void)
 Check if AMI is enabled.
 
struct ast_manager_event_blobast_manager_event_blob_create (int event_flags, const char *manager_event, const char *extra_fields_fmt,...)
 Construct a ast_manager_event_blob.
 
struct stasis_message_routerast_manager_get_message_router (void)
 Get the stasis_message_router for AMI.
 
struct stasis_topicast_manager_get_topic (void)
 Get the Stasis Message Bus API topic for AMI.
 
int ast_manager_hangup_helper (struct mansession *s, const struct message *m, manager_hangup_handler_t hangup_handler, manager_hangup_cause_validator_t cause_validator)
 A manager helper function that hangs up a channel using a supplied channel type specific hangup function and cause code validator.
 
void ast_manager_publish_event (const char *type, int class_type, struct ast_json *obj)
 Publish an event to AMI.
 
int ast_manager_register2 (const char *action, int auth, int(*func)(struct mansession *s, const struct message *m), struct ast_module *module, 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.
 
static int ast_manager_register_struct (struct manager_action *act)
 
struct ast_strast_manager_str_from_json_object (struct ast_json *blob, key_exclusion_cb exclusion_cb)
 Convert a JSON object into an AMI compatible string.
 
int ast_manager_unregister (const char *action)
 support functions to register/unregister AMI action handlers,
 
void ast_manager_unregister_hook (struct manager_custom_hook *hook)
 Delete a custom hook to be called when an event is fired.
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
int ast_str_append_event_header (struct ast_str **fields_string, const char *header, const char *value)
 append an event header to an ast string
 
 AST_THREADSTORAGE_CUSTOM_SCOPE (astman_append_buf, NULL, ast_free_ptr, static)
 thread local buffer for astman_append
 
 AST_THREADSTORAGE_CUSTOM_SCOPE (manager_event_buf, NULL, ast_free_ptr, static)
 
 AST_THREADSTORAGE_CUSTOM_SCOPE (userevent_buf, NULL, ast_free_ptr, static)
 
int ast_webmanager_check_enabled (void)
 Check if AMI/HTTP is enabled.
 
void astman_append (struct mansession *s, const char *fmt,...)
 
static void astman_append_headers (struct message *m, const struct ast_variable *params)
 Append additional headers into the message structure from params.
 
static void astman_append_json (struct mansession *s, const char *str)
 
int astman_datastore_add (struct mansession *s, struct ast_datastore *datastore)
 Add a datastore to a session.
 
struct ast_datastoreastman_datastore_find (struct mansession *s, const struct ast_datastore_info *info, const char *uid)
 Find a datastore on a session.
 
int astman_datastore_remove (struct mansession *s, struct ast_datastore *datastore)
 Remove a datastore from a session.
 
static void astman_flush (struct mansession *s, struct ast_str *buf)
 
static void astman_free_headers (struct message *m)
 Free headers inside message structure, but not the message structure itself.
 
const char * astman_get_header (const struct message *m, char *var)
 Return the first matching variable from an array.
 
struct ast_variableastman_get_variables (const struct message *m)
 Get a linked list of the Variable: headers.
 
struct ast_variableastman_get_variables_order (const struct message *m, enum variable_orders order)
 Get a linked list of the Variable: headers with order specified.
 
int astman_is_authed (uint32_t ident)
 Determine if a manager session ident is authenticated.
 
void astman_live_dangerously (int new_live_dangerously)
 Enable/disable the inclusion of 'dangerous' configurations outside of the ast_config_AST_CONFIG_DIR.
 
void astman_send_ack (struct mansession *s, const struct message *m, char *msg)
 Send ack in manager transaction.
 
void astman_send_error (struct mansession *s, const struct message *m, char *error)
 Send error in manager transaction.
 
void astman_send_error_va (struct mansession *s, const struct message *m, const char *fmt,...)
 Send error in manager transaction (with va_args support)
 
static void astman_send_list_complete (struct mansession *s, const struct message *m, const char *event_name, int count)
 
void astman_send_list_complete_end (struct mansession *s)
 End the list complete event.
 
void astman_send_list_complete_start (struct mansession *s, const struct message *m, const char *event_name, int count)
 Start the list complete event.
 
static struct ast_strastman_send_list_complete_start_common (struct mansession *s, const struct message *m, const char *event_name, int count)
 
void astman_send_listack (struct mansession *s, const struct message *m, char *msg, char *listflag)
 Send ack in manager transaction to begin a list.
 
void astman_send_response (struct mansession *s, const struct message *m, char *resp, char *msg)
 Send response in manager transaction.
 
static void astman_send_response_full (struct mansession *s, const struct message *m, char *resp, char *msg, char *listflag)
 send a response with an optional message, and terminate it with an empty line. m is used only to grab the 'ActionID' field.
 
static void astman_start_ack (struct mansession *s, const struct message *m)
 
int astman_verify_session_readpermissions (uint32_t ident, int perm)
 Verify a session's read permissions against a permission mask.
 
int astman_verify_session_writepermissions (uint32_t ident, int perm)
 Verify a session's write permissions against a permission mask.
 
static int async_goto_with_discard_bridge_after (struct ast_channel *chan, const char *context, const char *exten, int priority)
 
static int auth_http_callback (struct ast_tcptls_session_instance *ser, enum ast_http_method method, enum output_format format, const struct ast_sockaddr *remote_address, const char *uri, struct ast_variable *get_params, struct ast_variable *headers)
 
static int auth_manager_http_callback (struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
 
static int auth_mxml_http_callback (struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
 
static int auth_rawman_http_callback (struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
 
static int authenticate (struct mansession *s, const struct message *m)
 
static const char * authority_to_str (int authority, struct ast_str **res)
 Convert authority code to a list of options. Note that the EVENT_FLAG_ALL authority will always be returned.
 
static struct mansession_sessionbuild_mansession (const struct ast_sockaddr *addr)
 Allocate manager session structure and add it to the list of sessions.
 
static int check_blacklist (const char *cmd)
 
static int check_manager_session_inuse (const char *name)
 
static void close_mansession_file (struct mansession *s)
 
static int coreshowchannelmap_add_connected_channels (struct ao2_container *channel_map, struct ast_channel_snapshot *channel_snapshot, struct ast_bridge_snapshot *bridge_snapshot)
 Recursive function to get all channels in a bridge. Follow local channels as well.
 
static int coreshowchannelmap_add_to_map (struct ao2_container *c, const char *s)
 Helper function to add a channel name to the vector.
 
static void destroy_fast_originate_helper (struct fast_originate_helper *doomed)
 
static int do_message (struct mansession *s)
 
static void event_filter_destructor (void *obj)
 
static int event_max_name_len_cb (void *obj, void *arg, void *data, int flags)
 
static void * fast_originate (void *data)
 
static int file_in_modules_dir (const char *filename)
 Check if the given file path is in the modules dir or not.
 
static int filter_cmp_fn (void *obj, void *arg, void *data, int flags)
 
static struct mansession_sessionfind_session (uint32_t ident, int incinuse)
 
static struct mansession_sessionfind_session_by_nonce (const char *username, unsigned long nonce, int *stale)
 
static int function_amiclient (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 ${AMI_CLIENT()} Dialplan function - reads manager client data
 
static int function_capable_string_allowed_with_auths (const char *evaluating, int writepermlist)
 Checks to see if a string which can be used to evaluate functions should be rejected.
 
static void generate_status (struct mansession *s, struct ast_channel *chan, char **vars, int varc, int all_variables, char *id_text, int *count)
 
static int generic_http_callback (struct ast_tcptls_session_instance *ser, enum ast_http_method method, enum output_format format, const struct ast_sockaddr *remote_address, const char *uri, struct ast_variable *get_params, struct ast_variable *headers)
 
static int get_input (struct mansession *s, char *output)
 
static struct ast_manager_userget_manager_by_name_locked (const char *name)
 
static int get_manager_sessions_cb (void *obj, void *arg, void *data, int flags)
 Get number of logged in sessions for a login name.
 
static int get_perm (const char *instr)
 
static struct eventqentgrab_last (void)
 
static char * handle_kickmanconn (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 CLI command manager kick session.
 
static char * handle_manager_reload (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 CLI command manager reload.
 
static char * handle_manager_show_event (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_manager_show_events (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_manager_show_settings (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 CLI command manager show settings.
 
static char * handle_mandebug (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static void handle_parse_error (struct mansession *s, struct message *m, char *error)
 
static char * handle_showmanager (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_showmanagers (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_showmancmd (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_showmancmds (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 CLI command manager list commands.
 
static char * handle_showmanconn (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 CLI command manager list connected.
 
static char * handle_showmaneventq (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 CLI command manager list eventq.
 
static enum error_type handle_updates (struct mansession *s, const struct message *m, struct ast_config *cfg, const char *dfn)
 helper function for action_updateconfig
 
static int is_originate_app_permitted (const char *app, const char *data, int permission)
 
static int is_restricted_file (const char *filename)
 Check if a file is restricted or not.
 
static void json_escape (char *out, const char *in)
 
static void load_channelvars (struct ast_variable *var)
 
static void load_disabledevents (struct ast_variable *var)
 
static int load_module (void)
 
static void log_action (const struct message *m, const char *action)
 
static struct ast_variableman_do_variable_value (struct ast_variable *head, const char *hdr_val)
 
static enum add_filter_result manager_add_filter (const char *criteria, const char *filter_pattern, struct ao2_container *includefilters, struct ao2_container *excludefilters)
 Add an event filter to a manager session.
 
static void manager_default_msg_cb (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 
static int manager_displayconnects (struct mansession_session *session)
 Get displayconnects config option.
 
static void manager_event_blob_dtor (void *obj)
 
static void manager_free_user (struct ast_manager_user *user)
 
static void manager_generic_msg_cb (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 
static int manager_http_callback (struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
 
static void manager_json_array_with_key (struct ast_json *obj, const char *key, size_t index, struct ast_str **res, key_exclusion_cb exclusion_cb)
 
static void manager_json_obj_with_key (struct ast_json *obj, const char *key, const char *parent_key, struct ast_str **res, key_exclusion_cb exclusion_cb)
 
static void manager_json_to_ast_str (struct ast_json *obj, const char *key, struct ast_str **res, key_exclusion_cb exclusion_cb)
 
static void manager_json_value_str_append (struct ast_json *value, const char *key, struct ast_str **res)
 
static int manager_modulecheck (struct mansession *s, const struct message *m)
 Manager function to check if module is loaded.
 
static int manager_moduleload (struct mansession *s, const struct message *m)
 
static void manager_set_defaults (void)
 
static void manager_shutdown (void)
 
static int manager_state_cb (const char *context, const char *exten, struct ast_state_cb_info *info, void *data)
 
static void manager_subscription_change_msg_cb (void *userdata, struct stasis_subscription *sub, struct stasis_message *message)
 Callback for subscription change messages.
 
static int manager_subscriptions_init (void)
 Initialize all Stasis Message Bus API topics and routers used by the various sub-components of AMI.
 
static int mansession_cmp_fn (void *obj, void *arg, int flags)
 
static enum ast_transport mansession_get_transport (const struct mansession *s)
 
static void mansession_lock (struct mansession *s)
 Lock the 'mansession' structure.
 
static void mansession_unlock (struct mansession *s)
 Unlock the 'mansession' structure.
 
static int match_eventdata (struct event_filter_entry *entry, const char *eventdata)
 Test eventdata against a filter entry.
 
static int mxml_http_callback (struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
 
static void print_event_instance (struct ast_cli_args *a, struct ast_xml_doc_item *instance)
 
static int process_events (struct mansession *s)
 
static int process_message (struct mansession *s, const struct message *m)
 Process an AMI message, performing desired action. Return 0 on success, -1 on error that require the session to be destroyed.
 
static void process_output (struct mansession *s, struct ast_str **out, struct ast_variable *params, enum output_format format)
 
static void purge_events (void)
 
static void purge_old_stuff (void *data)
 cleanup code called at each iteration of server_root, guaranteed to happen every 5 seconds at most
 
static int purge_sessions (int n_max)
 remove at most n_max stale session from the list.
 
static int queue_match (const char *app, const char *data, const char *search)
 
static int queue_read_action_payload (struct ast_channel *chan, const unsigned char *payload, size_t payload_size, enum ast_frame_read_action action)
 Queue a given read action containing a payload onto a channel.
 
static int queue_sendtext (struct ast_channel *chan, const char *body)
 Queue a read action to send a text message.
 
static int queue_sendtext_data (struct ast_channel *chan, const char *body, const char *content_type)
 Queue a read action to send a text data message.
 
static int rawman_http_callback (struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
 
static int reload_module (void)
 
static void report_auth_success (const struct mansession *s)
 
static void report_failed_acl (const struct mansession *s, const char *username)
 
static void report_failed_challenge_response (const struct mansession *s, const char *response, const char *expected_response)
 
static void report_inval_password (const struct mansession *s, const char *username)
 
static void report_invalid_user (const struct mansession *s, const char *username)
 
static void report_req_bad_format (const struct mansession *s, const char *action)
 
static void report_req_not_allowed (const struct mansession *s, const char *action)
 
static void report_session_limit (const struct mansession *s)
 
static int send_string (struct mansession *s, char *string)
 
static void session_destroy (struct mansession_session *s)
 
static void session_destructor (void *obj)
 
static void * session_do (void *data)
 The body of the individual manager session. Call get_input() to read one line at a time (or be woken up on new events), collect the lines in a message until found an empty line, and execute the request. In any case, deliver events asynchronously through process_events() (called from here if no line is available, or at the end of process_message(). )
 
static int set_eventmask (struct mansession *s, const char *eventmask)
 Rather than braindead on,off this now can also accept a specific int mask value or a ',' delim list of mask strings (the same as manager.conf) -anthm.
 
static int should_send_event (struct ao2_container *includefilters, struct ao2_container *excludefilters, struct eventqent *eqe)
 
static int strings_to_mask (const char *string)
 
static int subscribe_all (void)
 
static int unload_module (void)
 
static struct mansession_sessionunref_mansession (struct mansession_session *s)
 Unreference manager session object. If no more references, then go ahead and delete it.
 
static const char * user_authority_to_str (int authority, struct ast_str **res)
 Convert authority code to a list of options for a user. This will only display those authority codes that have an explicit match on authority.
 
static int variable_count_cmp_fn (void *obj, void *vstr, int flags)
 
static int variable_count_hash_fn (const void *vvc, const int flags)
 
static void xml_copy_escape (struct ast_str **out, const char *src, int mode)
 
static void xml_translate (struct ast_str **out, char *in, struct ast_variable *get_vars, enum output_format format)
 Convert the input into XML or HTML. The input is supposed to be a sequence of lines of the form Name: value optionally followed by a blob of unformatted text. A blank line is a section separator. Basically, this is a mixture of the format of Manager Interface and CLI commands. The unformatted text is considered as a single value of a field named 'Opaque-data'.
 
 STASIS_MESSAGE_TYPE_DEFN (ast_manager_get_generic_type)
 Define AMI message types.
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "Asterisk Manager Interface" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_CORE, .requires = "extconfig,acl,http", }
 
static struct stasis_subscriptionacl_change_sub
 
static struct actions actions = AST_RWLIST_HEAD_INIT_VALUE
 
static struct all_events all_events = AST_RWLIST_HEAD_INIT_VALUE
 
static int allowmultiplelogin = 1
 
static struct ast_http_uri amanageruri
 
static struct ast_http_uri amanagerxmluri
 
static struct ast_tcptls_session_args ami_desc
 
static struct ast_tls_config ami_tls_cfg
 
static struct ast_tcptls_session_args amis_desc
 
static struct ast_http_uri arawmanuri
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static int authlimit
 
static int authtimeout
 
static int broken_events_action = 0
 
static struct ast_cli_entry cli_manager []
 
struct { 
 
   const char *   words [AST_MAX_CMD_LEN
 
command_blacklist [] 
 
static const char *const contenttype []
 
static int displayconnects = 1
 
static char global_realm [MAXHOSTNAMELEN]
 
static int httptimeout = 60
 
static int live_dangerously
 Set to true (non-zero) to globally allow all dangerous AMI actions to run.
 
static char * manager_channelvars
 
static int manager_debug = 0
 
static char * manager_disabledevents
 
static int manager_enabled = 0
 
static struct manager_hooks manager_hooks = AST_RWLIST_HEAD_INIT_VALUE
 
static struct stasis_topicmanager_topic
 A stasis_topic that all topics AMI cares about will be forwarded to.
 
static struct ast_custom_function managerclient_function
 description of AMI_CLIENT dialplan function
 
static struct ast_http_uri manageruri
 
static struct ast_http_uri managerxmluri
 
static char * match_type_names []
 
static struct originate_permissions_entry originate_app_permissions []
 
static const struct permalias perms []
 
static struct ast_http_uri rawmanuri
 
static struct stasis_forwardrtp_topic_forwarder
 The stasis_subscription for forwarding the RTP topic to the AMI topic.
 
static struct stasis_forwardsecurity_topic_forwarder
 The stasis_subscription for forwarding the Security topic to the AMI topic.
 
static struct stasis_message_routerstasis_router
 The stasis_message_router for all Stasis Message Bus API messages.
 
static int subscribed = 0
 
static int timestampevents
 
static int unauth_sessions = 0
 
static struct users users = AST_RWLIST_HEAD_INIT_VALUE
 
static int webmanager_enabled = 0
 
static int webregged = 0
 

Detailed Description

The Asterisk Management Interface - AMI.

Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m

OpenSSL http://www.openssl.org - for AMI/SSL

At the moment this file contains a number of functions, namely:

manager.conf

Definition in file manager.c.

Macro Definition Documentation

◆ FORMAT

#define FORMAT   " %-25.25s %-15.55s\n"

◆ FORMAT2

#define FORMAT2   " %-25.25s %-15d\n"

◆ FORMAT3

#define FORMAT3   " %-25.25s %s\n"

◆ HSMC_FORMAT

#define HSMC_FORMAT   " %-*.*s %-.*s\n"

◆ HSMCONN_FORMAT1

#define HSMCONN_FORMAT1   " %-15.15s %-55.55s %-10.10s %-10.10s %-8.8s %-8.8s %-10.10s %-10.10s\n"

◆ HSMCONN_FORMAT2

#define HSMCONN_FORMAT2   " %-15.15s %-55.55s %-10d %-10d %-8d %-8d %-10.10d %-10.10d\n"

◆ ROW_FMT

#define ROW_FMT   "<tr><td colspan=\"2\" bgcolor=\"#f1f1ff\">%s</td></tr>\r\n"

◆ TEST_STRING

#define TEST_STRING    "<form action=\"manager\" method=\"post\">\n\ Action: <select name=\"action\">\n\ <option value=\"\">-----&gt;</option>\n\ <option value=\"login\">login</option>\n\ <option value=\"command\">Command</option>\n\ <option value=\"waitevent\">waitevent</option>\n\ <option value=\"listcommands\">listcommands</option>\n\ </select>\n\ or <input name=\"action\"><br/>\n\ CLI Command <input name=\"command\"><br>\n\ user <input name=\"username\"> pass <input type=\"password\" name=\"secret\"><br>\n\ <input type=\"submit\">\n</form>\n"

Enumeration Type Documentation

◆ output_format

Enumerator
FORMAT_RAW 
FORMAT_HTML 
FORMAT_XML 

Definition at line 7937 of file manager.c.

7937 {
7938 FORMAT_RAW,
7940 FORMAT_XML,
7941};
@ FORMAT_RAW
Definition manager.c:7938
@ FORMAT_HTML
Definition manager.c:7939
@ FORMAT_XML
Definition manager.c:7940

Function Documentation

◆ __init_manager()

static int __init_manager ( int  reload,
int  by_external_config 
)
static

Definition at line 9699 of file manager.c.

9700{
9701 struct ast_config *cfg = NULL;
9702 const char *val;
9703 char *cat = NULL;
9704 int newhttptimeout = 60;
9705 struct ast_manager_user *user = NULL;
9706 struct ast_variable *var;
9707 struct ast_flags config_flags = { (reload && !by_external_config) ? CONFIG_FLAG_FILEUNCHANGED : 0 };
9708 char a1[337];
9709 char a1_hash[256];
9710 struct ast_sockaddr ami_desc_local_address_tmp;
9711 struct ast_sockaddr amis_desc_local_address_tmp;
9712 int tls_was_enabled = 0;
9713 int acl_subscription_flag = 0;
9714
9715 if (!reload) {
9716 struct ao2_container *sessions;
9717#ifdef AST_XML_DOCS
9718 struct ao2_container *temp_event_docs;
9719#endif
9720 int res;
9721
9723 if (res != 0) {
9724 return -1;
9725 }
9726 manager_topic = stasis_topic_create("manager:core");
9727 if (!manager_topic) {
9728 return -1;
9729 }
9730
9731 /* Register default actions */
9771
9772#ifdef TEST_FRAMEWORK
9773 test_suite_forwarder = stasis_forward_all(ast_test_suite_topic(), manager_topic);
9774#endif
9775
9779
9780 /* Append placeholder event so master_eventq never runs dry */
9781 if (append_event("Event: Placeholder\r\n\r\n",
9782 ast_str_hash("Placeholder"), 0)) {
9783 return -1;
9784 }
9785
9786#ifdef AST_XML_DOCS
9787 temp_event_docs = ast_xmldoc_build_documentation("managerEvent");
9788 if (temp_event_docs) {
9789 ao2_t_global_obj_replace_unref(event_docs, temp_event_docs, "Toss old event docs");
9790 ao2_t_ref(temp_event_docs, -1, "Remove creation ref - container holds only ref now");
9791 }
9792#endif
9793
9794 /* If you have a NULL hash fn, you only need a single bucket */
9796 if (!sessions) {
9797 return -1;
9798 }
9800 ao2_ref(sessions, -1);
9801
9802 /* Initialize all settings before first configuration load. */
9804 }
9805
9806 cfg = ast_config_load2("manager.conf", "manager", config_flags);
9807 if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
9808 return 0;
9809 } else if (!cfg || cfg == CONFIG_STATUS_FILEINVALID) {
9810 ast_log(LOG_NOTICE, "Unable to open AMI configuration manager.conf, or configuration is invalid.\n");
9811 return 0;
9812 }
9813
9814 /* If this wasn't performed due to a forced reload (because those can be created by ACL change events, we need to unsubscribe to ACL change events. */
9815 if (!by_external_config) {
9817 }
9818
9819 if (reload) {
9820 /* Reset all settings before reloading configuration */
9821 tls_was_enabled = ami_tls_cfg.enabled;
9823 }
9824
9825 ast_sockaddr_parse(&ami_desc_local_address_tmp, "[::]", 0);
9826 ast_sockaddr_set_port(&ami_desc_local_address_tmp, DEFAULT_MANAGER_PORT);
9827
9828 for (var = ast_variable_browse(cfg, "general"); var; var = var->next) {
9829 val = var->value;
9830
9831 /* read tls config options while preventing unsupported options from being set */
9832 if (strcasecmp(var->name, "tlscafile")
9833 && strcasecmp(var->name, "tlscapath")
9834 && strcasecmp(var->name, "tlscadir")
9835 && strcasecmp(var->name, "tlsverifyclient")
9836 && strcasecmp(var->name, "tlsdontverifyserver")
9837 && strcasecmp(var->name, "tlsclientmethod")
9838 && strcasecmp(var->name, "sslclientmethod")
9840 continue;
9841 }
9842
9843 if (!strcasecmp(var->name, "enabled")) {
9845 } else if (!strcasecmp(var->name, "webenabled")) {
9847 } else if (!strcasecmp(var->name, "port")) {
9848 int bindport;
9849 if (ast_parse_arg(val, PARSE_UINT32|PARSE_IN_RANGE, &bindport, 1024, 65535)) {
9850 ast_log(LOG_WARNING, "Invalid port number '%s'\n", val);
9851 }
9852 ast_sockaddr_set_port(&ami_desc_local_address_tmp, bindport);
9853 } else if (!strcasecmp(var->name, "bindaddr")) {
9854 /* remember port if it has already been set */
9855 int setport = ast_sockaddr_port(&ami_desc_local_address_tmp);
9856
9858 ast_log(LOG_WARNING, "Invalid address '%s' specified, default '%s' will be used\n", val,
9859 ast_sockaddr_stringify_addr(&ami_desc_local_address_tmp));
9860 } else {
9861 ast_sockaddr_parse(&ami_desc_local_address_tmp, val, PARSE_PORT_IGNORE);
9862 }
9863
9864 if (setport) {
9865 ast_sockaddr_set_port(&ami_desc_local_address_tmp, setport);
9866 }
9867
9868 } else if (!strcasecmp(var->name, "brokeneventsaction")) {
9870 } else if (!strcasecmp(var->name, "allowmultiplelogin")) {
9872 } else if (!strcasecmp(var->name, "displayconnects")) {
9874 } else if (!strcasecmp(var->name, "timestampevents")) {
9876 } else if (!strcasecmp(var->name, "debug")) {
9878 } else if (!strcasecmp(var->name, "httptimeout")) {
9879 newhttptimeout = atoi(val);
9880 } else if (!strcasecmp(var->name, "authtimeout")) {
9881 int timeout = atoi(var->value);
9882
9883 if (timeout < 1) {
9884 ast_log(LOG_WARNING, "Invalid authtimeout value '%s', using default value\n", var->value);
9885 } else {
9886 authtimeout = timeout;
9887 }
9888 } else if (!strcasecmp(var->name, "authlimit")) {
9889 int limit = atoi(var->value);
9890
9891 if (limit < 1) {
9892 ast_log(LOG_WARNING, "Invalid authlimit value '%s', using default value\n", var->value);
9893 } else {
9894 authlimit = limit;
9895 }
9896 } else if (!strcasecmp(var->name, "channelvars")) {
9898 } else if (!strcasecmp(var->name, "disabledevents")) {
9900 } else {
9901 ast_log(LOG_NOTICE, "Invalid keyword <%s> = <%s> in manager.conf [general]\n",
9902 var->name, val);
9903 }
9904 }
9905
9906 if (manager_enabled && !subscribed) {
9907 if (subscribe_all() != 0) {
9908 ast_log(LOG_ERROR, "Manager subscription error\n");
9909 return -1;
9910 }
9911 }
9912
9913 ast_sockaddr_copy(&amis_desc_local_address_tmp, &amis_desc.local_address);
9914
9915 /* if the amis address has not been set, default is the same as non secure ami */
9916 if (ast_sockaddr_isnull(&amis_desc_local_address_tmp)) {
9917 ast_sockaddr_copy(&amis_desc_local_address_tmp, &ami_desc_local_address_tmp);
9918 }
9919
9920 /* if the amis address was not set, it will have non-secure ami port set; if
9921 amis address was set, we need to check that a port was set or not, if not
9922 use the default tls port */
9923 if (ast_sockaddr_port(&amis_desc_local_address_tmp) == 0 ||
9924 (ast_sockaddr_port(&ami_desc_local_address_tmp) == ast_sockaddr_port(&amis_desc_local_address_tmp))) {
9925
9926 ast_sockaddr_set_port(&amis_desc_local_address_tmp, DEFAULT_MANAGER_TLS_PORT);
9927 }
9928
9929 if (manager_enabled) {
9930 ast_sockaddr_copy(&ami_desc.local_address, &ami_desc_local_address_tmp);
9931 ast_sockaddr_copy(&amis_desc.local_address, &amis_desc_local_address_tmp);
9932 }
9933
9935
9936 while ((cat = ast_category_browse(cfg, cat))) {
9937 struct ast_acl_list *oldacl;
9938
9939 if (!strcasecmp(cat, "general")) {
9940 continue;
9941 }
9942
9943 /* Look for an existing entry, if none found - create one and add it to the list */
9944 if (!(user = get_manager_by_name_locked(cat))) {
9945 if (!(user = ast_calloc(1, sizeof(*user)))) {
9946 break;
9947 }
9948 /* Copy name over */
9949 ast_copy_string(user->username, cat, sizeof(user->username));
9950
9951 user->acl = NULL;
9952 user->readperm = 0;
9953 user->writeperm = 0;
9954 /* Default displayconnect from [general] */
9955 user->displayconnects = displayconnects;
9956 /* Default allowmultiplelogin from [general] */
9957 user->allowmultiplelogin = allowmultiplelogin;
9958 user->writetimeout = 100;
9961 if (!user->includefilters || !user->excludefilters) {
9963 break;
9964 }
9965
9966 /* Insert into list */
9968 } else {
9969 ao2_t_callback(user->includefilters, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL, "unlink all include filters");
9970 ao2_t_callback(user->excludefilters, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL, "unlink all exclude filters");
9971 }
9972
9973 /* Make sure we keep this user and don't destroy it during cleanup */
9974 user->keep = 1;
9975 oldacl = user->acl;
9976 user->acl = NULL;
9977 ast_variables_destroy(user->chanvars);
9978
9979 var = ast_variable_browse(cfg, cat);
9980 for (; var; var = var->next) {
9981 if (!strcasecmp(var->name, "secret")) {
9982 ast_free(user->secret);
9983 user->secret = ast_strdup(var->value);
9984 } else if (!strcasecmp(var->name, "deny") ||
9985 !strcasecmp(var->name, "permit") ||
9986 !strcasecmp(var->name, "acl")) {
9987 int acl_error = 0;
9988
9989 ast_append_acl(var->name, var->value, &user->acl, &acl_error, &acl_subscription_flag);
9990 if (acl_error) {
9991 ast_log(LOG_ERROR, "Invalid ACL '%s' for manager user '%s' on line %d. Deleting user\n",
9992 var->value, user->username, var->lineno);
9993 user->keep = 0;
9994 }
9995 } else if (!strcasecmp(var->name, "read") ) {
9996 user->readperm = get_perm(var->value);
9997 } else if (!strcasecmp(var->name, "write") ) {
9998 user->writeperm = get_perm(var->value);
9999 } else if (!strcasecmp(var->name, "displayconnects") ) {
10000 user->displayconnects = ast_true(var->value);
10001 } else if (!strcasecmp(var->name, "allowmultiplelogin") ) {
10002 user->allowmultiplelogin = ast_true(var->value);
10003 } else if (!strcasecmp(var->name, "writetimeout")) {
10004 int value = atoi(var->value);
10005 if (value < 100) {
10006 ast_log(LOG_WARNING, "Invalid writetimeout value '%s' at line %d\n", var->value, var->lineno);
10007 } else {
10008 user->writetimeout = value;
10009 }
10010 } else if (!strcasecmp(var->name, "setvar")) {
10011 struct ast_variable *tmpvar;
10012 char varbuf[256];
10013 char *varval;
10014 char *varname;
10015
10016 ast_copy_string(varbuf, var->value, sizeof(varbuf));
10017 varname = varbuf;
10018
10019 if ((varval = strchr(varname,'='))) {
10020 *varval++ = '\0';
10021 if ((tmpvar = ast_variable_new(varname, varval, ""))) {
10022 tmpvar->next = user->chanvars;
10023 user->chanvars = tmpvar;
10024 }
10025 }
10026 } else if (ast_begins_with(var->name, "eventfilter")) {
10027 const char *value = var->value;
10028 manager_add_filter(var->name, value, user->includefilters, user->excludefilters);
10029 } else {
10030 ast_debug(1, "%s is an unknown option.\n", var->name);
10031 }
10032 }
10033
10034 oldacl = ast_free_acl_list(oldacl);
10035 }
10036 ast_config_destroy(cfg);
10037
10038 /* Check the flag for named ACL event subscription and if we need to, register a subscription. */
10039 if (acl_subscription_flag && !by_external_config) {
10041 }
10042
10043 /* Perform cleanup - essentially prune out old users that no longer exist */
10045 if (user->keep) { /* valid record. clear flag for the next round */
10046 user->keep = 0;
10047
10048 /* Calculate A1 for Digest auth */
10049 snprintf(a1, sizeof(a1), "%s:%s:%s", user->username, global_realm, user->secret);
10050 ast_md5_hash(a1_hash,a1);
10051 ast_free(user->a1_hash);
10052 user->a1_hash = ast_strdup(a1_hash);
10053 continue;
10054 }
10055 /* We do not need to keep this user so take them out of the list */
10057 ast_debug(4, "Pruning user '%s'\n", user->username);
10059 }
10061
10063
10065 if (!webregged) {
10069
10073 webregged = 1;
10074 }
10075 } else {
10076 if (webregged) {
10080
10084 webregged = 0;
10085 }
10086 }
10087
10088 if (newhttptimeout > 0) {
10089 httptimeout = newhttptimeout;
10090 }
10091
10093 if (tls_was_enabled && !ami_tls_cfg.enabled) {
10095 } else if (ast_ssl_setup(amis_desc.tls_cfg)) {
10097 }
10098
10099 return 0;
10100}
void ast_append_acl(const char *sense, const char *stuff, struct ast_acl_list **path, int *error, int *named_acl_flag)
Add a rule to an ACL struct.
Definition acl.c:429
struct ast_acl_list * ast_free_acl_list(struct ast_acl_list *acl)
Free a list of ACLs.
Definition acl.c:233
#define var
Definition ast_expr2f.c:605
#define ast_free(a)
Definition astmm.h:180
#define ast_strdup(str)
A wrapper for strdup()
Definition astmm.h:241
#define ast_calloc(num, len)
A wrapper for calloc()
Definition astmm.h:202
#define ast_log
Definition astobj2.c:42
#define ao2_t_ref(o, delta, tag)
Definition astobj2.h:460
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition astobj2.h:363
#define ao2_global_obj_replace_unref(holder, obj)
Replace an ao2 object in the global holder, throwing away any old object.
Definition astobj2.h:901
#define ao2_t_global_obj_replace_unref(holder, obj, tag)
Definition astobj2.h:904
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
@ OBJ_NODATA
Definition astobj2.h:1044
@ OBJ_MULTIPLE
Definition astobj2.h:1049
@ OBJ_UNLINK
Definition astobj2.h:1039
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
Allocate and initialize a list container.
Definition astobj2.h:1327
#define ao2_t_callback(c, flags, cb_fn, arg, tag)
Definition astobj2.h:1696
static struct unistimsession * sessions
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition cli.h:265
static int action_setvar(struct mansession *s, const struct message *m)
Definition manager.c:3566
static int action_createconfig(struct mansession *s, const struct message *m)
Definition manager.c:3111
static int manager_state_cb(const char *context, const char *exten, struct ast_state_cb_info *info, void *data)
Definition manager.c:7746
static int action_loggerrotate(struct mansession *s, const struct message *m)
Manager command "LoggerRotate" - reloads and rotates the logger in the same manner as the CLI command...
Definition manager.c:6847
static struct ast_manager_user * get_manager_by_name_locked(const char *name)
Definition manager.c:1054
static void acl_change_stasis_subscribe(void)
Definition manager.c:231
static int append_event(const char *str, int event_name_hash, int category)
events are appended to a queue from where they can be dispatched to clients.
Definition manager.c:7514
static int manager_enabled
Definition manager.c:166
static int action_sendtext(struct mansession *s, const struct message *m)
Definition manager.c:3922
static int action_mailboxcount(struct mansession *s, const struct message *m)
Definition manager.c:5457
static int action_getconfigjson(struct mansession *s, const struct message *m)
Definition manager.c:2663
static int action_listcategories(struct mansession *s, const struct message *m)
Definition manager.c:2587
static int action_hangup(struct mansession *s, const struct message *m)
Definition manager.c:3560
static int action_listcommands(struct mansession *s, const struct message *m)
Definition manager.c:3303
static int action_atxfer(struct mansession *s, const struct message *m)
Definition manager.c:4162
static int action_timeout(struct mansession *s, const struct message *m)
Definition manager.c:5551
static int action_coresettings(struct mansession *s, const struct message *m)
Show PBX core settings information.
Definition manager.c:6480
static int mansession_cmp_fn(void *obj, void *arg, int flags)
Definition manager.c:1011
static int displayconnects
Definition manager.c:161
static int action_filter(struct mansession *s, const struct message *m)
Manager command to add an event filter to a manager session.
Definition manager.c:5703
static int manager_debug
Definition manager.c:169
static int action_mailboxstatus(struct mansession *s, const struct message *m)
Definition manager.c:5440
static int action_login(struct mansession *s, const struct message *m)
Definition manager.c:3372
static int action_getvar(struct mansession *s, const struct message *m)
Definition manager.c:3599
static int action_blind_transfer(struct mansession *s, const struct message *m)
Definition manager.c:4116
static int action_extensionstate(struct mansession *s, const struct message *m)
Definition manager.c:5478
static int action_getconfig(struct mansession *s, const struct message *m)
Definition manager.c:2515
static enum add_filter_result manager_add_filter(const char *criteria, const char *filter_pattern, struct ao2_container *includefilters, struct ao2_container *excludefilters)
Add an event filter to a manager session.
Definition manager.c:5770
static int action_logoff(struct mansession *s, const struct message *m)
Definition manager.c:3366
static int action_updateconfig(struct mansession *s, const struct message *m)
Definition manager.c:3020
static int manager_moduleload(struct mansession *s, const struct message *m)
Definition manager.c:6924
static void acl_change_stasis_unsubscribe(void)
Definition manager.c:241
static int action_reload(struct mansession *s, const struct message *m)
Send a reload event.
Definition manager.c:6566
static int authlimit
Definition manager.c:171
static int action_aocmessage(struct mansession *s, const struct message *m)
Definition manager.c:4952
static int action_events(struct mansession *s, const struct message *m)
Definition manager.c:3322
static int action_redirect(struct mansession *s, const struct message *m)
action_redirect: The redirect manager command
Definition manager.c:3971
static int action_presencestate(struct mansession *s, const struct message *m)
Definition manager.c:5508
static int allowmultiplelogin
Definition manager.c:162
static int action_cancel_atxfer(struct mansession *s, const struct message *m)
Definition manager.c:4216
static char global_realm[MAXHOSTNAMELEN]
Definition manager.c:176
static int action_originate(struct mansession *s, const struct message *m)
Definition manager.c:5245
static int action_userevent(struct mansession *s, const struct message *m)
Definition manager.c:6459
static int action_command(struct mansession *s, const struct message *m)
Manager command "command" - execute CLI command.
Definition manager.c:4293
static int broken_events_action
Definition manager.c:165
static int timestampevents
Definition manager.c:163
static int subscribed
Definition manager.c:167
static int authtimeout
Definition manager.c:170
static int manager_modulecheck(struct mansession *s, const struct message *m)
Manager function to check if module is loaded.
Definition manager.c:6859
static int webmanager_enabled
Definition manager.c:168
static int action_status(struct mansession *s, const struct message *m)
Manager "status" command to show channels.
Definition manager.c:3766
static int get_perm(const char *instr)
Definition manager.c:874
static int action_coreshowchannels(struct mansession *s, const struct message *m)
Manager command "CoreShowChannels" - List currently defined channels and some information about them.
Definition manager.c:6598
static int action_corestatus(struct mansession *s, const struct message *m)
Show PBX core status information.
Definition manager.c:6524
static int action_challenge(struct mansession *s, const struct message *m)
Definition manager.c:3421
static struct stasis_topic * manager_topic
A stasis_topic that all topics AMI cares about will be forwarded to.
Definition manager.c:182
static int action_waitevent(struct mansession *s, const struct message *m)
Definition manager.c:3185
static int action_coreshowchannelmap(struct mansession *s, const struct message *m)
Manager command "CoreShowChannelMap" - Lists all channels connected to the specified channel.
Definition manager.c:6766
static int action_ping(struct mansession *s, const struct message *m)
Definition manager.c:2443
static int httptimeout
Definition manager.c:164
void ast_http_uri_unlink(struct ast_http_uri *urihandler)
Unregister a URI handler.
Definition http.c:771
int ast_http_uri_link(struct ast_http_uri *urihandler)
Register a URI handler.
Definition http.c:739
struct ast_config * ast_config_load2(const char *filename, const char *who_asked, struct ast_flags flags)
Load a config file.
char * ast_category_browse(struct ast_config *config, const char *prev_name)
Browse categories.
Definition extconf.c:3324
#define ast_variable_new(name, value, filename)
#define CONFIG_STATUS_FILEUNCHANGED
@ CONFIG_FLAG_FILEUNCHANGED
#define CONFIG_STATUS_FILEINVALID
int ast_parse_arg(const char *arg, enum ast_parse_flags flags, void *p_result,...)
The argument parsing routine.
void ast_config_destroy(struct ast_config *cfg)
Destroys a config.
Definition extconf.c:1287
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Definition extconf.c:1260
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
Definition extconf.c:1213
#define ast_debug(level,...)
Log a DEBUG message.
#define LOG_ERROR
#define LOG_NOTICE
#define LOG_WARNING
#define AST_RWLIST_REMOVE_CURRENT
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition linkedlists.h:52
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
#define AST_RWLIST_TRAVERSE_SAFE_END
#define AST_RWLIST_INSERT_TAIL
static struct ast_tls_config ami_tls_cfg
Definition manager.c:9136
static struct ast_tcptls_session_args ami_desc
Definition manager.c:9137
static struct ast_http_uri managerxmluri
Definition manager.c:8976
static struct ast_tcptls_session_args amis_desc
Definition manager.c:9148
static struct ast_custom_function managerclient_function
description of AMI_CLIENT dialplan function
Definition manager.c:9109
static void load_channelvars(struct ast_variable *var)
Definition manager.c:9435
static struct ast_http_uri manageruri
Definition manager.c:8968
static void manager_set_defaults(void)
Definition manager.c:9671
static struct ast_http_uri arawmanuri
Definition manager.c:9019
static struct ast_http_uri rawmanuri
Definition manager.c:8960
static struct ast_cli_entry cli_manager[]
Definition manager.c:9412
static void manager_free_user(struct ast_manager_user *user)
Definition manager.c:9468
static struct ast_http_uri amanageruri
Definition manager.c:9028
static int webregged
Definition manager.c:9115
static int subscribe_all(void)
Definition manager.c:9641
static struct ast_http_uri amanagerxmluri
Definition manager.c:9037
static void load_disabledevents(struct ast_variable *var)
Definition manager.c:9458
#define EVENT_FLAG_REPORTING
Definition manager.h:84
#define ast_manager_register_xml_core(action, authority, func)
Register a manager callback using XML documentation to describe the manager.
Definition manager.h:204
#define EVENT_FLAG_CONFIG
Definition manager.h:82
#define EVENT_FLAG_SYSTEM
Definition manager.h:75
struct stasis_message_type * ast_manager_get_generic_type(void)
Get the stasis_message_type for generic messages.
#define DEFAULT_MANAGER_PORT
Definition manager.h:58
#define DEFAULT_MANAGER_TLS_PORT
Definition manager.h:59
#define EVENT_FLAG_CALL
Definition manager.h:76
#define EVENT_FLAG_COMMAND
Definition manager.h:79
#define EVENT_FLAG_USER
Definition manager.h:81
#define EVENT_FLAG_AOC
Definition manager.h:91
#define EVENT_FLAG_ORIGINATE
Definition manager.h:87
#define ast_sockaddr_port(addr)
Get the port number of a socket address.
Definition netsock2.h:517
static void ast_sockaddr_copy(struct ast_sockaddr *dst, const struct ast_sockaddr *src)
Copies the data from one ast_sockaddr to another.
Definition netsock2.h:167
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
Definition netsock2.c:230
static int ast_sockaddr_isnull(const struct ast_sockaddr *addr)
Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized,...
Definition netsock2.h:127
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
Definition netsock2.h:532
static char * ast_sockaddr_stringify_addr(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return an address only.
Definition netsock2.h:286
int __ast_custom_function_register(struct ast_custom_function *acf, struct ast_module *mod)
Register a custom function.
int ast_extension_state_add(const char *context, const char *exten, ast_state_cb_type change_cb, void *data)
Add watcher for extension states.
Definition pbx.c:3859
static int reload(void)
#define NULL
Definition resample.c:96
struct stasis_topic * stasis_topic_create(const char *name)
Create a new topic.
Definition stasis.c:684
#define STASIS_MESSAGE_TYPE_INIT(name)
Boiler-plate messaging macro for initializing message types.
Definition stasis.h:1493
struct stasis_forward * stasis_forward_all(struct stasis_topic *from_topic, struct stasis_topic *to_topic)
Create a subscription which forwards all messages from one topic to another.
Definition stasis.c:1645
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
Definition strings.h:1259
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
Definition utils.c:2233
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425
static int force_inline attribute_pure ast_begins_with(const char *str, const char *prefix)
Checks whether a string begins with another.
Definition strings.h:97
Generic container type.
Wrapper for an ast_acl linked list.
Definition acl.h:76
Structure used to handle boolean flags.
Definition utils.h:220
user descriptor, as read from the config file.
Definition manager.c:342
Socket address structure.
Definition netsock2.h:97
struct ast_sockaddr local_address
Definition tcptls.h:131
const char * name
Definition tcptls.h:143
struct ast_tls_config * tls_cfg
Definition tcptls.h:135
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
structure to hold users read from phoneprov_users.conf
list of users found in the config file
int value
Definition syslog.c:37
void ast_tcptls_server_stop(struct ast_tcptls_session_args *desc)
Shutdown a running server if there is one.
Definition tcptls.c:933
int ast_ssl_setup(struct ast_tls_config *cfg)
Set up an SSL server.
Definition tcptls.c:577
void ast_tcptls_server_start(struct ast_tcptls_session_args *desc)
This is a generic (re)start routine for a TCP server, which does the socket/bind/listen and starts a ...
Definition tcptls.c:768
int ast_tls_read_conf(struct ast_tls_config *tls_cfg, struct ast_tcptls_session_args *tls_desc, const char *varname, const char *value)
Used to parse conf files containing tls/ssl options.
Definition tcptls.c:959
#define ARRAY_LEN(a)
Definition utils.h:706
void ast_md5_hash(char *output, const char *input)
Produces MD5 hash based on input string.
Definition utils.c:250
struct ao2_container * ast_xmldoc_build_documentation(const char *type)
Build the documentation for a particular source type.
Definition xmldoc.c:2851

References __ast_custom_function_register(), acl_change_stasis_subscribe(), acl_change_stasis_unsubscribe(), action_aocmessage(), action_atxfer(), action_blind_transfer(), action_cancel_atxfer(), action_challenge(), action_command(), action_coresettings(), action_coreshowchannelmap(), action_coreshowchannels(), action_corestatus(), action_createconfig(), action_events(), action_extensionstate(), action_filter(), action_getconfig(), action_getconfigjson(), action_getvar(), action_hangup(), action_listcategories(), action_listcommands(), action_loggerrotate(), action_login(), action_logoff(), action_mailboxcount(), action_mailboxstatus(), action_originate(), action_ping(), action_presencestate(), action_redirect(), action_reload(), action_sendtext(), action_setvar(), action_status(), action_timeout(), action_updateconfig(), action_userevent(), action_waitevent(), allowmultiplelogin, amanageruri, amanagerxmluri, ami_desc, ami_tls_cfg, amis_desc, AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_list, ao2_global_obj_replace_unref, ao2_ref, ao2_t_callback, ao2_t_global_obj_replace_unref, ao2_t_ref, append_event(), arawmanuri, ARRAY_LEN, ast_append_acl(), ast_begins_with(), ast_calloc, ast_category_browse(), ast_cli_register_multiple, ast_config_destroy(), ast_config_load2(), ast_copy_string(), ast_debug, ast_extension_state_add(), ast_free, ast_free_acl_list(), ast_http_uri_link(), ast_http_uri_unlink(), ast_log, ast_manager_get_generic_type(), ast_manager_register_xml_core, ast_md5_hash(), ast_parse_arg(), AST_RWLIST_INSERT_TAIL, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_sockaddr_copy(), ast_sockaddr_isnull(), ast_sockaddr_parse(), ast_sockaddr_port, ast_sockaddr_set_port, ast_sockaddr_stringify_addr(), ast_ssl_setup(), ast_str_hash(), ast_strdup, ast_tcptls_server_start(), ast_tcptls_server_stop(), ast_tls_read_conf(), ast_true(), ast_variable_browse(), ast_variable_new, ast_variables_destroy(), ast_xmldoc_build_documentation(), authlimit, authtimeout, broken_events_action, cli_manager, CONFIG_FLAG_FILEUNCHANGED, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, DEFAULT_MANAGER_PORT, DEFAULT_MANAGER_TLS_PORT, displayconnects, ast_tls_config::enabled, EVENT_FLAG_AOC, EVENT_FLAG_CALL, EVENT_FLAG_COMMAND, EVENT_FLAG_CONFIG, EVENT_FLAG_ORIGINATE, EVENT_FLAG_REPORTING, EVENT_FLAG_SYSTEM, EVENT_FLAG_USER, get_manager_by_name_locked(), get_perm(), global_realm, httptimeout, load_channelvars(), load_disabledevents(), ast_tcptls_session_args::local_address, LOG_ERROR, LOG_NOTICE, LOG_WARNING, manager_add_filter(), manager_debug, manager_enabled, manager_free_user(), manager_modulecheck(), manager_moduleload(), manager_set_defaults(), manager_state_cb(), manager_topic, managerclient_function, manageruri, managerxmluri, mansession_cmp_fn(), ast_tcptls_session_args::name, ast_variable::next, NULL, OBJ_MULTIPLE, OBJ_NODATA, OBJ_UNLINK, PARSE_ADDR, PARSE_IN_RANGE, PARSE_PORT_IGNORE, PARSE_UINT32, rawmanuri, reload(), sessions, stasis_forward_all(), STASIS_MESSAGE_TYPE_INIT, stasis_topic_create(), subscribe_all(), subscribed, timestampevents, ast_tcptls_session_args::tls_cfg, ast_variable::value, value, var, webmanager_enabled, and webregged.

Referenced by acl_change_stasis_cb(), load_module(), and reload_module().

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 10237 of file manager.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 10237 of file manager.c.

◆ AO2_STRING_FIELD_SORT_FN()

AO2_STRING_FIELD_SORT_FN ( ast_xml_doc_item  ,
name   
)

◆ ast_manager_event_blob_create()

struct ast_manager_event_blob * ast_manager_event_blob_create ( int  event_flags,
const char *  manager_event,
const char *  extra_fields_fmt,
  ... 
)

Construct a ast_manager_event_blob.

Since
12

The returned object is AO2 managed, so clean up with ao2_cleanup().

Parameters
event_flagsFlags the event should be raised with.
manager_eventThe event to be raised, should be a string literal.
extra_fields_fmtFormat string for extra fields to include. Or NO_EXTRA_FIELDS for no extra fields.
Returns
New ast_manager_event_blob object.
Return values
NULLon error.

Definition at line 10198 of file manager.c.

10203{
10204 struct ast_manager_event_blob *ev;
10205 va_list argp;
10206
10207 ast_assert(extra_fields_fmt != NULL);
10209
10211 if (!ev) {
10212 return NULL;
10213 }
10214
10215 if (ast_string_field_init(ev, 20)) {
10216 ao2_ref(ev, -1);
10217 return NULL;
10218 }
10219
10222
10223 va_start(argp, extra_fields_fmt);
10224 ast_string_field_ptr_build_va(ev, &ev->extra_fields, extra_fields_fmt, argp);
10225 va_end(argp);
10226
10227 return ev;
10228}
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition astobj2.h:367
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition astobj2.h:404
static void manager_event_blob_dtor(void *obj)
Definition manager.c:10189
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
Definition manager.h:255
#define ast_string_field_ptr_build_va(x, ptr, fmt, args)
Set a field to a complex (built) value with prebuilt va_lists.
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Struct containing info for an AMI event to send out.
Definition manager.h:504
const ast_string_field extra_fields
Definition manager.h:509
const char * manager_event
Definition manager.h:506
#define ast_assert(a)
Definition utils.h:779

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_ref, ast_assert, ast_string_field_init, ast_string_field_ptr_build_va, ast_manager_event_blob::event_flags, ast_manager_event_blob::extra_fields, manager_event, ast_manager_event_blob::manager_event, manager_event_blob_dtor(), and NULL.

Referenced by agent_login_to_ami(), agent_logoff_to_ami(), agi_channel_to_ami(), aoc_to_ami(), attended_transfer_to_ami(), blind_transfer_to_ami(), bridge_create(), bridge_destroy(), bridge_video_update(), call_pickup_to_ami(), cc_available_to_ami(), cc_callerrecalling_to_ami(), cc_callerstartmonitoring_to_ami(), cc_callerstopmonitoring_to_ami(), cc_failure_to_ami(), cc_monitorfailed_to_ami(), cc_offertimerstart_to_ami(), cc_recallcomplete_to_ami(), cc_requestacknowledged_to_ami(), cc_requested_to_ami(), channel_new_accountcode(), channel_new_callerid(), channel_new_connected_line(), channel_newexten(), channel_state_change(), contactstatus_to_ami(), dahdichannel_to_ami(), devstate_to_ami(), fake_ami(), local_message_to_ami(), multi_user_event_to_ami(), peerstatus_to_ami(), presence_state_to_ami(), queue_channel_to_ami(), queue_member_to_ami(), queue_multi_channel_to_ami(), rtcp_report_to_ami(), security_event_to_ami_blob(), system_registry_to_ami(), talking_start_to_ami(), talking_stop_to_ami(), and varset_to_ami().

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 10237 of file manager.c.

◆ ast_str_append_event_header()

int ast_str_append_event_header ( struct ast_str **  fields_string,
const char *  header,
const char *  value 
)

append an event header to an ast string

Since
12
Parameters
fields_stringpointer to an ast_string pointer. It may be a pointer to a NULL ast_str pointer, in which case the ast_str will be initialized.
headerThe header being applied
valuethe value of the header
Return values
0if successful
non-zeroon failure

Definition at line 10176 of file manager.c.

10178{
10179 if (!*fields_string) {
10180 *fields_string = ast_str_create(128);
10181 if (!*fields_string) {
10182 return -1;
10183 }
10184 }
10185
10186 return (ast_str_append(fields_string, 0, "%s: %s\r\n", header, value) < 0) ? -1 : 0;
10187}
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition strings.h:1139
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition strings.h:659

References ast_str_append(), ast_str_create, and value.

Referenced by confbridge_talking_cb(), get_bool_header(), and meetme_stasis_cb().

◆ astman_datastore_add()

int astman_datastore_add ( struct mansession s,
struct ast_datastore datastore 
)

Add a datastore to a session.

Return values
0success
non-zerofailure
Since
1.6.1

Definition at line 10137 of file manager.c.

10138{
10139 AST_LIST_INSERT_HEAD(&s->session->datastores, datastore, entry);
10140
10141 return 0;
10142}
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
struct mansession_session::mansession_datastores datastores
struct mansession_session * session
Definition manager.c:324

References AST_LIST_INSERT_HEAD, mansession_session::datastores, and mansession::session.

◆ astman_datastore_find()

struct ast_datastore * astman_datastore_find ( struct mansession s,
const struct ast_datastore_info info,
const char *  uid 
)

Find a datastore on a session.

Returns
pointer to the datastore if found
Return values
NULLif not found
Since
1.6.1

Definition at line 10149 of file manager.c.

10150{
10151 struct ast_datastore *datastore = NULL;
10152
10153 if (info == NULL)
10154 return NULL;
10155
10157 if (datastore->info != info) {
10158 continue;
10159 }
10160
10161 if (uid == NULL) {
10162 /* matched by type only */
10163 break;
10164 }
10165
10166 if ((datastore->uid != NULL) && !strcasecmp(uid, datastore->uid)) {
10167 /* Matched by type AND uid */
10168 break;
10169 }
10170 }
10172
10173 return datastore;
10174}
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Structure for a data store object.
Definition datastore.h:64
const struct ast_datastore_info * info
Definition datastore.h:67
const char * uid
Definition datastore.h:65
struct ast_datastore::@223 entry

References AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, mansession_session::datastores, ast_datastore::entry, ast_datastore::info, NULL, mansession::session, and ast_datastore::uid.

◆ astman_datastore_remove()

int astman_datastore_remove ( struct mansession s,
struct ast_datastore datastore 
)

Remove a datastore from a session.

Return values
0success
non-zerofailure
Since
1.6.1

Definition at line 10144 of file manager.c.

10145{
10146 return AST_LIST_REMOVE(&s->session->datastores, datastore, entry) ? 0 : -1;
10147}
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.

References AST_LIST_REMOVE, mansession_session::datastores, and mansession::session.

◆ astman_is_authed()

int astman_is_authed ( uint32_t  ident)

Determine if a manager session ident is authenticated.

Definition at line 8026 of file manager.c.

8027{
8028 int authed;
8030
8031 if (!(session = find_session(ident, 0)))
8032 return 0;
8033
8034 authed = (session->authenticated != 0);
8035
8038
8039 return authed;
8040}
static struct ast_mansession session
#define ao2_unlock(a)
Definition astobj2.h:729
static struct mansession_session * unref_mansession(struct mansession_session *s)
Unreference manager session object. If no more references, then go ahead and delete it.
Definition manager.c:926
static struct mansession_session * find_session(uint32_t ident, int incinuse)
Definition manager.c:7954

References ao2_unlock, find_session(), session, and unref_mansession().

Referenced by http_post_callback(), and static_callback().

◆ astman_verify_session_readpermissions()

int astman_verify_session_readpermissions ( uint32_t  ident,
int  perm 
)

Verify a session's read permissions against a permission mask.

Parameters
identsession identity
permpermission mask to verify
Return values
1if the session has the permission mask capabilities
0otherwise

Definition at line 8042 of file manager.c.

8043{
8044 int result = 0;
8046 struct ao2_container *sessions;
8047 struct ao2_iterator i;
8048
8049 if (ident == 0) {
8050 return 0;
8051 }
8052
8053 sessions = ao2_global_obj_ref(mgr_sessions);
8054 if (!sessions) {
8055 return 0;
8056 }
8058 ao2_ref(sessions, -1);
8059 while ((session = ao2_iterator_next(&i))) {
8061 if ((session->managerid == ident) && (session->readperm & perm)) {
8062 result = 1;
8065 break;
8066 }
8069 }
8071
8072 return result;
8073}
#define ao2_iterator_next(iter)
Definition astobj2.h:1911
#define ao2_global_obj_ref(holder)
Get a reference to the object stored in the global holder.
Definition astobj2.h:918
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_lock(a)
Definition astobj2.h:717
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
static PGresult * result
Definition cel_pgsql.c:84
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition astobj2.h:1821

References ao2_global_obj_ref, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_lock, ao2_ref, ao2_unlock, result, session, sessions, and unref_mansession().

◆ astman_verify_session_writepermissions()

int astman_verify_session_writepermissions ( uint32_t  ident,
int  perm 
)

Verify a session's write permissions against a permission mask.

Parameters
identsession identity
permpermission mask to verify
Return values
1if the session has the permission mask capabilities, otherwise 0
0otherwise

Definition at line 8075 of file manager.c.

8076{
8077 int result = 0;
8079 struct ao2_container *sessions;
8080 struct ao2_iterator i;
8081
8082 if (ident == 0) {
8083 return 0;
8084 }
8085
8086 sessions = ao2_global_obj_ref(mgr_sessions);
8087 if (!sessions) {
8088 return 0;
8089 }
8091 ao2_ref(sessions, -1);
8092 while ((session = ao2_iterator_next(&i))) {
8094 if ((session->managerid == ident) && (session->writeperm & perm)) {
8095 result = 1;
8098 break;
8099 }
8102 }
8104
8105 return result;
8106}

References ao2_global_obj_ref, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_lock, ao2_ref, ao2_unlock, result, session, sessions, and unref_mansession().

Referenced by http_post_callback().

◆ auth_http_callback()

static int auth_http_callback ( struct ast_tcptls_session_instance ser,
enum ast_http_method  method,
enum output_format  format,
const struct ast_sockaddr remote_address,
const char *  uri,
struct ast_variable get_params,
struct ast_variable headers 
)
static

Definition at line 8604 of file manager.c.

8610{
8612 struct mansession s = { .session = NULL, .tcptls_session = ser };
8613 struct ast_variable *v, *params = get_params;
8614 char template[] = "/tmp/ast-http-XXXXXX"; /* template for temporary file */
8615 struct ast_str *http_header = NULL, *out = NULL;
8616 size_t result_size;
8617 struct message m = { 0 };
8618 int fd;
8619
8620 time_t time_now = time(NULL);
8621 unsigned long nonce = 0, nc;
8622 struct ast_http_digest d = { NULL, };
8623 struct ast_manager_user *user = NULL;
8624 int stale = 0;
8625 char resp_hash[256]="";
8626 /* Cache for user data */
8627 char u_username[80];
8628 int u_readperm;
8629 int u_writeperm;
8630 int u_writetimeout;
8631 int u_displayconnects;
8632
8634 ast_http_error(ser, 501, "Not Implemented", "Attempt to use unimplemented / unsupported method");
8635 return 0;
8636 }
8637
8638 /* Find "Authorization: " header */
8639 for (v = headers; v; v = v->next) {
8640 if (!strcasecmp(v->name, "Authorization")) {
8641 break;
8642 }
8643 }
8644
8645 if (!v || ast_strlen_zero(v->value)) {
8646 goto out_401; /* Authorization Header not present - send auth request */
8647 }
8648
8649 /* Digest found - parse */
8650 if (ast_string_field_init(&d, 128)) {
8652 ast_http_error(ser, 500, "Server Error", "Internal Server Error (out of memory)");
8653 return 0;
8654 }
8655
8656 if (ast_parse_digest(v->value, &d, 0, 1)) {
8657 /* Error in Digest - send new one */
8658 nonce = 0;
8659 goto out_401;
8660 }
8661 if (sscanf(d.nonce, "%30lx", &nonce) != 1) {
8662 ast_log(LOG_WARNING, "Received incorrect nonce in Digest <%s>\n", d.nonce);
8663 nonce = 0;
8664 goto out_401;
8665 }
8666
8668 user = get_manager_by_name_locked(d.username);
8669 if(!user) {
8671 ast_log(LOG_NOTICE, "%s tried to authenticate with nonexistent user '%s'\n", ast_sockaddr_stringify_addr(&session->addr), d.username);
8672 nonce = 0;
8673 goto out_401;
8674 }
8675
8676 /* --- We have User for this auth, now check ACL */
8677 if (user->acl && !ast_apply_acl(user->acl, remote_address, "Manager User ACL:")) {
8679 ast_log(LOG_NOTICE, "%s failed to pass IP ACL as '%s'\n", ast_sockaddr_stringify_addr(&session->addr), d.username);
8681 ast_http_error(ser, 403, "Permission denied", "Permission denied");
8682 return 0;
8683 }
8684
8685 /* --- We have auth, so check it */
8686
8687 /* compute the expected response to compare with what we received */
8688 {
8689 char *a2;
8690 /* ast_md5_hash outputs 32 characters plus NULL terminator. */
8691 char a2_hash[33];
8692 char resp[256];
8693
8694 /* XXX Now request method are hardcoded in A2 */
8695 if (ast_asprintf(&a2, "%s:%s", ast_get_http_method(method), d.uri) < 0) {
8698 ast_http_error(ser, 500, "Server Error", "Internal Server Error (out of memory)");
8699 return 0;
8700 }
8701
8702 ast_md5_hash(a2_hash, a2);
8703 ast_free(a2);
8704
8705 if (d.qop) {
8706 /* RFC 2617 */
8707 snprintf(resp, sizeof(resp), "%s:%08lx:%s:%s:auth:%s", user->a1_hash, nonce, d.nc, d.cnonce, a2_hash);
8708 } else {
8709 /* RFC 2069 */
8710 snprintf(resp, sizeof(resp), "%s:%08lx:%s", user->a1_hash, nonce, a2_hash);
8711 }
8712 ast_md5_hash(resp_hash, resp);
8713 }
8714
8715 if (strncasecmp(d.response, resp_hash, strlen(resp_hash))) {
8716 /* Something was wrong, so give the client to try with a new challenge */
8718 nonce = 0;
8719 goto out_401;
8720 }
8721
8722 /*
8723 * User are pass Digest authentication.
8724 * Now, cache the user data and unlock user list.
8725 */
8726 ast_copy_string(u_username, user->username, sizeof(u_username));
8727 u_readperm = user->readperm;
8728 u_writeperm = user->writeperm;
8729 u_displayconnects = user->displayconnects;
8730 u_writetimeout = user->writetimeout;
8732
8733 if (!(session = find_session_by_nonce(d.username, nonce, &stale))) {
8734 /*
8735 * Create new session.
8736 * While it is not in the list we don't need any locking
8737 */
8738 if (!(session = build_mansession(remote_address))) {
8740 ast_http_error(ser, 500, "Server Error", "Internal Server Error (out of memory)");
8741 return 0;
8742 }
8744
8745 ast_copy_string(session->username, u_username, sizeof(session->username));
8746 session->managerid = nonce;
8747 session->last_ev = grab_last();
8748 AST_LIST_HEAD_INIT_NOLOCK(&session->datastores);
8749
8750 session->readperm = u_readperm;
8751 session->writeperm = u_writeperm;
8752 session->writetimeout = u_writetimeout;
8753
8754 if (u_displayconnects) {
8755 ast_verb(2, "HTTP Manager '%s' logged in from %s\n", session->username, ast_sockaddr_stringify_addr(&session->addr));
8756 }
8757 session->noncetime = session->sessionstart = time_now;
8758 session->authenticated = 1;
8759 } else if (stale) {
8760 /*
8761 * Session found, but nonce is stale.
8762 *
8763 * This could be because an old request (w/old nonce) arrived.
8764 *
8765 * This may be as the result of http proxy usage (separate delay or
8766 * multipath) or in a situation where a page was refreshed too quickly
8767 * (seen in Firefox).
8768 *
8769 * In this situation, we repeat the 401 auth with the current nonce
8770 * value.
8771 */
8772 nonce = session->managerid;
8774 stale = 1;
8775 goto out_401;
8776 } else {
8777 sscanf(d.nc, "%30lx", &nc);
8778 if (session->nc >= nc || ((time_now - session->noncetime) > 62) ) {
8779 /*
8780 * Nonce time expired (> 2 minutes) or something wrong with nonce
8781 * counter.
8782 *
8783 * Create new nonce key and resend Digest auth request. Old nonce
8784 * is saved for stale checking...
8785 */
8786 session->nc = 0; /* Reset nonce counter */
8787 session->oldnonce = session->managerid;
8788 nonce = session->managerid = ast_random();
8789 session->noncetime = time_now;
8791 stale = 1;
8792 goto out_401;
8793 } else {
8794 session->nc = nc; /* All OK, save nonce counter */
8795 }
8796 }
8797
8798
8799 /* Reset session timeout. */
8800 session->sessiontimeout = time(NULL) + (httptimeout > 5 ? httptimeout : 5);
8802
8803 ast_mutex_init(&s.lock);
8804 s.session = session;
8805 fd = mkstemp(template); /* create a temporary file for command output */
8806 unlink(template);
8807 if (fd <= -1) {
8808 ast_http_error(ser, 500, "Server Error", "Internal Server Error (mkstemp failed)");
8809 goto auth_callback_out;
8810 }
8812 if (!s.stream) {
8813 ast_log(LOG_WARNING, "HTTP Manager, fdopen failed: %s!\n", strerror(errno));
8814 ast_http_error(ser, 500, "Server Error", "Internal Server Error (fdopen failed)");
8815 close(fd);
8816 goto auth_callback_out;
8817 }
8818
8819 if (method == AST_HTTP_POST) {
8820 params = ast_http_get_post_vars(ser, headers);
8821 if (!params) {
8822 switch (errno) {
8823 case EFBIG:
8824 ast_http_error(ser, 413, "Request Entity Too Large", "Body too large");
8826 goto auth_callback_out;
8827 case ENOMEM:
8829 ast_http_error(ser, 500, "Server Error", "Out of memory");
8831 goto auth_callback_out;
8832 case EIO:
8833 ast_http_error(ser, 400, "Bad Request", "Error parsing request body");
8835 goto auth_callback_out;
8836 }
8837 }
8838 }
8839
8840 astman_append_headers(&m, params);
8841
8842 if (process_message(&s, &m)) {
8843 if (u_displayconnects) {
8844 ast_verb(2, "HTTP Manager '%s' logged off from %s\n", session->username, ast_sockaddr_stringify_addr(&session->addr));
8845 }
8846
8847 session->needdestroy = 1;
8848 }
8849
8851
8852 result_size = lseek(ast_iostream_get_fd(s.stream), 0, SEEK_CUR); /* Calculate approx. size of result */
8853
8854 http_header = ast_str_create(80);
8855 out = ast_str_create(result_size * 2 + 512);
8856 if (http_header == NULL || out == NULL) {
8858 ast_http_error(ser, 500, "Server Error", "Internal Server Error (ast_str_create() out of memory)");
8860 goto auth_callback_out;
8861 }
8862
8863 ast_str_append(&http_header, 0, "Content-type: text/%s\r\n", contenttype[format]);
8864
8865 if (format == FORMAT_XML) {
8866 ast_str_append(&out, 0, "<ajax-response>\n");
8867 } else if (format == FORMAT_HTML) {
8868 ast_str_append(&out, 0,
8869 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n"
8870 "<html><head>\r\n"
8871 "<title>Asterisk&trade; Manager Interface</title>\r\n"
8872 "</head><body style=\"background-color: #ffffff;\">\r\n"
8873 "<form method=\"POST\">\r\n"
8874 "<table align=\"center\" style=\"background-color: #f1f1f1;\" width=\"500\">\r\n"
8875 "<tr><th colspan=\"2\" style=\"background-color: #f1f1ff;\"><h1>Manager Tester</h1></th></tr>\r\n"
8876 "<tr><th colspan=\"2\" style=\"background-color: #f1f1ff;\">Action: <input name=\"action\" /> Cmd: <input name=\"command\" /><br>"
8877 "<input type=\"submit\" value=\"Send request\" /></th></tr>\r\n");
8878 }
8879
8880 process_output(&s, &out, params, format);
8881
8882 if (format == FORMAT_XML) {
8883 ast_str_append(&out, 0, "</ajax-response>\n");
8884 } else if (format == FORMAT_HTML) {
8885 ast_str_append(&out, 0, "</table></form></body></html>\r\n");
8886 }
8887
8888 ast_http_send(ser, method, 200, NULL, http_header, out, 0, 0);
8889 http_header = NULL;
8890 out = NULL;
8891
8892auth_callback_out:
8894
8895 /* Clear resources and unlock manager session */
8896 if (method == AST_HTTP_POST && params) {
8897 ast_variables_destroy(params);
8898 }
8899
8900 ast_free(http_header);
8901 ast_free(out);
8902
8904 if (session->stream) {
8905 ast_iostream_close(session->stream);
8906 session->stream = NULL;
8907 }
8909
8910 if (session->needdestroy) {
8911 ast_debug(1, "Need destroy, doing it now!\n");
8913 }
8915 return 0;
8916
8917out_401:
8918 if (!nonce) {
8919 nonce = ast_random();
8920 }
8921
8922 ast_http_auth(ser, global_realm, nonce, nonce, stale, NULL);
8924 return 0;
8925}
enum ast_acl_sense ast_apply_acl(struct ast_acl_list *acl_list, const struct ast_sockaddr *addr, const char *purpose)
Apply a set of rules to a given IP address.
Definition acl.c:799
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition astmm.h:267
static int process_message(struct mansession *s, const struct message *m)
Process an AMI message, performing desired action. Return 0 on success, -1 on error that require the ...
Definition manager.c:7044
static struct mansession_session * build_mansession(const struct ast_sockaddr *addr)
Allocate manager session structure and add it to the list of sessions.
Definition manager.c:978
static void astman_free_headers(struct message *m)
Free headers inside message structure, but not the message structure itself.
Definition manager.c:1685
static void session_destroy(struct mansession_session *s)
Definition manager.c:1018
static void astman_append_headers(struct message *m, const struct ast_variable *params)
Append additional headers into the message structure from params.
Definition manager.c:1671
static struct eventqent * grab_last(void)
Definition manager.c:706
void ast_http_send(struct ast_tcptls_session_instance *ser, enum ast_http_method method, int status_code, const char *status_title, struct ast_str *http_header, struct ast_str *out, int fd, unsigned int static_content)
Generic function for sending HTTP/1.1 response.
Definition http.c:522
struct ast_variable * ast_http_get_post_vars(struct ast_tcptls_session_instance *ser, struct ast_variable *headers)
Get post variables from client Request Entity-Body, if content type is application/x-www-form-urlenco...
Definition http.c:1455
@ AST_HTTP_POST
Definition http.h:61
@ AST_HTTP_GET
Definition http.h:60
@ AST_HTTP_HEAD
Definition http.h:62
const char * ast_get_http_method(enum ast_http_method method) attribute_pure
Return http method name string.
Definition http.c:207
void ast_http_request_close_on_completion(struct ast_tcptls_session_instance *ser)
Request the HTTP connection be closed after this HTTP request.
Definition http.c:903
void ast_http_error(struct ast_tcptls_session_instance *ser, int status, const char *title, const char *text)
Send HTTP error message and close socket.
Definition http.c:714
#define ast_verb(level,...)
struct ast_iostream * ast_iostream_from_fd(int *fd)
Create an iostream from a file descriptor.
Definition iostream.c:611
int ast_iostream_get_fd(struct ast_iostream *stream)
Get an iostream's file descriptor.
Definition iostream.c:85
int ast_iostream_close(struct ast_iostream *stream)
Close an iostream.
Definition iostream.c:539
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
#define ast_mutex_init(pmutex)
Definition lock.h:193
#define ast_mutex_destroy(a)
Definition lock.h:195
int errno
static void close_mansession_file(struct mansession *s)
Definition manager.c:8349
static struct mansession_session * find_session_by_nonce(const char *username, unsigned long nonce, int *stale)
Definition manager.c:7993
static void process_output(struct mansession *s, struct ast_str **out, struct ast_variable *params, enum output_format format)
Definition manager.c:8359
static const char *const contenttype[]
Definition manager.c:7943
const char * method
Definition res_pjsip.c:1273
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
HTTP authentication information.
Definition http.h:125
Support for dynamic strings.
Definition strings.h:623
In case you didn't read that giant block of text above the mansession_session struct,...
Definition manager.c:323
struct ast_iostream * stream
Definition manager.c:325
ast_mutex_t lock
Definition manager.c:330
static struct test_val d
FILE * out
Definition utils/frame.c:33
int ast_parse_digest(const char *digest, struct ast_http_digest *d, int request, int pedantic)
Parse digest authorization header.
Definition utils.c:2672
long int ast_random(void)
Definition utils.c:2346

References ao2_lock, ao2_unlock, ast_apply_acl(), ast_asprintf, ast_copy_string(), ast_debug, ast_free, ast_get_http_method(), ast_http_error(), AST_HTTP_GET, ast_http_get_post_vars(), AST_HTTP_HEAD, AST_HTTP_POST, ast_http_request_close_on_completion(), ast_http_send(), ast_iostream_close(), ast_iostream_from_fd(), ast_iostream_get_fd(), AST_LIST_HEAD_INIT_NOLOCK, ast_log, ast_md5_hash(), ast_mutex_destroy, ast_mutex_init, ast_parse_digest(), ast_random(), AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_sockaddr_stringify_addr(), ast_str_append(), ast_str_create, ast_string_field_free_memory, ast_string_field_init, ast_strlen_zero(), ast_variables_destroy(), ast_verb, astman_append_headers(), astman_free_headers(), build_mansession(), close_mansession_file(), contenttype, d, errno, find_session_by_nonce(), FORMAT_HTML, FORMAT_XML, get_manager_by_name_locked(), global_realm, grab_last(), httptimeout, mansession::lock, LOG_NOTICE, LOG_WARNING, method, ast_variable::name, ast_variable::next, NULL, out, process_message(), process_output(), mansession::session, session, session_destroy(), mansession::stream, and ast_variable::value.

Referenced by auth_manager_http_callback(), auth_mxml_http_callback(), and auth_rawman_http_callback().

◆ auth_manager_http_callback()

static int auth_manager_http_callback ( struct ast_tcptls_session_instance ser,
const struct ast_http_uri urih,
const char *  uri,
enum ast_http_method  method,
struct ast_variable get_params,
struct ast_variable headers 
)
static

Definition at line 8986 of file manager.c.

8987{
8988 int retval;
8989 struct ast_sockaddr ser_remote_address_tmp;
8990
8991 ast_sockaddr_copy(&ser_remote_address_tmp, &ser->remote_address);
8992 retval = auth_http_callback(ser, method, FORMAT_HTML, &ser_remote_address_tmp, uri, get_params, headers);
8993 ast_sockaddr_copy(&ser->remote_address, &ser_remote_address_tmp);
8994 return retval;
8995}
static int auth_http_callback(struct ast_tcptls_session_instance *ser, enum ast_http_method method, enum output_format format, const struct ast_sockaddr *remote_address, const char *uri, struct ast_variable *get_params, struct ast_variable *headers)
Definition manager.c:8604
struct ast_sockaddr remote_address
Definition tcptls.h:153

References ast_sockaddr_copy(), auth_http_callback(), FORMAT_HTML, method, and ast_tcptls_session_instance::remote_address.

◆ auth_mxml_http_callback()

static int auth_mxml_http_callback ( struct ast_tcptls_session_instance ser,
const struct ast_http_uri urih,
const char *  uri,
enum ast_http_method  method,
struct ast_variable get_params,
struct ast_variable headers 
)
static

Definition at line 8997 of file manager.c.

8998{
8999 int retval;
9000 struct ast_sockaddr ser_remote_address_tmp;
9001
9002 ast_sockaddr_copy(&ser_remote_address_tmp, &ser->remote_address);
9003 retval = auth_http_callback(ser, method, FORMAT_XML, &ser_remote_address_tmp, uri, get_params, headers);
9004 ast_sockaddr_copy(&ser->remote_address, &ser_remote_address_tmp);
9005 return retval;
9006}

References ast_sockaddr_copy(), auth_http_callback(), FORMAT_XML, method, and ast_tcptls_session_instance::remote_address.

◆ auth_rawman_http_callback()

static int auth_rawman_http_callback ( struct ast_tcptls_session_instance ser,
const struct ast_http_uri urih,
const char *  uri,
enum ast_http_method  method,
struct ast_variable get_params,
struct ast_variable headers 
)
static

Definition at line 9008 of file manager.c.

9009{
9010 int retval;
9011 struct ast_sockaddr ser_remote_address_tmp;
9012
9013 ast_sockaddr_copy(&ser_remote_address_tmp, &ser->remote_address);
9014 retval = auth_http_callback(ser, method, FORMAT_RAW, &ser_remote_address_tmp, uri, get_params, headers);
9015 ast_sockaddr_copy(&ser->remote_address, &ser_remote_address_tmp);
9016 return retval;
9017}

References ast_sockaddr_copy(), auth_http_callback(), FORMAT_RAW, method, and ast_tcptls_session_instance::remote_address.

◆ close_mansession_file()

static void close_mansession_file ( struct mansession s)
static

Definition at line 8349 of file manager.c.

8350{
8351 if (s->stream) {
8353 s->stream = NULL;
8354 } else {
8355 ast_log(LOG_ERROR, "Attempted to close file/file descriptor on mansession without a valid file or file descriptor.\n");
8356 }
8357}

References ast_iostream_close(), ast_log, LOG_ERROR, NULL, and mansession::stream.

Referenced by auth_http_callback(), generic_http_callback(), and process_output().

◆ event_max_name_len_cb()

static int event_max_name_len_cb ( void *  obj,
void *  arg,
void *  data,
int  flags 
)
static

Definition at line 9206 of file manager.c.

9207{
9208 struct ast_xml_doc_item *item = obj;
9209 int *max_len = data;
9210 int len = strlen(item->name);
9211
9212 if (len > *max_len) {
9213 *max_len = len;
9214 }
9215
9216 return 0;
9217}
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
const char * name
Struct that contains the XML documentation for a particular item. Note that this is an ao2 ref counte...
Definition xmldoc.h:56
static struct aco_type item

References item, len(), and aco_type::name.

Referenced by handle_manager_show_events().

◆ find_session()

static struct mansession_session * find_session ( uint32_t  ident,
int  incinuse 
)
static

locate an http session in the list. The search key (ident) is the value of the mansession_id cookie (0 is not valid and means a session on the AMI socket).

Definition at line 7954 of file manager.c.

7955{
7956 struct ao2_container *sessions;
7958 struct ao2_iterator i;
7959
7960 if (ident == 0) {
7961 return NULL;
7962 }
7963
7964 sessions = ao2_global_obj_ref(mgr_sessions);
7965 if (!sessions) {
7966 return NULL;
7967 }
7969 ao2_ref(sessions, -1);
7970 while ((session = ao2_iterator_next(&i))) {
7972 if (session->managerid == ident && !session->needdestroy) {
7973 ast_atomic_fetchadd_int(&session->inuse, incinuse ? 1 : 0);
7974 break;
7975 }
7978 }
7980
7981 return session;
7982}
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
Definition lock.h:764

References ao2_global_obj_ref, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_lock, ao2_ref, ao2_unlock, ast_atomic_fetchadd_int(), NULL, session, sessions, and unref_mansession().

Referenced by astman_is_authed(), generic_http_callback(), and manager_fax_session().

◆ find_session_by_nonce()

static struct mansession_session * find_session_by_nonce ( const char *  username,
unsigned long  nonce,
int *  stale 
)
static

locate an http session in the list. The search keys (nonce) and (username) is value from received "Authorization" http header. As well as in find_session() function, the value of the nonce can't be zero. (0 meansi, that the session used for AMI socket connection). Flag (stale) is set, if client used valid, but old, nonce value.

Definition at line 7993 of file manager.c.

7994{
7996 struct ao2_container *sessions;
7997 struct ao2_iterator i;
7998
7999 if (nonce == 0 || username == NULL || stale == NULL) {
8000 return NULL;
8001 }
8002
8003 sessions = ao2_global_obj_ref(mgr_sessions);
8004 if (!sessions) {
8005 return NULL;
8006 }
8008 ao2_ref(sessions, -1);
8009 while ((session = ao2_iterator_next(&i))) {
8011 if (!strcasecmp(session->username, username) && session->managerid == nonce) {
8012 *stale = 0;
8013 break;
8014 } else if (!strcasecmp(session->username, username) && session->oldnonce == nonce) {
8015 *stale = 1;
8016 break;
8017 }
8020 }
8022
8023 return session;
8024}

References ao2_global_obj_ref, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_lock, ao2_ref, ao2_unlock, NULL, session, sessions, and unref_mansession().

Referenced by auth_http_callback().

◆ function_amiclient()

static int function_amiclient ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
)
static

${AMI_CLIENT()} Dialplan function - reads manager client data

Definition at line 9062 of file manager.c.

9063{
9064 struct ast_manager_user *user = NULL;
9065
9068 AST_APP_ARG(param);
9069 );
9070
9071
9072 if (ast_strlen_zero(data) ) {
9073 ast_log(LOG_WARNING, "AMI_CLIENT() requires two arguments: AMI_CLIENT(<name>[,<arg>])\n");
9074 return -1;
9075 }
9077 args.name = ast_strip(args.name);
9078 args.param = ast_strip(args.param);
9079
9081 if (!(user = get_manager_by_name_locked(args.name))) {
9083 ast_log(LOG_ERROR, "There's no manager user called : \"%s\"\n", args.name);
9084 return -1;
9085 }
9087
9088 if (!strcasecmp(args.param, "sessions")) {
9089 int no_sessions = 0;
9090 struct ao2_container *sessions;
9091
9092 sessions = ao2_global_obj_ref(mgr_sessions);
9093 if (sessions) {
9094 ao2_callback_data(sessions, 0, get_manager_sessions_cb, /*login name*/ data, &no_sessions);
9095 ao2_ref(sessions, -1);
9096 }
9097 snprintf(buf, len, "%d", no_sessions);
9098 } else {
9099 ast_log(LOG_ERROR, "Invalid arguments provided to function AMI_CLIENT: %s\n", args.param);
9100 return -1;
9101
9102 }
9103
9104 return 0;
9105}
#define ao2_callback_data(container, flags, cb_fn, arg, data)
Definition astobj2.h:1723
char buf[BUFSIZE]
Definition eagi_proxy.c:66
static const char name[]
Definition format_mp3.c:68
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition linkedlists.h:78
static int get_manager_sessions_cb(void *obj, void *arg, void *data, int flags)
Get number of logged in sessions for a login name.
Definition manager.c:9047
static struct @522 args
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition strings.h:223

References ao2_callback_data, ao2_global_obj_ref, ao2_ref, args, AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_log, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, AST_STANDARD_APP_ARGS, ast_strip(), ast_strlen_zero(), buf, get_manager_by_name_locked(), get_manager_sessions_cb(), len(), LOG_ERROR, LOG_WARNING, name, NULL, and sessions.

◆ generic_http_callback()

static int generic_http_callback ( struct ast_tcptls_session_instance ser,
enum ast_http_method  method,
enum output_format  format,
const struct ast_sockaddr remote_address,
const char *  uri,
struct ast_variable get_params,
struct ast_variable headers 
)
static
Note
There is approximately a 1 in 1.8E19 chance that the following calculation will produce 0, which is an invalid ID, but due to the properties of the rand() function (and the constancy of s), that won't happen twice in a row.

Definition at line 8392 of file manager.c.

8398{
8399 struct mansession s = { .session = NULL, .tcptls_session = ser };
8401 uint32_t ident;
8402 int fd;
8403 int blastaway = 0;
8404 struct ast_variable *params = get_params;
8405 char template[] = "/tmp/ast-http-XXXXXX"; /* template for temporary file */
8406 struct ast_str *http_header = NULL, *out = NULL;
8407 struct message m = { 0 };
8408
8410 ast_http_error(ser, 501, "Not Implemented", "Attempt to use unimplemented / unsupported method");
8411 return 0;
8412 }
8413
8414 ident = ast_http_manid_from_vars(headers);
8415
8416 if (!(session = find_session(ident, 1))) {
8417
8418 /**/
8419 /* Create new session.
8420 * While it is not in the list we don't need any locking
8421 */
8422 if (!(session = build_mansession(remote_address))) {
8424 ast_http_error(ser, 500, "Server Error", "Internal Server Error (out of memory)");
8425 return 0;
8426 }
8428 session->send_events = 0;
8429 session->inuse = 1;
8430 /*!
8431 * \note There is approximately a 1 in 1.8E19 chance that the following
8432 * calculation will produce 0, which is an invalid ID, but due to the
8433 * properties of the rand() function (and the constancy of s), that
8434 * won't happen twice in a row.
8435 */
8436 while ((session->managerid = ast_random() ^ (unsigned long) session) == 0) {
8437 }
8438 session->last_ev = grab_last();
8439 AST_LIST_HEAD_INIT_NOLOCK(&session->datastores);
8440 }
8442
8443 http_header = ast_str_create(128);
8444 out = ast_str_create(2048);
8445
8446 ast_mutex_init(&s.lock);
8447
8448 if (http_header == NULL || out == NULL) {
8450 ast_http_error(ser, 500, "Server Error", "Internal Server Error (ast_str_create() out of memory)");
8451 goto generic_callback_out;
8452 }
8453
8454 s.session = session;
8455 fd = mkstemp(template); /* create a temporary file for command output */
8456 unlink(template);
8457 if (fd <= -1) {
8458 ast_http_error(ser, 500, "Server Error", "Internal Server Error (mkstemp failed)");
8459 goto generic_callback_out;
8460 }
8462 if (!s.stream) {
8463 ast_log(LOG_WARNING, "HTTP Manager, fdopen failed: %s!\n", strerror(errno));
8464 ast_http_error(ser, 500, "Server Error", "Internal Server Error (fdopen failed)");
8465 close(fd);
8466 goto generic_callback_out;
8467 }
8468
8469 if (method == AST_HTTP_POST) {
8470 params = ast_http_get_post_vars(ser, headers);
8471 if (!params) {
8472 switch (errno) {
8473 case EFBIG:
8474 ast_http_error(ser, 413, "Request Entity Too Large", "Body too large");
8476 goto generic_callback_out;
8477 case ENOMEM:
8479 ast_http_error(ser, 500, "Server Error", "Out of memory");
8481 goto generic_callback_out;
8482 case EIO:
8483 ast_http_error(ser, 400, "Bad Request", "Error parsing request body");
8485 goto generic_callback_out;
8486 }
8487 }
8488 }
8489
8490 astman_append_headers(&m, params);
8491
8492 if (process_message(&s, &m)) {
8493 if (session->authenticated) {
8495 ast_verb(2, "HTTP Manager '%s' logged off from %s\n", session->username, ast_sockaddr_stringify_addr(&session->addr));
8496 }
8497 } else {
8498 if (displayconnects) {
8499 ast_verb(2, "HTTP Connect attempt from '%s' unable to authenticate\n", ast_sockaddr_stringify_addr(&session->addr));
8500 }
8501 }
8502 session->needdestroy = 1;
8503 }
8504
8506
8507 ast_str_append(&http_header, 0,
8508 "Content-type: text/%s\r\n"
8509 "Set-Cookie: mansession_id=\"%08x\"; Version=1; Max-Age=%d\r\n"
8510 "Pragma: SuppressEvents\r\n",
8511 contenttype[format],
8512 session->managerid, httptimeout);
8513
8514 if (format == FORMAT_XML) {
8515 ast_str_append(&out, 0, "<ajax-response>\n");
8516 } else if (format == FORMAT_HTML) {
8517 /*
8518 * When handling AMI-over-HTTP in HTML format, we provide a simple form for
8519 * debugging purposes. This HTML code should not be here, we
8520 * should read from some config file...
8521 */
8522
8523#define ROW_FMT "<tr><td colspan=\"2\" bgcolor=\"#f1f1ff\">%s</td></tr>\r\n"
8524#define TEST_STRING \
8525 "<form action=\"manager\" method=\"post\">\n\
8526 Action: <select name=\"action\">\n\
8527 <option value=\"\">-----&gt;</option>\n\
8528 <option value=\"login\">login</option>\n\
8529 <option value=\"command\">Command</option>\n\
8530 <option value=\"waitevent\">waitevent</option>\n\
8531 <option value=\"listcommands\">listcommands</option>\n\
8532 </select>\n\
8533 or <input name=\"action\"><br/>\n\
8534 CLI Command <input name=\"command\"><br>\n\
8535 user <input name=\"username\"> pass <input type=\"password\" name=\"secret\"><br>\n\
8536 <input type=\"submit\">\n</form>\n"
8537
8538 ast_str_append(&out, 0, "<title>Asterisk&trade; Manager Interface</title>");
8539 ast_str_append(&out, 0, "<body bgcolor=\"#ffffff\"><table align=center bgcolor=\"#f1f1f1\" width=\"500\">\r\n");
8540 ast_str_append(&out, 0, ROW_FMT, "<h1>Manager Tester</h1>");
8542 }
8543
8544 process_output(&s, &out, params, format);
8545
8546 if (format == FORMAT_XML) {
8547 ast_str_append(&out, 0, "</ajax-response>\n");
8548 } else if (format == FORMAT_HTML) {
8549 ast_str_append(&out, 0, "</table></body>\r\n");
8550 }
8551
8553 /* Reset HTTP timeout. If we're not authenticated, keep it extremely short */
8554 session->sessiontimeout = time(NULL) + ((session->authenticated || httptimeout < 5) ? httptimeout : 5);
8555
8556 if (session->needdestroy) {
8557 if (session->inuse == 1) {
8558 ast_debug(1, "Need destroy, doing it now!\n");
8559 blastaway = 1;
8560 } else {
8561 ast_debug(1, "Need destroy, but can't do it yet!\n");
8562 ast_mutex_lock(&session->notify_lock);
8563 if (session->waiting_thread != AST_PTHREADT_NULL) {
8564 pthread_kill(session->waiting_thread, SIGURG);
8565 }
8566 ast_mutex_unlock(&session->notify_lock);
8567 session->inuse--;
8568 }
8569 } else {
8570 session->inuse--;
8571 }
8573
8574 ast_http_send(ser, method, 200, NULL, http_header, out, 0, 0);
8575 http_header = NULL;
8576 out = NULL;
8577
8578generic_callback_out:
8580
8581 /* Clear resource */
8582
8583 if (method == AST_HTTP_POST && params) {
8584 ast_variables_destroy(params);
8585 }
8586 ast_free(http_header);
8587 ast_free(out);
8588
8589 if (session) {
8590 if (blastaway) {
8592 } else {
8593 if (session->stream) {
8594 ast_iostream_close(session->stream);
8595 session->stream = NULL;
8596 }
8598 }
8599 }
8600
8601 return 0;
8602}
static int manager_displayconnects(struct mansession_session *session)
Get displayconnects config option.
Definition manager.c:1071
uint32_t ast_http_manid_from_vars(struct ast_variable *headers) attribute_pure
Return manager id, if exist, from request headers.
Definition http.c:247
#define AST_PTHREADT_NULL
Definition lock.h:73
#define ast_mutex_unlock(a)
Definition lock.h:197
#define ast_mutex_lock(a)
Definition lock.h:196
#define ROW_FMT
#define TEST_STRING

References ao2_lock, ao2_unlock, ast_debug, ast_free, ast_http_error(), AST_HTTP_GET, ast_http_get_post_vars(), AST_HTTP_HEAD, ast_http_manid_from_vars(), AST_HTTP_POST, ast_http_request_close_on_completion(), ast_http_send(), ast_iostream_close(), ast_iostream_from_fd(), AST_LIST_HEAD_INIT_NOLOCK, ast_log, ast_mutex_destroy, ast_mutex_init, ast_mutex_lock, ast_mutex_unlock, AST_PTHREADT_NULL, ast_random(), ast_sockaddr_stringify_addr(), ast_str_append(), ast_str_create, ast_variables_destroy(), ast_verb, astman_append_headers(), astman_free_headers(), build_mansession(), close_mansession_file(), contenttype, displayconnects, errno, find_session(), FORMAT_HTML, FORMAT_XML, grab_last(), httptimeout, mansession::lock, LOG_WARNING, manager_displayconnects(), method, NULL, out, process_message(), process_output(), ROW_FMT, mansession::session, session, session_destroy(), mansession::stream, TEST_STRING, and unref_mansession().

Referenced by manager_http_callback(), mxml_http_callback(), and rawman_http_callback().

◆ get_manager_sessions_cb()

static int get_manager_sessions_cb ( void *  obj,
void *  arg,
void *  data,
int  flags 
)
static

Get number of logged in sessions for a login name.

Definition at line 9047 of file manager.c.

9048{
9049 struct mansession_session *session = obj;
9050 const char *login = (char *)arg;
9051 int *no_sessions = data;
9052
9053 if (strcasecmp(session->username, login) == 0) {
9054 (*no_sessions)++;
9055 }
9056
9057 return 0;
9058}

References session.

Referenced by function_amiclient().

◆ handle_manager_show_event()

static char * handle_manager_show_event ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 9350 of file manager.c.

9351{
9353 struct ao2_iterator it_events;
9354 struct ast_xml_doc_item *item, *temp;
9355 int length;
9356
9357 if (cmd == CLI_INIT) {
9358 e->command = "manager show event";
9359 e->usage =
9360 "Usage: manager show event <eventname>\n"
9361 " Provides a detailed description a Manager interface event.\n";
9362 return NULL;
9363 }
9364
9365 events = ao2_global_obj_ref(event_docs);
9366 if (!events) {
9367 ast_cli(a->fd, "No manager event documentation loaded\n");
9368 return CLI_SUCCESS;
9369 }
9370
9371 if (cmd == CLI_GENERATE) {
9372 if (a->pos != 3) {
9373 return NULL;
9374 }
9375
9376 length = strlen(a->word);
9377 it_events = ao2_iterator_init(events, 0);
9378 while ((item = ao2_iterator_next(&it_events))) {
9379 if (!strncasecmp(a->word, item->name, length)) {
9381 ao2_ref(item, -1);
9382 break;
9383 }
9384 }
9385 ao2_ref(item, -1);
9386 }
9387 ao2_iterator_destroy(&it_events);
9388
9389 return NULL;
9390 }
9391
9392 if (a->argc != 4) {
9393 return CLI_SHOWUSAGE;
9394 }
9395
9396 if (!(item = ao2_find(events, a->argv[3], OBJ_KEY))) {
9397 ast_cli(a->fd, "Could not find event '%s'\n", a->argv[3]);
9398 return CLI_SUCCESS;
9399 }
9400
9401 ast_cli(a->fd, "Event: %s\n", a->argv[3]);
9402 for (temp = item; temp; temp = AST_LIST_NEXT(temp, next)) {
9403 print_event_instance(a, temp);
9404 }
9405
9406 ao2_ref(item, -1);
9407 return CLI_SUCCESS;
9408}
static const struct adsi_event events[]
#define OBJ_KEY
Definition astobj2.h:1151
#define ao2_cleanup(obj)
Definition astobj2.h:1934
#define ao2_find(container, arg, flags)
Definition astobj2.h:1736
#define CLI_SHOWUSAGE
Definition cli.h:45
#define CLI_SUCCESS
Definition cli.h:44
int ast_cli_completion_add(char *value)
Add a result to a request for completion options.
Definition main/cli.c:2845
void ast_cli(int fd, const char *fmt,...)
Definition clicompat.c:6
@ CLI_INIT
Definition cli.h:152
@ CLI_GENERATE
Definition cli.h:153
static void print_event_instance(struct ast_cli_args *a, struct ast_xml_doc_item *instance)
Definition manager.c:9298
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
char * command
Definition cli.h:186
const char * usage
Definition cli.h:177
struct ast_xml_doc_item * next
Definition xmldoc.h:80
static struct test_val a
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition utils.h:981

References a, ao2_cleanup, ao2_find, ao2_global_obj_ref, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_cli(), ast_cli_completion_add(), AST_LIST_NEXT, ast_strdup, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, events, item, aco_type::name, ast_xml_doc_item::next, NULL, OBJ_KEY, print_event_instance(), RAII_VAR, and ast_cli_entry::usage.

◆ handle_manager_show_events()

static char * handle_manager_show_events ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 9219 of file manager.c.

9220{
9221 struct ao2_container *events;
9222 struct ao2_container *sorted_events;
9223 struct ao2_iterator it_events;
9224 struct ast_xml_doc_item *item;
9225 struct ast_str *buffer;
9226 int col = 0;
9227 int maxlen = 0;
9228 const char *dashes = "--------------------------------------------------------------------------------";
9229
9230 switch (cmd) {
9231 case CLI_INIT:
9232 e->command = "manager show events";
9233 e->usage =
9234 "Usage: manager show events\n"
9235 " Prints a listing of the available Asterisk manager interface events.\n";
9236 return NULL;
9237 case CLI_GENERATE:
9238 return NULL;
9239 }
9240 if (a->argc != 3) {
9241 return CLI_SHOWUSAGE;
9242 }
9243
9244 buffer = ast_str_create(128);
9245 if (!buffer) {
9246 return CLI_SUCCESS;
9247 }
9248
9249 events = ao2_global_obj_ref(event_docs);
9250 if (!events) {
9251 ast_cli(a->fd, "No manager event documentation loaded\n");
9252 ast_free(buffer);
9253 return CLI_SUCCESS;
9254 }
9255
9259 ast_xml_doc_item_sort_fn, NULL);
9260 if (!sorted_events) {
9262 ast_log(AST_LOG_ERROR, "Unable to create sorted container for events\n");
9263 ast_free(buffer);
9264 ao2_ref(events, -1);
9265 return CLI_SUCCESS;
9266 }
9267 ao2_container_dup(sorted_events, events, 0);
9269 ao2_ref(events, -1);
9270
9271 ao2_callback_data(sorted_events, OBJ_NODATA, event_max_name_len_cb, NULL, &maxlen);
9272 it_events = ao2_iterator_init(sorted_events, AO2_ITERATOR_DONTLOCK);
9273
9274 ast_cli(a->fd, "Events:\n");
9275 ast_cli(a->fd, " %.*s %.*s %.*s \n", maxlen, dashes, maxlen, dashes, maxlen, dashes);
9276
9277 while ((item = ao2_iterator_next(&it_events))) {
9278 ast_str_append(&buffer, 0, " %-*s", maxlen, item->name);
9279 if (++col % 3 == 0) {
9280 ast_cli(a->fd, "%s\n", ast_str_buffer(buffer));
9281 ast_str_set(&buffer, 0, "%s", "");
9282 }
9283 ao2_ref(item, -1);
9284 }
9285 ao2_iterator_destroy(&it_events);
9286
9287 if (col % 3 != 0) {
9288 ast_cli(a->fd, "%s\n", ast_str_buffer(buffer));
9289 }
9290 ast_cli(a->fd, "\n%d events registered.\n", col);
9291
9292 ao2_ref(sorted_events, -1);
9293 ast_free(buffer);
9294
9295 return CLI_SUCCESS;
9296}
int ao2_container_dup(struct ao2_container *dest, struct ao2_container *src, enum search_flags flags)
Copy all object references in the src container into the dest container.
@ AO2_ITERATOR_DONTLOCK
Assume that the ao2_container is already locked.
Definition astobj2.h:1852
#define ao2_container_alloc_rbtree(ao2_options, container_options, sort_fn, cmp_fn)
Allocate and initialize a red-black tree container.
Definition astobj2.h:1349
@ AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE
Replace objects with duplicate keys in container.
Definition astobj2.h:1211
#define AST_LOG_ERROR
static int event_max_name_len_cb(void *obj, void *arg, void *data, int flags)
Definition manager.c:9206
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition strings.h:1113
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761

References a, AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_callback_data, AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE, ao2_container_alloc_rbtree, ao2_container_dup(), ao2_global_obj_ref, ao2_iterator_destroy(), AO2_ITERATOR_DONTLOCK, ao2_iterator_init(), ao2_iterator_next, ao2_lock, ao2_ref, ao2_unlock, ast_cli(), ast_free, ast_log, AST_LOG_ERROR, ast_str_append(), ast_str_buffer(), ast_str_create, ast_str_set(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, event_max_name_len_cb(), events, item, aco_type::name, NULL, OBJ_NODATA, and ast_cli_entry::usage.

◆ handle_manager_show_settings()

static char * handle_manager_show_settings ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

CLI command manager show settings.

Definition at line 9159 of file manager.c.

9160{
9161 switch (cmd) {
9162 case CLI_INIT:
9163 e->command = "manager show settings";
9164 e->usage =
9165 "Usage: manager show settings\n"
9166 " Provides detailed list of the configuration of the Manager.\n";
9167 return NULL;
9168 case CLI_GENERATE:
9169 return NULL;
9170 }
9171#define FORMAT " %-25.25s %-15.55s\n"
9172#define FORMAT2 " %-25.25s %-15d\n"
9173#define FORMAT3 " %-25.25s %s\n"
9174 if (a->argc != 3) {
9175 return CLI_SHOWUSAGE;
9176 }
9177 ast_cli(a->fd, "\nGlobal Settings:\n");
9178 ast_cli(a->fd, "----------------\n");
9179 ast_cli(a->fd, FORMAT, "Manager (AMI):", AST_CLI_YESNO(manager_enabled));
9180 ast_cli(a->fd, FORMAT, "Web Manager (AMI/HTTP):", AST_CLI_YESNO(webmanager_enabled));
9181 ast_cli(a->fd, FORMAT, "TCP Bindaddress:", manager_enabled != 0 ? ast_sockaddr_stringify(&ami_desc.local_address) : "Disabled");
9182 ast_cli(a->fd, FORMAT2, "HTTP Timeout (seconds):", httptimeout);
9183 ast_cli(a->fd, FORMAT, "TLS Enable:", AST_CLI_YESNO(ami_tls_cfg.enabled));
9184 ast_cli(a->fd, FORMAT, "TLS Bindaddress:", ami_tls_cfg.enabled != 0 ? ast_sockaddr_stringify(&amis_desc.local_address) : "Disabled");
9185 ast_cli(a->fd, FORMAT, "TLS Certfile:", ami_tls_cfg.certfile);
9186 ast_cli(a->fd, FORMAT, "TLS Privatekey:", ami_tls_cfg.pvtfile);
9187 ast_cli(a->fd, FORMAT, "TLS Cipher:", ami_tls_cfg.cipher);
9188 ast_cli(a->fd, FORMAT, "Allow multiple login:", AST_CLI_YESNO(allowmultiplelogin));
9189 ast_cli(a->fd, FORMAT, "Display connects:", AST_CLI_YESNO(displayconnects));
9190 ast_cli(a->fd, FORMAT, "Timestamp events:", AST_CLI_YESNO(timestampevents));
9191 ast_cli(a->fd, FORMAT3, "Channel vars:", S_OR(manager_channelvars, ""));
9192 ast_cli(a->fd, FORMAT3, "Disabled events:", S_OR(manager_disabledevents, ""));
9193 ast_cli(a->fd, FORMAT, "Debug:", AST_CLI_YESNO(manager_debug));
9194#undef FORMAT
9195#undef FORMAT2
9196#undef FORMAT3
9197
9198 return CLI_SUCCESS;
9199}
#define AST_CLI_YESNO(x)
Return Yes or No depending on the argument.
Definition cli.h:71
static char * manager_channelvars
Definition manager.c:172
static char * manager_disabledevents
Definition manager.c:173
#define FORMAT3
#define FORMAT
#define FORMAT2
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition netsock2.h:256
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition strings.h:80
char * certfile
Definition tcptls.h:90
char * cipher
Definition tcptls.h:92
char * pvtfile
Definition tcptls.h:91

References a, allowmultiplelogin, ami_desc, ami_tls_cfg, amis_desc, ast_cli(), AST_CLI_YESNO, ast_sockaddr_stringify(), ast_tls_config::certfile, ast_tls_config::cipher, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, displayconnects, ast_tls_config::enabled, FORMAT, FORMAT2, FORMAT3, httptimeout, ast_tcptls_session_args::local_address, manager_channelvars, manager_debug, manager_disabledevents, manager_enabled, NULL, ast_tls_config::pvtfile, S_OR, timestampevents, ast_cli_entry::usage, and webmanager_enabled.

◆ load_channelvars()

static void load_channelvars ( struct ast_variable var)
static

Definition at line 9435 of file manager.c.

9436{
9437 char *parse = NULL;
9439 AST_APP_ARG(vars)[MAX_VARS];
9440 );
9441
9444
9445 /* parse the setting */
9448
9450}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition astmm.h:298
void ast_channel_set_manager_vars(size_t varc, char **vars)
Sets the variables to be stored in the manager_vars field of all snapshots.
Definition channel.c:7934
#define MAX_VARS
Definition manager.c:205

References args, AST_APP_ARG, ast_channel_set_manager_vars(), AST_DECLARE_APP_ARGS, ast_free, AST_STANDARD_APP_ARGS, ast_strdup, ast_strdupa, manager_channelvars, MAX_VARS, NULL, and var.

Referenced by __init_manager().

◆ load_disabledevents()

static void load_disabledevents ( struct ast_variable var)
static

Definition at line 9458 of file manager.c.

References ast_free, ast_strdup, manager_disabledevents, and var.

Referenced by __init_manager().

◆ load_module()

static int load_module ( void  )
static

Definition at line 10119 of file manager.c.

10120{
10121 int rc = 0;
10124#ifdef TEST_FRAMEWORK
10125 AST_TEST_REGISTER(eventfilter_test_creation);
10126 AST_TEST_REGISTER(eventfilter_test_matching);
10127 AST_TEST_REGISTER(originate_permissions_test);
10128#endif
10129 return rc;
10130}
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition clicompat.c:19
static int __init_manager(int reload, int by_external_config)
Definition manager.c:9699
static void manager_shutdown(void)
Definition manager.c:9487
@ AST_MODULE_LOAD_FAILURE
Module could not be loaded properly.
Definition module.h:102
@ AST_MODULE_LOAD_SUCCESS
Definition module.h:70
#define AST_TEST_REGISTER(cb)
Definition test.h:127

References __init_manager(), AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, ast_register_cleanup(), AST_TEST_REGISTER, and manager_shutdown().

◆ manager_event_blob_dtor()

static void manager_event_blob_dtor ( void *  obj)
static

Definition at line 10189 of file manager.c.

10190{
10191 struct ast_manager_event_blob *ev = obj;
10192
10194}

References ast_string_field_free_memory.

Referenced by ast_manager_event_blob_create().

◆ manager_free_user()

static void manager_free_user ( struct ast_manager_user user)
static

Definition at line 9468 of file manager.c.

9469{
9470 ast_free(user->a1_hash);
9471 ast_free(user->secret);
9472 if (user->includefilters) {
9473 ao2_t_ref(user->includefilters, -1, "decrement ref for include container, should be last one");
9474 }
9475 if (user->excludefilters) {
9476 ao2_t_ref(user->excludefilters, -1, "decrement ref for exclude container, should be last one");
9477 }
9478 user->acl = ast_free_acl_list(user->acl);
9479 ast_variables_destroy(user->chanvars);
9480 ast_free(user);
9481}

References ao2_t_ref, ast_free, ast_free_acl_list(), and ast_variables_destroy().

Referenced by __init_manager(), and manager_shutdown().

◆ manager_http_callback()

static int manager_http_callback ( struct ast_tcptls_session_instance ser,
const struct ast_http_uri urih,
const char *  uri,
enum ast_http_method  method,
struct ast_variable get_params,
struct ast_variable headers 
)
static

Definition at line 8927 of file manager.c.

8928{
8929 int retval;
8930 struct ast_sockaddr ser_remote_address_tmp;
8931
8932 ast_sockaddr_copy(&ser_remote_address_tmp, &ser->remote_address);
8933 retval = generic_http_callback(ser, method, FORMAT_HTML, &ser_remote_address_tmp, uri, get_params, headers);
8934 ast_sockaddr_copy(&ser->remote_address, &ser_remote_address_tmp);
8935 return retval;
8936}
static int generic_http_callback(struct ast_tcptls_session_instance *ser, enum ast_http_method method, enum output_format format, const struct ast_sockaddr *remote_address, const char *uri, struct ast_variable *get_params, struct ast_variable *headers)
Definition manager.c:8392

References ast_sockaddr_copy(), FORMAT_HTML, generic_http_callback(), method, and ast_tcptls_session_instance::remote_address.

◆ manager_set_defaults()

static void manager_set_defaults ( void  )
static

Definition at line 9671 of file manager.c.

9672{
9673 manager_enabled = 0;
9674 displayconnects = 1;
9676 authtimeout = 30;
9677 authlimit = 50;
9678 manager_debug = 0; /* Debug disabled by default */
9679
9680 /* default values */
9682 sizeof(global_realm));
9685
9686 ami_tls_cfg.enabled = 0;
9697}
#define DEFAULT_REALM
Definition manager.c:175
static void ast_sockaddr_setnull(struct ast_sockaddr *addr)
Sets address addr to null.
Definition netsock2.h:138
const char * ast_config_AST_SYSTEM_NAME
Definition options.c:171
char * capath
Definition tcptls.h:94
char * cafile
Definition tcptls.h:93
#define AST_CERTFILE
Definition tcptls.h:63

References ami_desc, ami_tls_cfg, amis_desc, AST_CERTFILE, ast_config_AST_SYSTEM_NAME, ast_copy_string(), ast_free, ast_sockaddr_setnull(), ast_strdup, authlimit, authtimeout, broken_events_action, ast_tls_config::cafile, ast_tls_config::capath, ast_tls_config::certfile, ast_tls_config::cipher, DEFAULT_REALM, displayconnects, ast_tls_config::enabled, global_realm, ast_tcptls_session_args::local_address, manager_debug, manager_enabled, ast_tls_config::pvtfile, and S_OR.

Referenced by __init_manager().

◆ manager_shutdown()

static void manager_shutdown ( void  )
static

Definition at line 9487 of file manager.c.

9488{
9489 struct ast_manager_user *user;
9490
9491#ifdef TEST_FRAMEWORK
9492 AST_TEST_UNREGISTER(eventfilter_test_creation);
9493 AST_TEST_UNREGISTER(eventfilter_test_matching);
9494 AST_TEST_UNREGISTER(originate_permissions_test);
9495#endif
9496
9497 /* This event is not actually transmitted, but causes all TCP sessions to be closed */
9498 manager_event(EVENT_FLAG_SHUTDOWN, "CloseSession", "CloseSession: true\r\n");
9499
9500 ast_manager_unregister("Ping");
9501 ast_manager_unregister("Events");
9502 ast_manager_unregister("Logoff");
9503 ast_manager_unregister("Login");
9504 ast_manager_unregister("Challenge");
9505 ast_manager_unregister("Hangup");
9506 ast_manager_unregister("Status");
9507 ast_manager_unregister("Setvar");
9508 ast_manager_unregister("Getvar");
9509 ast_manager_unregister("GetConfig");
9510 ast_manager_unregister("GetConfigJSON");
9511 ast_manager_unregister("UpdateConfig");
9512 ast_manager_unregister("CreateConfig");
9513 ast_manager_unregister("ListCategories");
9514 ast_manager_unregister("Redirect");
9515 ast_manager_unregister("Atxfer");
9516 ast_manager_unregister("CancelAtxfer");
9517 ast_manager_unregister("Originate");
9518 ast_manager_unregister("Command");
9519 ast_manager_unregister("ExtensionState");
9520 ast_manager_unregister("PresenceState");
9521 ast_manager_unregister("AbsoluteTimeout");
9522 ast_manager_unregister("MailboxStatus");
9523 ast_manager_unregister("MailboxCount");
9524 ast_manager_unregister("ListCommands");
9525 ast_manager_unregister("SendText");
9526 ast_manager_unregister("UserEvent");
9527 ast_manager_unregister("WaitEvent");
9528 ast_manager_unregister("CoreSettings");
9529 ast_manager_unregister("CoreStatus");
9530 ast_manager_unregister("Reload");
9531 ast_manager_unregister("LoggerRotate");
9532 ast_manager_unregister("CoreShowChannels");
9533 ast_manager_unregister("CoreShowChannelMap");
9534 ast_manager_unregister("ModuleLoad");
9535 ast_manager_unregister("ModuleCheck");
9536 ast_manager_unregister("AOCMessage");
9537 ast_manager_unregister("Filter");
9538 ast_manager_unregister("BlindTransfer");
9541
9542#ifdef AST_XML_DOCS
9543 ao2_t_global_obj_release(event_docs, "Dispose of event_docs");
9544#endif
9545
9546#ifdef TEST_FRAMEWORK
9547 stasis_forward_cancel(test_suite_forwarder);
9548 test_suite_forwarder = NULL;
9549#endif
9550
9551 if (stasis_router) {
9554 }
9562
9565
9576
9577 ao2_global_obj_release(mgr_sessions);
9578
9579 while ((user = AST_LIST_REMOVE_HEAD(&users, list))) {
9581 }
9583
9586}
void ast_cli_unregister_multiple(void)
Definition ael_main.c:408
#define ao2_global_obj_release(holder)
Release the ao2 object held in the global holder.
Definition astobj2.h:859
#define ao2_t_global_obj_release(holder, tag)
Definition astobj2.h:861
static struct stasis_message_router * stasis_router
The stasis_message_router for all Stasis Message Bus API messages.
Definition manager.c:185
static struct stasis_forward * rtp_topic_forwarder
The stasis_subscription for forwarding the RTP topic to the AMI topic.
Definition manager.c:188
static struct stasis_forward * security_topic_forwarder
The stasis_subscription for forwarding the Security topic to the AMI topic.
Definition manager.c:191
#define EVENT_FLAG_SHUTDOWN
Fake event class used to end sessions at shutdown.
Definition manager.c:208
int ast_manager_unregister(const char *action)
support functions to register/unregister AMI action handlers,
Definition manager.c:7716
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.
#define STASIS_MESSAGE_TYPE_CLEANUP(name)
Boiler-plate messaging macro for cleaning up message types.
Definition stasis.h:1515
struct stasis_forward * stasis_forward_cancel(struct stasis_forward *forward)
Definition stasis.c:1615
void stasis_message_router_unsubscribe_and_join(struct stasis_message_router *router)
Unsubscribe the router from the upstream topic, blocking until the final message has been processed.
struct ast_manager_user::@399 list
#define AST_TEST_UNREGISTER(cb)
Definition test.h:128

References acl_change_stasis_unsubscribe(), ami_desc, ami_tls_cfg, amis_desc, ao2_cleanup, ao2_global_obj_release, ao2_t_global_obj_release, ARRAY_LEN, ast_cli_unregister_multiple(), ast_custom_function_unregister(), ast_free, AST_LIST_REMOVE_HEAD, ast_manager_get_generic_type(), ast_manager_unregister(), ast_tcptls_server_stop(), AST_TEST_UNREGISTER, ast_tls_config::cafile, ast_tls_config::capath, ast_tls_config::certfile, ast_tls_config::cipher, cli_manager, EVENT_FLAG_SHUTDOWN, ast_manager_user::list, manager_channelvars, manager_disabledevents, manager_event, manager_free_user(), manager_topic, managerclient_function, NULL, ast_tls_config::pvtfile, rtp_topic_forwarder, security_topic_forwarder, stasis_forward_cancel(), stasis_message_router_unsubscribe_and_join(), STASIS_MESSAGE_TYPE_CLEANUP, and stasis_router.

Referenced by load_module().

◆ manager_subscriptions_init()

static int manager_subscriptions_init ( void  )
static

Initialize all Stasis Message Bus API topics and routers used by the various sub-components of AMI.

Definition at line 9592 of file manager.c.

9593{
9594 struct ao2_container *sessions;
9595 int res = 0;
9596
9598 if (!rtp_topic_forwarder) {
9599 return -1;
9600 }
9601
9604 return -1;
9605 }
9606
9608 if (!stasis_router) {
9609 return -1;
9610 }
9613
9614 /*
9615 * The reference to sessions passes to the stasis router subscription so
9616 * no need to unref here at all. This is also invoked after creating the
9617 * sessions container so it has to exist.
9618 */
9619 sessions = ao2_global_obj_ref(mgr_sessions);
9620
9623
9626
9627 /*
9628 * This specific callback is solely for lifetime management of the sessions
9629 * reference. Once the subscription is finalized the reference is dropped in
9630 * the callback.
9631 */
9634
9635 if (res != 0) {
9636 return -1;
9637 }
9638 return 0;
9639}
static void manager_default_msg_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
Definition manager.c:568
static void manager_subscription_change_msg_cb(void *userdata, struct stasis_subscription *sub, struct stasis_message *message)
Callback for subscription change messages.
Definition manager.c:631
static void manager_generic_msg_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
Definition manager.c:594
struct stasis_message_type * stasis_subscription_change_type(void)
Gets the message type for subscription change notices.
struct stasis_topic * ast_rtp_topic(void)
Stasis Message Bus API topic for RTP and RTCP related messages
struct stasis_topic * ast_security_topic(void)
A stasis_topic which publishes messages for security related issues.
@ STASIS_SUBSCRIPTION_FORMATTER_AMI
Definition stasis.h:311
int stasis_message_router_set_congestion_limits(struct stasis_message_router *router, long low_water, long high_water)
Set the high and low alert water marks of the stasis message router.
#define stasis_message_router_create(topic)
Create a new message router object.
int stasis_message_router_add(struct stasis_message_router *router, struct stasis_message_type *message_type, stasis_subscription_cb callback, void *data)
Add a route to a message router.
void stasis_message_router_set_formatters_default(struct stasis_message_router *router, stasis_subscription_cb callback, void *data, enum stasis_subscription_message_formatters formatters)
Sets the default route of a router with formatters.
#define AST_TASKPROCESSOR_HIGH_WATER_LEVEL

References ao2_global_obj_ref, ast_manager_get_generic_type(), ast_rtp_topic(), ast_security_topic(), AST_TASKPROCESSOR_HIGH_WATER_LEVEL, manager_default_msg_cb(), manager_generic_msg_cb(), manager_subscription_change_msg_cb(), manager_topic, rtp_topic_forwarder, security_topic_forwarder, sessions, stasis_forward_all(), stasis_message_router_add(), stasis_message_router_create, stasis_message_router_set_congestion_limits(), stasis_message_router_set_formatters_default(), stasis_router, stasis_subscription_change_type(), and STASIS_SUBSCRIPTION_FORMATTER_AMI.

Referenced by subscribe_all().

◆ mxml_http_callback()

static int mxml_http_callback ( struct ast_tcptls_session_instance ser,
const struct ast_http_uri urih,
const char *  uri,
enum ast_http_method  method,
struct ast_variable get_params,
struct ast_variable headers 
)
static

Definition at line 8938 of file manager.c.

8939{
8940 int retval;
8941 struct ast_sockaddr ser_remote_address_tmp;
8942
8943 ast_sockaddr_copy(&ser_remote_address_tmp, &ser->remote_address);
8944 retval = generic_http_callback(ser, method, FORMAT_XML, &ser_remote_address_tmp, uri, get_params, headers);
8945 ast_sockaddr_copy(&ser->remote_address, &ser_remote_address_tmp);
8946 return retval;
8947}

References ast_sockaddr_copy(), FORMAT_XML, generic_http_callback(), method, and ast_tcptls_session_instance::remote_address.

◆ process_output()

static void process_output ( struct mansession s,
struct ast_str **  out,
struct ast_variable params,
enum output_format  format 
)
static

Definition at line 8359 of file manager.c.

8360{
8361 char *buf;
8362 off_t l;
8363 int fd;
8364
8365 if (!s->stream)
8366 return;
8367
8368 /* Ensure buffer is NULL-terminated */
8369 ast_iostream_write(s->stream, "", 1);
8370
8371 fd = ast_iostream_get_fd(s->stream);
8372
8373 l = lseek(fd, 0, SEEK_CUR);
8374 if (l > 0) {
8375 if (MAP_FAILED == (buf = mmap(NULL, l, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0))) {
8376 ast_log(LOG_WARNING, "mmap failed. Manager output was not processed\n");
8377 } else {
8378 if (format == FORMAT_XML || format == FORMAT_HTML) {
8379 xml_translate(out, buf, params, format);
8380 } else {
8381 ast_str_append(out, 0, "%s", buf);
8382 }
8383 munmap(buf, l);
8384 }
8385 } else if (format == FORMAT_XML || format == FORMAT_HTML) {
8386 xml_translate(out, "", params, format);
8387 }
8388
8390}
ssize_t ast_iostream_write(struct ast_iostream *stream, const void *buffer, size_t count)
Write data to an iostream.
Definition iostream.c:385
static void xml_translate(struct ast_str **out, char *in, struct ast_variable *get_vars, enum output_format format)
Convert the input into XML or HTML. The input is supposed to be a sequence of lines of the form Name:...
Definition manager.c:8231

References ast_iostream_get_fd(), ast_iostream_write(), ast_log, ast_str_append(), buf, close_mansession_file(), FORMAT_HTML, FORMAT_XML, LOG_WARNING, NULL, out, mansession::stream, and xml_translate().

Referenced by auth_http_callback(), and generic_http_callback().

◆ purge_old_stuff()

static void purge_old_stuff ( void *  data)
static

cleanup code called at each iteration of server_root, guaranteed to happen every 5 seconds at most

Definition at line 9120 of file manager.c.

9121{
9122 struct ast_tcptls_session_args *ser = data;
9123 /* purge_sessions will return the number of sessions actually purged,
9124 * up to a maximum of it's arguments, purge one at a time, keeping a
9125 * purge interval of 1ms as long as we purged a session, otherwise
9126 * revert to a purge check every 5s
9127 */
9128 if (purge_sessions(1) == 1) {
9129 ser->poll_timeout = 1;
9130 } else {
9131 ser->poll_timeout = 5000;
9132 }
9133 purge_events();
9134}
static void purge_events(void)
Definition manager.c:726
static int purge_sessions(int n_max)
remove at most n_max stale session from the list.
Definition manager.c:7472
arguments for the accepting thread
Definition tcptls.h:130

References ast_tcptls_session_args::poll_timeout, purge_events(), and purge_sessions().

◆ rawman_http_callback()

static int rawman_http_callback ( struct ast_tcptls_session_instance ser,
const struct ast_http_uri urih,
const char *  uri,
enum ast_http_method  method,
struct ast_variable get_params,
struct ast_variable headers 
)
static

Definition at line 8949 of file manager.c.

8950{
8951 int retval;
8952 struct ast_sockaddr ser_remote_address_tmp;
8953
8954 ast_sockaddr_copy(&ser_remote_address_tmp, &ser->remote_address);
8955 retval = generic_http_callback(ser, method, FORMAT_RAW, &ser_remote_address_tmp, uri, get_params, headers);
8956 ast_sockaddr_copy(&ser->remote_address, &ser_remote_address_tmp);
8957 return retval;
8958}

References ast_sockaddr_copy(), FORMAT_RAW, generic_http_callback(), method, and ast_tcptls_session_instance::remote_address.

◆ subscribe_all()

static int subscribe_all ( void  )
static

Definition at line 9641 of file manager.c.

9642{
9644 ast_log(AST_LOG_ERROR, "Failed to initialize manager subscriptions\n");
9645 return -1;
9646 }
9647 if (manager_system_init()) {
9648 ast_log(AST_LOG_ERROR, "Failed to initialize manager system handling\n");
9649 return -1;
9650 }
9651 if (manager_channels_init()) {
9652 ast_log(AST_LOG_ERROR, "Failed to initialize manager channel handling\n");
9653 return -1;
9654 }
9655 if (manager_mwi_init()) {
9656 ast_log(AST_LOG_ERROR, "Failed to initialize manager MWI handling\n");
9657 return -1;
9658 }
9659 if (manager_bridging_init()) {
9660 return -1;
9661 }
9662 if (manager_endpoints_init()) {
9663 ast_log(AST_LOG_ERROR, "Failed to initialize manager endpoints handling\n");
9664 return -1;
9665 }
9666
9667 subscribed = 1;
9668 return 0;
9669}
static int manager_subscriptions_init(void)
Initialize all Stasis Message Bus API topics and routers used by the various sub-components of AMI.
Definition manager.c:9592
int manager_mwi_init(void)
Initialize support for AMI MWI events.
int manager_bridging_init(void)
Initialize support for AMI channel events.
int manager_endpoints_init(void)
Initialize support for AMI endpoint events.
int manager_system_init(void)
Initialize support for AMI system events.
int manager_channels_init(void)
Initialize support for AMI channel events.

References ast_log, AST_LOG_ERROR, manager_bridging_init(), manager_channels_init(), manager_endpoints_init(), manager_mwi_init(), manager_subscriptions_init(), manager_system_init(), and subscribed.

Referenced by __init_manager(), ari_conf_init(), session_create(), session_register_apps(), and websocket_attempted_cb().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 10114 of file manager.c.

10115{
10116 return 0;
10117}

◆ variable_count_cmp_fn()

static int variable_count_cmp_fn ( void *  obj,
void *  vstr,
int  flags 
)
static

Definition at line 8192 of file manager.c.

8193{
8194 /* Due to the simplicity of struct variable_count, it makes no difference
8195 * if you pass in objects or strings, the same operation applies. This is
8196 * due to the fact that the hash occurs on the first element, which means
8197 * the address of both the struct and the string are exactly the same. */
8198 struct variable_count *vc = obj;
8199 char *str = vstr;
8200 return !strcmp(vc->varname, str) ? CMP_MATCH | CMP_STOP : 0;
8201}
const char * str
Definition app_jack.c:150
@ CMP_MATCH
Definition astobj2.h:1027
@ CMP_STOP
Definition astobj2.h:1028
char * varname
Definition manager.c:8181

References CMP_MATCH, CMP_STOP, str, and variable_count::varname.

Referenced by xml_translate().

◆ variable_count_hash_fn()

static int variable_count_hash_fn ( const void *  vvc,
const int  flags 
)
static

Definition at line 8185 of file manager.c.

8186{
8187 const struct variable_count *vc = vvc;
8188
8189 return ast_str_hash(vc->varname);
8190}

References ast_str_hash(), and variable_count::varname.

Referenced by xml_translate().

◆ xml_copy_escape()

static void xml_copy_escape ( struct ast_str **  out,
const char *  src,
int  mode 
)
static

Definition at line 8113 of file manager.c.

8114{
8115 /* store in a local buffer to avoid calling ast_str_append too often */
8116 char buf[256];
8117 char *dst = buf;
8118 const char *save = src;
8119 int space = sizeof(buf);
8120 /* repeat until done and nothing to flush */
8121 for ( ; *src || dst != buf ; src++) {
8122 if (*src == '\0' || space < 10) { /* flush */
8123 *dst++ = '\0';
8124 ast_str_append(out, 0, "%s", buf);
8125 dst = buf;
8126 space = sizeof(buf);
8127 if (*src == '\0') {
8128 break;
8129 }
8130 }
8131
8132 if (mode & 2) {
8133 if (save == src && isdigit(*src)) {
8134 /* The first character of an XML attribute cannot be a digit */
8135 *dst++ = '_';
8136 *dst++ = *src;
8137 space -= 2;
8138 continue;
8139 } else if (!isalnum(*src)) {
8140 /* Replace non-alphanumeric with an underscore */
8141 *dst++ = '_';
8142 space--;
8143 continue;
8144 }
8145 }
8146 switch (*src) {
8147 case '<':
8148 strcpy(dst, "&lt;");
8149 dst += 4;
8150 space -= 4;
8151 break;
8152 case '>':
8153 strcpy(dst, "&gt;");
8154 dst += 4;
8155 space -= 4;
8156 break;
8157 case '\"':
8158 strcpy(dst, "&quot;");
8159 dst += 6;
8160 space -= 6;
8161 break;
8162 case '\'':
8163 strcpy(dst, "&apos;");
8164 dst += 6;
8165 space -= 6;
8166 break;
8167 case '&':
8168 strcpy(dst, "&amp;");
8169 dst += 5;
8170 space -= 5;
8171 break;
8172
8173 default:
8174 *dst++ = mode ? tolower(*src) : *src;
8175 space--;
8176 }
8177 }
8178}

References ast_str_append(), buf, and out.

Referenced by xml_translate().

◆ xml_translate()

static void xml_translate ( struct ast_str **  out,
char *  in,
struct ast_variable get_vars,
enum output_format  format 
)
static

Convert the input into XML or HTML. The input is supposed to be a sequence of lines of the form Name: value optionally followed by a blob of unformatted text. A blank line is a section separator. Basically, this is a mixture of the format of Manager Interface and CLI commands. The unformatted text is considered as a single value of a field named 'Opaque-data'.

At the moment the output format is the following (but it may change depending on future requirements so don't count too much on it when writing applications):

General: the unformatted text is used as a value of XML output: to be completed

*   Each section is within <response type="object" id="xxx">
*   where xxx is taken from ajaxdest variable or defaults to unknown
*   Each row is reported as an attribute Name="value" of an XML
*   entity named from the variable ajaxobjtype, default to "generic"
* 

HTML output: each Name-value pair is output as a single row of a two-column table. Sections (blank lines in the input) are separated by a


Definition at line 8231 of file manager.c.

8232{
8233 struct ast_variable *v;
8234 const char *dest = NULL;
8235 char *var, *val;
8236 const char *objtype = NULL;
8237 int in_data = 0; /* parsing data */
8238 int inobj = 0;
8239 int xml = (format == FORMAT_XML);
8240 struct variable_count *vc = NULL;
8241 struct ao2_container *vco = NULL;
8242
8243 if (xml) {
8244 /* dest and objtype need only for XML format */
8245 for (v = get_vars; v; v = v->next) {
8246 if (!strcasecmp(v->name, "ajaxdest")) {
8247 dest = v->value;
8248 } else if (!strcasecmp(v->name, "ajaxobjtype")) {
8249 objtype = v->value;
8250 }
8251 }
8252 if (ast_strlen_zero(dest)) {
8253 dest = "unknown";
8254 }
8255 if (ast_strlen_zero(objtype)) {
8256 objtype = "generic";
8257 }
8258 }
8259
8260 /* we want to stop when we find an empty line */
8261 while (in && *in) {
8262 val = strsep(&in, "\r\n"); /* mark start and end of line */
8263 if (in && *in == '\n') { /* remove trailing \n if any */
8264 in++;
8265 }
8267 ast_debug(5, "inobj %d in_data %d line <%s>\n", inobj, in_data, val);
8268 if (ast_strlen_zero(val)) {
8269 /* empty line */
8270 if (in_data) {
8271 /* close data in Opaque mode */
8272 ast_str_append(out, 0, xml ? "'" : "</td></tr>\n");
8273 in_data = 0;
8274 }
8275
8276 if (inobj) {
8277 /* close block */
8278 ast_str_append(out, 0, xml ? " /></response>\n" :
8279 "<tr><td colspan=\"2\"><hr></td></tr>\r\n");
8280 inobj = 0;
8281 ao2_ref(vco, -1);
8282 vco = NULL;
8283 }
8284 continue;
8285 }
8286
8287 if (!inobj) {
8288 /* start new block */
8289 if (xml) {
8290 ast_str_append(out, 0, "<response type='object' id='%s'><%s", dest, objtype);
8291 }
8294 inobj = 1;
8295 }
8296
8297 if (in_data) {
8298 /* Process data field in Opaque mode. This is a
8299 * followup, so we re-add line feeds. */
8300 ast_str_append(out, 0, xml ? "\n" : "<br>\n");
8301 xml_copy_escape(out, val, 0); /* data field */
8302 continue;
8303 }
8304
8305 /* We expect "Name: value" line here */
8306 var = strsep(&val, ":");
8307 if (val) {
8308 /* found the field name */
8311 } else {
8312 /* field name not found, switch to opaque mode */
8313 val = var;
8314 var = "Opaque-data";
8315 in_data = 1;
8316 }
8317
8318
8319 ast_str_append(out, 0, xml ? " " : "<tr><td>");
8320 if ((vc = ao2_find(vco, var, 0))) {
8321 vc->count++;
8322 } else {
8323 /* Create a new entry for this one */
8324 vc = ao2_alloc(sizeof(*vc), NULL);
8325 vc->varname = var;
8326 vc->count = 1;
8327 ao2_link(vco, vc);
8328 }
8329
8330 xml_copy_escape(out, var, xml ? 1 | 2 : 0); /* data name */
8331 if (vc->count > 1) {
8332 ast_str_append(out, 0, "-%d", vc->count);
8333 }
8334 ao2_ref(vc, -1);
8335 ast_str_append(out, 0, xml ? "='" : "</td><td>");
8336 xml_copy_escape(out, val, 0); /* data field */
8337 if (!in_data || !*in) {
8338 ast_str_append(out, 0, xml ? "'" : "</td></tr>\n");
8339 }
8340 }
8341
8342 if (inobj) {
8343 ast_str_append(out, 0, xml ? " /></response>\n" :
8344 "<tr><td colspan=\"2\"><hr></td></tr>\r\n");
8345 ao2_ref(vco, -1);
8346 }
8347}
char * strsep(char **str, const char *delims)
#define ao2_link(container, obj)
Add an object to a container.
Definition astobj2.h:1532
#define ao2_alloc(data_size, destructor_fn)
Definition astobj2.h:409
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
Definition astobj2.h:1303
static void xml_copy_escape(struct ast_str **out, const char *src, int mode)
Definition manager.c:8113
static int variable_count_cmp_fn(void *obj, void *vstr, int flags)
Definition manager.c:8192
static int variable_count_hash_fn(const void *vvc, const int flags)
Definition manager.c:8185
char * ast_trim_blanks(char *str)
Trims trailing whitespace characters from a string.
Definition strings.h:186
char *attribute_pure ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition strings.h:161
FILE * in
Definition utils/frame.c:33

References ao2_alloc, AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, ao2_find, ao2_link, ao2_ref, ast_debug, ast_skip_blanks(), ast_str_append(), ast_strlen_zero(), ast_trim_blanks(), variable_count::count, FORMAT_XML, in, ast_variable::name, ast_variable::next, NULL, out, strsep(), ast_variable::value, var, variable_count_cmp_fn(), variable_count_hash_fn(), variable_count::varname, and xml_copy_escape().

Referenced by process_output().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "Asterisk Manager Interface" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_CORE, .requires = "extconfig,acl,http", }
static

Definition at line 10237 of file manager.c.

◆ amanageruri

struct ast_http_uri amanageruri
static

Definition at line 9028 of file manager.c.

9028 {
9029 .description = "HTML Manager Event Interface w/Digest authentication",
9030 .uri = "amanager",
9031 .has_subtree = 0,
9032 .callback = auth_manager_http_callback,
9033 .data = NULL,
9034 .key = __FILE__,
9035};
static int auth_manager_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
Definition manager.c:8986

Referenced by __init_manager().

◆ amanagerxmluri

struct ast_http_uri amanagerxmluri
static

Definition at line 9037 of file manager.c.

9037 {
9038 .description = "XML Manager Event Interface w/Digest authentication",
9039 .uri = "amxml",
9040 .has_subtree = 0,
9041 .callback = auth_mxml_http_callback,
9042 .data = NULL,
9043 .key = __FILE__,
9044};
static int auth_mxml_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
Definition manager.c:8997

Referenced by __init_manager().

◆ ami_desc

struct ast_tcptls_session_args ami_desc
static

Definition at line 9137 of file manager.c.

9137 {
9138 .accept_fd = -1,
9139 .master = AST_PTHREADT_NULL,
9140 .tls_cfg = NULL,
9141 .poll_timeout = 5000, /* wake up every 5 seconds */
9142 .periodic_fn = purge_old_stuff,
9143 .name = "AMI server",
9144 .accept_fn = ast_tcptls_server_root, /* thread doing the accept() */
9145 .worker_fn = session_do, /* thread handling the session */
9146};
static void * session_do(void *data)
The body of the individual manager session. Call get_input() to read one line at a time (or be woken ...
Definition manager.c:7378
static void purge_old_stuff(void *data)
cleanup code called at each iteration of server_root, guaranteed to happen every 5 seconds at most
Definition manager.c:9120
void * ast_tcptls_server_root(void *)
Definition tcptls.c:280

Referenced by __init_manager(), handle_manager_show_settings(), manager_set_defaults(), and manager_shutdown().

◆ ami_tls_cfg

struct ast_tls_config ami_tls_cfg
static

◆ amis_desc

struct ast_tcptls_session_args amis_desc
static

Definition at line 9148 of file manager.c.

9148 {
9149 .accept_fd = -1,
9150 .master = AST_PTHREADT_NULL,
9151 .tls_cfg = &ami_tls_cfg,
9152 .poll_timeout = -1, /* the other does the periodic cleanup */
9153 .name = "AMI TLS server",
9154 .accept_fn = ast_tcptls_server_root, /* thread doing the accept() */
9155 .worker_fn = session_do, /* thread handling the session */
9156};

Referenced by __init_manager(), handle_manager_show_settings(), manager_set_defaults(), and manager_shutdown().

◆ arawmanuri

struct ast_http_uri arawmanuri
static

Definition at line 9019 of file manager.c.

9019 {
9020 .description = "Raw HTTP Manager Event Interface w/Digest authentication",
9021 .uri = "arawman",
9022 .has_subtree = 0,
9023 .callback = auth_rawman_http_callback,
9024 .data = NULL,
9025 .key = __FILE__,
9026};
static int auth_rawman_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
Definition manager.c:9008

Referenced by __init_manager().

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 10237 of file manager.c.

◆ cli_manager

struct ast_cli_entry cli_manager[]
static

Definition at line 9412 of file manager.c.

9412 {
9413 AST_CLI_DEFINE(handle_showmancmd, "Show a manager interface command"),
9414 AST_CLI_DEFINE(handle_showmancmds, "List manager interface commands"),
9415 AST_CLI_DEFINE(handle_showmanconn, "List connected manager interface users"),
9416 AST_CLI_DEFINE(handle_kickmanconn, "Kick a connected manager interface connection"),
9417 AST_CLI_DEFINE(handle_showmaneventq, "List manager interface queued events"),
9418 AST_CLI_DEFINE(handle_showmanagers, "List configured manager users"),
9419 AST_CLI_DEFINE(handle_showmanager, "Display information on a specific manager user"),
9420 AST_CLI_DEFINE(handle_mandebug, "Show, enable, disable debugging of the manager code"),
9421 AST_CLI_DEFINE(handle_manager_reload, "Reload manager configurations"),
9422 AST_CLI_DEFINE(handle_manager_show_settings, "Show manager global settings"),
9423#ifdef AST_XML_DOCS
9424 AST_CLI_DEFINE(handle_manager_show_events, "List manager interface events"),
9425 AST_CLI_DEFINE(handle_manager_show_event, "Show a manager interface event"),
9426#endif
9427};
#define AST_CLI_DEFINE(fn, txt,...)
Definition cli.h:197
static char * handle_showmancmd(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition manager.c:1089
static char * handle_showmaneventq(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
CLI command manager list eventq.
Definition manager.c:1547
static char * handle_showmanconn(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
CLI command manager list connected.
Definition manager.c:1496
static char * handle_kickmanconn(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
CLI command manager kick session.
Definition manager.c:1426
static char * handle_showmanagers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition manager.c:1341
static char * handle_showmanager(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition manager.c:1268
static char * handle_manager_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
CLI command manager reload.
Definition manager.c:1575
static char * handle_showmancmds(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
CLI command manager list commands.
Definition manager.c:1384
static char * handle_mandebug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition manager.c:1243
static char * handle_manager_show_events(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition manager.c:9219
static char * handle_manager_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
CLI command manager show settings.
Definition manager.c:9159
static char * handle_manager_show_event(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition manager.c:9350

Referenced by __init_manager(), and manager_shutdown().

◆ contenttype

const char* const contenttype[]
static
Initial value:
= {
[FORMAT_RAW] = "plain",
[FORMAT_HTML] = "html",
[FORMAT_XML] = "xml",
}

Definition at line 7943 of file manager.c.

7943 {
7944 [FORMAT_RAW] = "plain",
7945 [FORMAT_HTML] = "html",
7946 [FORMAT_XML] = "xml",
7947};

Referenced by auth_http_callback(), and generic_http_callback().

◆ managerclient_function

struct ast_custom_function managerclient_function
static
Initial value:
= {
.name = "AMI_CLIENT",
.read_max = 12,
}
static int function_amiclient(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
${AMI_CLIENT()} Dialplan function - reads manager client data
Definition manager.c:9062

description of AMI_CLIENT dialplan function

Definition at line 9109 of file manager.c.

9109 {
9110 .name = "AMI_CLIENT",
9111 .read = function_amiclient,
9112 .read_max = 12,
9113};

Referenced by __init_manager(), and manager_shutdown().

◆ manageruri

struct ast_http_uri manageruri
static

Definition at line 8968 of file manager.c.

8968 {
8969 .description = "HTML Manager Event Interface",
8970 .uri = "manager",
8971 .callback = manager_http_callback,
8972 .data = NULL,
8973 .key = __FILE__,
8974};
static int manager_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
Definition manager.c:8927

Referenced by __init_manager().

◆ managerxmluri

struct ast_http_uri managerxmluri
static

Definition at line 8976 of file manager.c.

8976 {
8977 .description = "XML Manager Event Interface",
8978 .uri = "mxml",
8979 .callback = mxml_http_callback,
8980 .data = NULL,
8981 .key = __FILE__,
8982};
static int mxml_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
Definition manager.c:8938

Referenced by __init_manager().

◆ rawmanuri

struct ast_http_uri rawmanuri
static

Definition at line 8960 of file manager.c.

8960 {
8961 .description = "Raw HTTP Manager Event Interface",
8962 .uri = "rawman",
8963 .callback = rawman_http_callback,
8964 .data = NULL,
8965 .key = __FILE__,
8966};
static int rawman_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
Definition manager.c:8949

Referenced by __init_manager().

◆ webregged

int webregged = 0
static

Definition at line 9115 of file manager.c.

Referenced by __init_manager().

◆ words

const char* words[AST_MAX_CMD_LEN]

Definition at line 222 of file manager.c.

Referenced by check_blacklist().