[Pkg-voip-commits] [asterisk] 01/02: Patch from upstream: pjsip_improve_logging.patch to improve logging levels in pjproject/chan_pjsip. Thanks to Joerg Dorchain for testing.

Bernhard Schmidt berni at moszumanska.debian.org
Tue Jan 17 21:31:56 UTC 2017


This is an automated email from the git hooks/post-receive script.

berni pushed a commit to branch master
in repository asterisk.

commit dbc98be14c12978a5bb8c8bd7ea105bc18134cf7
Author: Bernhard Schmidt <berni at debian.org>
Date:   Tue Jan 17 22:23:37 2017 +0100

    Patch from upstream: pjsip_improve_logging.patch to improve logging
    levels in pjproject/chan_pjsip. Thanks to Joerg Dorchain for testing.
    
    Closes: #849804
---
 debian/patches/pjsip_improve_logging.patch | 455 +++++++++++++++++++++++++++++
 debian/patches/series                      |   1 +
 2 files changed, 456 insertions(+)

diff --git a/debian/patches/pjsip_improve_logging.patch b/debian/patches/pjsip_improve_logging.patch
new file mode 100644
index 0000000..da26e97
--- /dev/null
+++ b/debian/patches/pjsip_improve_logging.patch
@@ -0,0 +1,455 @@
+Subject: PJPROJECT logging: Made easier to get available logging levels.
+Origin: https://github.com/asterisk/asterisk/commit/44fe4a576968a61fc3c0f6633e5ea9fc2c104105
+Bug: https://issues.asterisk.org/jira/browse/ASTERISK-26630
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=849804
+From: Richard Mudgett <rmudgett at digium.com>
+
+Use of the new logging is as simple as issuing the new CLI command or
+setting the new pjproject.conf option.
+
+Other options that can affect the logging are how you have the pjproject
+log levels mapped to Asterisk log types in pjproject.conf and if you have
+configured Asterisk to log the DEBUG type messages.  Altering the
+pjproject.conf level mapping shouldn't be necessary for most installations
+as the default mapping is sensible.  Configuring Asterisk to log the DEBUG
+message type is standard practice for collecting debug information.
+
+* Added CLI "pjproject set log level" command to dynamically adjust the
+maximum pjproject log message level.
+
+* Added CLI "pjproject show log level" command to see the currently set
+maximum pjproject log message level.
+
+* Added pjproject.conf startup section "log_level" option to set the
+initial maximum pjproject log message level so all messages could be
+captured from initialization.
+
+* Set PJ_LOG_MAX_LEVEL to 6 to compile in all defined logging levels into
+bundled pjproject.  Pjproject will use the currently set run time log
+level to determine if a log message is generated just like Asterisk
+verbose and debug logging levels.
+
+* In log_forwarder(), made always log enabled and mapped pjproject log
+messages.  DEBUG mapped log messages are no longer gated by the current
+Asterisk debug logging level.
+
+* Removed RAII_VAR() from res_pjproject.c:get_log_level().
+
+ASTERISK-26630 #close
+
+Change-Id: I6dca12979f482ffb0450aaf58db0fe0f6d2e5389
+---
+
+diff --git a/configs/samples/pjproject.conf.sample b/configs/samples/pjproject.conf.sample
+index 97af734..82c81a1 100644
+--- a/configs/samples/pjproject.conf.sample
++++ b/configs/samples/pjproject.conf.sample
+@@ -1,14 +1,35 @@
+ ; Common pjproject options
+ ;
+ 
++;[startup]
++;  NOTES: The name of this section in the pjproject.conf configuration file must
++;         remain startup or the configuration will not be applied.
++;
++;log_level=default   ; Initial maximum pjproject logging level to log
++                     ; Valid values are: 0-6, and default
++                     ;
++                     ; Note: This option is needed very early in the startup
++                     ; process so it can only be read from config files because
++                     ; the modules for other methods have not been loaded yet.
++;type=               ; Must be of type startup (default: "")
++
+ ;========================LOG_MAPPINGS SECTION OPTIONS===============================
+ ;[log_mappings]
+ ;  SYNOPSIS: Provides pjproject to Asterisk log level mappings.
+ ;  NOTES: The name of this section in the pjproject.conf configuration file must
+ ;         remain log_mappings or the configuration will not be applied.
+ ;         The defaults mentioned below only apply if this file or the 'log_mappings'
+-;         object can'tbe found.  If the object is found, there are no defaults. If
++;         object can't be found.  If the object is found, there are no defaults. If
+ ;         you don't specify an entry, nothing will be logged for that level.
++;
++; These logging level meanings are typically used by pjproject:
++;  - 0: fatal error
++;  - 1: error
++;  - 2: warning
++;  - 3: info
++;  - 4: debug
++;  - 5: trace
++;  - 6: more detailed trace
+ ;
+ ;asterisk_error =    ; A comma separated list of pjproject log levels to map to
+                      ; Asterisk errors.
+@@ -24,5 +45,5 @@
+                      ; (default: "")
+ ;asterisk_debug =    ; A comma separated list of pjproject log levels to map to
+                      ; Asterisk debug
+-                     ; (default: "3,4,5")
++                     ; (default: "3,4,5,6")
+ ;type=               ; Must be of type log_mappings (default: "")
+diff --git a/include/asterisk/options.h b/include/asterisk/options.h
+index 21bd7a7..0f8c6f8 100644
+--- a/include/asterisk/options.h
++++ b/include/asterisk/options.h
+@@ -132,6 +132,20 @@
+ #define ast_opt_lock_confdir		ast_test_flag(&ast_options, AST_OPT_FLAG_LOCK_CONFIG_DIR)
+ #define ast_opt_generic_plc         ast_test_flag(&ast_options, AST_OPT_FLAG_GENERIC_PLC)
+ 
++/*! Maximum log level defined by PJPROJECT. */
++#define MAX_PJ_LOG_MAX_LEVEL		6
++/*!
++ * Normal PJPROJECT active log level used by Asterisk.
++ *
++ * These levels are usually mapped to Error and
++ * Warning Asterisk log levels which shouldn't
++ * normally be suppressed.
++ */
++#define DEFAULT_PJ_LOG_MAX_LEVEL	2
++
++/*! Current pjproject logging level */
++extern int ast_option_pjproject_log_level;
++
+ extern struct ast_flags ast_options;
+ 
+ extern int option_verbose;
+diff --git a/main/asterisk.c b/main/asterisk.c
+index 746823e..2236e8c 100644
+--- a/main/asterisk.c
++++ b/main/asterisk.c
+@@ -325,6 +325,7 @@
+ 
+ int option_verbose;				/*!< Verbosity level */
+ int option_debug;				/*!< Debug level */
++int ast_option_pjproject_log_level;
+ double ast_option_maxload;			/*!< Max load avg on system */
+ int ast_option_maxcalls;			/*!< Max number of active calls */
+ int ast_option_maxfiles;			/*!< Max number of open file handles (files, sockets) */
+@@ -3891,6 +3892,37 @@
+ 	ast_config_destroy(cfg);
+ }
+ 
++static void read_pjproject_startup_options(void)
++{
++	struct ast_config *cfg;
++	struct ast_variable *v;
++	struct ast_flags config_flags = { CONFIG_FLAG_NOCACHE | CONFIG_FLAG_NOREALTIME };
++
++	ast_option_pjproject_log_level = DEFAULT_PJ_LOG_MAX_LEVEL;
++
++	cfg = ast_config_load2("pjproject.conf", "" /* core, can't reload */, config_flags);
++	if (!cfg
++		|| cfg == CONFIG_STATUS_FILEUNCHANGED
++		|| cfg == CONFIG_STATUS_FILEINVALID) {
++		/* We'll have to use defaults */
++		return;
++	}
++
++	for (v = ast_variable_browse(cfg, "startup"); v; v = v->next) {
++		if (!strcasecmp(v->name, "log_level")) {
++			if (sscanf(v->value, "%30d", &ast_option_pjproject_log_level) != 1) {
++				ast_option_pjproject_log_level = DEFAULT_PJ_LOG_MAX_LEVEL;
++			} else if (ast_option_pjproject_log_level < 0) {
++				ast_option_pjproject_log_level = 0;
++			} else if (MAX_PJ_LOG_MAX_LEVEL < ast_option_pjproject_log_level) {
++				ast_option_pjproject_log_level = MAX_PJ_LOG_MAX_LEVEL;
++			}
++		}
++	}
++
++	ast_config_destroy(cfg);
++}
++
+ static void *monitor_sig_flags(void *unused)
+ {
+ 	for (;;) {
+@@ -4612,6 +4644,7 @@
+ 
+ 	check_init(ast_timing_init(), "Timing");
+ 	check_init(ast_ssl_init(), "SSL");
++	read_pjproject_startup_options();
+ 	check_init(ast_pj_init(), "Embedded PJProject");
+ 	check_init(app_init(), "App Core");
+ 	check_init(devstate_init(), "Device State Core");
+diff --git a/main/libasteriskpj.c b/main/libasteriskpj.c
+index aed0ec8..2d92b59 100644
+--- a/main/libasteriskpj.c
++++ b/main/libasteriskpj.c
+@@ -37,6 +37,7 @@
+ #include <pjlib.h>
+ #endif
+ 
++#include "asterisk/options.h"
+ #include "asterisk/_private.h" /* ast_pj_init() */
+ 
+ /*!
+@@ -46,6 +47,7 @@
+ int ast_pj_init(void)
+ {
+ #ifdef HAVE_PJPROJECT_BUNDLED
++	pj_log_set_level(ast_option_pjproject_log_level);
+ 	pj_init();
+ #endif
+ 	return 0;
+diff --git a/res/res_pjproject.c b/res/res_pjproject.c
+index 08699f3..cd56266 100644
+--- a/res/res_pjproject.c
++++ b/res/res_pjproject.c
+@@ -41,6 +41,27 @@
+ 	<configInfo name="res_pjproject" language="en_US">
+ 		<synopsis>pjproject common configuration</synopsis>
+ 		<configFile name="pjproject.conf">
++			<configObject name="startup">
++				<synopsis>Asterisk startup time options for PJPROJECT</synopsis>
++				<description>
++					<note><para>The id of this object, as well as its type, must be
++					'startup' or it won't be found.</para></note>
++				</description>
++				<configOption name="type">
++					<synopsis>Must be of type 'startup'.</synopsis>
++				</configOption>
++				<configOption name="log_level" default="2">
++					<synopsis>Initial maximum pjproject logging level to log.</synopsis>
++					<description>
++						<para>Valid values are: 0-6, and default</para>
++					<note><para>
++						This option is needed very early in the startup process
++						so it can only be read from config files because the
++						modules for other methods have not been loaded yet.
++					</para></note>
++					</description>
++				</configOption>
++			</configObject>
+ 			<configObject name="log_mappings">
+ 				<synopsis>PJPROJECT to Asterisk Log Level Mapping</synopsis>
+ 				<description><para>Warnings and errors in the pjproject libraries are generally handled
+@@ -64,7 +85,7 @@
+ 				<configOption name="asterisk_notice" default="">
+ 					<synopsis>A comma separated list of pjproject log levels to map to Asterisk LOG_NOTICE.</synopsis>
+ 				</configOption>
+-				<configOption name="asterisk_debug" default="3,4,5">
++				<configOption name="asterisk_debug" default="3,4,5,6">
+ 					<synopsis>A comma separated list of pjproject log levels to map to Asterisk LOG_DEBUG.</synopsis>
+ 				</configOption>
+ 				<configOption name="asterisk_verbose" default="">
+@@ -84,6 +105,7 @@
+ #include <pjsip.h>
+ #include <pj/log.h>
+ 
++#include "asterisk/options.h"
+ #include "asterisk/logger.h"
+ #include "asterisk/module.h"
+ #include "asterisk/cli.h"
+@@ -146,9 +168,11 @@
+ 
+ static int get_log_level(int pj_level)
+ {
+-	RAII_VAR(struct log_mappings *, mappings, get_log_mappings(), ao2_cleanup);
++	int mapped_level;
+ 	unsigned char l;
++	struct log_mappings *mappings;
+ 
++	mappings = get_log_mappings();
+ 	if (!mappings) {
+ 		return __LOG_ERROR;
+ 	}
+@@ -156,18 +180,21 @@
+ 	l = '0' + fmin(pj_level, 9);
+ 
+ 	if (strchr(mappings->asterisk_error, l)) {
+-		return __LOG_ERROR;
++		mapped_level = __LOG_ERROR;
+ 	} else if (strchr(mappings->asterisk_warning, l)) {
+-		return __LOG_WARNING;
++		mapped_level = __LOG_WARNING;
+ 	} else if (strchr(mappings->asterisk_notice, l)) {
+-		return __LOG_NOTICE;
++		mapped_level = __LOG_NOTICE;
+ 	} else if (strchr(mappings->asterisk_verbose, l)) {
+-		return __LOG_VERBOSE;
++		mapped_level = __LOG_VERBOSE;
+ 	} else if (strchr(mappings->asterisk_debug, l)) {
+-		return __LOG_DEBUG;
++		mapped_level = __LOG_DEBUG;
++	} else {
++		mapped_level = __LOG_SUPPRESS;
+ 	}
+ 
+-	return __LOG_SUPPRESS;
++	ao2_ref(mappings, -1);
++	return mapped_level;
+ }
+ 
+ static void log_forwarder(int level, const char *data, int len)
+@@ -192,13 +219,6 @@
+ 
+ 	if (ast_level == __LOG_SUPPRESS) {
+ 		return;
+-	}
+-
+-	if (ast_level == __LOG_DEBUG) {
+-		/* Obey the debug level for res_pjproject */
+-		if (!DEBUG_ATLEAST(level)) {
+-			return;
+-		}
+ 	}
+ 
+ 	/* PJPROJECT uses indention to indicate function call depth. We'll prepend
+@@ -351,9 +371,95 @@
+ 	return CLI_SUCCESS;
+ }
+ 
++struct max_pjproject_log_level_check {
++	/*!
++	 * Compile time sanity check to determine if
++	 * MAX_PJ_LOG_MAX_LEVEL matches CLI syntax.
++	 */
++	char check[1 / (6 == MAX_PJ_LOG_MAX_LEVEL)];
++};
++
++static char *handle_pjproject_set_log_level(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
++{
++	int level_new;
++	int level_old;
++
++	switch (cmd) {
++	case CLI_INIT:
++		e->command = "pjproject set log level {default|0|1|2|3|4|5|6}";
++		e->usage =
++			"Usage: pjproject set log level {default|<level>}\n"
++			"\n"
++			"       Set the maximum active pjproject logging level.\n"
++			"       See pjproject.conf.sample for additional information\n"
++			"       about the various levels pjproject uses.\n";
++		return NULL;
++	case CLI_GENERATE:
++		return NULL;
++	}
++
++	if (a->argc != 5) {
++		return CLI_SHOWUSAGE;
++	}
++
++	if (!strcasecmp(a->argv[4], "default")) {
++		level_new = DEFAULT_PJ_LOG_MAX_LEVEL;
++	} else {
++		if (sscanf(a->argv[4], "%30d", &level_new) != 1
++			|| level_new < 0 || MAX_PJ_LOG_MAX_LEVEL < level_new) {
++			return CLI_SHOWUSAGE;
++		}
++	}
++
++	/* Update pjproject logging level */
++	level_old = ast_option_pjproject_log_level;
++	if (level_old == level_new) {
++		ast_cli(a->fd, "pjproject log level is still %d.\n", level_old);
++	} else {
++		ast_cli(a->fd, "pjproject log level was %d and is now %d.\n",
++			level_old, level_new);
++		pj_log_set_level(level_new);
++	}
++	ast_option_pjproject_log_level = pj_log_get_level();
++	if (ast_option_pjproject_log_level != level_new) {
++		ast_log(LOG_WARNING, "Asterisk built with pjproject PJ_LOG_MAX_LEVEL set too low.\n");
++	}
++
++	return CLI_SUCCESS;
++}
++
++static char *handle_pjproject_show_log_level(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
++{
++	switch (cmd) {
++	case CLI_INIT:
++		e->command = "pjproject show log level";
++		e->usage =
++			"Usage: pjproject show log level\n"
++			"\n"
++			"       Show the current maximum active pjproject logging level.\n"
++			"       See pjproject.conf.sample for additional information\n"
++			"       about the various levels pjproject uses.\n";
++		return NULL;
++	case CLI_GENERATE:
++		return NULL;
++	}
++
++	if (a->argc != 4) {
++		return CLI_SHOWUSAGE;
++	}
++
++	ast_cli(a->fd, "pjproject log level is %d.%s\n",
++		ast_option_pjproject_log_level,
++		ast_option_pjproject_log_level == DEFAULT_PJ_LOG_MAX_LEVEL ? " (default)" : "");
++
++	return CLI_SUCCESS;
++}
++
+ static struct ast_cli_entry pjproject_cli[] = {
++	AST_CLI_DEFINE(handle_pjproject_set_log_level, "Set the maximum active pjproject logging level"),
+ 	AST_CLI_DEFINE(handle_pjproject_show_buildopts, "Show the compiled config of the pjproject in use"),
+ 	AST_CLI_DEFINE(handle_pjproject_show_log_mappings, "Show pjproject to Asterisk log mappings"),
++	AST_CLI_DEFINE(handle_pjproject_show_log_level, "Show the maximum active pjproject logging level"),
+ };
+ 
+ static int load_module(void)
+@@ -387,10 +493,11 @@
+ 	}
+ 	ast_string_field_set(default_log_mappings, asterisk_error, "0,1");
+ 	ast_string_field_set(default_log_mappings, asterisk_warning, "2");
+-	ast_string_field_set(default_log_mappings, asterisk_debug, "3,4,5");
++	ast_string_field_set(default_log_mappings, asterisk_debug, "3,4,5,6");
+ 
+ 	ast_sorcery_load(pjproject_sorcery);
+ 
++	pj_log_set_level(ast_option_pjproject_log_level);
+ 	pj_init();
+ 
+ 	decor_orig = pj_log_get_decor();
+@@ -405,9 +512,15 @@
+ 	 */
+ 	pj_log_set_log_func(capture_buildopts_cb);
+ 	pj_log_set_decor(0);
++	pj_log_set_level(MAX_PJ_LOG_MAX_LEVEL);/* Set level to guarantee the dump output. */
+ 	pj_dump_config();
++	pj_log_set_level(ast_option_pjproject_log_level);
+ 	pj_log_set_decor(PJ_LOG_HAS_SENDER | PJ_LOG_HAS_INDENT);
+ 	pj_log_set_log_func(log_forwarder);
++	if (!AST_VECTOR_SIZE(&buildopts)
++		|| ast_option_pjproject_log_level != pj_log_get_level()) {
++		ast_log(LOG_WARNING, "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL set too low.\n");
++	}
+ 
+ 	ast_cli_register_multiple(pjproject_cli, ARRAY_LEN(pjproject_cli));
+ 
+diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
+index b8cb10b..64b1372 100644
+--- a/res/res_rtp_asterisk.c
++++ b/res/res_rtp_asterisk.c
+@@ -54,6 +54,7 @@
+ #include <ifaddrs.h>
+ #endif
+ 
++#include "asterisk/options.h"
+ #include "asterisk/stun.h"
+ #include "asterisk/pbx.h"
+ #include "asterisk/frame.h"
+@@ -5668,6 +5669,7 @@
+ #ifdef HAVE_PJPROJECT
+ 	pj_lock_t *lock;
+ 
++	pj_log_set_level(ast_option_pjproject_log_level);
+ 	if (pj_init() != PJ_SUCCESS) {
+ 		return AST_MODULE_LOAD_DECLINE;
+ 	}
+diff --git a/third-party/pjproject/patches/config_site.h b/third-party/pjproject/patches/config_site.h
+index 1a48695..66e8e84 100644
+--- a/third-party/pjproject/patches/config_site.h
++++ b/third-party/pjproject/patches/config_site.h
+@@ -34,7 +34,7 @@
+ 
+ #define PJ_SCANNER_USE_BITWISE	0
+ #define PJ_OS_HAS_CHECK_STACK	0
+-#define PJ_LOG_MAX_LEVEL		3
++#define PJ_LOG_MAX_LEVEL		6
+ #define PJ_ENABLE_EXTRA_CHECK	1
+ #define PJSIP_MAX_TSX_COUNT		((64*1024)-1)
+ #define PJSIP_MAX_DIALOG_COUNT	((64*1024)-1)
diff --git a/debian/patches/series b/debian/patches/series
index 2e8df0a..18735f5 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -39,3 +39,4 @@ OpenSSL-1.1.0-support.patch
 OpenSSL-1.1.0-support-2.patch
 
 pjsip_unresolved_symbol.patch
+pjsip_improve_logging.patch

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-voip/asterisk.git



More information about the Pkg-voip-commits mailing list