From: Thomas Heil Date: Mon, 30 Jun 2014 21:44:43 +0000 (+0200) Subject: haproxy: patches from upstream X-Git-Tag: v14.07~219 X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=ece8d3b51f29a88595c135b0068a3876a58bce0f;p=feed%2Fpackages.git haproxy: patches from upstream - [PATCH 7/9] BUILD: remove TODO from the spec file and add READM - [PATCH 8/9] MINOR: log: make MAX_SYSLOG_LEN overridable at build time - [PATCH 9/9] MEDIUM: log: support a user-configurable max log line length Signed-off-by: Thomas Heil --- diff --git a/net/haproxy/Makefile b/net/haproxy/Makefile index 3fe090716d..c74e58aa22 100644 --- a/net/haproxy/Makefile +++ b/net/haproxy/Makefile @@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=haproxy PKG_VERSION:=1.5.1 -PKG_RELEASE:=06 +PKG_RELEASE:=09 PKG_SOURCE:=haproxy-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=http://haproxy.1wt.eu/download/1.5/src/ PKG_MD5SUM:=49640cf3ddd793a05fbd3394481a1ed4 diff --git a/net/haproxy/patches/0007-BUILD-remove-TODO-from-the-spec-file-and-add-README.patch b/net/haproxy/patches/0007-BUILD-remove-TODO-from-the-spec-file-and-add-README.patch new file mode 100644 index 0000000000..52134f3114 --- /dev/null +++ b/net/haproxy/patches/0007-BUILD-remove-TODO-from-the-spec-file-and-add-README.patch @@ -0,0 +1,28 @@ +From e726fd6571f684d0e92b8d97de8ca7a68d30f708 Mon Sep 17 00:00:00 2001 +From: Willy Tarreau +Date: Thu, 26 Jun 2014 08:20:38 +0200 +Subject: [PATCH 7/9] BUILD: remove TODO from the spec file and add README + +This used to cause a build failure since 1.5.0, as reported by +Timothy Shelton. The proxy protocol doc was also added. +(cherry picked from commit ca3094d0b1531ce62fc1970aa7396a01330bb5c1) +--- + examples/haproxy.spec | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/examples/haproxy.spec b/examples/haproxy.spec +index 4ee3aa5..2fdb1a7 100644 +--- a/examples/haproxy.spec ++++ b/examples/haproxy.spec +@@ -67,7 +67,7 @@ fi + + %files + %defattr(-,root,root) +-%doc CHANGELOG TODO examples/*.cfg doc/haproxy-en.txt doc/haproxy-fr.txt doc/architecture.txt doc/configuration.txt ++%doc CHANGELOG README examples/*.cfg doc/haproxy-en.txt doc/haproxy-fr.txt doc/architecture.txt doc/configuration.txt doc/proxy-protocol.txt + %doc %{_mandir}/man1/%{name}.1* + + %attr(0755,root,root) %{_sbindir}/%{name} +-- +1.8.5.5 + diff --git a/net/haproxy/patches/0008-MINOR-log-make-MAX_SYSLOG_LEN-overridable-at-build-t.patch b/net/haproxy/patches/0008-MINOR-log-make-MAX_SYSLOG_LEN-overridable-at-build-t.patch new file mode 100644 index 0000000000..0423a9965b --- /dev/null +++ b/net/haproxy/patches/0008-MINOR-log-make-MAX_SYSLOG_LEN-overridable-at-build-t.patch @@ -0,0 +1,44 @@ +From b4cbc1e2227754ff384da1437e7d3448f91571b2 Mon Sep 17 00:00:00 2001 +From: Willy Tarreau +Date: Fri, 27 Jun 2014 18:08:49 +0200 +Subject: [PATCH 8/9] MINOR: log: make MAX_SYSLOG_LEN overridable at build time + +This value was set in log.h without any #ifndef around, so when one +wanted to change it, a patch was needed. Let's move it to defaults.h +with the usual #ifndef so that it's easier to change it. +(cherry picked from commit 4e957907aa117c07214ab84ba2a58f2fc1666931) +--- + include/common/defaults.h | 4 ++++ + include/types/log.h | 1 - + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/include/common/defaults.h b/include/common/defaults.h +index c53db08..0075509 100644 +--- a/include/common/defaults.h ++++ b/include/common/defaults.h +@@ -48,6 +48,10 @@ + #define CAPTURE_LEN 64 + #endif + ++#ifndef MAX_SYSLOG_LEN ++#define MAX_SYSLOG_LEN 1024 ++#endif ++ + // maximum line size when parsing config + #ifndef LINESIZE + #define LINESIZE 2048 +diff --git a/include/types/log.h b/include/types/log.h +index 8ee8d7c..b3288bd 100644 +--- a/include/types/log.h ++++ b/include/types/log.h +@@ -28,7 +28,6 @@ + #include + #include + +-#define MAX_SYSLOG_LEN 1024 + #define NB_LOG_FACILITIES 24 + #define NB_LOG_LEVELS 8 + #define SYSLOG_PORT 514 +-- +1.8.5.5 + diff --git a/net/haproxy/patches/0009-MEDIUM-log-support-a-user-configurable-max-log-line-.patch b/net/haproxy/patches/0009-MEDIUM-log-support-a-user-configurable-max-log-line-.patch new file mode 100644 index 0000000000..d28aa5ca35 --- /dev/null +++ b/net/haproxy/patches/0009-MEDIUM-log-support-a-user-configurable-max-log-line-.patch @@ -0,0 +1,360 @@ +From dc2695cc531bd7fc98f09df5f6e1e57290ab1a14 Mon Sep 17 00:00:00 2001 +From: Willy Tarreau +Date: Fri, 27 Jun 2014 18:10:07 +0200 +Subject: [PATCH 9/9] MEDIUM: log: support a user-configurable max log line + length + +With all the goodies supported by logformat, people find that the limit +of 1024 chars for log lines is too short. Some servers do not support +larger lines and can simply drop them, so changing the default value is +not always the best choice. + +This patch takes a different approach. Log line length is specified per +log server on the "log" line, with a value between 80 and 65535. That +way it's possibly to satisfy all needs, even with some fat local servers +and small remote ones. +(cherry picked from commit 18324f574f349d510622ff45635de899437a3a11) +--- + doc/configuration.txt | 28 ++++++++++++++++-- + include/proto/log.h | 1 + + include/types/global.h | 1 + + include/types/log.h | 1 + + src/cfgparse.c | 80 ++++++++++++++++++++++++++++++++++++++++---------- + src/log.c | 36 ++++++++++++++++------- + 6 files changed, 118 insertions(+), 29 deletions(-) + +diff --git a/doc/configuration.txt b/doc/configuration.txt +index 080d8fc..e53bb21 100644 +--- a/doc/configuration.txt ++++ b/doc/configuration.txt +@@ -559,7 +559,7 @@ group + Similar to "gid" but uses the GID of group name from /etc/group. + See also "gid" and "user". + +-log
[max level [min level]] ++log
[len ] [max level [min level]] + Adds a global syslog server. Up to two global servers can be defined. They + will receive logs for startups and exits, as well as all logs from proxies + configured with "log global". +@@ -584,6 +584,18 @@ log
[max level [min level]] + optionally enclosing them with braces ('{}'), similarly to what is done + in Bourne shell. + ++ is an optional maximum line length. Log lines larger than this value ++ will be truncated before being sent. The reason is that syslog ++ servers act differently on log line length. All servers support the ++ default value of 1024, but some servers simply drop larger lines ++ while others do log them. If a server supports long lines, it may ++ make sense to set this value here in order to avoid truncating long ++ lines. Similarly, if a server drops long lines, it is preferable to ++ truncate them before sending them. Accepted values are 80 to 65535 ++ inclusive. The default value of 1024 is generally fine for all ++ standard usages. Some specific cases of long captures or ++ JSON-formated logs may require larger values. ++ + must be one of the 24 standard syslog facilities : + + kern user mail daemon auth syslog lpr news +@@ -3349,7 +3361,7 @@ ignore-persist { if | unless } + + + log global +-log
[ []] ++log
[len ] [ []] + no log + Enable per-instance logging of events and traffic. + May be used in sections : defaults | frontend | listen | backend +@@ -3389,6 +3401,18 @@ no log + sign ('$') and optionally enclosing them with braces ('{}'), + similarly to what is done in Bourne shell. + ++ is an optional maximum line length. Log lines larger than this ++ value will be truncated before being sent. The reason is that ++ syslog servers act differently on log line length. All servers ++ support the default value of 1024, but some servers simply drop ++ larger lines while others do log them. If a server supports long ++ lines, it may make sense to set this value here in order to avoid ++ truncating long lines. Similarly, if a server drops long lines, ++ it is preferable to truncate them before sending them. Accepted ++ values are 80 to 65535 inclusive. The default value of 1024 is ++ generally fine for all standard usages. Some specific cases of ++ long captures or JSON-formated logs may require larger values. ++ + must be one of the 24 standard syslog facilities : + + kern user mail daemon auth syslog lpr news +diff --git a/include/proto/log.h b/include/proto/log.h +index e3c1a75..54c51d1 100644 +--- a/include/proto/log.h ++++ b/include/proto/log.h +@@ -39,6 +39,7 @@ extern char *log_format; + extern char default_tcp_log_format[]; + extern char default_http_log_format[]; + extern char clf_http_log_format[]; ++extern char *logline; + + + int build_logline(struct session *s, char *dst, size_t maxsize, struct list *list_format); +diff --git a/include/types/global.h b/include/types/global.h +index 23e3f3d..77df1dd 100644 +--- a/include/types/global.h ++++ b/include/types/global.h +@@ -110,6 +110,7 @@ struct global { + int last_checks; + int spread_checks; + int max_spread_checks; ++ int max_syslog_len; + char *chroot; + char *pidfile; + char *node, *desc; /* node name & description */ +diff --git a/include/types/log.h b/include/types/log.h +index b3288bd..c7e47ea 100644 +--- a/include/types/log.h ++++ b/include/types/log.h +@@ -152,6 +152,7 @@ struct logsrv { + int facility; + int level; + int minlvl; ++ int maxlen; + }; + + #endif /* _TYPES_LOG_H */ +diff --git a/src/cfgparse.c b/src/cfgparse.c +index 762978a..e6e65b4 100644 +--- a/src/cfgparse.c ++++ b/src/cfgparse.c +@@ -1254,6 +1254,8 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) + struct sockaddr_storage *sk; + int port1, port2; + struct logsrv *logsrv; ++ int arg = 0; ++ int len = 0; + + if (*(args[1]) == 0 || *(args[2]) == 0) { + Alert("parsing [%s:%d] : '%s' expects
and as arguments.\n", file, linenum, args[0]); +@@ -1263,28 +1265,50 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) + + logsrv = calloc(1, sizeof(struct logsrv)); + +- logsrv->facility = get_log_facility(args[2]); ++ /* just after the address, a length may be specified */ ++ if (strcmp(args[arg+2], "len") == 0) { ++ len = atoi(args[arg+3]); ++ if (len < 80 || len > 65535) { ++ Alert("parsing [%s:%d] : invalid log length '%s', must be between 80 and 65535.\n", ++ file, linenum, args[arg+3]); ++ err_code |= ERR_ALERT | ERR_FATAL; ++ goto out; ++ } ++ logsrv->maxlen = len; ++ ++ /* skip these two args */ ++ arg += 2; ++ } ++ else ++ logsrv->maxlen = MAX_SYSLOG_LEN; ++ ++ if (logsrv->maxlen > global.max_syslog_len) { ++ global.max_syslog_len = logsrv->maxlen; ++ logline = realloc(logline, global.max_syslog_len + 1); ++ } ++ ++ logsrv->facility = get_log_facility(args[arg+2]); + if (logsrv->facility < 0) { +- Alert("parsing [%s:%d] : unknown log facility '%s'\n", file, linenum, args[2]); ++ Alert("parsing [%s:%d] : unknown log facility '%s'\n", file, linenum, args[arg+2]); + err_code |= ERR_ALERT | ERR_FATAL; + logsrv->facility = 0; + } + + logsrv->level = 7; /* max syslog level = debug */ +- if (*(args[3])) { +- logsrv->level = get_log_level(args[3]); ++ if (*(args[arg+3])) { ++ logsrv->level = get_log_level(args[arg+3]); + if (logsrv->level < 0) { +- Alert("parsing [%s:%d] : unknown optional log level '%s'\n", file, linenum, args[3]); ++ Alert("parsing [%s:%d] : unknown optional log level '%s'\n", file, linenum, args[arg+3]); + err_code |= ERR_ALERT | ERR_FATAL; + logsrv->level = 0; + } + } + + logsrv->minlvl = 0; /* limit syslog level to this level (emerg) */ +- if (*(args[4])) { +- logsrv->minlvl = get_log_level(args[4]); ++ if (*(args[arg+4])) { ++ logsrv->minlvl = get_log_level(args[arg+4]); + if (logsrv->minlvl < 0) { +- Alert("parsing [%s:%d] : unknown optional minimum log level '%s'\n", file, linenum, args[4]); ++ Alert("parsing [%s:%d] : unknown optional minimum log level '%s'\n", file, linenum, args[arg+4]); + err_code |= ERR_ALERT | ERR_FATAL; + logsrv->minlvl = 0; + } +@@ -4791,22 +4815,46 @@ stats_error_parsing: + else if (*(args[1]) && *(args[2])) { + struct sockaddr_storage *sk; + int port1, port2; ++ int arg = 0; ++ int len = 0; + + logsrv = calloc(1, sizeof(struct logsrv)); + +- logsrv->facility = get_log_facility(args[2]); ++ /* just after the address, a length may be specified */ ++ if (strcmp(args[arg+2], "len") == 0) { ++ len = atoi(args[arg+3]); ++ if (len < 80 || len > 65535) { ++ Alert("parsing [%s:%d] : invalid log length '%s', must be between 80 and 65535.\n", ++ file, linenum, args[arg+3]); ++ err_code |= ERR_ALERT | ERR_FATAL; ++ goto out; ++ } ++ logsrv->maxlen = len; ++ ++ /* skip these two args */ ++ arg += 2; ++ } ++ else ++ logsrv->maxlen = MAX_SYSLOG_LEN; ++ ++ if (logsrv->maxlen > global.max_syslog_len) { ++ global.max_syslog_len = logsrv->maxlen; ++ logline = realloc(logline, global.max_syslog_len + 1); ++ } ++ ++ logsrv->facility = get_log_facility(args[arg+2]); + if (logsrv->facility < 0) { +- Alert("parsing [%s:%d] : unknown log facility '%s'\n", file, linenum, args[2]); ++ Alert("parsing [%s:%d] : unknown log facility '%s'\n", file, linenum, args[arg+2]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + + } + + logsrv->level = 7; /* max syslog level = debug */ +- if (*(args[3])) { +- logsrv->level = get_log_level(args[3]); ++ if (*(args[arg+3])) { ++ logsrv->level = get_log_level(args[arg+3]); + if (logsrv->level < 0) { +- Alert("parsing [%s:%d] : unknown optional log level '%s'\n", file, linenum, args[3]); ++ Alert("parsing [%s:%d] : unknown optional log level '%s'\n", file, linenum, args[arg+3]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + +@@ -4814,10 +4862,10 @@ stats_error_parsing: + } + + logsrv->minlvl = 0; /* limit syslog level to this level (emerg) */ +- if (*(args[4])) { +- logsrv->minlvl = get_log_level(args[4]); ++ if (*(args[arg+4])) { ++ logsrv->minlvl = get_log_level(args[arg+4]); + if (logsrv->minlvl < 0) { +- Alert("parsing [%s:%d] : unknown optional minimum log level '%s'\n", file, linenum, args[4]); ++ Alert("parsing [%s:%d] : unknown optional minimum log level '%s'\n", file, linenum, args[arg+4]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + +diff --git a/src/log.c b/src/log.c +index 114ab7b..3e3acb4 100644 +--- a/src/log.c ++++ b/src/log.c +@@ -146,7 +146,7 @@ char *log_format = NULL; + /* This is a global syslog line, common to all outgoing messages. It begins + * with the syslog tag and the date that are updated by update_log_hdr(). + */ +-static char logline[MAX_SYSLOG_LEN]; ++char *logline = NULL; + + struct logformat_var_args { + char *name; +@@ -736,7 +736,7 @@ static char *update_log_hdr() + tvsec = date.tv_sec; + get_localtime(tvsec, &tm); + +- hdr_len = snprintf(logline, MAX_SYSLOG_LEN, ++ hdr_len = snprintf(logline, global.max_syslog_len, + "<<<<>%s %2d %02d:%02d:%02d %s%s[%d]: ", + monthname[tm.tm_mon], + tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, +@@ -746,8 +746,8 @@ static char *update_log_hdr() + * either -1 or the number of bytes that would be needed to store + * the total message. In both cases, we must adjust it. + */ +- if (hdr_len < 0 || hdr_len > MAX_SYSLOG_LEN) +- hdr_len = MAX_SYSLOG_LEN; ++ if (hdr_len < 0 || hdr_len > global.max_syslog_len) ++ hdr_len = global.max_syslog_len; + + dataptr = logline + hdr_len; + } +@@ -772,9 +772,9 @@ void send_log(struct proxy *p, int level, const char *format, ...) + data_len = dataptr - logline; + + va_start(argp, format); +- data_len += vsnprintf(dataptr, logline + sizeof(logline) - dataptr, format, argp); +- if (data_len < 0 || data_len > MAX_SYSLOG_LEN) +- data_len = MAX_SYSLOG_LEN; ++ data_len += vsnprintf(dataptr, logline + global.max_syslog_len - dataptr, format, argp); ++ if (data_len < 0 || data_len > global.max_syslog_len) ++ data_len = global.max_syslog_len; + va_end(argp); + + __send_log(p, level, logline, data_len); +@@ -811,8 +811,6 @@ void __send_log(struct proxy *p, int level, char *message, size_t size) + if (!logsrvs) + return; + +- message[size - 1] = '\n'; +- + /* Send log messages to syslog server. */ + nblogger = 0; + list_for_each_entry(tmp, logsrvs, list) { +@@ -820,6 +818,8 @@ void __send_log(struct proxy *p, int level, char *message, size_t size) + int *plogfd = logsrv->addr.ss_family == AF_UNIX ? + &logfdunix : &logfdinet; + int sent; ++ int max; ++ char backup; + + nblogger++; + +@@ -858,9 +858,23 @@ void __send_log(struct proxy *p, int level, char *message, size_t size) + } while (fac_level && log_ptr > dataptr); + *log_ptr = '<'; + +- sent = sendto(*plogfd, log_ptr, size - (log_ptr - dataptr), ++ max = size - (log_ptr - dataptr); ++ if (max > logsrv->maxlen) ++ max = logsrv->maxlen; ++ ++ /* insert a \n at the end of the message, but save what was ++ * there first because we could have different max lengths ++ * for different log targets. ++ */ ++ backup = log_ptr[max - 1]; ++ log_ptr[max - 1] = '\n'; ++ ++ sent = sendto(*plogfd, log_ptr, max, + MSG_DONTWAIT | MSG_NOSIGNAL, + (struct sockaddr *)&logsrv->addr, get_addr_len(&logsrv->addr)); ++ ++ log_ptr[max - 1] = backup; ++ + if (sent < 0) { + Alert("sendto logger #%d failed: %s (errno=%d)\n", + nblogger, strerror(errno), errno); +@@ -1604,7 +1618,7 @@ void sess_log(struct session *s) + + tmplog = update_log_hdr(); + size = tmplog - logline; +- size += build_logline(s, tmplog, sizeof(logline) - size, &s->fe->logformat); ++ size += build_logline(s, tmplog, global.max_syslog_len - size, &s->fe->logformat); + if (size > 0) { + __send_log(s->fe, level, logline, size + 1); + s->logs.logwait = 0; +-- +1.8.5.5 +