diff mbox

[conntrack-tools,v2] log: print messages to stdout/sderr if running in console mode

Message ID 147763774551.12311.7353846218834006990.stgit@nfdev2.cica.es
State Accepted
Delegated to: Pablo Neira
Headers show

Commit Message

Arturo Borrero Gonzalez Oct. 28, 2016, 6:57 a.m. UTC
If conntrackd is running in console mode (i.e. in foreground)
then we can print the log messages to stdout/stderr.

This eases the workflow for admins, since we condensate more info into
the same terminal output.

Example:

% sudo conntrackd -C /etc/conntrackd.conf
WARNING: XXXX is an invalid interface
[Thu Oct 27 13:57:09 2016] (pid=7581) [notice] disabling internal cache
[Thu Oct 27 13:57:09 2016] (pid=7581) [notice] disabling external cache
[Thu Oct 27 13:57:09 2016] (pid=7581) [ERROR] can't open channel socket: No such device
[Thu Oct 27 13:57:09 2016] (pid=7581) [ERROR] initialization failed
ERROR: conntrackd cannot start, please check the logfile for more info

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
---

v2: fix va_list arguments usage by using pointers where needed.

 include/conntrackd.h |    1 +
 src/log.c            |   67 +++++++++++++++++++++++++++++++++++---------------
 src/main.c           |    1 +
 3 files changed, 49 insertions(+), 20 deletions(-)


--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Pablo Neira Ayuso Oct. 28, 2016, 8:16 a.m. UTC | #1
On Fri, Oct 28, 2016 at 08:57:08AM +0200, Arturo Borrero Gonzalez wrote:
> If conntrackd is running in console mode (i.e. in foreground)
> then we can print the log messages to stdout/stderr.
> 
> This eases the workflow for admins, since we condensate more info into
> the same terminal output.

Applied, thanks Arturo.

BTW, one comment:

> Example:
> 
> % sudo conntrackd -C /etc/conntrackd.conf
> WARNING: XXXX is an invalid interface

Probably, we can now place this message via logging. I remember the
problem is that logging is not yet initialized at that stage, but this
should be easy to fix.

> [Thu Oct 27 13:57:09 2016] (pid=7581) [notice] disabling internal cache
> [Thu Oct 27 13:57:09 2016] (pid=7581) [notice] disabling external cache
> [Thu Oct 27 13:57:09 2016] (pid=7581) [ERROR] can't open channel socket: No such device
> [Thu Oct 27 13:57:09 2016] (pid=7581) [ERROR] initialization failed
> ERROR: conntrackd cannot start, please check the logfile for more info

And I guess this "ERROR: conntrackd cannot start, please review your
configuration" can go into log message too.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/include/conntrackd.h b/include/conntrackd.h
index f8b11a7..8406c54 100644
--- a/include/conntrackd.h
+++ b/include/conntrackd.h
@@ -110,6 +110,7 @@  struct ct_conf {
 	int filter_from_kernelspace;
 	int event_iterations_limit;
 	int systemd;
+	int running_mode;
 	struct {
 		int error_queue_length;
 	} channelc;
diff --git a/src/log.c b/src/log.c
index d4de111..0796ba9 100644
--- a/src/log.c
+++ b/src/log.c
@@ -60,41 +60,68 @@  int init_log(void)
 	return 0;
 }
 
-void dlog(int priority, const char *format, ...)
- {
-	FILE *fd = STATE(log);
+static void logline_put(FILE *fd, int priority, const char *format,
+			va_list *args)
+{
 	time_t t;
 	char *buf;
 	const char *prio;
+
+	t = time(NULL);
+	buf = ctime(&t);
+	buf[strlen(buf)-1]='\0';
+
+	switch (priority) {
+	case LOG_INFO:
+		prio = "info";
+		break;
+	case LOG_NOTICE:
+		prio = "notice";
+		break;
+	case LOG_WARNING:
+		prio = "warning";
+		break;
+	case LOG_ERR:
+		prio = "ERROR";
+		break;
+	default:
+		prio = "?";
+		break;
+	}
+
+	fprintf(fd, "[%s] (pid=%d) [%s] ", buf, getpid(), prio);
+	vfprintf(fd, format, *args);
+	fprintf(fd, "\n");
+	fflush(fd);
+}
+
+void dlog(int priority, const char *format, ...)
+{
+	FILE *fd = STATE(log);
+	FILE *console_out;
  	va_list args;
- 
-	if (fd) {
-		t = time(NULL);
-		buf = ctime(&t);
-		buf[strlen(buf)-1]='\0';
+
+	if (CONFIG(running_mode) != DAEMON) {
 		switch (priority) {
 		case LOG_INFO:
-			prio = "info";
-			break;
 		case LOG_NOTICE:
-			prio = "notice";
+			console_out = stdout;
 			break;
 		case LOG_WARNING:
-			prio = "warning";
-			break;
 		case LOG_ERR:
-			prio = "ERROR";
-			break;
 		default:
-			prio = "?";
+			console_out = stderr;
 			break;
 		}
 		va_start(args, format);
-		fprintf(fd, "[%s] (pid=%d) [%s] ", buf, getpid(), prio);
-		vfprintf(fd, format, args);
+		logline_put(console_out, priority, format, &args);
+		va_end(args);
+	}
+
+	if (fd) {
+		va_start(args, format);
+		logline_put(fd, priority, format, &args);
 		va_end(args);
-		fprintf(fd, "\n");
-		fflush(fd);
 	}
 
 	if (CONFIG(syslog_facility) != -1) {
diff --git a/src/main.c b/src/main.c
index 2be9b2f..0319b5c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -150,6 +150,7 @@  int main(int argc, char *argv[])
 		switch(argv[i][1]) {
 		case 'd':
 			set_operation_mode(&type, DAEMON, argv);
+			CONFIG(running_mode) = DAEMON;
 			break;
 		case 'c':
 			set_operation_mode(&type, REQUEST, argv);