[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#773087: [systemd-no-service-for-init-script] false positives



control: tags -1 + patch

Hi,

On Sun, Dec 14, 2014 at 08:11:13AM +0100, Jörg Frings-Fürst wrote:

> On package sane-utils I use
> 
> - /etc/init.d/saned
> - /lib/systemd/system/saned@.service (with Alias=saned)
> - /lib/system/system/saned.socket

As far as I can see you do not use this layout anymore, right? At least 
there is no more systemd-no-service-for-init-script warning for sane?

> When you are installing a systemd service file alongside of your SysV init
> script, you should name it correspondingly. E.g. for /etc/init.d/apache2 the
> corresponding service file should be named /lib/systemd/system/apache2.service.
> This way, systemd will automatically prefer the native service file over the
> SysV init script and use that to start the service. If the names do not match,
> say your service file is provided by upstream and named NetworkManager.service
> and your existing SysV init script is called /etc/init.d/network-manager, you
> can either rename one of the two or you simply use an Alias=. This instruction
> tells systemctl enable to create a symlink. Augment the service file like this:

The alias parsing in lintian was slightly broken, as it did not strip 
the .service from the Alias entry (which is required as per spec [1]). 
Because of this the matching of the init.d-name and the alias was 
broken. The attached patch fixes this behaviour. However I am not sure 
if that would actually fix it for the old saned@.service as you write 
you had "saned" in the alias field? Or was it "saned.service"?

Regards
Evgeni

[1] http://www.freedesktop.org/software/systemd/man/systemd.unit.html#Alias=
>From 5f32595c52838ef9d21046229bd7a79960a02c6e Mon Sep 17 00:00:00 2001
From: Evgeni Golov <evgeni@debian.org>
Date: Sat, 19 Dec 2015 00:23:17 +0100
Subject: [PATCH] remove .service from systemd service aliases

when parsing .service files, we read the Aliases so we can match them
against the init.d name, however, we forgot to strip the .service
file extension [1] as we do with the main unit name.

Closes: #773087

[1] http://www.freedesktop.org/software/systemd/man/systemd.unit.html#Alias=
---
 checks/systemd.pm                                  |   1 +
 t/tests/systemd-general/debian/debian/rules        |   4 +
 .../debian/debian/systemd-aliasd.init              | 157 +++++++++++++++++++++
 t/tests/systemd-general/debian/debian/test.service |   1 +
 4 files changed, 163 insertions(+)
 create mode 100644 t/tests/systemd-general/debian/debian/systemd-aliasd.init

diff --git a/checks/systemd.pm b/checks/systemd.pm
index e59510e..aef5c32 100644
--- a/checks/systemd.pm
+++ b/checks/systemd.pm
@@ -164,6 +164,7 @@ sub get_systemd_service_names {
           = extract_service_file_values($info, $file, 'Install', 'Alias', 1);
 
         for my $alias (@aliases) {
+            $alias =~ s/\.service$//;
             $safe_add_service->($alias, $file);
         }
     }
diff --git a/t/tests/systemd-general/debian/debian/rules b/t/tests/systemd-general/debian/debian/rules
index ea39c0e..fade512 100644
--- a/t/tests/systemd-general/debian/debian/rules
+++ b/t/tests/systemd-general/debian/debian/rules
@@ -19,3 +19,7 @@ override_dh_install:
 override_dh_fixperms:
 	dh_fixperms
 	chmod -x $(INITD_DIR)/README
+
+override_dh_installinit:
+	dh_installinit
+	dh_installinit --name systemd-aliasd
diff --git a/t/tests/systemd-general/debian/debian/systemd-aliasd.init b/t/tests/systemd-general/debian/debian/systemd-aliasd.init
new file mode 100644
index 0000000..775eb1a
--- /dev/null
+++ b/t/tests/systemd-general/debian/debian/systemd-aliasd.init
@@ -0,0 +1,157 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides:          systemd-aliasd
+# Required-Start:    $remote_fs $syslog
+# Required-Stop:     $remote_fs $syslog
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Example initscript
+# Description:       This file should be used to construct scripts to be
+#                    placed in /etc/init.d.
+### END INIT INFO
+
+# Author: Foo Bar <foobar@baz.org>
+#
+# Please remove the "Author" lines above and replace them
+# with your own name if you copy and modify this script.
+
+# Do NOT "set -e"
+
+# PATH should only include /usr/* if it runs after the mountnfs.sh script
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
+DESC="Description of the service"
+NAME=daemonexecutablename
+DAEMON=/usr/sbin/$NAME
+DAEMON_ARGS="--options args"
+PIDFILE=/var/run/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+
+# Exit if the package is not installed
+[ -x "$DAEMON" ] || exit 0
+
+# Read configuration variable file if it is present
+[ -r /etc/default/$NAME ] && . /etc/default/$NAME
+
+. /lib/lsb/init-functionsh
+
+# Define LSB log_* functions.
+# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
+# and status_of_proc is working.
+
+#
+# Function that starts the daemon/service
+#
+do_start()
+{
+	# Return
+	#   0 if daemon has been started
+	#   1 if daemon was already running
+	#   2 if daemon could not be started
+	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
+		|| return 1
+	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
+		$DAEMON_ARGS \
+		|| return 2
+	# Add code here, if necessary, that waits for the process to be ready
+	# to handle requests from services started subsequently which depend
+	# on this one.  As a last resort, sleep for some time.
+}
+
+#
+# Function that stops the daemon/service
+#
+do_stop()
+{
+	# Return
+	#   0 if daemon has been stopped
+	#   1 if daemon was already stopped
+	#   2 if daemon could not be stopped
+	#   other if a failure occurred
+	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
+	RETVAL="$?"
+	[ "$RETVAL" = 2 ] && return 2
+	# Wait for children to finish too if this is a daemon that forks
+	# and if the daemon is only ever run from this initscript.
+	# If the above conditions are not satisfied then add some other code
+	# that waits for the process to drop all resources that could be
+	# needed by services started subsequently.  A last resort is to
+	# sleep for some time.
+	start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
+	[ "$?" = 2 ] && return 2
+	# Many daemons don't delete their pidfiles when they exit.
+	rm -f $PIDFILE
+	return "$RETVAL"
+}
+
+#
+# Function that sends a SIGHUP to the daemon/service
+#
+do_reload() {
+	#
+	# If the daemon can reload its configuration without
+	# restarting (for example, when it is sent a SIGHUP),
+	# then implement that here.
+	#
+	start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
+	return 0
+}
+
+case "$1" in
+  start)
+	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
+	do_start
+	case "$?" in
+		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+	esac
+	;;
+  stop)
+	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
+	do_stop
+	case "$?" in
+		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+	esac
+	;;
+  status)
+	status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
+	;;
+  #reload|force-reload)
+	#
+	# If do_reload() is not implemented then leave this commented out
+	# and leave 'force-reload' as an alias for 'restart'.
+	#
+	#log_daemon_msg "Reloading $DESC" "$NAME"
+	#do_reload
+	#log_end_msg $?
+	#;;
+  restart|force-reload)
+	#
+	# If the "reload" option is implemented then remove the
+	# 'force-reload' alias
+	#
+	log_daemon_msg "Restarting $DESC" "$NAME"
+	do_stop
+	case "$?" in
+	  0|1)
+		do_start
+		case "$?" in
+			0) log_end_msg 0 ;;
+			1) log_end_msg 1 ;; # Old process is still running
+			*) log_end_msg 1 ;; # Failed to start
+		esac
+		;;
+	  *)
+		# Failed to stop
+		log_end_msg 1
+		;;
+	esac
+	;;
+  *)
+	#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
+	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
+	exit 3
+	;;
+esac
+
+:
diff --git a/t/tests/systemd-general/debian/debian/test.service b/t/tests/systemd-general/debian/debian/test.service
index a327823..54611f4 100644
--- a/t/tests/systemd-general/debian/debian/test.service
+++ b/t/tests/systemd-general/debian/debian/test.service
@@ -8,3 +8,4 @@ ExecStart=/usr/bin/test
 
 [Install]
 WantedBy=multi-user.target
+Alias=systemd-aliasd.service
-- 
2.6.4


Reply to: