Accepting request 68825 from Base:System
update to 5.8.0 OBS-URL: https://build.opensuse.org/request/show/68825 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/rsyslog?expand=0&rev=26
This commit is contained in:
commit
a3f392757f
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:38c5f3639d316d1fd78bb933a701063be0910977c71ba775fabac0eb3f94c013
|
|
||||||
size 1848178
|
|
3
rsyslog-5.8.0.tar.bz2
Normal file
3
rsyslog-5.8.0.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:6ca538374f347eddff5f827f8f14792b0f3cda82dbbeecfe6509ea65e3a5f779
|
||||||
|
size 1904404
|
@ -1,281 +0,0 @@
|
|||||||
From 21f69b2c3a95c990ea123d078b08c554cab1d121 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Rainer Gerhards <rgerhards@adiscon.com>
|
|
||||||
Date: Fri, 8 Apr 2011 11:04:38 +0200
|
|
||||||
Subject: [PATCH] bugfix: race condition in deferred name resolution
|
|
||||||
|
|
||||||
Note that this actually is a very small change, but I needed
|
|
||||||
to shuffle a lot of code around in order to make it compile
|
|
||||||
(due to required define order...).
|
|
||||||
|
|
||||||
Signed-off-by: Marius Tomaschewski <mt@suse.de>
|
|
||||||
---
|
|
||||||
runtime/msg.c | 232 +++++++++++++++++++++++++++++----------------------------
|
|
||||||
1 files changed, 117 insertions(+), 115 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/runtime/msg.c b/runtime/msg.c
|
|
||||||
index 409515a..8a1e66a 100644
|
|
||||||
--- a/runtime/msg.c
|
|
||||||
+++ b/runtime/msg.c
|
|
||||||
@@ -287,6 +287,121 @@ static pthread_mutex_t mutTrimCtr; /* mutex to handle malloc trim */
|
|
||||||
static int getAPPNAMELen(msg_t *pM, sbool bLockMutex);
|
|
||||||
|
|
||||||
|
|
||||||
+/* The following functions will support advanced output module
|
|
||||||
+ * multithreading, once this is implemented. Currently, we
|
|
||||||
+ * include them as hooks only. The idea is that we need to guard
|
|
||||||
+ * some msg objects data fields against concurrent access if
|
|
||||||
+ * we run on multiple threads. Please note that in any case this
|
|
||||||
+ * is not necessary for calls from INPUT modules, because they
|
|
||||||
+ * construct the message object and do this serially. Only when
|
|
||||||
+ * the message is in the processing queue, multiple threads may
|
|
||||||
+ * access a single object. Consequently, there are no guard functions
|
|
||||||
+ * for "set" methods, as these are called during input. Only "get"
|
|
||||||
+ * functions that modify important structures have them.
|
|
||||||
+ * rgerhards, 2007-07-20
|
|
||||||
+ * We now support locked and non-locked operations, depending on
|
|
||||||
+ * the configuration of rsyslog. To support this, we use function
|
|
||||||
+ * pointers. Initially, we start in non-locked mode. There, all
|
|
||||||
+ * locking operations call into dummy functions. When locking is
|
|
||||||
+ * enabled, the function pointers are changed to functions doing
|
|
||||||
+ * actual work. We also introduced another MsgPrepareEnqueue() function
|
|
||||||
+ * which initializes the locking structures, if needed. This is
|
|
||||||
+ * necessary because internal messages during config file startup
|
|
||||||
+ * processing are always created in non-locking mode. So we can
|
|
||||||
+ * not initialize locking structures during constructions. We now
|
|
||||||
+ * postpone this until when the message is fully constructed and
|
|
||||||
+ * enqueued. Then we know the status of locking. This has a nice
|
|
||||||
+ * side effect, and that is that during the initial creation of
|
|
||||||
+ * the Msg object no locking needs to be done, which results in better
|
|
||||||
+ * performance. -- rgerhards, 2008-01-05
|
|
||||||
+ */
|
|
||||||
+static void (*funcLock)(msg_t *pMsg);
|
|
||||||
+static void (*funcUnlock)(msg_t *pMsg);
|
|
||||||
+static void (*funcDeleteMutex)(msg_t *pMsg);
|
|
||||||
+void (*funcMsgPrepareEnqueue)(msg_t *pMsg);
|
|
||||||
+#if 1 /* This is a debug aid */
|
|
||||||
+#define MsgLock(pMsg) funcLock(pMsg)
|
|
||||||
+#define MsgUnlock(pMsg) funcUnlock(pMsg)
|
|
||||||
+#else
|
|
||||||
+#define MsgLock(pMsg) {dbgprintf("MsgLock line %d\n - ", __LINE__); funcLock(pMsg);; }
|
|
||||||
+#define MsgUnlock(pMsg) {dbgprintf("MsgUnlock line %d - ", __LINE__); funcUnlock(pMsg); }
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+/* the next function is a dummy to be used by the looking functions
|
|
||||||
+ * when the class is not yet running in an environment where locking
|
|
||||||
+ * is necessary. Please note that the need to lock can (and will) change
|
|
||||||
+ * during a single run. Typically, this is depending on the operation mode
|
|
||||||
+ * of the message queues (which is operator-configurable). -- rgerhards, 2008-01-05
|
|
||||||
+ */
|
|
||||||
+static void MsgLockingDummy(msg_t __attribute__((unused)) *pMsg)
|
|
||||||
+{
|
|
||||||
+ /* empty be design */
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+/* The following function prepares a message for enqueue into the queue. This is
|
|
||||||
+ * where a message may be accessed by multiple threads. This implementation here
|
|
||||||
+ * is the version for multiple concurrent acces. It initializes the locking
|
|
||||||
+ * structures.
|
|
||||||
+ * TODO: change to an iRet interface! -- rgerhards, 2008-07-14
|
|
||||||
+ */
|
|
||||||
+static void MsgPrepareEnqueueLockingCase(msg_t *pThis)
|
|
||||||
+{
|
|
||||||
+ BEGINfunc
|
|
||||||
+ assert(pThis != NULL);
|
|
||||||
+ pthread_mutex_init(&pThis->mut, NULL);
|
|
||||||
+ pThis->bDoLock = 1;
|
|
||||||
+ ENDfunc
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+/* ... and now the locking and unlocking implementations: */
|
|
||||||
+static void MsgLockLockingCase(msg_t *pThis)
|
|
||||||
+{
|
|
||||||
+ /* DEV debug only! dbgprintf("MsgLock(0x%lx)\n", (unsigned long) pThis); */
|
|
||||||
+ assert(pThis != NULL);
|
|
||||||
+ if(pThis->bDoLock == 1) /* TODO: this is a testing hack, we should find a way with better performance! -- rgerhards, 2009-01-27 */
|
|
||||||
+ pthread_mutex_lock(&pThis->mut);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void MsgUnlockLockingCase(msg_t *pThis)
|
|
||||||
+{
|
|
||||||
+ /* DEV debug only! dbgprintf("MsgUnlock(0x%lx)\n", (unsigned long) pThis); */
|
|
||||||
+ assert(pThis != NULL);
|
|
||||||
+ if(pThis->bDoLock == 1) /* TODO: this is a testing hack, we should find a way with better performance! -- rgerhards, 2009-01-27 */
|
|
||||||
+ pthread_mutex_unlock(&pThis->mut);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* delete the mutex object on message destruction (locking case)
|
|
||||||
+ */
|
|
||||||
+static void MsgDeleteMutexLockingCase(msg_t *pThis)
|
|
||||||
+{
|
|
||||||
+ assert(pThis != NULL);
|
|
||||||
+ pthread_mutex_destroy(&pThis->mut);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* enable multiple concurrent access on the message object
|
|
||||||
+ * This works on a class-wide basis and can bot be undone.
|
|
||||||
+ * That is, if it is once enabled, it can not be disabled during
|
|
||||||
+ * the same run. When this function is called, no other thread
|
|
||||||
+ * must manipulate message objects. Then we would have race conditions,
|
|
||||||
+ * but guarding against this is counter-productive because it
|
|
||||||
+ * would cost additional time. Plus, it would be a programming error.
|
|
||||||
+ * rgerhards, 2008-01-05
|
|
||||||
+ */
|
|
||||||
+rsRetVal MsgEnableThreadSafety(void)
|
|
||||||
+{
|
|
||||||
+ DEFiRet;
|
|
||||||
+ funcLock = MsgLockLockingCase;
|
|
||||||
+ funcUnlock = MsgUnlockLockingCase;
|
|
||||||
+ funcMsgPrepareEnqueue = MsgPrepareEnqueueLockingCase;
|
|
||||||
+ funcDeleteMutex = MsgDeleteMutexLockingCase;
|
|
||||||
+ RETiRet;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* end locking functions */
|
|
||||||
+
|
|
||||||
+
|
|
||||||
static inline int getProtocolVersion(msg_t *pM)
|
|
||||||
{
|
|
||||||
return(pM->iProtocolVersion);
|
|
||||||
@@ -306,6 +421,7 @@ resolveDNS(msg_t *pMsg) {
|
|
||||||
uchar fromHostFQDN[NI_MAXHOST];
|
|
||||||
DEFiRet;
|
|
||||||
|
|
||||||
+ MsgLock(pMsg);
|
|
||||||
CHKiRet(objUse(net, CORE_COMPONENT));
|
|
||||||
if(pMsg->msgFlags & NEEDS_DNSRESOL) {
|
|
||||||
localRet = net.cvthname(pMsg->rcvFrom.pfrominet, fromHost, fromHostFQDN, fromHostIP);
|
|
||||||
@@ -315,6 +431,7 @@ resolveDNS(msg_t *pMsg) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finalize_it:
|
|
||||||
+ MsgUnlock(pMsg);
|
|
||||||
if(iRet != RS_RET_OK) {
|
|
||||||
/* best we can do: remove property */
|
|
||||||
MsgSetRcvFromStr(pMsg, UCHAR_CONSTANT(""), 0, &propFromHost);
|
|
||||||
@@ -531,121 +648,6 @@ uchar *propIDToName(propid_t propID)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
-/* The following functions will support advanced output module
|
|
||||||
- * multithreading, once this is implemented. Currently, we
|
|
||||||
- * include them as hooks only. The idea is that we need to guard
|
|
||||||
- * some msg objects data fields against concurrent access if
|
|
||||||
- * we run on multiple threads. Please note that in any case this
|
|
||||||
- * is not necessary for calls from INPUT modules, because they
|
|
||||||
- * construct the message object and do this serially. Only when
|
|
||||||
- * the message is in the processing queue, multiple threads may
|
|
||||||
- * access a single object. Consequently, there are no guard functions
|
|
||||||
- * for "set" methods, as these are called during input. Only "get"
|
|
||||||
- * functions that modify important structures have them.
|
|
||||||
- * rgerhards, 2007-07-20
|
|
||||||
- * We now support locked and non-locked operations, depending on
|
|
||||||
- * the configuration of rsyslog. To support this, we use function
|
|
||||||
- * pointers. Initially, we start in non-locked mode. There, all
|
|
||||||
- * locking operations call into dummy functions. When locking is
|
|
||||||
- * enabled, the function pointers are changed to functions doing
|
|
||||||
- * actual work. We also introduced another MsgPrepareEnqueue() function
|
|
||||||
- * which initializes the locking structures, if needed. This is
|
|
||||||
- * necessary because internal messages during config file startup
|
|
||||||
- * processing are always created in non-locking mode. So we can
|
|
||||||
- * not initialize locking structures during constructions. We now
|
|
||||||
- * postpone this until when the message is fully constructed and
|
|
||||||
- * enqueued. Then we know the status of locking. This has a nice
|
|
||||||
- * side effect, and that is that during the initial creation of
|
|
||||||
- * the Msg object no locking needs to be done, which results in better
|
|
||||||
- * performance. -- rgerhards, 2008-01-05
|
|
||||||
- */
|
|
||||||
-static void (*funcLock)(msg_t *pMsg);
|
|
||||||
-static void (*funcUnlock)(msg_t *pMsg);
|
|
||||||
-static void (*funcDeleteMutex)(msg_t *pMsg);
|
|
||||||
-void (*funcMsgPrepareEnqueue)(msg_t *pMsg);
|
|
||||||
-#if 1 /* This is a debug aid */
|
|
||||||
-#define MsgLock(pMsg) funcLock(pMsg)
|
|
||||||
-#define MsgUnlock(pMsg) funcUnlock(pMsg)
|
|
||||||
-#else
|
|
||||||
-#define MsgLock(pMsg) {dbgprintf("MsgLock line %d\n - ", __LINE__); funcLock(pMsg);; }
|
|
||||||
-#define MsgUnlock(pMsg) {dbgprintf("MsgUnlock line %d - ", __LINE__); funcUnlock(pMsg); }
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
-/* the next function is a dummy to be used by the looking functions
|
|
||||||
- * when the class is not yet running in an environment where locking
|
|
||||||
- * is necessary. Please note that the need to lock can (and will) change
|
|
||||||
- * during a single run. Typically, this is depending on the operation mode
|
|
||||||
- * of the message queues (which is operator-configurable). -- rgerhards, 2008-01-05
|
|
||||||
- */
|
|
||||||
-static void MsgLockingDummy(msg_t __attribute__((unused)) *pMsg)
|
|
||||||
-{
|
|
||||||
- /* empty be design */
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-/* The following function prepares a message for enqueue into the queue. This is
|
|
||||||
- * where a message may be accessed by multiple threads. This implementation here
|
|
||||||
- * is the version for multiple concurrent acces. It initializes the locking
|
|
||||||
- * structures.
|
|
||||||
- * TODO: change to an iRet interface! -- rgerhards, 2008-07-14
|
|
||||||
- */
|
|
||||||
-static void MsgPrepareEnqueueLockingCase(msg_t *pThis)
|
|
||||||
-{
|
|
||||||
- BEGINfunc
|
|
||||||
- assert(pThis != NULL);
|
|
||||||
- pthread_mutex_init(&pThis->mut, NULL);
|
|
||||||
- pThis->bDoLock = 1;
|
|
||||||
- ENDfunc
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-/* ... and now the locking and unlocking implementations: */
|
|
||||||
-static void MsgLockLockingCase(msg_t *pThis)
|
|
||||||
-{
|
|
||||||
- /* DEV debug only! dbgprintf("MsgLock(0x%lx)\n", (unsigned long) pThis); */
|
|
||||||
- assert(pThis != NULL);
|
|
||||||
- if(pThis->bDoLock == 1) /* TODO: this is a testing hack, we should find a way with better performance! -- rgerhards, 2009-01-27 */
|
|
||||||
- pthread_mutex_lock(&pThis->mut);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-static void MsgUnlockLockingCase(msg_t *pThis)
|
|
||||||
-{
|
|
||||||
- /* DEV debug only! dbgprintf("MsgUnlock(0x%lx)\n", (unsigned long) pThis); */
|
|
||||||
- assert(pThis != NULL);
|
|
||||||
- if(pThis->bDoLock == 1) /* TODO: this is a testing hack, we should find a way with better performance! -- rgerhards, 2009-01-27 */
|
|
||||||
- pthread_mutex_unlock(&pThis->mut);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-/* delete the mutex object on message destruction (locking case)
|
|
||||||
- */
|
|
||||||
-static void MsgDeleteMutexLockingCase(msg_t *pThis)
|
|
||||||
-{
|
|
||||||
- assert(pThis != NULL);
|
|
||||||
- pthread_mutex_destroy(&pThis->mut);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-/* enable multiple concurrent access on the message object
|
|
||||||
- * This works on a class-wide basis and can bot be undone.
|
|
||||||
- * That is, if it is once enabled, it can not be disabled during
|
|
||||||
- * the same run. When this function is called, no other thread
|
|
||||||
- * must manipulate message objects. Then we would have race conditions,
|
|
||||||
- * but guarding against this is counter-productive because it
|
|
||||||
- * would cost additional time. Plus, it would be a programming error.
|
|
||||||
- * rgerhards, 2008-01-05
|
|
||||||
- */
|
|
||||||
-rsRetVal MsgEnableThreadSafety(void)
|
|
||||||
-{
|
|
||||||
- DEFiRet;
|
|
||||||
- funcLock = MsgLockLockingCase;
|
|
||||||
- funcUnlock = MsgUnlockLockingCase;
|
|
||||||
- funcMsgPrepareEnqueue = MsgPrepareEnqueueLockingCase;
|
|
||||||
- funcDeleteMutex = MsgDeleteMutexLockingCase;
|
|
||||||
- RETiRet;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-/* end locking functions */
|
|
||||||
-
|
|
||||||
-
|
|
||||||
/* This is common code for all Constructors. It is defined in an
|
|
||||||
* inline'able function so that we can save a function call in the
|
|
||||||
* actual constructors (otherwise, the msgConstruct would need
|
|
||||||
--
|
|
||||||
1.7.3.4
|
|
||||||
|
|
@ -1,929 +0,0 @@
|
|||||||
commit 020e414396b9ed4d005b6b0f6fb6567fe954230c
|
|
||||||
Author: Marius Tomaschewski <mt@suse.de>
|
|
||||||
Date: Thu Jan 20 15:08:08 2011 +0100
|
|
||||||
|
|
||||||
Improved systemd socket activation support
|
|
||||||
|
|
||||||
Support for multiple unix sockets and activation in forking mode
|
|
||||||
|
|
||||||
commit f9a409137bdcd04ebf4851a23f573c436a14e5b2
|
|
||||||
Author: Rainer Gerhards <rgerhards@adiscon.com>
|
|
||||||
Date: Wed Sep 8 12:46:03 2010 +0200
|
|
||||||
|
|
||||||
moved systemd interface to rsyslog convenience lib
|
|
||||||
|
|
||||||
Mostly a refresh of sd-daemon.[ch] from its source plus some make file changes.
|
|
||||||
We now have systemd interfaces inside rsyslog, so that all plugins interested can
|
|
||||||
call the interfaces. Seems not to be totally necessary right now, but will help
|
|
||||||
in the long term.
|
|
||||||
|
|
||||||
commit be3d81ee54088180a657ac37899d1def8ef4b36c
|
|
||||||
Author: Rainer Gerhards <rgerhards@adiscon.com>
|
|
||||||
Date: Tue Sep 7 14:19:05 2010 +0200
|
|
||||||
|
|
||||||
added forgotten files
|
|
||||||
|
|
||||||
commit 8b7ca000dec71f6dcb73a8ab738093c17bd293c1
|
|
||||||
Author: Lennart Poettering <mailto:lennart@poettering.net>
|
|
||||||
Date: Tue Sep 7 13:06:04 2010 +0200
|
|
||||||
|
|
||||||
acquire /dev/log socket optionally from systemd
|
|
||||||
|
|
||||||
[skipped whitespace-only changes -- mt@suse.de]
|
|
||||||
diff --git a/ChangeLog b/ChangeLog
|
|
||||||
index 89d5711..1e2aaa7 100644
|
|
||||||
--- a/ChangeLog
|
|
||||||
+++ b/ChangeLog
|
|
||||||
@@ -1,3 +1,5 @@
|
|
||||||
+- acquire /dev/log socket optionally from systemd
|
|
||||||
+ thanks to Lennart Poettering for this patch
|
|
||||||
---------------------------------------------------------------------------
|
|
||||||
Version 5.6.5 [V5-STABLE] (rgerhards), 2011-03-22
|
|
||||||
- bugfix: failover did not work correctly if repeated msg reduction was on
|
|
||||||
diff --git a/plugins/imuxsock/Makefile.am b/plugins/imuxsock/Makefile.am
|
|
||||||
index a2fe0ba..28f9f9e 100644
|
|
||||||
--- a/plugins/imuxsock/Makefile.am
|
|
||||||
+++ b/plugins/imuxsock/Makefile.am
|
|
||||||
@@ -1,6 +1,6 @@
|
|
||||||
pkglib_LTLIBRARIES = imuxsock.la
|
|
||||||
|
|
||||||
imuxsock_la_SOURCES = imuxsock.c
|
|
||||||
-imuxsock_la_CPPFLAGS = -I$(top_srcdir) $(PTHREADS_CFLAGS) $(RSRT_CFLAGS)
|
|
||||||
+imuxsock_la_CPPFLAGS = -DSD_EXPORT_SYMBOLS -I$(top_srcdir) $(PTHREADS_CFLAGS) $(RSRT_CFLAGS)
|
|
||||||
imuxsock_la_LDFLAGS = -module -avoid-version
|
|
||||||
-imuxsock_la_LIBADD =
|
|
||||||
+imuxsock_la_LIBADD = $(RSRT_LIBS)
|
|
||||||
diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c
|
|
||||||
index 046f12f..fc6b1e7 100644
|
|
||||||
--- a/plugins/imuxsock/imuxsock.c
|
|
||||||
+++ b/plugins/imuxsock/imuxsock.c
|
|
||||||
@@ -47,6 +47,7 @@
|
|
||||||
#include "prop.h"
|
|
||||||
#include "debug.h"
|
|
||||||
#include "unlimited_select.h"
|
|
||||||
+#include "sd-daemon.h"
|
|
||||||
|
|
||||||
MODULE_TYPE_INPUT
|
|
||||||
|
|
||||||
@@ -86,6 +87,7 @@ static prop_t *funixHName[MAXFUNIX] = { NULL, }; /* host-name override - if set,
|
|
||||||
static int funixFlowCtl[MAXFUNIX] = { eFLOWCTL_NO_DELAY, }; /* flow control settings for this socket */
|
|
||||||
static int funix[MAXFUNIX] = { -1, }; /* read-only after startup */
|
|
||||||
static int nfunix = 1; /* number of Unix sockets open / read-only after startup */
|
|
||||||
+static int sd_fds = 0; /* number of systemd activated sockers */
|
|
||||||
|
|
||||||
/* config settings */
|
|
||||||
static int bOmitLocalLogging = 0;
|
|
||||||
@@ -190,6 +192,20 @@ static int create_unix_socket(const char *path, int bCreatePath)
|
|
||||||
if (path[0] == '\0')
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
+ if (sd_fds > 0) {
|
|
||||||
+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + sd_fds; fd++) {
|
|
||||||
+ if( sd_is_socket_unix(fd, SOCK_DGRAM, -1, path, 0) == 1) {
|
|
||||||
+ /* ok, it matches -- just use as is */
|
|
||||||
+ return fd;
|
|
||||||
+ }
|
|
||||||
+ /*
|
|
||||||
+ * otherwise it either didn't matched *this* socket and
|
|
||||||
+ * we just continue to check the next one or there were
|
|
||||||
+ * an error and we will recreate it bellow.
|
|
||||||
+ */
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
unlink(path);
|
|
||||||
|
|
||||||
memset(&sunx, 0, sizeof(sunx));
|
|
||||||
@@ -371,6 +387,11 @@ CODESTARTwillRun
|
|
||||||
if(pLogSockName != NULL)
|
|
||||||
funixn[0] = pLogSockName;
|
|
||||||
|
|
||||||
+ sd_fds = sd_listen_fds(0);
|
|
||||||
+ if (sd_fds < 0) {
|
|
||||||
+ errmsg.LogError(-sd_fds, NO_ERRCODE, "Failed to acquire systemd sockets");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
/* initialize and return if will run or not */
|
|
||||||
for (i = startIndexUxLocalSockets ; i < nfunix ; i++) {
|
|
||||||
if ((funix[i] = create_unix_socket((char*) funixn[i], funixCreateSockPath[i])) != -1)
|
|
||||||
@@ -395,10 +416,19 @@ CODESTARTafterRun
|
|
||||||
if (funix[i] != -1)
|
|
||||||
close(funix[i]);
|
|
||||||
|
|
||||||
- /* Clean-up files. */
|
|
||||||
- for(i = startIndexUxLocalSockets; i < nfunix; i++)
|
|
||||||
- if (funixn[i] && funix[i] != -1)
|
|
||||||
+ /* Clean-up files. If systemd passed us a socket it is
|
|
||||||
+ * systemd's job to clean it up.*/
|
|
||||||
+ for(i = startIndexUxLocalSockets; i < nfunix; i++) {
|
|
||||||
+ if (funixn[i] && funix[i] != -1) {
|
|
||||||
+ if (sd_fds > 0 &&
|
|
||||||
+ funix[i] >= SD_LISTEN_FDS_START &&
|
|
||||||
+ funix[i] < SD_LISTEN_FDS_START + sd_fds)
|
|
||||||
+ continue;
|
|
||||||
+
|
|
||||||
unlink((char*) funixn[i]);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
/* free no longer needed string */
|
|
||||||
free(pLogSockName);
|
|
||||||
free(pLogHostName);
|
|
||||||
diff --git a/runtime/Makefile.am b/runtime/Makefile.am
|
|
||||||
index b700eae..27c56a2 100644
|
|
||||||
--- a/runtime/Makefile.am
|
|
||||||
+++ b/runtime/Makefile.am
|
|
||||||
@@ -82,6 +82,8 @@ librsyslog_la_SOURCES = \
|
|
||||||
prop.h \
|
|
||||||
cfsysline.c \
|
|
||||||
cfsysline.h \
|
|
||||||
+ sd-daemon.c \
|
|
||||||
+ sd-daemon.h \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
../action.h \
|
|
||||||
@@ -100,9 +102,9 @@ librsyslog_la_SOURCES = \
|
|
||||||
# runtime or will no longer be needed. -- rgerhards, 2008-06-13
|
|
||||||
|
|
||||||
if WITH_MODDIRS
|
|
||||||
-librsyslog_la_CPPFLAGS = -D_PATH_MODDIR=\"$(pkglibdir)/:$(moddirs)\" $(PTHREADS_CFLAGS)
|
|
||||||
+librsyslog_la_CPPFLAGS = -DSD_EXPORT_SYMBOLS -D_PATH_MODDIR=\"$(pkglibdir)/:$(moddirs)\" $(PTHREADS_CFLAGS)
|
|
||||||
else
|
|
||||||
-librsyslog_la_CPPFLAGS = -D_PATH_MODDIR=\"$(pkglibdir)/\" -I$(top_srcdir) $(PTHREADS_CFLAGS)
|
|
||||||
+librsyslog_la_CPPFLAGS = -DSD_EXPORT_SYMBOLS -D_PATH_MODDIR=\"$(pkglibdir)/\" -I$(top_srcdir) $(PTHREADS_CFLAGS)
|
|
||||||
endif
|
|
||||||
#librsyslog_la_LDFLAGS = -module -avoid-version
|
|
||||||
librsyslog_la_LIBADD = $(DL_LIBS) $(RT_LIBS)
|
|
||||||
@@ -178,3 +180,6 @@ lmnsd_gtls_la_LDFLAGS = -module -avoid-version
|
|
||||||
lmnsd_gtls_la_LIBADD = $(GNUTLS_LIBS)
|
|
||||||
endif
|
|
||||||
|
|
||||||
+update-systemd:
|
|
||||||
+ curl http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.c > sd-daemon.c
|
|
||||||
+ curl http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.h > sd-daemon.h
|
|
||||||
diff --git a/runtime/sd-daemon.c b/runtime/sd-daemon.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..9c23b91
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/runtime/sd-daemon.c
|
|
||||||
@@ -0,0 +1,435 @@
|
|
||||||
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
|
||||||
+
|
|
||||||
+/***
|
|
||||||
+ Copyright 2010 Lennart Poettering
|
|
||||||
+
|
|
||||||
+ Permission is hereby granted, free of charge, to any person
|
|
||||||
+ obtaining a copy of this software and associated documentation files
|
|
||||||
+ (the "Software"), to deal in the Software without restriction,
|
|
||||||
+ including without limitation the rights to use, copy, modify, merge,
|
|
||||||
+ publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
+ and to permit persons to whom the Software is furnished to do so,
|
|
||||||
+ subject to the following conditions:
|
|
||||||
+
|
|
||||||
+ The above copyright notice and this permission notice shall be
|
|
||||||
+ included in all copies or substantial portions of the Software.
|
|
||||||
+
|
|
||||||
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
||||||
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
||||||
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
+ SOFTWARE.
|
|
||||||
+***/
|
|
||||||
+
|
|
||||||
+#ifndef _GNU_SOURCE
|
|
||||||
+#define _GNU_SOURCE
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+#include <sys/types.h>
|
|
||||||
+#include <sys/stat.h>
|
|
||||||
+#include <sys/socket.h>
|
|
||||||
+#include <sys/un.h>
|
|
||||||
+#include <sys/fcntl.h>
|
|
||||||
+#include <netinet/in.h>
|
|
||||||
+#include <stdlib.h>
|
|
||||||
+#include <errno.h>
|
|
||||||
+#include <unistd.h>
|
|
||||||
+#include <string.h>
|
|
||||||
+#include <stdarg.h>
|
|
||||||
+#include <stdio.h>
|
|
||||||
+
|
|
||||||
+#include "sd-daemon.h"
|
|
||||||
+
|
|
||||||
+int sd_listen_fds(int unset_environment) {
|
|
||||||
+
|
|
||||||
+#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
|
|
||||||
+ return 0;
|
|
||||||
+#else
|
|
||||||
+ int r, fd;
|
|
||||||
+ const char *e;
|
|
||||||
+ char *p = NULL;
|
|
||||||
+ unsigned long l;
|
|
||||||
+
|
|
||||||
+ if (!(e = getenv("LISTEN_PID"))) {
|
|
||||||
+ r = 0;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ errno = 0;
|
|
||||||
+ l = strtoul(e, &p, 10);
|
|
||||||
+
|
|
||||||
+ if (errno != 0) {
|
|
||||||
+ r = -errno;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!p || *p || l <= 0) {
|
|
||||||
+ r = -EINVAL;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Is this for us? */
|
|
||||||
+ if (getpid() != (pid_t) l) {
|
|
||||||
+ r = 0;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!(e = getenv("LISTEN_FDS"))) {
|
|
||||||
+ r = 0;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ errno = 0;
|
|
||||||
+ l = strtoul(e, &p, 10);
|
|
||||||
+
|
|
||||||
+ if (errno != 0) {
|
|
||||||
+ r = -errno;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!p || *p) {
|
|
||||||
+ r = -EINVAL;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int) l; fd ++) {
|
|
||||||
+ int flags;
|
|
||||||
+
|
|
||||||
+ if ((flags = fcntl(fd, F_GETFD)) < 0) {
|
|
||||||
+ r = -errno;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (flags & FD_CLOEXEC)
|
|
||||||
+ continue;
|
|
||||||
+
|
|
||||||
+ if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) {
|
|
||||||
+ r = -errno;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ r = (int) l;
|
|
||||||
+
|
|
||||||
+finish:
|
|
||||||
+ if (unset_environment) {
|
|
||||||
+ unsetenv("LISTEN_PID");
|
|
||||||
+ unsetenv("LISTEN_FDS");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return r;
|
|
||||||
+#endif
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int sd_is_fifo(int fd, const char *path) {
|
|
||||||
+ struct stat st_fd;
|
|
||||||
+
|
|
||||||
+ if (fd < 0)
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ memset(&st_fd, 0, sizeof(st_fd));
|
|
||||||
+ if (fstat(fd, &st_fd) < 0)
|
|
||||||
+ return -errno;
|
|
||||||
+
|
|
||||||
+ if (!S_ISFIFO(st_fd.st_mode))
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ if (path) {
|
|
||||||
+ struct stat st_path;
|
|
||||||
+
|
|
||||||
+ memset(&st_path, 0, sizeof(st_path));
|
|
||||||
+ if (stat(path, &st_path) < 0) {
|
|
||||||
+
|
|
||||||
+ if (errno == ENOENT || errno == ENOTDIR)
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ return -errno;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return
|
|
||||||
+ st_path.st_dev == st_fd.st_dev &&
|
|
||||||
+ st_path.st_ino == st_fd.st_ino;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int sd_is_socket_internal(int fd, int type, int listening) {
|
|
||||||
+ struct stat st_fd;
|
|
||||||
+
|
|
||||||
+ if (fd < 0 || type < 0)
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ if (fstat(fd, &st_fd) < 0)
|
|
||||||
+ return -errno;
|
|
||||||
+
|
|
||||||
+ if (!S_ISSOCK(st_fd.st_mode))
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ if (type != 0) {
|
|
||||||
+ int other_type = 0;
|
|
||||||
+ socklen_t l = sizeof(other_type);
|
|
||||||
+
|
|
||||||
+ if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &other_type, &l) < 0)
|
|
||||||
+ return -errno;
|
|
||||||
+
|
|
||||||
+ if (l != sizeof(other_type))
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ if (other_type != type)
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (listening >= 0) {
|
|
||||||
+ int accepting = 0;
|
|
||||||
+ socklen_t l = sizeof(accepting);
|
|
||||||
+
|
|
||||||
+ if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &accepting, &l) < 0)
|
|
||||||
+ return -errno;
|
|
||||||
+
|
|
||||||
+ if (l != sizeof(accepting))
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ if (!accepting != !listening)
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+union sockaddr_union {
|
|
||||||
+ struct sockaddr sa;
|
|
||||||
+ struct sockaddr_in in4;
|
|
||||||
+ struct sockaddr_in6 in6;
|
|
||||||
+ struct sockaddr_un un;
|
|
||||||
+ struct sockaddr_storage storage;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+int sd_is_socket(int fd, int family, int type, int listening) {
|
|
||||||
+ int r;
|
|
||||||
+
|
|
||||||
+ if (family < 0)
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
|
|
||||||
+ return r;
|
|
||||||
+
|
|
||||||
+ if (family > 0) {
|
|
||||||
+ union sockaddr_union sockaddr;
|
|
||||||
+ socklen_t l;
|
|
||||||
+
|
|
||||||
+ memset(&sockaddr, 0, sizeof(sockaddr));
|
|
||||||
+ l = sizeof(sockaddr);
|
|
||||||
+
|
|
||||||
+ if (getsockname(fd, &sockaddr.sa, &l) < 0)
|
|
||||||
+ return -errno;
|
|
||||||
+
|
|
||||||
+ if (l < sizeof(sa_family_t))
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ return sockaddr.sa.sa_family == family;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) {
|
|
||||||
+ union sockaddr_union sockaddr;
|
|
||||||
+ socklen_t l;
|
|
||||||
+ int r;
|
|
||||||
+
|
|
||||||
+ if (family != 0 && family != AF_INET && family != AF_INET6)
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
|
|
||||||
+ return r;
|
|
||||||
+
|
|
||||||
+ memset(&sockaddr, 0, sizeof(sockaddr));
|
|
||||||
+ l = sizeof(sockaddr);
|
|
||||||
+
|
|
||||||
+ if (getsockname(fd, &sockaddr.sa, &l) < 0)
|
|
||||||
+ return -errno;
|
|
||||||
+
|
|
||||||
+ if (l < sizeof(sa_family_t))
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ if (sockaddr.sa.sa_family != AF_INET &&
|
|
||||||
+ sockaddr.sa.sa_family != AF_INET6)
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ if (family > 0)
|
|
||||||
+ if (sockaddr.sa.sa_family != family)
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ if (port > 0) {
|
|
||||||
+ if (sockaddr.sa.sa_family == AF_INET) {
|
|
||||||
+ if (l < sizeof(struct sockaddr_in))
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ return htons(port) == sockaddr.in4.sin_port;
|
|
||||||
+ } else {
|
|
||||||
+ if (l < sizeof(struct sockaddr_in6))
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ return htons(port) == sockaddr.in6.sin6_port;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) {
|
|
||||||
+ union sockaddr_union sockaddr;
|
|
||||||
+ socklen_t l;
|
|
||||||
+ int r;
|
|
||||||
+
|
|
||||||
+ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
|
|
||||||
+ return r;
|
|
||||||
+
|
|
||||||
+ memset(&sockaddr, 0, sizeof(sockaddr));
|
|
||||||
+ l = sizeof(sockaddr);
|
|
||||||
+
|
|
||||||
+ if (getsockname(fd, &sockaddr.sa, &l) < 0)
|
|
||||||
+ return -errno;
|
|
||||||
+
|
|
||||||
+ if (l < sizeof(sa_family_t))
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ if (sockaddr.sa.sa_family != AF_UNIX)
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ if (path) {
|
|
||||||
+ if (length <= 0)
|
|
||||||
+ length = strlen(path);
|
|
||||||
+
|
|
||||||
+ if (length <= 0)
|
|
||||||
+ /* Unnamed socket */
|
|
||||||
+ return l == sizeof(sa_family_t);
|
|
||||||
+
|
|
||||||
+ if (path[0])
|
|
||||||
+ /* Normal path socket */
|
|
||||||
+ return
|
|
||||||
+ (l >= sizeof(sa_family_t) + length + 1) &&
|
|
||||||
+ memcmp(path, sockaddr.un.sun_path, length+1) == 0;
|
|
||||||
+ else
|
|
||||||
+ /* Abstract namespace socket */
|
|
||||||
+ return
|
|
||||||
+ (l == sizeof(sa_family_t) + length) &&
|
|
||||||
+ memcmp(path, sockaddr.un.sun_path, length) == 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int sd_notify(int unset_environment, const char *state) {
|
|
||||||
+#if defined(DISABLE_SYSTEMD) || !defined(__linux__) || !defined(SOCK_CLOEXEC)
|
|
||||||
+ return 0;
|
|
||||||
+#else
|
|
||||||
+ int fd = -1, r;
|
|
||||||
+ struct msghdr msghdr;
|
|
||||||
+ struct iovec iovec;
|
|
||||||
+ union sockaddr_union sockaddr;
|
|
||||||
+ const char *e;
|
|
||||||
+
|
|
||||||
+ if (!state) {
|
|
||||||
+ r = -EINVAL;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!(e = getenv("NOTIFY_SOCKET")))
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ /* Must be an abstract socket, or an absolute path */
|
|
||||||
+ if ((e[0] != '@' && e[0] != '/') || e[1] == 0) {
|
|
||||||
+ r = -EINVAL;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) {
|
|
||||||
+ r = -errno;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ memset(&sockaddr, 0, sizeof(sockaddr));
|
|
||||||
+ sockaddr.sa.sa_family = AF_UNIX;
|
|
||||||
+ strncpy(sockaddr.un.sun_path, e, sizeof(sockaddr.un.sun_path));
|
|
||||||
+
|
|
||||||
+ if (sockaddr.un.sun_path[0] == '@')
|
|
||||||
+ sockaddr.un.sun_path[0] = 0;
|
|
||||||
+
|
|
||||||
+ memset(&iovec, 0, sizeof(iovec));
|
|
||||||
+ iovec.iov_base = (char*) state;
|
|
||||||
+ iovec.iov_len = strlen(state);
|
|
||||||
+
|
|
||||||
+ memset(&msghdr, 0, sizeof(msghdr));
|
|
||||||
+ msghdr.msg_name = &sockaddr;
|
|
||||||
+ msghdr.msg_namelen = sizeof(sa_family_t) + strlen(e);
|
|
||||||
+
|
|
||||||
+ if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
|
|
||||||
+ msghdr.msg_namelen = sizeof(struct sockaddr_un);
|
|
||||||
+
|
|
||||||
+ msghdr.msg_iov = &iovec;
|
|
||||||
+ msghdr.msg_iovlen = 1;
|
|
||||||
+
|
|
||||||
+ if (sendmsg(fd, &msghdr, MSG_NOSIGNAL) < 0) {
|
|
||||||
+ r = -errno;
|
|
||||||
+ goto finish;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ r = 1;
|
|
||||||
+
|
|
||||||
+finish:
|
|
||||||
+ if (unset_environment)
|
|
||||||
+ unsetenv("NOTIFY_SOCKET");
|
|
||||||
+
|
|
||||||
+ if (fd >= 0)
|
|
||||||
+ close(fd);
|
|
||||||
+
|
|
||||||
+ return r;
|
|
||||||
+#endif
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int sd_notifyf(int unset_environment, const char *format, ...) {
|
|
||||||
+#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
|
|
||||||
+ return 0;
|
|
||||||
+#else
|
|
||||||
+ va_list ap;
|
|
||||||
+ char *p = NULL;
|
|
||||||
+ int r;
|
|
||||||
+
|
|
||||||
+ va_start(ap, format);
|
|
||||||
+ r = vasprintf(&p, format, ap);
|
|
||||||
+ va_end(ap);
|
|
||||||
+
|
|
||||||
+ if (r < 0 || !p)
|
|
||||||
+ return -ENOMEM;
|
|
||||||
+
|
|
||||||
+ r = sd_notify(unset_environment, p);
|
|
||||||
+ free(p);
|
|
||||||
+
|
|
||||||
+ return r;
|
|
||||||
+#endif
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int sd_booted(void) {
|
|
||||||
+#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
|
|
||||||
+ return 0;
|
|
||||||
+#else
|
|
||||||
+
|
|
||||||
+ struct stat a, b;
|
|
||||||
+
|
|
||||||
+ /* We simply test whether the systemd cgroup hierarchy is
|
|
||||||
+ * mounted */
|
|
||||||
+
|
|
||||||
+ if (lstat("/sys/fs/cgroup", &a) < 0)
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ if (lstat("/sys/fs/cgroup/systemd", &b) < 0)
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ return a.st_dev != b.st_dev;
|
|
||||||
+#endif
|
|
||||||
+}
|
|
||||||
diff --git a/runtime/sd-daemon.h b/runtime/sd-daemon.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..45aac8b
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/runtime/sd-daemon.h
|
|
||||||
@@ -0,0 +1,261 @@
|
|
||||||
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
|
||||||
+
|
|
||||||
+#ifndef foosddaemonhfoo
|
|
||||||
+#define foosddaemonhfoo
|
|
||||||
+
|
|
||||||
+/***
|
|
||||||
+ Copyright 2010 Lennart Poettering
|
|
||||||
+
|
|
||||||
+ Permission is hereby granted, free of charge, to any person
|
|
||||||
+ obtaining a copy of this software and associated documentation files
|
|
||||||
+ (the "Software"), to deal in the Software without restriction,
|
|
||||||
+ including without limitation the rights to use, copy, modify, merge,
|
|
||||||
+ publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
+ and to permit persons to whom the Software is furnished to do so,
|
|
||||||
+ subject to the following conditions:
|
|
||||||
+
|
|
||||||
+ The above copyright notice and this permission notice shall be
|
|
||||||
+ included in all copies or substantial portions of the Software.
|
|
||||||
+
|
|
||||||
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
||||||
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
||||||
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
+ SOFTWARE.
|
|
||||||
+***/
|
|
||||||
+
|
|
||||||
+#include <sys/types.h>
|
|
||||||
+#include <inttypes.h>
|
|
||||||
+
|
|
||||||
+#ifdef __cplusplus
|
|
||||||
+extern "C" {
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ Reference implementation of a few systemd related interfaces for
|
|
||||||
+ writing daemons. These interfaces are trivial to implement. To
|
|
||||||
+ simplify porting we provide this reference implementation.
|
|
||||||
+ Applications are welcome to reimplement the algorithms described
|
|
||||||
+ here if they do not want to include these two source files.
|
|
||||||
+
|
|
||||||
+ The following functionality is provided:
|
|
||||||
+
|
|
||||||
+ - Support for logging with log levels on stderr
|
|
||||||
+ - File descriptor passing for socket-based activation
|
|
||||||
+ - Daemon startup and status notification
|
|
||||||
+ - Detection of systemd boots
|
|
||||||
+
|
|
||||||
+ You may compile this with -DDISABLE_SYSTEMD to disable systemd
|
|
||||||
+ support. This makes all those calls NOPs that are directly related to
|
|
||||||
+ systemd (i.e. only sd_is_xxx() will stay useful).
|
|
||||||
+
|
|
||||||
+ Since this is drop-in code we don't want any of our symbols to be
|
|
||||||
+ exported in any case. Hence we declare hidden visibility for all of
|
|
||||||
+ them.
|
|
||||||
+
|
|
||||||
+ You may find an up-to-date version of these source files online:
|
|
||||||
+
|
|
||||||
+ http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.h
|
|
||||||
+ http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.c
|
|
||||||
+
|
|
||||||
+ This should compile on non-Linux systems, too, but with the
|
|
||||||
+ exception of the sd_is_xxx() calls all functions will become NOPs.
|
|
||||||
+
|
|
||||||
+ See sd-daemon(7) for more information.
|
|
||||||
+*/
|
|
||||||
+
|
|
||||||
+#if (__GNUC__ >= 4)
|
|
||||||
+#define _sd_printf_attr_(a,b) __attribute__ ((format (printf, a, b)))
|
|
||||||
+# if defined(SD_EXPORT_SYMBOLS)
|
|
||||||
+# define _sd_hidden_
|
|
||||||
+# else
|
|
||||||
+# define _sd_hidden_ __attribute__ ((visibility("hidden")))
|
|
||||||
+# endif
|
|
||||||
+#else
|
|
||||||
+#define _sd_printf_attr_(a,b)
|
|
||||||
+#define _sd_hidden_
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ Log levels for usage on stderr:
|
|
||||||
+
|
|
||||||
+ fprintf(stderr, SD_NOTICE "Hello World!\n");
|
|
||||||
+
|
|
||||||
+ This is similar to printk() usage in the kernel.
|
|
||||||
+*/
|
|
||||||
+#define SD_EMERG "<0>" /* system is unusable */
|
|
||||||
+#define SD_ALERT "<1>" /* action must be taken immediately */
|
|
||||||
+#define SD_CRIT "<2>" /* critical conditions */
|
|
||||||
+#define SD_ERR "<3>" /* error conditions */
|
|
||||||
+#define SD_WARNING "<4>" /* warning conditions */
|
|
||||||
+#define SD_NOTICE "<5>" /* normal but significant condition */
|
|
||||||
+#define SD_INFO "<6>" /* informational */
|
|
||||||
+#define SD_DEBUG "<7>" /* debug-level messages */
|
|
||||||
+
|
|
||||||
+/* The first passed file descriptor is fd 3 */
|
|
||||||
+#define SD_LISTEN_FDS_START 3
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ Returns how many file descriptors have been passed, or a negative
|
|
||||||
+ errno code on failure. Optionally, removes the $LISTEN_FDS and
|
|
||||||
+ $LISTEN_PID file descriptors from the environment (recommended, but
|
|
||||||
+ problematic in threaded environments). If r is the return value of
|
|
||||||
+ this function you'll find the file descriptors passed as fds
|
|
||||||
+ SD_LISTEN_FDS_START to SD_LISTEN_FDS_START+r-1. Returns a negative
|
|
||||||
+ errno style error code on failure. This function call ensures that
|
|
||||||
+ the FD_CLOEXEC flag is set for the passed file descriptors, to make
|
|
||||||
+ sure they are not passed on to child processes. If FD_CLOEXEC shall
|
|
||||||
+ not be set, the caller needs to unset it after this call for all file
|
|
||||||
+ descriptors that are used.
|
|
||||||
+
|
|
||||||
+ See sd_listen_fds(3) for more information.
|
|
||||||
+*/
|
|
||||||
+int sd_listen_fds(int unset_environment) _sd_hidden_;
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ Helper call for identifying a passed file descriptor. Returns 1 if
|
|
||||||
+ the file descriptor is a FIFO in the file system stored under the
|
|
||||||
+ specified path, 0 otherwise. If path is NULL a path name check will
|
|
||||||
+ not be done and the call only verifies if the file descriptor
|
|
||||||
+ refers to a FIFO. Returns a negative errno style error code on
|
|
||||||
+ failure.
|
|
||||||
+
|
|
||||||
+ See sd_is_fifo(3) for more information.
|
|
||||||
+*/
|
|
||||||
+int sd_is_fifo(int fd, const char *path) _sd_hidden_;
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ Helper call for identifying a passed file descriptor. Returns 1 if
|
|
||||||
+ the file descriptor is a socket of the specified family (AF_INET,
|
|
||||||
+ ...) and type (SOCK_DGRAM, SOCK_STREAM, ...), 0 otherwise. If
|
|
||||||
+ family is 0 a socket family check will not be done. If type is 0 a
|
|
||||||
+ socket type check will not be done and the call only verifies if
|
|
||||||
+ the file descriptor refers to a socket. If listening is > 0 it is
|
|
||||||
+ verified that the socket is in listening mode. (i.e. listen() has
|
|
||||||
+ been called) If listening is == 0 it is verified that the socket is
|
|
||||||
+ not in listening mode. If listening is < 0 no listening mode check
|
|
||||||
+ is done. Returns a negative errno style error code on failure.
|
|
||||||
+
|
|
||||||
+ See sd_is_socket(3) for more information.
|
|
||||||
+*/
|
|
||||||
+int sd_is_socket(int fd, int family, int type, int listening) _sd_hidden_;
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ Helper call for identifying a passed file descriptor. Returns 1 if
|
|
||||||
+ the file descriptor is an Internet socket, of the specified family
|
|
||||||
+ (either AF_INET or AF_INET6) and the specified type (SOCK_DGRAM,
|
|
||||||
+ SOCK_STREAM, ...), 0 otherwise. If version is 0 a protocol version
|
|
||||||
+ check is not done. If type is 0 a socket type check will not be
|
|
||||||
+ done. If port is 0 a socket port check will not be done. The
|
|
||||||
+ listening flag is used the same way as in sd_is_socket(). Returns a
|
|
||||||
+ negative errno style error code on failure.
|
|
||||||
+
|
|
||||||
+ See sd_is_socket_inet(3) for more information.
|
|
||||||
+*/
|
|
||||||
+int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) _sd_hidden_;
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ Helper call for identifying a passed file descriptor. Returns 1 if
|
|
||||||
+ the file descriptor is an AF_UNIX socket of the specified type
|
|
||||||
+ (SOCK_DGRAM, SOCK_STREAM, ...) and path, 0 otherwise. If type is 0
|
|
||||||
+ a socket type check will not be done. If path is NULL a socket path
|
|
||||||
+ check will not be done. For normal AF_UNIX sockets set length to
|
|
||||||
+ 0. For abstract namespace sockets set length to the length of the
|
|
||||||
+ socket name (including the initial 0 byte), and pass the full
|
|
||||||
+ socket path in path (including the initial 0 byte). The listening
|
|
||||||
+ flag is used the same way as in sd_is_socket(). Returns a negative
|
|
||||||
+ errno style error code on failure.
|
|
||||||
+
|
|
||||||
+ See sd_is_socket_unix(3) for more information.
|
|
||||||
+*/
|
|
||||||
+int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) _sd_hidden_;
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ Informs systemd about changed daemon state. This takes a number of
|
|
||||||
+ newline separated environment-style variable assignments in a
|
|
||||||
+ string. The following variables are known:
|
|
||||||
+
|
|
||||||
+ READY=1 Tells systemd that daemon startup is finished (only
|
|
||||||
+ relevant for services of Type=notify). The passed
|
|
||||||
+ argument is a boolean "1" or "0". Since there is
|
|
||||||
+ little value in signalling non-readiness the only
|
|
||||||
+ value daemons should send is "READY=1".
|
|
||||||
+
|
|
||||||
+ STATUS=... Passes a single-line status string back to systemd
|
|
||||||
+ that describes the daemon state. This is free-from
|
|
||||||
+ and can be used for various purposes: general state
|
|
||||||
+ feedback, fsck-like programs could pass completion
|
|
||||||
+ percentages and failing programs could pass a human
|
|
||||||
+ readable error message. Example: "STATUS=Completed
|
|
||||||
+ 66% of file system check..."
|
|
||||||
+
|
|
||||||
+ ERRNO=... If a daemon fails, the errno-style error code,
|
|
||||||
+ formatted as string. Example: "ERRNO=2" for ENOENT.
|
|
||||||
+
|
|
||||||
+ BUSERROR=... If a daemon fails, the D-Bus error-style error
|
|
||||||
+ code. Example: "BUSERROR=org.freedesktop.DBus.Error.TimedOut"
|
|
||||||
+
|
|
||||||
+ MAINPID=... The main pid of a daemon, in case systemd did not
|
|
||||||
+ fork off the process itself. Example: "MAINPID=4711"
|
|
||||||
+
|
|
||||||
+ Daemons can choose to send additional variables. However, it is
|
|
||||||
+ recommened to prefix variable names not listed above with X_.
|
|
||||||
+
|
|
||||||
+ Returns a negative errno-style error code on failure. Returns > 0
|
|
||||||
+ if systemd could be notified, 0 if it couldn't possibly because
|
|
||||||
+ systemd is not running.
|
|
||||||
+
|
|
||||||
+ Example: When a daemon finished starting up, it could issue this
|
|
||||||
+ call to notify systemd about it:
|
|
||||||
+
|
|
||||||
+ sd_notify(0, "READY=1");
|
|
||||||
+
|
|
||||||
+ See sd_notifyf() for more complete examples.
|
|
||||||
+
|
|
||||||
+ See sd_notify(3) for more information.
|
|
||||||
+*/
|
|
||||||
+int sd_notify(int unset_environment, const char *state) _sd_hidden_;
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ Similar to sd_notify() but takes a format string.
|
|
||||||
+
|
|
||||||
+ Example 1: A daemon could send the following after initialization:
|
|
||||||
+
|
|
||||||
+ sd_notifyf(0, "READY=1\n"
|
|
||||||
+ "STATUS=Processing requests...\n"
|
|
||||||
+ "MAINPID=%lu",
|
|
||||||
+ (unsigned long) getpid());
|
|
||||||
+
|
|
||||||
+ Example 2: A daemon could send the following shortly before
|
|
||||||
+ exiting, on failure:
|
|
||||||
+
|
|
||||||
+ sd_notifyf(0, "STATUS=Failed to start up: %s\n"
|
|
||||||
+ "ERRNO=%i",
|
|
||||||
+ strerror(errno),
|
|
||||||
+ errno);
|
|
||||||
+
|
|
||||||
+ See sd_notifyf(3) for more information.
|
|
||||||
+*/
|
|
||||||
+int sd_notifyf(int unset_environment, const char *format, ...) _sd_printf_attr_(2,3) _sd_hidden_;
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ Returns > 0 if the system was booted with systemd. Returns < 0 on
|
|
||||||
+ error. Returns 0 if the system was not booted with systemd. Note
|
|
||||||
+ that all of the functions above handle non-systemd boots just
|
|
||||||
+ fine. You should NOT protect them with a call to this function. Also
|
|
||||||
+ note that this function checks whether the system, not the user
|
|
||||||
+ session is controlled by systemd. However the functions above work
|
|
||||||
+ for both session and system services.
|
|
||||||
+
|
|
||||||
+ See sd_booted(3) for more information.
|
|
||||||
+*/
|
|
||||||
+int sd_booted(void) _sd_hidden_;
|
|
||||||
+
|
|
||||||
+#ifdef __cplusplus
|
|
||||||
+}
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+#endif
|
|
||||||
diff --git a/tools/syslogd.c b/tools/syslogd.c
|
|
||||||
index 1148108..e18101c 100644
|
|
||||||
--- a/tools/syslogd.c
|
|
||||||
+++ b/tools/syslogd.c
|
|
||||||
@@ -135,6 +135,7 @@
|
|
||||||
#include "net.h"
|
|
||||||
#include "vm.h"
|
|
||||||
#include "prop.h"
|
|
||||||
+#include "sd-daemon.h"
|
|
||||||
|
|
||||||
/* definitions for objects we access */
|
|
||||||
DEFobjCurrIf(obj)
|
|
||||||
@@ -2433,10 +2434,44 @@ doGlblProcessInit(void)
|
|
||||||
*/
|
|
||||||
exit(1); /* "good" exit - after forking, not diasabling anything */
|
|
||||||
}
|
|
||||||
+
|
|
||||||
num_fds = getdtablesize();
|
|
||||||
close(0);
|
|
||||||
/* we keep stdout and stderr open in case we have to emit something */
|
|
||||||
- for (i = 3; i < num_fds; i++)
|
|
||||||
+ i = 3;
|
|
||||||
+
|
|
||||||
+ /* if (sd_booted()) */ {
|
|
||||||
+ const char *e;
|
|
||||||
+ char buf[24] = { '\0' };
|
|
||||||
+ char *p = NULL;
|
|
||||||
+ unsigned long l;
|
|
||||||
+ int sd_fds;
|
|
||||||
+
|
|
||||||
+ /* fork & systemd socket activation:
|
|
||||||
+ * fetch listen pid and update to ours,
|
|
||||||
+ * when it is set to pid of our parent.
|
|
||||||
+ */
|
|
||||||
+ if ( (e = getenv("LISTEN_PID"))) {
|
|
||||||
+ errno = 0;
|
|
||||||
+ l = strtoul(e, &p, 10);
|
|
||||||
+ if (errno == 0 && l > 0 && (!p || !*p)) {
|
|
||||||
+ if (getppid() == (pid_t)l) {
|
|
||||||
+ snprintf(buf, sizeof(buf), "%d",
|
|
||||||
+ getpid());
|
|
||||||
+ setenv("LISTEN_PID", buf, 1);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * close only all further fds, except
|
|
||||||
+ * of the fds provided by systemd.
|
|
||||||
+ */
|
|
||||||
+ sd_fds = sd_listen_fds(0);
|
|
||||||
+ if (sd_fds > 0)
|
|
||||||
+ i = SD_LISTEN_FDS_START + sd_fds;
|
|
||||||
+ }
|
|
||||||
+ for ( ; i < num_fds; i++)
|
|
||||||
(void) close(i);
|
|
||||||
untty();
|
|
||||||
}
|
|
@ -1,3 +1,44 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Apr 27 16:19:31 UTC 2011 - mrueckert@suse.de
|
||||||
|
|
||||||
|
- move most of the additional requirements and subpackages into
|
||||||
|
conditionals so we can switch them on and off by more easily.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Apr 26 12:30:17 UTC 2011 - mt@suse.de
|
||||||
|
|
||||||
|
- Dropped obsolete rsyslog-systemd-integration.bnc656104.diff
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Apr 26 12:20:16 UTC 2011 - mrueckert@suse.de
|
||||||
|
|
||||||
|
- dont ship the systemd service file for now.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Sun Apr 24 01:32:17 UTC 2011 - mrueckert@suse.de
|
||||||
|
|
||||||
|
- update to 5.8.0 (v5-tsable)
|
||||||
|
This is the new v5-stable branch, importing all feature from the
|
||||||
|
5.7.x versions. To see what has changed in regard to the previous
|
||||||
|
v5-stable, check the entries for 5.7.x in
|
||||||
|
/usr/share/doc/packages/rsyslog/ChangeLog.
|
||||||
|
|
||||||
|
- bugfix: race condition in deferred name resolution
|
||||||
|
closes: http://bugzilla.adiscon.com/show_bug.cgi?id=238
|
||||||
|
Special thanks to Marcin for his persistence in helping to solve this
|
||||||
|
bug.
|
||||||
|
- bugfix: DA queue was never shutdown once it was started
|
||||||
|
closes: http://bugzilla.adiscon.com/show_bug.cgi?id=241
|
||||||
|
- dropped patch rsyslog-deferred-dns-query-race.diff
|
||||||
|
included in the release
|
||||||
|
- refreshed rsyslog-systemd-integration.bnc656104.diff:
|
||||||
|
most of the patch went upstream just a small chunk left
|
||||||
|
- fixed the with_dbi conditional, it was using the build_with_relp.
|
||||||
|
- added a new conditional with_systemd and moved all the systemd
|
||||||
|
specific things from suse_version >= 1140 to the with_systemd
|
||||||
|
conditional. the patch line in the preamble should be
|
||||||
|
unconditional.
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri Apr 8 13:24:34 UTC 2011 - mt@suse.de
|
Fri Apr 8 13:24:34 UTC 2011 - mt@suse.de
|
||||||
|
|
||||||
|
@ -43,12 +43,12 @@ $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
|
|||||||
# using the SYSLOGD_ADDITIONAL_SOCKET* variables in the
|
# using the SYSLOGD_ADDITIONAL_SOCKET* variables in the
|
||||||
# /etc/sysconfig/syslog file.
|
# /etc/sysconfig/syslog file.
|
||||||
#
|
#
|
||||||
$IncludeConfig /var/run/rsyslog/additional-log-sockets.conf
|
$IncludeConfig ADDITIONAL_SOCKETS
|
||||||
|
|
||||||
#
|
#
|
||||||
# Include config files, that the admin provided? :
|
# Include config files, that the admin provided? :
|
||||||
#
|
#
|
||||||
$IncludeConfig /etc/rsyslog.d/*.conf
|
$IncludeConfig ETC_RSYSLOG_D_GLOB
|
||||||
|
|
||||||
|
|
||||||
###
|
###
|
||||||
|
149
rsyslog.spec
149
rsyslog.spec
@ -20,11 +20,31 @@
|
|||||||
|
|
||||||
Name: rsyslog
|
Name: rsyslog
|
||||||
Summary: The enhanced syslogd for Linux and Unix
|
Summary: The enhanced syslogd for Linux and Unix
|
||||||
Version: 5.6.5
|
Version: 5.8.0
|
||||||
Release: 2
|
Release: 2
|
||||||
%define upstream_version 5.6.5
|
# for setting those bcond_with* configs see
|
||||||
%define with_dbi 0%{?suse_version} >= 1140 || 0%{?build_with_relp:1}
|
# http://lizards.opensuse.org/2008/09/12/conditional-features-aka-use-flags/
|
||||||
%define with_relp 0%{?suse_version} >= 1130 || 0%{?build_with_relp:1}
|
%if 0%{?suse_version} >= 1140
|
||||||
|
%bcond_without dbi
|
||||||
|
%else
|
||||||
|
%bcond_with dbi
|
||||||
|
%endif
|
||||||
|
%if 0%{?suse_version} >= 1140
|
||||||
|
%bcond_without systemd
|
||||||
|
%else
|
||||||
|
%bcond_with systemd
|
||||||
|
%endif
|
||||||
|
%if 0%{?suse_version} >= 1130
|
||||||
|
%bcond_without relp
|
||||||
|
%else
|
||||||
|
%bcond_with relp
|
||||||
|
%endif
|
||||||
|
%bcond_without gssapi
|
||||||
|
%bcond_without gnutls
|
||||||
|
%bcond_without mysql
|
||||||
|
%bcond_without pgsql
|
||||||
|
%bcond_without snmp
|
||||||
|
%define upstream_version 5.8.0
|
||||||
%define _sbindir /sbin
|
%define _sbindir /sbin
|
||||||
%define rsyslogdocdir %{_docdir}/%{name}
|
%define rsyslogdocdir %{_docdir}/%{name}
|
||||||
%define additional_sockets %{_localstatedir}/run/rsyslog/additional-log-sockets.conf
|
%define additional_sockets %{_localstatedir}/run/rsyslog/additional-log-sockets.conf
|
||||||
@ -38,26 +58,46 @@ AutoReqProv: on
|
|||||||
Provides: syslog
|
Provides: syslog
|
||||||
PreReq: %insserv_prereq %fillup_prereq /sbin/klogd /etc/init.d/syslog /sbin/checkproc
|
PreReq: %insserv_prereq %fillup_prereq /sbin/klogd /etc/init.d/syslog /sbin/checkproc
|
||||||
BuildRequires: klogd
|
BuildRequires: klogd
|
||||||
BuildRequires: dos2unix openssl-devel pcre-devel pkgconfig zlib-devel
|
BuildRequires: dos2unix
|
||||||
BuildRequires: krb5-devel mysql-devel net-snmp-devel postgresql-devel
|
BuildRequires: openssl-devel
|
||||||
|
BuildRequires: pcre-devel
|
||||||
|
BuildRequires: pkgconfig
|
||||||
|
BuildRequires: zlib-devel
|
||||||
|
#
|
||||||
|
%if %{with gssapi}
|
||||||
|
BuildRequires: krb5-devel
|
||||||
|
%endif
|
||||||
|
%if %{with mysql}
|
||||||
|
BuildRequires: mysql-devel
|
||||||
|
%endif
|
||||||
|
%if %{with snmp}
|
||||||
|
BuildRequires: net-snmp-devel
|
||||||
|
%endif
|
||||||
|
%if %{with pgsql}
|
||||||
|
BuildRequires: postgresql-devel
|
||||||
|
%endif
|
||||||
|
%if %{with gnutls}
|
||||||
BuildRequires: libgnutls-devel
|
BuildRequires: libgnutls-devel
|
||||||
%if 0%{?with_dbi}
|
%endif
|
||||||
|
%if %{with dbi}
|
||||||
BuildRequires: libdbi-devel
|
BuildRequires: libdbi-devel
|
||||||
%endif
|
%endif
|
||||||
%if 0%{?with_relp}
|
%if %{with relp}
|
||||||
# RELP support
|
# RELP support
|
||||||
BuildRequires: librelp-devel
|
BuildRequires: librelp-devel
|
||||||
%endif
|
%endif
|
||||||
# UDP spoof support
|
# UDP spoof support
|
||||||
%if 0%{?suse_version} >= 1140
|
%if 0%{?suse_version} >= 1140
|
||||||
BuildRequires: libnet-devel
|
BuildRequires: libnet-devel
|
||||||
# The systemd package provides
|
|
||||||
# /usr/share/doc/packages/systemd/sd-daemon.[ch]
|
|
||||||
# files instead of a lib ...
|
|
||||||
BuildRequires: systemd
|
|
||||||
%else
|
%else
|
||||||
BuildRequires: libnet
|
BuildRequires: libnet
|
||||||
%endif
|
%endif
|
||||||
|
%if %{with systemd}
|
||||||
|
# The systemd package provides
|
||||||
|
# /usr/share/doc/packages/systemd/sd-daemon.[ch]
|
||||||
|
# files instead of a lib ... See also bug 656259.
|
||||||
|
BuildRequires: systemd
|
||||||
|
%endif
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
#Source0: http://download.rsyslog.com/rsyslog/rsyslog-<upstream_version>.tar.gz
|
#Source0: http://download.rsyslog.com/rsyslog/rsyslog-<upstream_version>.tar.gz
|
||||||
Source0: %{name}-%{upstream_version}.tar.bz2
|
Source0: %{name}-%{upstream_version}.tar.bz2
|
||||||
@ -65,10 +105,6 @@ Source1: rsyslog.sysconfig
|
|||||||
Source2: rsyslog.conf.in
|
Source2: rsyslog.conf.in
|
||||||
Source3: rsyslog.early.conf.in
|
Source3: rsyslog.early.conf.in
|
||||||
Source4: rsyslog.d.remote.conf.in
|
Source4: rsyslog.d.remote.conf.in
|
||||||
%if 0%{?suse_version} >= 1140
|
|
||||||
Patch1: rsyslog-systemd-integration.bnc656104.diff
|
|
||||||
%endif
|
|
||||||
Patch2: rsyslog-deferred-dns-query-race.diff
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
Rsyslog is an enhanced multi-threaded syslogd supporting, among others,
|
Rsyslog is an enhanced multi-threaded syslogd supporting, among others,
|
||||||
@ -104,6 +140,7 @@ package.
|
|||||||
This package provides additional diagnostic tools (small helpers,
|
This package provides additional diagnostic tools (small helpers,
|
||||||
usually not needed).
|
usually not needed).
|
||||||
|
|
||||||
|
%if %{with gssapi}
|
||||||
%package module-gssapi
|
%package module-gssapi
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
Group: System/Daemons
|
Group: System/Daemons
|
||||||
@ -116,7 +153,9 @@ package.
|
|||||||
|
|
||||||
This module provides the support to receive syslog messages from the
|
This module provides the support to receive syslog messages from the
|
||||||
network protected via Kerberos 5 encryption and authentication.
|
network protected via Kerberos 5 encryption and authentication.
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with mysql}
|
||||||
%package module-mysql
|
%package module-mysql
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
Group: System/Daemons
|
Group: System/Daemons
|
||||||
@ -129,7 +168,9 @@ package.
|
|||||||
|
|
||||||
This package provides a module with the support for logging into MySQL
|
This package provides a module with the support for logging into MySQL
|
||||||
databases.
|
databases.
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with pgsql}
|
||||||
%package module-pgsql
|
%package module-pgsql
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
Group: System/Daemons
|
Group: System/Daemons
|
||||||
@ -141,9 +182,9 @@ Rsyslog is an enhanced multi-threaded syslog daemon. See rsyslog
|
|||||||
package.
|
package.
|
||||||
|
|
||||||
This module provides the support for logging into PostgreSQL databases.
|
This module provides the support for logging into PostgreSQL databases.
|
||||||
|
%endif
|
||||||
|
|
||||||
%if 0%{?with_dbi}
|
%if %{with dbi}
|
||||||
|
|
||||||
%package module-dbi
|
%package module-dbi
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
Group: System/Daemons
|
Group: System/Daemons
|
||||||
@ -158,6 +199,7 @@ This package provides a module with the support for logging into DBI
|
|||||||
supported databases.
|
supported databases.
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%if %{with snmp}
|
||||||
%package module-snmp
|
%package module-snmp
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
Group: System/Daemons
|
Group: System/Daemons
|
||||||
@ -170,7 +212,9 @@ package.
|
|||||||
|
|
||||||
This module provides the ability to send syslog messages as an SNMPv1 &
|
This module provides the ability to send syslog messages as an SNMPv1 &
|
||||||
v2c traps.
|
v2c traps.
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with gnutls}
|
||||||
%package module-gtls
|
%package module-gtls
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
Group: System/Daemons
|
Group: System/Daemons
|
||||||
@ -183,9 +227,9 @@ package.
|
|||||||
|
|
||||||
This module provides the ability for TLS encrypted TCP logging (based
|
This module provides the ability for TLS encrypted TCP logging (based
|
||||||
on current syslog-transport-tls internet drafts).
|
on current syslog-transport-tls internet drafts).
|
||||||
|
%endif
|
||||||
|
|
||||||
%if 0%{?with_relp}
|
%if %{with relp}
|
||||||
|
|
||||||
%package module-relp
|
%package module-relp
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
Group: System/Daemons
|
Group: System/Daemons
|
||||||
@ -214,9 +258,8 @@ This module provides a UDP forwarder that allows changing the sender address.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -n %{name}-%{upstream_version}
|
%setup -q -n %{name}-%{upstream_version}
|
||||||
%if 0%{?suse_version} >= 1140
|
%if %{with systemd}
|
||||||
%patch1 -p1
|
# Bug: https://bugzilla.novell.com/show_bug.cgi?id=656259
|
||||||
%patch2 -p1
|
|
||||||
# install the files systemd provides rather than what we provide.
|
# install the files systemd provides rather than what we provide.
|
||||||
cp -a /usr/share/doc/packages/systemd/sd-daemon.[ch] runtime/
|
cp -a /usr/share/doc/packages/systemd/sd-daemon.[ch] runtime/
|
||||||
%endif
|
%endif
|
||||||
@ -240,18 +283,28 @@ export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing -W -Wall"
|
|||||||
--enable-zlib \
|
--enable-zlib \
|
||||||
--enable-klog \
|
--enable-klog \
|
||||||
--enable-inet \
|
--enable-inet \
|
||||||
|
%if %{with gnutls}
|
||||||
--enable-gnutls \
|
--enable-gnutls \
|
||||||
|
%endif
|
||||||
--enable-rsyslogd \
|
--enable-rsyslogd \
|
||||||
|
%if %{with gssapi}
|
||||||
--enable-gssapi-krb5 \
|
--enable-gssapi-krb5 \
|
||||||
|
%endif
|
||||||
|
%if %{with mysql}
|
||||||
--enable-mysql \
|
--enable-mysql \
|
||||||
|
%endif
|
||||||
|
%if %{with pgsql}
|
||||||
--enable-pgsql \
|
--enable-pgsql \
|
||||||
%if 0%{?with_dbi}
|
%endif
|
||||||
|
%if %{with dbi}
|
||||||
--enable-libdbi \
|
--enable-libdbi \
|
||||||
%endif
|
%endif
|
||||||
%if 0%{?with_relp}
|
%if %{with relp}
|
||||||
--enable-relp \
|
--enable-relp \
|
||||||
%endif
|
%endif
|
||||||
|
%if %{with snmp}
|
||||||
--enable-snmp \
|
--enable-snmp \
|
||||||
|
%endif
|
||||||
--enable-mail \
|
--enable-mail \
|
||||||
--enable-imfile \
|
--enable-imfile \
|
||||||
--enable-imptcp \
|
--enable-imptcp \
|
||||||
@ -275,14 +328,28 @@ rm -f %{buildroot}%{rsyslog_module_dir_nodeps}/*.la
|
|||||||
# move all modules linking libraries in /usr to /usr/lib[64]
|
# move all modules linking libraries in /usr to /usr/lib[64]
|
||||||
# the user has to specify them with full path then...
|
# the user has to specify them with full path then...
|
||||||
install -d -m0755 %{buildroot}%{rsyslog_module_dir_withdeps}
|
install -d -m0755 %{buildroot}%{rsyslog_module_dir_withdeps}
|
||||||
for mod in omgssapi.so imgssapi.so lmgssutil.so ommysql.so \
|
for mod in \
|
||||||
ompgsql.so omsnmp.so lmnsd_gtls.so \
|
%if %{with gssapi}
|
||||||
%if 0%{?with_dbi}
|
omgssapi.so imgssapi.so lmgssutil.so \
|
||||||
|
%endif
|
||||||
|
%if %{with mysql}
|
||||||
|
ommysql.so \
|
||||||
|
%endif
|
||||||
|
%if %{with pgsql}
|
||||||
|
ompgsql.so \
|
||||||
|
%endif
|
||||||
|
%if %{with snmp}
|
||||||
|
omsnmp.so \
|
||||||
|
%endif
|
||||||
|
%if %{with dbi}
|
||||||
omlibdbi.so \
|
omlibdbi.so \
|
||||||
%endif
|
%endif
|
||||||
%if 0%{?with_relp}
|
%if %{with relp}
|
||||||
imrelp.so omrelp.so \
|
imrelp.so omrelp.so \
|
||||||
%endif
|
%endif
|
||||||
|
%if %{with gnutls}
|
||||||
|
lmnsd_gtls.so \
|
||||||
|
%endif
|
||||||
; do
|
; do
|
||||||
mv -f %{buildroot}%{rsyslog_module_dir_nodeps}/$mod \
|
mv -f %{buildroot}%{rsyslog_module_dir_nodeps}/$mod \
|
||||||
%{buildroot}%{rsyslog_module_dir_withdeps}
|
%{buildroot}%{rsyslog_module_dir_withdeps}
|
||||||
@ -323,11 +390,19 @@ install -d -m0755 %{buildroot}%{rsyslogdocdir}/
|
|||||||
find ChangeLog README AUTHORS COPYING COPYING.LESSER rsyslog.conf doc \
|
find ChangeLog README AUTHORS COPYING COPYING.LESSER rsyslog.conf doc \
|
||||||
\( -type d -exec install -m755 -d %{buildroot}%{rsyslogdocdir}/\{\} \; \) \
|
\( -type d -exec install -m755 -d %{buildroot}%{rsyslogdocdir}/\{\} \; \) \
|
||||||
-o \( -type f -exec install -m644 \{\} %{buildroot}%{rsyslogdocdir}/\{\} \; \)
|
-o \( -type f -exec install -m644 \{\} %{buildroot}%{rsyslogdocdir}/\{\} \; \)
|
||||||
|
%if %{with mysql}
|
||||||
install -m644 plugins/ommysql/createDB.sql \
|
install -m644 plugins/ommysql/createDB.sql \
|
||||||
%{buildroot}%{rsyslogdocdir}/mysql-createDB.sql
|
%{buildroot}%{rsyslogdocdir}/mysql-createDB.sql
|
||||||
|
%endif
|
||||||
|
%if %{with pgsql}
|
||||||
install -m644 plugins/ompgsql/createDB.sql \
|
install -m644 plugins/ompgsql/createDB.sql \
|
||||||
%{buildroot}%{rsyslogdocdir}/pgsql-createDB.sql
|
%{buildroot}%{rsyslogdocdir}/pgsql-createDB.sql
|
||||||
|
%endif
|
||||||
#
|
#
|
||||||
|
%if %{with systemd}
|
||||||
|
# TODO: https://features.opensuse.org/311316
|
||||||
|
rm -v %{buildroot}/lib/systemd/system/rsyslog.service
|
||||||
|
%endif
|
||||||
|
|
||||||
%clean
|
%clean
|
||||||
if [ -n "%{buildroot}" ] && [ "%{buildroot}" != "/" ] ; then
|
if [ -n "%{buildroot}" ] && [ "%{buildroot}" != "/" ] ; then
|
||||||
@ -484,39 +559,47 @@ fi
|
|||||||
%{_sbindir}/rsyslog_diag_hostname
|
%{_sbindir}/rsyslog_diag_hostname
|
||||||
%{_sbindir}/zpipe
|
%{_sbindir}/zpipe
|
||||||
|
|
||||||
|
%if %{with gssapi}
|
||||||
%files module-gssapi
|
%files module-gssapi
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%{rsyslog_module_dir_withdeps}/omgssapi.so
|
%{rsyslog_module_dir_withdeps}/omgssapi.so
|
||||||
%{rsyslog_module_dir_withdeps}/imgssapi.so
|
%{rsyslog_module_dir_withdeps}/imgssapi.so
|
||||||
%{rsyslog_module_dir_withdeps}/lmgssutil.so
|
%{rsyslog_module_dir_withdeps}/lmgssutil.so
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with mysql}
|
||||||
%files module-mysql
|
%files module-mysql
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%doc %{rsyslogdocdir}/mysql-createDB.sql
|
%doc %{rsyslogdocdir}/mysql-createDB.sql
|
||||||
%{rsyslog_module_dir_withdeps}/ommysql.so
|
%{rsyslog_module_dir_withdeps}/ommysql.so
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with pgsql}
|
||||||
%files module-pgsql
|
%files module-pgsql
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%doc %{rsyslogdocdir}/pgsql-createDB.sql
|
%doc %{rsyslogdocdir}/pgsql-createDB.sql
|
||||||
%{rsyslog_module_dir_withdeps}/ompgsql.so
|
%{rsyslog_module_dir_withdeps}/ompgsql.so
|
||||||
|
%endif
|
||||||
|
|
||||||
%if 0%{?with_dbi}
|
%if %{with dbi}
|
||||||
|
|
||||||
%files module-dbi
|
%files module-dbi
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%{rsyslog_module_dir_withdeps}/omlibdbi.so
|
%{rsyslog_module_dir_withdeps}/omlibdbi.so
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%if %{with snmp}
|
||||||
%files module-snmp
|
%files module-snmp
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%{rsyslog_module_dir_withdeps}/omsnmp.so
|
%{rsyslog_module_dir_withdeps}/omsnmp.so
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with gnutls}
|
||||||
%files module-gtls
|
%files module-gtls
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%{rsyslog_module_dir_withdeps}/lmnsd_gtls.so
|
%{rsyslog_module_dir_withdeps}/lmnsd_gtls.so
|
||||||
|
%endif
|
||||||
|
|
||||||
%if 0%{?with_relp}
|
%if %{with relp}
|
||||||
|
|
||||||
%files module-relp
|
%files module-relp
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%{rsyslog_module_dir_withdeps}/imrelp.so
|
%{rsyslog_module_dir_withdeps}/imrelp.so
|
||||||
|
Loading…
Reference in New Issue
Block a user