[syslog-ng] [PATCH 1/3] mainloop: Add support for systemd notifications

Gergely Nagy algernon at balabit.hu
Tue Apr 9 13:03:21 CEST 2013


From: Gergely Nagy <algernon at madhouse-project.org>

When compiling with systemd support, notify systemd about our status
and readiness via sd_notify().

Also set the service type to Type=notify in the systemd unit file.

Signed-off-by: Gergely Nagy <algernon at madhouse-project.org>
---
 contrib/systemd/syslog-ng.service |    1 +
 lib/Makefile.am                   |    3 ++-
 lib/mainloop.c                    |   17 +++++++++++++++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/contrib/systemd/syslog-ng.service b/contrib/systemd/syslog-ng.service
index ee8d28b..46e61bf 100644
--- a/contrib/systemd/syslog-ng.service
+++ b/contrib/systemd/syslog-ng.service
@@ -3,6 +3,7 @@ Description=System Logger Daemon
 Documentation=man:syslog-ng(8)
 
 [Service]
+Type=notify
 Sockets=syslog.socket
 ExecStart=/usr/sbin/syslog-ng -F
 ExecReload=/bin/kill -HUP $MAINPID
diff --git a/lib/Makefile.am b/lib/Makefile.am
index f572499..a735df2 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -10,7 +10,8 @@ export top_srcdir
 include logproto/logproto.am
 
 lib_LTLIBRARIES = libsyslog-ng.la
-libsyslog_ng_la_LIBADD = @CORE_DEPS_LIBS@
+libsyslog_ng_la_CPPFLAGS = $(libsystemd_daemon_CFLAGS)
+libsyslog_ng_la_LIBADD = @CORE_DEPS_LIBS@ $(libsystemd_daemon_LIBS)
 libsyslog_ng_la_LDFLAGS = -no-undefined -release @VERSION@
 
 # this is intentionally formatted so conflicts are less likely to arise. one name in every line.
diff --git a/lib/mainloop.c b/lib/mainloop.c
index 6dd1979..68b8bf5 100644
--- a/lib/mainloop.c
+++ b/lib/mainloop.c
@@ -33,6 +33,7 @@
 #include "dnscache.h"
 #include "tls-support.h"
 #include "scratch-buffers.h"
+#include "config.h"
 
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -45,6 +46,12 @@
 #include <iv_work.h>
 #include <iv_event.h>
 
+#if ENABLE_SYSTEMD
+#include <systemd/sd-daemon.h>
+#else
+#define sd_notify(...)
+#endif
+
 /**
  * Processing model
  * ================
@@ -506,10 +513,12 @@ main_loop_reload_config_apply(void)
       main_loop_new_config->persist = NULL;
       cfg_free(main_loop_old_config);
       current_configuration = main_loop_new_config;
+      sd_notify(0, "STATUS=");
     }
   else
     {
       msg_error("Error initializing new configuration, reverting to old config", NULL);
+      sd_notify(0, "STATUS=Error initializing new configuration, using the old config");
       cfg_persist_config_move(main_loop_new_config, main_loop_old_config);
       if (!cfg_init(main_loop_old_config))
         {
@@ -548,6 +557,8 @@ main_loop_reload_config_apply(void)
 void
 main_loop_reload_config_initiate(void)
 {
+  sd_notify(0, "STATUS=Reloading configuration");
+
   if (main_loop_new_config)
     {
       /* This block is entered only if this function is reentered before
@@ -559,6 +570,7 @@ main_loop_reload_config_initiate(void)
       cfg_free(main_loop_new_config);
       main_loop_new_config = NULL;
     }
+
   main_loop_old_config = current_configuration;
   app_pre_config_loaded();
   main_loop_new_config = cfg_new(0);
@@ -570,6 +582,7 @@ main_loop_reload_config_initiate(void)
       msg_error("Error parsing configuration",
                 evt_tag_str(EVT_TAG_FILENAME, cfgfilename),
                 NULL);
+      sd_notify(0, "STATUS=Error parsing new configuration, using the old config");
       return;
     }
   main_loop_io_worker_sync_call(main_loop_reload_config_apply);
@@ -700,6 +713,7 @@ main_loop_run(void)
   msg_notice("syslog-ng starting up",
              evt_tag_str("version", VERSION),
              NULL);
+  sd_notify(0, "STATUS=starting up");
 
   IV_TIMER_INIT(&stats_timer);
   stats_timer.handler = stats_timer_elapsed;
@@ -734,7 +748,10 @@ main_loop_run(void)
   stats_timer_kickoff(current_configuration);
 
   /* main loop */
+  sd_notify(0, "STATUS=");
+  sd_notify(0, "READY=1");
   iv_main();
+  sd_notify(0, "STATUS=Shutting down");
 
   control_destroy();
 
-- 
1.7.10.4




More information about the syslog-ng mailing list