* Path support has been added with the 'support_path' option in registration
and aor sections.
+res_pjsip
+------------------
+ * A 'debug' option has been added to the globals section that will allow
+ sip messages to be logged.
+
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 11 to Asterisk 12 --------------------
------------------------------------------------------------------------------
potentially cause a migration problem. If so, it may be necessary to
manually alter the affected table/column to bring it back in line with the
migration scripts.
+ * A new column was added to the 'ps_globals' realtime table for the 'debug'
+ option.
From 11 to 12:
There are many significant architectural changes in Asterisk 12. It is
; A value of 0 indicates no maximum (default: "0")
;type= ; Must be of type system (default: "")
-
;==========================GLOBAL SECTION OPTIONS=========================
;[global]
; SYNOPSIS: Options that apply globally to all SIP communications
; endpoint (default: "d
; efault_outbound_endpo
; int")
-
-
+;debug=no ; Enable/Disable SIP debug logging. Valid options include yes|no
+ ; or a host address (default: "no")
; MODULE PROVIDING BELOW SECTION(S): res_pjsip_acl
--- /dev/null
+"""add pjsip debug option
+
+Revision ID: 21e526ad3040
+Revises: 2fc7930b41b3
+Create Date: 2014-01-30 10:44:02.297455
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '21e526ad3040'
+down_revision = '2fc7930b41b3'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+ op.add_column('ps_globals', sa.Column('debug', sa.String(40)))
+
+def downgrade():
+ op.drop_column('ps_globals', 'debug')
*/
void ast_sip_unregister_supplement(struct ast_sip_supplement *supplement);
+/*!
+ * \brief Retrieve the system debug setting (yes|no|host).
+ *
+ * \note returned string needs to be de-allocated by caller.
+ *
+ * \retval the system debug setting.
+ */
+char *ast_sip_get_debug(void);
+
#endif /* _RES_PJSIP_H */
<configOption name="default_outbound_endpoint" default="default_outbound_endpoint">
<synopsis>Endpoint to use when sending an outbound request to a URI without a specified endpoint.</synopsis>
</configOption>
-
+ <configOption name="debug" default="no">
+ <synopsis>Enable/Disable SIP debug logging. Valid options include yes|no or
+ a host address</synopsis>
+ </configOption>
</configObject>
</configFile>
</configInfo>
AST_DECLARE_STRING_FIELDS(
AST_STRING_FIELD(useragent);
AST_STRING_FIELD(default_outbound_endpoint);
+ /*! Debug logging yes|no|host */
+ AST_STRING_FIELD(debug);
);
/* Value to put in Max-Forwards header */
unsigned int max_forwards;
{
struct global_config *cfg = ast_sorcery_generic_alloc(sizeof(*cfg), global_destructor);
- if (!cfg || ast_string_field_init(cfg, 64)) {
+ if (!cfg || ast_string_field_init(cfg, 80)) {
return NULL;
}
return ast_strdup(cfg->default_outbound_endpoint);
}
+char *ast_sip_get_debug(void)
+{
+ char *res;
+ struct global_config *cfg = get_global_cfg();
+
+ if (!cfg) {
+ return 0;
+ }
+
+ res = ast_strdup(cfg->debug);
+ ao2_ref(cfg, -1);
+
+ return res;
+}
+
int ast_sip_initialize_sorcery_global(struct ast_sorcery *sorcery)
{
snprintf(default_useragent, sizeof(default_useragent), "%s %s", DEFAULT_USERAGENT_PREFIX, ast_get_version());
OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, useragent));
ast_sorcery_object_field_register(sorcery, "global", "default_outbound_endpoint", DEFAULT_OUTBOUND_ENDPOINT,
OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, default_outbound_endpoint));
+ ast_sorcery_object_field_register(sorcery, "global", "debug", "no",
+ OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, debug));
return 0;
}
AST_CLI_DEFINE(pjsip_set_logger, "Enable/Disable PJSIP Logger Output")
};
+static void check_debug(void)
+{
+ RAII_VAR(char *, debug, ast_sip_get_debug(), ast_free);
+
+ if (ast_false(debug)) {
+ logging_mode = LOGGING_MODE_DISABLED;
+ return;
+ }
+
+ logging_mode = LOGGING_MODE_ENABLED;
+
+ if (ast_true(debug)) {
+ ast_sockaddr_setnull(&log_addr);
+ return;
+ }
+
+ /* assume host */
+ if (ast_sockaddr_resolve_first_af(&log_addr, debug, 0, AST_AF_UNSPEC)) {
+ ast_log(LOG_WARNING, "Could not resolve host %s for debug "
+ "logging\n", debug);
+ }
+}
+
+static void global_reloaded(const char *object_type)
+{
+ check_debug();
+}
+
+static const struct ast_sorcery_observer global_observer = {
+ .loaded = global_reloaded
+};
+
static int load_module(void)
{
+ if (ast_sorcery_observer_add(ast_sip_get_sorcery(), "global", &global_observer)) {
+ ast_log(LOG_WARNING, "Unable to add global observer\n");
+ return AST_MODULE_LOAD_DECLINE;
+ }
+
+ check_debug();
+
ast_sip_register_service(&logging_module);
ast_cli_register_multiple(cli_pjsip, ARRAY_LEN(cli_pjsip));
+
return AST_MODULE_LOAD_SUCCESS;
}
{
ast_cli_unregister_multiple(cli_pjsip, ARRAY_LEN(cli_pjsip));
ast_sip_unregister_service(&logging_module);
+
+ ast_sorcery_observer_remove(
+ ast_sip_get_sorcery(), "global", &global_observer);
+
return 0;
}