Configurable log facility

chris packham chris.packham at alliedtelesis.co.nz
Wed Nov 21 03:57:33 UTC 2012


(Sorry if this is a duplicate but I can't see this message in the list archives
so maybe it got lost in transit when I sent it the first time).
 
Hi,

We're using ISC dhcp server for 2 distinct purposes on the same device. 
The first is a user facing dhcp server, the second is a internal facing 
dhcp server used for card management in a bladed chassis. We wanted a way 
of identifying/filtering log messages from the internal server separately 
from the user facing server.

So here's a patch that allows you to specify a --log-facility on the 
command line. It needs cleaning up to remove some tags we use for tracking 
our changes to upstream code if there is interest I'll do so.

Thanks,
Chris

--- 8< ---
>From 699fd72596026b911ce64a86a7000fb704da12c1 Mon Sep 17 00:00:00 2001
From: Chris Packham <chris.packham at alliedtelesis.co.nz>
Date: Mon, 12 Nov 2012 12:40:57 +1300
Subject: [dhcp PATCH] server: Add --log-facility option

The --log-facility option allows the user to specify which log facility
should be used when generating log messages. If not specified the
default DHCPD_LOG_FACILITY is used.

Note that because this is set by a command line option, log messages
related to the command line options will still have the facility set to
DHCPD_LOG_FACILITY. The log facility is updated after option parsing is
done.

Reviewed-by: Mark McKinstry <mark.mckinstry at alliedtelesis.co.nz>
---
  common/Makefile.am |    2 +-
  common/Makefile.in |    5 +++--
  common/log.c       |   42 ++++++++++++++++++++++++++++++++++++++++++
  server/dhcpd.c     |   24 +++++++++++++++++++++++-
  4 files changed, 69 insertions(+), 4 deletions(-)
  create mode 100644 common/log.c

diff --git a/common/Makefile.am b/common/Makefile.am
index e4d4f9c..689b38d 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -6,7 +6,7 @@ libdhcp_a_SOURCES = alloc.c bpf.c comapi.c conflex.c ctrace.c discover.c \
  		    dispatch.c dlpi.c dns.c ethernet.c execute.c fddi.c \
  		    icmp.c inet.c lpf.c memory.c nit.c ns_name.c options.c \
  		    packet.c parse.c print.c raw.c resolv.c socket.c \
-		    tables.c tr.c tree.c upf.c
+		    tables.c tr.c tree.c upf.c log.c
  man_MANS = dhcp-eval.5 dhcp-options.5
  EXTRA_DIST = $(man_MANS)

diff --git a/common/Makefile.in b/common/Makefile.in
index 3c39008..842f8a0 100644
--- a/common/Makefile.in
+++ b/common/Makefile.in
@@ -52,7 +52,7 @@ am_libdhcp_a_OBJECTS = alloc.$(OBJEXT) bpf.$(OBJEXT) comapi.$(OBJEXT) \
  	nit.$(OBJEXT) ns_name.$(OBJEXT) options.$(OBJEXT) \
  	packet.$(OBJEXT) parse.$(OBJEXT) print.$(OBJEXT) raw.$(OBJEXT) \
  	resolv.$(OBJEXT) socket.$(OBJEXT) tables.$(OBJEXT) \
-	tr.$(OBJEXT) tree.$(OBJEXT) upf.$(OBJEXT)
+	tr.$(OBJEXT) tree.$(OBJEXT) upf.$(OBJEXT) log.$(OBJEXT)
  libdhcp_a_OBJECTS = $(am_libdhcp_a_OBJECTS)
  DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/includes
  depcomp = $(SHELL) $(top_srcdir)/depcomp
@@ -178,7 +178,7 @@ libdhcp_a_SOURCES = alloc.c bpf.c comapi.c conflex.c ctrace.c discover.c \
  		    dispatch.c dlpi.c dns.c ethernet.c execute.c fddi.c \
  		    icmp.c inet.c lpf.c memory.c nit.c ns_name.c options.c \
  		    packet.c parse.c print.c raw.c resolv.c socket.c \
-		    tables.c tr.c tree.c upf.c
+		    tables.c tr.c tree.c upf.c log.c

  man_MANS = dhcp-eval.5 dhcp-options.5
  EXTRA_DIST = $(man_MANS)
@@ -244,6 +244,7 @@ distclean-compile:
  @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fddi.Po at am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/icmp.Po at am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/inet.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/log.Po at am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/lpf.Po at am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/memory.Po at am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nit.Po at am__quote@
diff --git a/common/log.c b/common/log.c
new file mode 100644
index 0000000..28552ac
--- /dev/null
+++ b/common/log.c
@@ -0,0 +1,42 @@
+/* ATL addition - add --log-facility option */
+/*
+ * log.c
+ *
+ * There is a naming conflict between the dhctoken.h enum member "CODE"
+ * and the syslog.h typedef "CODE" (which appears when you define
+ * SYSLOG_NAMES). To avoid this conflict it is necessary to have the
+ * syslog name parsing in a file that does not include dhctoken.h.
+ *
+ * Copyright (c) 2012 Allied Telesis Labs
+ */
+#include "config.h"
+#include <stdio.h>
+#define SYSLOG_NAMES
+#include <syslog.h>
+
+static int decode_syslog_name(char *name, CODE *codetab)
+{
+	CODE *c;
+
+	if (isdigit(*name))
+		return atoi(name);
+	for (c = codetab; c->c_name; c++) {
+		if (!strcasecmp(name, c->c_name)) {
+			return c->c_val;
+		}
+	}
+
+	return -1;
+}
+
+int parse_log_facility (const char *name, int def)
+{
+	int facility;
+
+	if ((facility = decode_syslog_name(name, facilitynames)) < 0)
+		facility = def;
+
+	return facility;
+}
+/* ATL addition end. */
+
diff --git a/server/dhcpd.c b/server/dhcpd.c
index 4c32c59..37816a3 100644
--- a/server/dhcpd.c
+++ b/server/dhcpd.c
@@ -71,6 +71,10 @@ static const char url [] =
  #  undef group
  #endif /* PARANOIA */

+/* ATL addition - add --log-facility option */
+extern int parse_log_facility (const char *name, int def);
+/* ATL addition end. */
+
  static void usage(void);

  struct iaddr server_identifier;
@@ -272,7 +276,6 @@ dhcp_signal_init ()
  }
  /* ATL addition end. */

-
  #if defined (PARANOIA)
  /* to be used in one of two possible scenarios */
  static void setup_chroot (char *chroot_dir) {
@@ -331,6 +334,9 @@ main(int argc, char **argv) {
  	uid_t set_uid = 0;
  	gid_t set_gid = 0;
  #endif /* PARANOIA */
+/* ATL addition - add --log-facility option */
+	int log_facility;
+/* ATL addition end */

          /* Make sure that file descriptors 0 (stdin), 1, (stdout), and
             2 (stderr) are open. To do this, we assume that when we
@@ -471,6 +477,12 @@ main(int argc, char **argv) {
  			traceinfile = argv [i];
  			trace_replay_init ();
  #endif /* TRACING */
+/* ATL addition - add --log-facility option */
+		} else if (!strcmp (argv [i], "--log-facility")) {
+			if (++i == argc)
+				usage();
+			log_facility = parse_log_facility(argv[i], DHCPD_LOG_FACILITY);
+/* ATL addition end */
  		} else if (argv [i][0] == '-') {
  			usage ();
  		} else {
@@ -496,6 +508,13 @@ main(int argc, char **argv) {
  		}
  	}

+/* ATL addition - add --log-facility option */
+	if (log_facility != DHCPD_LOG_FACILITY) {
+		closelog();
+		openlog ("dhcpd", LOG_NDELAY|LOG_PID, log_facility);
+	}
+/* ATL addition end */
+
  	if (!no_dhcpd_conf && (s = getenv ("PATH_DHCPD_CONF"))) {
  		path_dhcpd_conf = s;
  	}
@@ -1375,6 +1394,9 @@ usage(void) {
  		  "             [-play trace-input-file]\n"
  #endif /* TRACING */
  		  "             [-pf pid-file] [--no-pid] [-s server]\n"
+/* ATL addition - add --log-facility option */
+		  "             [--log-facility facility]\n"
+/* ATL addition end */
  		  "             [if0 [...ifN]]");
  }

-- 
1.7.10.2.dirty



NOTICE: This message contains privileged and confidential
information intended only for the use of the addressee
named above. If you are not the intended recipient of
this message you are hereby notified that you must not
disseminate, copy or take any action in reliance on it.
If you have received this message in error please
notify Allied Telesis Labs Ltd immediately.
Any views expressed in this message are those of the
individual sender, except where the sender has the
authority to issue and specifically states them to
be the views of Allied Telesis Labs.


More information about the dhcp-users mailing list