syslog: rework syslog detection so that we need no compile-time option what the name of the syslog implementation is

This commit is contained in:
Lennart Poettering 2011-03-18 04:31:22 +01:00
parent 0732ec002e
commit f1dd0c3f9b
9 changed files with 63 additions and 94 deletions

View file

@ -1102,7 +1102,6 @@ SED_PROCESS = \
$(SED) -e 's,@rootlibexecdir\@,$(rootlibexecdir),g' \ $(SED) -e 's,@rootlibexecdir\@,$(rootlibexecdir),g' \
-e 's,@rootbindir\@,$(rootbindir),g' \ -e 's,@rootbindir\@,$(rootbindir),g' \
-e 's,@bindir\@,$(bindir),g' \ -e 's,@bindir\@,$(bindir),g' \
-e 's,@SPECIAL_SYSLOG_SERVICE\@,$(SPECIAL_SYSLOG_SERVICE),g' \
-e 's,@SYSTEMCTL\@,$(rootbindir)/systemctl,g' \ -e 's,@SYSTEMCTL\@,$(rootbindir)/systemctl,g' \
-e 's,@SYSTEMD_NOTIFY\@,$(rootbindir)/systemd-notify,g' \ -e 's,@SYSTEMD_NOTIFY\@,$(rootbindir)/systemd-notify,g' \
-e 's,@pkgsysconfdir\@,$(pkgsysconfdir),g' \ -e 's,@pkgsysconfdir\@,$(pkgsysconfdir),g' \

2
TODO
View file

@ -29,6 +29,8 @@ F15:
* pull in .service from meta .targers AND vice versa too. i.e. syslog.target ←→ rsyslog.service, rpcbind similarly * pull in .service from meta .targers AND vice versa too. i.e. syslog.target ←→ rsyslog.service, rpcbind similarly
* document default dependencies
Features: Features:
* hide passwords on TAB * hide passwords on TAB

View file

@ -297,30 +297,15 @@ fi
with_distro=`echo ${with_distro} | tr '[[:upper:]]' '[[:lower:]]' ` with_distro=`echo ${with_distro} | tr '[[:upper:]]' '[[:lower:]]' `
AC_DEFINE_UNQUOTED(DISTRIBUTION, ["${with_distro}"], [Target Distribution]) AC_DEFINE_UNQUOTED(DISTRIBUTION, ["${with_distro}"], [Target Distribution])
# Default generic names
SPECIAL_SYSLOG_SERVICE=syslog.service
# Location of the init scripts as mandated by LSB # Location of the init scripts as mandated by LSB
SYSTEM_SYSVINIT_PATH=/etc/init.d SYSTEM_SYSVINIT_PATH=/etc/init.d
SYSTEM_SYSVRCND_PATH=/etc/rc.d
M4_DISTRO_FLAG= M4_DISTRO_FLAG=
case $with_distro in case $with_distro in
fedora) fedora)
SYSTEM_SYSVINIT_PATH=/etc/rc.d/init.d SYSTEM_SYSVINIT_PATH=/etc/rc.d/init.d
SYSTEM_SYSVRCND_PATH=/etc/rc.d
# A little background why we define this special unit
# names here in configure.ac: SysV services currently
# cannot have aliases. As long as syslog is started
# via a SysV init script we hence define this name to
# the actual SysV name here. Later on when SysV init
# scripts are not used anymore it is advisable to use
# the generic name instead and use symlinks in the
# unit directories to point to the right native unit
# file.
SPECIAL_SYSLOG_SERVICE=rsyslog.service
AC_DEFINE(TARGET_FEDORA, [], [Target is Fedora/RHEL]) AC_DEFINE(TARGET_FEDORA, [], [Target is Fedora/RHEL])
M4_DISTRO_FLAG=-DTARGET_FEDORA=1 M4_DISTRO_FLAG=-DTARGET_FEDORA=1
have_plymouth=true have_plymouth=true
@ -333,61 +318,49 @@ case $with_distro in
;; ;;
debian) debian)
SYSTEM_SYSVRCND_PATH=/etc SYSTEM_SYSVRCND_PATH=/etc
SPECIAL_SYSLOG_SERVICE=rsyslog.service
AC_DEFINE(TARGET_DEBIAN, [], [Target is Debian]) AC_DEFINE(TARGET_DEBIAN, [], [Target is Debian])
M4_DISTRO_FLAG=-DTARGET_DEBIAN=1 M4_DISTRO_FLAG=-DTARGET_DEBIAN=1
;; ;;
ubuntu) ubuntu)
SYSTEM_SYSVRCND_PATH=/etc SYSTEM_SYSVRCND_PATH=/etc
SPECIAL_SYSLOG_SERVICE=rsyslog.service
AC_DEFINE(TARGET_UBUNTU, [], [Target is Ubuntu]) AC_DEFINE(TARGET_UBUNTU, [], [Target is Ubuntu])
M4_DISTRO_FLAG=-DTARGET_UBUNTU=1 M4_DISTRO_FLAG=-DTARGET_UBUNTU=1
;; ;;
arch) arch)
SYSTEM_SYSVINIT_PATH=/etc/rc.d SYSTEM_SYSVINIT_PATH=/etc/rc.d
SYSTEM_SYSVRCND_PATH=/etc SYSTEM_SYSVRCND_PATH=/etc
SPECIAL_SYSLOG_SERVICE=syslog-ng.service
AC_DEFINE(TARGET_ARCH, [], [Target is ArchLinux]) AC_DEFINE(TARGET_ARCH, [], [Target is ArchLinux])
M4_DISTRO_FLAG=-DTARGET_ARCH=1 M4_DISTRO_FLAG=-DTARGET_ARCH=1
;; ;;
gentoo) gentoo)
SYSTEM_SYSVINIT_PATH= SYSTEM_SYSVINIT_PATH=
SYSTEM_SYSVRCND_PATH= SYSTEM_SYSVRCND_PATH=
SPECIAL_SYSLOG_SERVICE=syslog-ng.service
AC_DEFINE(TARGET_GENTOO, [], [Target is Gentoo]) AC_DEFINE(TARGET_GENTOO, [], [Target is Gentoo])
M4_DISTRO_FLAG=-DTARGET_GENTOO=1 M4_DISTRO_FLAG=-DTARGET_GENTOO=1
;; ;;
slackware) slackware)
SYSTEM_SYSVINIT_PATH=/etc/rc.d/init.d SYSTEM_SYSVINIT_PATH=/etc/rc.d/init.d
SYSTEM_SYSVRCND_PATH=/etc/rc.d
AC_DEFINE(TARGET_SLACKWARE, [], [Target is Slackware]) AC_DEFINE(TARGET_SLACKWARE, [], [Target is Slackware])
M4_DISTRO_FLAG=-DTARGET_SLACKWARE=1 M4_DISTRO_FLAG=-DTARGET_SLACKWARE=1
;; ;;
frugalware) frugalware)
SYSTEM_SYSVINIT_PATH=/etc/rc.d SYSTEM_SYSVINIT_PATH=/etc/rc.d
SYSTEM_SYSVRCND_PATH=/etc/rc.d
AC_DEFINE(TARGET_FRUGALWARE, [], [Target is Frugalware]) AC_DEFINE(TARGET_FRUGALWARE, [], [Target is Frugalware])
M4_DISTRO_FLAG=-DTARGET_FRUGALWARE=1 M4_DISTRO_FLAG=-DTARGET_FRUGALWARE=1
;; ;;
altlinux) altlinux)
SYSTEM_SYSVINIT_PATH=/etc/rc.d/init.d SYSTEM_SYSVINIT_PATH=/etc/rc.d/init.d
SYSTEM_SYSVRCND_PATH=/etc/rc.d
SPECIAL_SYSLOG_SERVICE=syslogd.service
AC_DEFINE(TARGET_ALTLINUX, [], [Target is ALTLinux]) AC_DEFINE(TARGET_ALTLINUX, [], [Target is ALTLinux])
M4_DISTRO_FLAG=-DTARGET_ALTLINUX=1 M4_DISTRO_FLAG=-DTARGET_ALTLINUX=1
have_plymouth=true have_plymouth=true
;; ;;
mandriva) mandriva)
SYSTEM_SYSVINIT_PATH=/etc/rc.d/init.d SYSTEM_SYSVINIT_PATH=/etc/rc.d/init.d
SYSTEM_SYSVRCND_PATH=/etc/rc.d
SPECIAL_SYSLOG_SERVICE=rsyslog.service
AC_DEFINE(TARGET_MANDRIVA, [], [Target is Mandriva]) AC_DEFINE(TARGET_MANDRIVA, [], [Target is Mandriva])
M4_DISTRO_FLAG=-DTARGET_MANDRIVA=1 M4_DISTRO_FLAG=-DTARGET_MANDRIVA=1
have_plymouth=true have_plymouth=true
;; ;;
other) other)
AS_IF([test "x$with_syslog_service" = "x"],
[AC_MSG_ERROR([With --distro=other, you must pass --with-syslog-service= to configure])])
;; ;;
*) *)
AC_MSG_ERROR([Your distribution (${with_distro}) is not yet supported, SysV init scripts could not be found! (patches welcome); you can specify --with-distro=other to skip this check]) AC_MSG_ERROR([Your distribution (${with_distro}) is not yet supported, SysV init scripts could not be found! (patches welcome); you can specify --with-distro=other to skip this check])
@ -406,15 +379,8 @@ AC_ARG_WITH([sysvrcd-path],
[SYSTEM_SYSVRCND_PATH="$withval"], [SYSTEM_SYSVRCND_PATH="$withval"],
[]) [])
AC_ARG_WITH([syslog-service],
[AS_HELP_STRING([--with-syslog-service=UNIT],
[Specify the name of the special syslog service @<:@default=based on distro@:>@])],
[SPECIAL_SYSLOG_SERVICE="$withval"],
[])
AC_SUBST(SYSTEM_SYSVINIT_PATH) AC_SUBST(SYSTEM_SYSVINIT_PATH)
AC_SUBST(SYSTEM_SYSVRCND_PATH) AC_SUBST(SYSTEM_SYSVRCND_PATH)
AC_SUBST(SPECIAL_SYSLOG_SERVICE)
AC_SUBST(M4_DISTRO_FLAG) AC_SUBST(M4_DISTRO_FLAG)
if test "x${SYSTEM_SYSVINIT_PATH}" != "x" -a "x${SYSTEM_SYSVRCND_PATH}" != "x"; then if test "x${SYSTEM_SYSVINIT_PATH}" != "x" -a "x${SYSTEM_SYSVRCND_PATH}" != "x"; then
@ -446,8 +412,6 @@ AM_CONDITIONAL(TARGET_MANDRIVA, test x"$with_distro" = xmandriva)
AM_CONDITIONAL(HAVE_PLYMOUTH, test -n "$have_plymouth") AM_CONDITIONAL(HAVE_PLYMOUTH, test -n "$have_plymouth")
AC_DEFINE_UNQUOTED(SPECIAL_SYSLOG_SERVICE, ["$SPECIAL_SYSLOG_SERVICE"], [Syslog service name])
AC_ARG_WITH([dbuspolicydir], AC_ARG_WITH([dbuspolicydir],
AS_HELP_STRING([--with-dbuspolicydir=DIR], [D-Bus policy directory]), AS_HELP_STRING([--with-dbuspolicydir=DIR], [D-Bus policy directory]),
[], [],
@ -501,7 +465,6 @@ echo "
SysV compatibility: ${SYSTEM_SYSV_COMPAT} SysV compatibility: ${SYSTEM_SYSV_COMPAT}
SysV init scripts: ${SYSTEM_SYSVINIT_PATH} SysV init scripts: ${SYSTEM_SYSVINIT_PATH}
SysV rc?.d directories: ${SYSTEM_SYSVRCND_PATH} SysV rc?.d directories: ${SYSTEM_SYSVRCND_PATH}
Syslog service: ${SPECIAL_SYSLOG_SERVICE}
Gtk: ${have_gtk} Gtk: ${have_gtk}
libcryptsetup: ${have_libcryptsetup} libcryptsetup: ${have_libcryptsetup}
tcpwrap: ${have_tcpwrap} tcpwrap: ${have_tcpwrap}

View file

@ -78,7 +78,6 @@
<filename>sockets.target</filename>, <filename>sockets.target</filename>,
<filename>swap.target</filename>, <filename>swap.target</filename>,
<filename>sysinit.target</filename>, <filename>sysinit.target</filename>,
<filename>@SPECIAL_SYSLOG_SERVICE@</filename>,
<filename>syslog.target</filename>, <filename>syslog.target</filename>,
<filename>systemd-initctl.service</filename>, <filename>systemd-initctl.service</filename>,
<filename>systemd-initctl.socket</filename>, <filename>systemd-initctl.socket</filename>,
@ -542,27 +541,6 @@
or b.</para> or b.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><filename>@SPECIAL_SYSLOG_SERVICE@</filename></term>
<listitem>
<para>A special unit for the
syslog daemon. As soon as
this service is fully started
up systemd will connect to it
and use it for logging if it
has been configured for
that.</para>
<para>Units should generally
avoid depending on this unit
directly and instead refer to
the
<filename>syslog.target</filename>
unit instead, which pulls this
one in directly or indirectly
via socket-based activation.</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><filename>syslog.target</filename></term> <term><filename>syslog.target</filename></term>
<listitem> <listitem>
@ -574,15 +552,6 @@
referring to the referring to the
<literal>$syslog</literal> <literal>$syslog</literal>
facility.</para> facility.</para>
<para>Administrators should
ensure that this target pulls
in a service unit with the
name or alias of
<filename>@SPECIAL_SYSLOG_SERVICE@</filename>
(or a socket unit that
activates this
service).</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>

View file

@ -2451,6 +2451,12 @@ void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
if (m->n_deserializing > 0) if (m->n_deserializing > 0)
return; return;
if (m->running_as != MANAGER_SYSTEM)
return;
if (u->meta.type != UNIT_SERVICE)
return;
if (!(p = unit_name_to_prefix_and_instance(u->meta.id))) { if (!(p = unit_name_to_prefix_and_instance(u->meta.id))) {
log_error("Failed to allocate unit name for audit message: %s", strerror(ENOMEM)); log_error("Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
return; return;
@ -2965,6 +2971,47 @@ int manager_set_default_controllers(Manager *m, char **controllers) {
return 0; return 0;
} }
void manager_recheck_syslog(Manager *m) {
Unit *u;
assert(m);
if (m->running_as != MANAGER_SYSTEM)
return;
if ((u = manager_get_unit(m, SPECIAL_SYSLOG_SOCKET))) {
SocketState state;
state = SOCKET(u)->state;
if (state != SOCKET_DEAD &&
state != SOCKET_FAILED &&
state != SOCKET_RUNNING) {
/* Hmm, the socket is not set up, or is still
* listening, let's better not try to use
* it. Note that we have no problem if the
* socket is completely down, since there
* might be a foreign /dev/log socket around
* and we want to make use of that.
*/
log_close_syslog();
return;
}
}
if ((u = manager_get_unit(m, SPECIAL_SYSLOG_TARGET)))
if (TARGET(u)->state != TARGET_ACTIVE) {
log_close_syslog();
return;
}
/* Hmm, OK, so the socket is either fully up, or fully down,
* and the target is up, then let's make use of the socket */
log_open();
}
static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = { static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = {
[MANAGER_SYSTEM] = "system", [MANAGER_SYSTEM] = "system",
[MANAGER_USER] = "user" [MANAGER_USER] = "user"

View file

@ -285,6 +285,8 @@ void manager_check_finished(Manager *m);
void manager_run_generators(Manager *m); void manager_run_generators(Manager *m);
void manager_undo_generators(Manager *m); void manager_undo_generators(Manager *m);
void manager_recheck_syslog(Manager *m);
const char *manager_running_as_to_string(ManagerRunningAs i); const char *manager_running_as_to_string(ManagerRunningAs i);
ManagerRunningAs manager_running_as_from_string(const char *s); ManagerRunningAs manager_running_as_from_string(const char *s);

View file

@ -24,21 +24,24 @@
#define SPECIAL_DEFAULT_TARGET "default.target" #define SPECIAL_DEFAULT_TARGET "default.target"
/* Shutdown targets */
#define SPECIAL_UMOUNT_TARGET "umount.target"
/* This is not really intended to be started by directly. This is /* This is not really intended to be started by directly. This is
* mostly so that other targets (reboot/halt/poweroff) can depend on * mostly so that other targets (reboot/halt/poweroff) can depend on
* it to bring all services down that want to be brought down on * it to bring all services down that want to be brought down on
* system shutdown. */ * system shutdown. */
#define SPECIAL_SHUTDOWN_TARGET "shutdown.target" #define SPECIAL_SHUTDOWN_TARGET "shutdown.target"
#define SPECIAL_UMOUNT_TARGET "umount.target"
#define SPECIAL_HALT_TARGET "halt.target" #define SPECIAL_HALT_TARGET "halt.target"
#define SPECIAL_POWEROFF_TARGET "poweroff.target" #define SPECIAL_POWEROFF_TARGET "poweroff.target"
#define SPECIAL_REBOOT_TARGET "reboot.target" #define SPECIAL_REBOOT_TARGET "reboot.target"
#define SPECIAL_KEXEC_TARGET "kexec.target" #define SPECIAL_KEXEC_TARGET "kexec.target"
#define SPECIAL_EXIT_TARGET "exit.target" #define SPECIAL_EXIT_TARGET "exit.target"
/* Special boot targets */
#define SPECIAL_RESCUE_TARGET "rescue.target" #define SPECIAL_RESCUE_TARGET "rescue.target"
#define SPECIAL_EMERGENCY_TARGET "emergency.target" #define SPECIAL_EMERGENCY_TARGET "emergency.target"
/* Early boot targets */
#define SPECIAL_SYSINIT_TARGET "sysinit.target" #define SPECIAL_SYSINIT_TARGET "sysinit.target"
#define SPECIAL_SOCKETS_TARGET "sockets.target" #define SPECIAL_SOCKETS_TARGET "sockets.target"
#define SPECIAL_LOCAL_FS_TARGET "local-fs.target" /* LSB's $local_fs */ #define SPECIAL_LOCAL_FS_TARGET "local-fs.target" /* LSB's $local_fs */
@ -46,8 +49,8 @@
#define SPECIAL_SWAP_TARGET "swap.target" #define SPECIAL_SWAP_TARGET "swap.target"
#define SPECIAL_BASIC_TARGET "basic.target" #define SPECIAL_BASIC_TARGET "basic.target"
/* LSB compatibility */
#define SPECIAL_NETWORK_TARGET "network.target" /* LSB's $network */ #define SPECIAL_NETWORK_TARGET "network.target" /* LSB's $network */
#define SPECIAL_NSS_LOOKUP_TARGET "nss-lookup.target" /* LSB's $named */ #define SPECIAL_NSS_LOOKUP_TARGET "nss-lookup.target" /* LSB's $named */
#define SPECIAL_RPCBIND_TARGET "rpcbind.target" /* LSB's $portmap */ #define SPECIAL_RPCBIND_TARGET "rpcbind.target" /* LSB's $portmap */
#define SPECIAL_SYSLOG_TARGET "syslog.target" /* LSB's $syslog; Should pull in syslog.socket or syslog.service */ #define SPECIAL_SYSLOG_TARGET "syslog.target" /* LSB's $syslog; Should pull in syslog.socket or syslog.service */
@ -56,22 +59,22 @@
#define SPECIAL_MAIL_TRANSFER_AGENT_TARGET "mail-transfer-agent.target" /* Debian's $mail-{transport|transfer-agent */ #define SPECIAL_MAIL_TRANSFER_AGENT_TARGET "mail-transfer-agent.target" /* Debian's $mail-{transport|transfer-agent */
#define SPECIAL_HTTP_DAEMON_TARGET "http-daemon.target" #define SPECIAL_HTTP_DAEMON_TARGET "http-daemon.target"
/* Magic early boot services */
#define SPECIAL_FSCK_SERVICE "fsck@.service" #define SPECIAL_FSCK_SERVICE "fsck@.service"
#define SPECIAL_QUOTACHECK_SERVICE "quotacheck.service" #define SPECIAL_QUOTACHECK_SERVICE "quotacheck.service"
#define SPECIAL_REMOUNT_ROOTFS_SERVICE "remount-rootfs.service" #define SPECIAL_REMOUNT_ROOTFS_SERVICE "remount-rootfs.service"
/* Services systemd relies on */
#define SPECIAL_DBUS_SERVICE "dbus.service" #define SPECIAL_DBUS_SERVICE "dbus.service"
#define SPECIAL_DBUS_SOCKET "dbus.socket" #define SPECIAL_DBUS_SOCKET "dbus.socket"
#define SPECIAL_LOGGER_SOCKET "systemd-logger.socket" #define SPECIAL_LOGGER_SOCKET "systemd-logger.socket"
#define SPECIAL_SYSLOG_SOCKET "syslog.socket"
/* Magic init signals */
#define SPECIAL_KBREQUEST_TARGET "kbrequest.target" #define SPECIAL_KBREQUEST_TARGET "kbrequest.target"
#define SPECIAL_SIGPWR_TARGET "sigpwr.target" #define SPECIAL_SIGPWR_TARGET "sigpwr.target"
#define SPECIAL_CTRL_ALT_DEL_TARGET "ctrl-alt-del.target" #define SPECIAL_CTRL_ALT_DEL_TARGET "ctrl-alt-del.target"
#ifndef SPECIAL_SYSLOG_SERVICE
#define SPECIAL_SYSLOG_SERVICE "syslog.service"
#endif
/* For SysV compatibility. Usually an alias for a saner target. On /* For SysV compatibility. Usually an alias for a saner target. On
* SysV-free systems this doesn't exist. */ * SysV-free systems this doesn't exist. */
#define SPECIAL_RUNLEVEL2_TARGET "runlevel2.target" #define SPECIAL_RUNLEVEL2_TARGET "runlevel2.target"

View file

@ -1224,12 +1224,6 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su
* yet connected. */ * yet connected. */
bus_init(u->meta.manager, true); bus_init(u->meta.manager, true);
if (unit_has_name(u, SPECIAL_SYSLOG_SERVICE))
/* The syslog daemon just might have become
* available, hence try to connect to it, if
* we aren't yet connected. */
log_open();
if (u->meta.type == UNIT_SERVICE && if (u->meta.type == UNIT_SERVICE &&
!UNIT_IS_ACTIVE_OR_RELOADING(os)) { !UNIT_IS_ACTIVE_OR_RELOADING(os)) {
/* Write audit record if we have just finished starting up */ /* Write audit record if we have just finished starting up */
@ -1242,12 +1236,6 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su
} else { } else {
if (unit_has_name(u, SPECIAL_SYSLOG_SERVICE))
/* The syslog daemon might just have
* terminated, hence try to disconnect from
* it. */
log_close_syslog();
/* We don't care about D-Bus here, since we'll get an /* We don't care about D-Bus here, since we'll get an
* asynchronous notification for it anyway. */ * asynchronous notification for it anyway. */
@ -1277,6 +1265,8 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su
unit_add_to_dbus_queue(u); unit_add_to_dbus_queue(u);
unit_add_to_gc_queue(u); unit_add_to_gc_queue(u);
manager_recheck_syslog(u->meta.manager);
} }
int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w) { int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w) {

View file

@ -9,9 +9,3 @@
[Unit] [Unit]
Description=Syslog Description=Syslog
# As soon as all syslog services have native unit files this explicit
# dependency should be dropped, and replaced by alias symlinks in the
# .wants/ directory, to either the .service or .socket unit of the
# syslog service.
After=@SPECIAL_SYSLOG_SERVICE@