Hi Patrick,

Le 08/04/2014 23:04, Patrick Hemmer a écrit :
Would it be possible to get an option to suppress the warning when a
reqrep rule is placed after a use_backend rule?
[WARNING] 097/205824 (4777) : parsing
[/var/run/hapi/haproxy/haproxy.cfg:1443] : a 'reqrep' rule placed after
a 'use_backend' rule will still be processed before.

I prefer keeping my related rules grouped together, and so this message
pops up every time haproxy is (re)started. Currently it logs out 264
lines each start (I have a lot of rules), and is thus fairly annoying. I
am well aware of what the message means and my configuration is not
affected by it.


Do you want to ignore every warnings or only some warnings ?

For the first case you can use the global keyword "quiet" (or its command line equivalent "-q").

For the second one, there is nothing available yet, but I was thinking of something like annotations in configuration comments.
For example :
- @ignore-warnings to ignore the warnings of the current line
- @BEGIN ignore-warnings to start a block of lines where warnings will be ignored
- @END ignore-warnings to stop ignoring warnings.

frontend test :8888
  mode http
  reqrep ^([^\ :]*)\ /static/(.*)     \1\ /\2
  block if TRUE   # @ignore-warnings
  block if FALSE  # @ignore-warnings
  block if TRUE
  block if TRUE
  block if TRUE
  # @BEGIN ignore-warnings
  block if TRUE
  block if TRUE
  block if TRUE
  block if TRUE
  block if TRUE
  # @END ignore-warnings
  block if TRUE
  block if TRUE
  block if TRUE

Please find a quick and dirty patch to illustrate. Is this something that could be useful ?


--
Cyril Bonté
diff --git a/include/types/global.h b/include/types/global.h
index 669ec23..cb18593 100644
--- a/include/types/global.h
+++ b/include/types/global.h
@@ -64,6 +64,11 @@
 #define ACCESS_LVL_OPER     2
 #define ACCESS_LVL_ADMIN    3
 
+/* Annotations */
+#define AN_IGNORE_WARN_LO   0x01	/* Annotation to ignore warnings on the current line */
+#define AN_IGNORE_WARN_BLCK 0x02	/* Annotation to ignore warnings on the current block */
+#define AN_IGNORE_WARN_MASK 0x03
+
 /* SSL server verify mode */
 enum {
 	SSL_SERVER_VERIFY_NONE = 0,
@@ -151,6 +156,7 @@ struct global {
 	struct proxy *stats_fe;     /* the frontend holding the stats settings */
 };
 
+extern int annotations;
 extern struct global global;
 extern int  pid;                /* current process id */
 extern int  relative_pid;       /* process id starting at 1 */
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 344bde1..d7c4d37 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -5557,6 +5557,8 @@ int readcfgfile(const char *file)
 		args[arg] = line;
 
 		while (*line && arg < MAX_LINE_ARGS) {
+			annotations &= ~AN_IGNORE_WARN_LO;
+
 			/* first, we'll replace \\, \<space>, \#, \r, \n, \t, \xXX with their
 			 * C equivalent value. Other combinations left unchanged (eg: \1).
 			 */
@@ -5600,6 +5602,22 @@ int readcfgfile(const char *file)
 				line++;
 			}
 			else if (*line == '#' || *line == '\n' || *line == '\r') {
+				char *aline = line;
+				while (*aline) {
+					if (*aline == '@') {
+						aline++;
+						if (strncmp(aline, "ignore-warnings", strlen("ignore-warnings")) == 0) {
+							annotations |= AN_IGNORE_WARN_LO;
+						}
+						else if (strncmp(aline, "BEGIN ignore-warnings", strlen("BEGIN ignore-warnings")) == 0) {
+							annotations |= AN_IGNORE_WARN_BLCK;
+						}
+						else if (strncmp(aline, "END ignore-warnings", strlen("END ignore-warnings")) == 0) {
+							annotations &= ~AN_IGNORE_WARN_BLCK;
+						}
+					}
+					aline++;
+				}
 				/* end of string, end of loop */
 				*line = 0;
 				break;
@@ -5685,6 +5703,7 @@ int readcfgfile(const char *file)
 		if (err_code & ERR_ABORT)
 			break;
 	}
+	annotations = 0;
 	cursection = NULL;
 	fclose(f);
 	return err_code;
diff --git a/src/haproxy.c b/src/haproxy.c
index fb8c8a1..cbc4888 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -118,6 +118,8 @@ static struct list cfg_cfgfiles = LIST_HEAD_INIT(cfg_cfgfiles);
 int  pid;			/* current process id */
 int  relative_pid = 1;		/* process id starting at 1 */
 
+int annotations = 0;		/* Configuration annotations */
+
 /* global options */
 struct global global = {
 	.nbproc = 1,
diff --git a/src/log.c b/src/log.c
index 176a725..71326f8 100644
--- a/src/log.c
+++ b/src/log.c
@@ -571,7 +571,7 @@ void Warning(const char *fmt, ...)
 	va_list argp;
 	struct tm tm;
 
-	if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)) {
+	if (!(global.mode & MODE_QUIET || annotations & AN_IGNORE_WARN_MASK) || (global.mode & MODE_VERBOSE)) {
 		va_start(argp, fmt);
 
 		get_localtime(date.tv_sec, &tm);

Reply via email to