[devel] обновления пакетов с поддержкой systemd

Alexey Shabalin a.shabalin на gmail.com
Вт Май 17 03:12:07 UTC 2011


Всем привет.
Возможно я кого-то ввел в заблужение (сам ошибался) по поводу
использования родных для systemd файлов.

Вопрос из FAQ:
Q: I have a native systemd service file and a SysV init script
installed which share the same basename, e.g.
/lib/systemd/system/foobar.service vs. /etc/init.d/foobar -- which one
wins?

A: If both files are available the native unit file always takes
precedence and the SysV init script is ignored, regardless whether
either is enabled or disabled. Note that a SysV service that is
enabled but overriden by a native service does not have the effect
that the native service would be enabled, too. Enabling of native and
SysV services is completely independent. Or in other words: you cannot
enable a native service by enabling a SysV service by the same name,
and if a SysV service is enabled but a the respective native service
is not, this will not have the effect that the SysV script is
executed.

То есть, если мы раньше имели включеный сервис /etc/init.d/foobar, а
теперь подложили в rpm-пакет  /lib/systemd/system/foobar.service, то
этот сервис будет выключен и после перезагрузки не стартует.
Надо запустить что-то типа
if chkconfig foobar ; then
  chkconfig foobar on
fi
(если сервис включен, включить его ещё раз - в этот раз уже с
перенаправлением на systemd)
Предполагается, что chkconfig из people/shaba/systemd -
модифицированный для перенаправления команд к systemd.

либо
if chkconfig --no-redirect foobar ; then  # не перенаправлять на systemd
  systemctl enable foobar.sevice         # можно использовать сразу
systemctl, без перенаправления из chkconfig
fi


В fedore во всех пакетах, где добавляют поддержку нативных сервисов
добавляют тригер типа:
%triggerun -- httpd < 0.47.11-1
if /sbin/chkconfig httpd ; then
        /bin/systemctl enable httpd.service >/dev/null 2>&1 || :
fi

или

%triggerun -- avahi < 0.6.28-1
 if /sbin/chkconfig --level 5 avahi-daemon ; then
          /bin/systemctl --no-reload enable avahi-daemon.service
>/dev/null 2>&1 || :
 fi

Как лучше сделать у нас?
Я пока придумал только модифицировать post_service:

--- post_service.def	2011-03-17 01:41:42.000000000 +0300
+++ post_service	2011-05-17 07:02:27.640147135 +0400
@@ -1,5 +1,21 @@
 #!/bin/sh -e

+SYSTEMCTL=/bin/systemctl
+SYSTEMD_SERVICE_DIR=/lib/systemd/system
+SYSTEMD_CGROUP_DIR=/sys/fs/cgroup/systemd
+
+systemd_status=
+systemd_is_active()
+{
+	if [ -z "$systemd_status" ]; then
+		[ -x "$SYSTEMCTL" -a \
+		  -d "$SYSTEMD_CGROUP_DIR" ] &&
+		mountpoint -q "$SYSTEMD_CGROUP_DIR"
+		systemd_status=$?
+	fi
+	return $systemd_status
+}
+
 if ! [ "$RPM_INSTALL_ARG1" -ge 1 ] 2>/dev/null; then
 	echo "post_service: invalid or undefined variable: RPM_INSTALL_ARG1" >&2
 	exit 1
@@ -14,5 +30,9 @@
 	/sbin/chkconfig --add "$1"
 else
 	/sbin/chkconfig "$1" resetpriorities ||:
+	[ -f "$SYSTEMD_SERVICE_DIR/$1.service" ] &&
+		systemd_is_active &&
+		/sbin/chkconfig --no-redirect "$1" &&
+		/sbin/chkconfig "$1" on
 	/sbin/service "$1" condrestart ||:
 fi

Или это можно в какой-нибудь filetrigger сделать?
Как лучше?

-- 
Alexey Shabalin


Подробная информация о списке рассылки Devel