On 2017/04/17 00:57, Alexander Bluhm wrote:
> Hi,
>
> I have received complaints from a customer that the "last message
> repeated" feature of syslogd(8) makes their log auditing difficult.
> FreeBSD has -c and -cc to disable it, but our -c is already taken.
>
> Add -r to suppress the summary line for pipe and remote loghost,
> as they are most commonly used for automated log processing. With
> -rr the "last message repeated" can be disabled completely.
>
> ok?
>
> bluhm
>
> Index: usr.sbin/syslogd/syslogd.8
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.8,v
> retrieving revision 1.53
> diff -u -p -r1.53 syslogd.8
> --- usr.sbin/syslogd/syslogd.8 2 Jan 2017 15:58:02 -0000 1.53
> +++ usr.sbin/syslogd/syslogd.8 16 Apr 2017 20:01:04 -0000
> @@ -39,7 +39,7 @@
> .Sh SYNOPSIS
> .Nm syslogd
> .Bk -words
> -.Op Fl 46dFhnuVZ
> +.Op Fl 46dFhnruVZ
> .Op Fl a Ar path
> .Op Fl C Ar CAfile
> .Op Fl c Ar cert_file
> @@ -129,6 +129,10 @@ the symbolic local host name.
> Specify the pathname of an alternate log socket to be used instead;
> the default is
> .Pa /dev/log .
> +.It Fl r
> +Suppress the message repeated summary and print every line immediately.
Would it be clearer if "message repeated" were in quotes?
> +If given once, only message piped to another program or forwarded
> +to a remote loghost are affected.
s/message/messages/
Doesn't this need something like "If given twice, all messages are
affected" or similar?
> Create a TLS listen socket for receiving encrypted messages and
> bind it to the specified address.
> Index: usr.sbin/syslogd/syslogd.c
I'm ok with the general idea and code diff.
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.c,v
> retrieving revision 1.241
> diff -u -p -r1.241 syslogd.c
> --- usr.sbin/syslogd/syslogd.c 7 Apr 2017 15:36:16 -0000 1.241
> +++ usr.sbin/syslogd/syslogd.c 16 Apr 2017 20:14:30 -0000
> @@ -209,6 +209,7 @@ int Initialized = 0; /* set when we have
> int MarkInterval = 20 * 60; /* interval between marks in seconds */
> int MarkSeq = 0; /* mark sequence number */
> int PrivChild = 0; /* Exec the privileged parent process */
> +int Repeat = 0; /* 0 msg repeated, 1 in files only, 2 never */
> int SecureMode = 1; /* when true, speak only unix domain socks */
> int NoDNS = 0; /* when true, refrain from doing DNS lookups */
> int ZuluTime = 0; /* display date and time in UTC ISO format */
> @@ -369,8 +370,8 @@ main(int argc, char *argv[])
> tls_hostport = tls_host = NULL;
> nbind = nlisten = 0;
>
> - while ((ch = getopt(argc, argv, "46a:C:c:dFf:hK:k:m:nP:p:S:s:T:U:uVZ"))
> - != -1)
> + while ((ch = getopt(argc, argv,
> + "46a:C:c:dFf:hK:k:m:nP:p:rS:s:T:U:uVZ")) != -1) {
> switch (ch) {
> case '4': /* disable IPv6 */
> Family = PF_INET;
> @@ -425,6 +426,9 @@ main(int argc, char *argv[])
> case 'p': /* path */
> path_unix[0] = optarg;
> break;
> + case 'r':
> + Repeat++;
> + break;
> case 'S': /* allow tls and listen on address */
> tls_hostport = optarg;
> if ((p = strdup(optarg)) == NULL)
> @@ -455,6 +459,7 @@ main(int argc, char *argv[])
> default:
> usage();
> }
> + }
> if (argc != optind)
> usage();
>
> @@ -1766,7 +1771,10 @@ logline(int pri, int flags, char *from,
> /*
> * suppress duplicate lines to this file
> */
> - if ((flags & MARK) == 0 && msglen == f->f_prevlen &&
> + if ((Repeat == 0 || (Repeat == 1 &&
> + (f->f_type != F_PIPE && f->f_type != F_FORWUDP &&
> + f->f_type != F_FORWTCP && f->f_type != F_FORWTLS))) &&
> + (flags & MARK) == 0 && msglen == f->f_prevlen &&
> !strcmp(msg, f->f_prevline) &&
> !strcmp(from, f->f_prevhost)) {
> strlcpy(f->f_lasttime, timestamp,
>