changeset 1345:51a0521cd065

dbg_loglevel: new extension that allows changing the log level at runtime
author Thomas Klausner <tk@giga.or.at>
date Sun, 12 May 2019 10:35:46 +0200
parents a5c072798f1a
children 25f86f4cdde8
files doc/dbg_loglevel.conf.sample extensions/dbg_loglevel/CMakeLists.txt extensions/dbg_loglevel/dbg_loglevel.c extensions/dbg_loglevel/dbg_loglevel.h extensions/dbg_loglevel/dbg_loglevel_conf.l extensions/dbg_loglevel/dbg_loglevel_conf.y
diffstat 6 files changed, 431 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/dbg_loglevel.conf.sample	Sun May 12 10:35:46 2019 +0200
@@ -0,0 +1,13 @@
+# This file contains information for configuring the dbg_loglevel extension.
+#
+# The dbg_loglevel extension allows changing the logging level at startup,
+# and then changing it at runtime.
+#
+# This extension supports configuration reload at runtime. Send
+# signal SIGUSR1 to the process to cause the process to reload its
+# config.
+#
+# 3 is the default log level (FD_LOG_NOTICE)
+# smaller values increase the logging
+# bigger values reduce the logging
+LogLevel=3;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dbg_loglevel/CMakeLists.txt	Sun May 12 10:35:46 2019 +0200
@@ -0,0 +1,28 @@
+# The dbg_loglevel extension
+PROJECT("Debugging extension that allows changing the log level at runtime" C)
+
+# Parser files
+BISON_FILE(dbg_loglevel_conf.y)
+FLEX_FILE(dbg_loglevel_conf.l)
+SET_SOURCE_FILES_PROPERTIES(lex.dbg_loglevel_conf.c dbg_loglevel_conf.tab.c PROPERTIES COMPILE_FLAGS "-I ${CMAKE_CURRENT_SOURCE_DIR}")
+
+# List of source files
+SET(DBG_LOGLEVEL_SRC
+	dbg_loglevel.c
+	dbg_loglevel.h
+	lex.dbg_loglevel_conf.c
+	dbg_loglevel_conf.tab.c
+	dbg_loglevel_conf.tab.h
+)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+
+# Compile these files as a freeDiameter extension
+FD_ADD_EXTENSION(dbg_loglevel ${DBG_LOGLEVEL_SRC})
+
+####
+## INSTALL section ##
+
+INSTALL(TARGETS dbg_loglevel
+	LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX}
+	COMPONENT freeDiameter-debug-tools)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dbg_loglevel/dbg_loglevel.c	Sun May 12 10:35:46 2019 +0200
@@ -0,0 +1,89 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Author: Thomas Klausner <tk@giga.or.at>								 *
+*													 *
+* Copyright (c) 2019, Thomas Klausner									 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+#include <signal.h>
+
+/* See doc/dbg_loglevel.conf.sample for more details about the features of this extension */
+#include "dbg_loglevel.h"
+
+static char *config_file = NULL;
+#define MODULE_NAME "dbg_loglevel"
+
+static void sig_hdlr(void)
+{
+	int old_log_level;
+
+	old_log_level = fd_g_debug_lvl;
+	if (dbg_loglevel_conf_handle(config_file) != 0) {
+		fd_log_error("%s: error during config file reload, restoring previous value", MODULE_NAME);
+		fd_g_debug_lvl = old_log_level;
+	}
+	fd_log_notice("%s: reloaded configuration, log level now %d", MODULE_NAME, fd_g_debug_lvl);
+}
+
+/* entry point */
+static int dbg_loglevel_entry(char * conffile)
+{
+	TRACE_ENTRY("%p", conffile);
+
+	config_file = conffile;
+
+	/* default set by main program */
+	/* fd_g_debug_lvl = FD_LOG_NOTICE; */
+
+	/* Parse the configuration file */
+	CHECK_FCT(dbg_loglevel_conf_handle(config_file));
+
+	/* Register reload callback */
+	CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr));
+
+	fd_log_notice("Extension 'Loglevel' initialized with log level %d", fd_g_debug_lvl);
+
+	/* We're done */
+	return 0;
+}
+
+/* Unload */
+void fd_ext_fini(void)
+{
+	TRACE_ENTRY();
+
+	/* Nothing to do */
+	return ;
+}
+
+EXTENSION_ENTRY(MODULE_NAME, dbg_loglevel_entry);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dbg_loglevel/dbg_loglevel.h	Sun May 12 10:35:46 2019 +0200
@@ -0,0 +1,47 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Author: Thomas Klausner <tk@giga.or.at>								 *
+*													 *
+* Copyright (c) 2019, Thomas Klausner									 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+/*
+ *  See the dbg_loglevel.conf.sample file for the format of the configuration file.
+ */
+
+/* FreeDiameter's common include file */
+#include <freeDiameter/extension.h>
+
+/* Parse the configuration file */
+int dbg_loglevel_conf_handle(char *);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dbg_loglevel/dbg_loglevel_conf.l	Sun May 12 10:35:46 2019 +0200
@@ -0,0 +1,107 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Authors: Thomas Klausner <tk@giga.or.at> based on code by Sebastien Decugis <sdecugis@freediameter.net>*
+*													 *
+* Copyright (c) 2019, Thomas Klausner									 *
+* Copyright (c) 2013, WIDE Project and NICT								 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+/* Tokenizer
+ *
+ */
+
+%{
+#include "dbg_loglevel.h"
+#include "dbg_loglevel_conf.tab.h"
+
+/* Update the column information */
+#define YY_USER_ACTION { 						\
+	yylloc->first_column = yylloc->last_column + 1; 		\
+	yylloc->last_column = yylloc->first_column + yyleng - 1;	\
+}
+
+/* Avoid warning with newer flex */
+#define YY_NO_INPUT
+
+%}
+
+qstring		\"[^\"\n]*\"
+
+
+%option bison-bridge bison-locations
+%option noyywrap
+%option nounput
+
+%%
+
+	/* Update the line count */
+\n			{
+				yylloc->first_line++;
+				yylloc->last_line++;
+				yylloc->last_column=0;
+			}
+
+	/* Eat all spaces but not new lines */
+([[:space:]]{-}[\n])+	;
+	/* Eat all comments */
+#.*$			;
+
+	/* Recognize any integer */
+[-]?[[:digit:]]+	{
+				/* Convert this to an integer value */
+				int ret=0;
+				ret = sscanf(yytext, "%i", &yylval->integer);
+				if (ret != 1) {
+					/* No matching: an error occurred */
+					TRACE_ERROR("Unable to convert the value '%s' to a valid number: %s", yytext, strerror(errno));
+					return LEX_ERROR; /* trig an error in yacc parser */
+					/* Maybe we could REJECT instead of failing here? */
+				}
+				return INTEGER;
+			}
+
+
+
+	/* The key words */
+(?i:"LogLevel")	 	{	return LOGLEVEL;	}
+
+	/* Valid single characters for yyparse */
+[=;]			{ return yytext[0]; }
+
+	/* Unrecognized sequence, if it did not match any previous pattern */
+[^[:space:]=;\n]+	{
+				TRACE_ERROR("Unrecognized text on line %d col %d: '%s'.", yylloc->first_line, yylloc->first_column, yytext);
+			 	return LEX_ERROR;
+			}
+
+%%
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dbg_loglevel/dbg_loglevel_conf.y	Sun May 12 10:35:46 2019 +0200
@@ -0,0 +1,147 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Author: Thomas Klausner <tk@giga.or.at>								 *
+*													 *
+* Copyright (c) 2019, Thomas Klausner									 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+/* Yacc extension's configuration parser.
+ */
+
+/* For development only : */
+%debug
+%error-verbose
+
+/* The parser receives the configuration file filename as parameter */
+%parse-param {char * conffile}
+
+/* Keep track of location */
+%locations
+%pure-parser
+
+%{
+#include "dbg_loglevel.h"
+#include "dbg_loglevel_conf.tab.h"
+
+/* Forward declaration */
+int dbg_loglevel_confparse(char *conffile);
+void dbg_loglevel_confrestart(FILE *input_file);
+
+/* Parse the configuration file */
+int dbg_loglevel_conf_handle(char * conffile)
+{
+	extern FILE *dbg_loglevel_confin;
+	int ret;
+
+	TRACE_ENTRY("%p", conffile);
+
+	TRACE_DEBUG(FULL, "Parsing configuration file: %s...", conffile);
+
+	dbg_loglevel_confin = fopen(conffile, "r");
+	if (dbg_loglevel_confin == NULL) {
+		ret = errno;
+		TRACE_ERROR("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret));
+		return ret;
+	}
+
+	dbg_loglevel_confrestart(dbg_loglevel_confin);
+	ret = dbg_loglevel_confparse(conffile);
+
+	fclose(dbg_loglevel_confin);
+
+	if (ret != 0) {
+		TRACE_ERROR( "Unable to parse the configuration file %s.", conffile);
+		return EINVAL;
+	} else {
+		TRACE_DEBUG(FULL, "[dbg_loglevel] LogLevel: %d.", fd_g_debug_lvl);
+	}
+
+	return 0;
+}
+
+/* The Lex parser prototype */
+int dbg_loglevel_conflex(YYSTYPE *lvalp, YYLTYPE *llocp);
+
+/* Function to report the errors */
+void yyerror (YYLTYPE *ploc, char * conffile, char const *s)
+{
+	TRACE_DEBUG(INFO, "Error in configuration parsing");
+
+	if (ploc->first_line != ploc->last_line)
+		fd_log_error("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s);
+	else if (ploc->first_column != ploc->last_column)
+		fd_log_error("%s:%d.%d-%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s);
+	else
+		fd_log_error("%s:%d.%d : %s", conffile, ploc->first_line, ploc->first_column, s);
+}
+
+%}
+
+/* Values returned by lex for token */
+%union {
+	int		integer;
+}
+
+/* In case of error in the lexical analysis */
+%token 		LEX_ERROR
+
+/* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */
+%token <integer> INTEGER
+
+/* Tokens */
+%token 		LOGLEVEL
+
+
+/* -------------------------------------- */
+%%
+
+	/* The grammar definition */
+conffile:		/* empty is OK */
+			| conffile size
+			| conffile errors
+			{
+				yyerror(&yylloc, conffile, "An error occurred while parsing the configuration file");
+				YYABORT;
+			}
+			;
+
+			/* Lexical or syntax error */
+errors:			LEX_ERROR
+			| error
+			;
+
+size:		LOGLEVEL '=' INTEGER ';'
+			{
+				fd_g_debug_lvl=$3;
+			}
+			;
"Welcome to our mercurial repository"