# -*- Mode: rpm-spec; indent-tabs-mode: t -*- */ # RPM macros for packages installing systemd unit files # ### # # When a package install systemd unit files, it should use the # following macros: # # add %systemd_requires in the specfile # # %pre # %service_add_pre demo.service demo1.service # # %post # %service_add_post demo.service demo1.service # # %preun # %service_del_preun demo.service # # %postun # %service_del_postun demo.service # %service_del_postun_without_restart demo.service # # Note: the upstream variants are also available and are aliases to # their SUSE counterparts. However for consistency the SUSE macros # should be preferred unless the package is intended to be portable # across multiple distributions based on RPM. %_systemd_util_dir /usr/lib/systemd %_unitdir /usr/lib/systemd/system %_userunitdir /usr/lib/systemd/user %_presetdir /usr/lib/systemd/system-preset %_userpresetdir /usr/lib/systemd/user-preset %_udevhwdbdir /usr/lib/udev/hwdb.d %_udevrulesdir /usr/lib/udev/rules.d %_journalcatalogdir /usr/lib/systemd/catalog %_tmpfilesdir /usr/lib/tmpfiles.d %_user_tmpfilesdir /usr/share/user-tmpfiles.d %_sysusersdir /usr/lib/sysusers.d %_sysctldir /usr/lib/sysctl.d %_ntpunitsdir /usr/lib/systemd/ntp-units.d %_binfmtdir /usr/lib/binfmt.d %_environmentdir /usr/lib/environment.d %_modulesloaddir /usr/lib/modules-load.d %_modprobedir /usr/lib/modprobe.d %_systemdgeneratordir /usr/lib/systemd/system-generators %_systemdusergeneratordir /usr/lib/systemd/user-generators %_systemd_system_env_generator_dir /usr/lib/systemd/system-environment-generators %_systemd_user_env_generator_dir /usr/lib/systemd/user-environment-generators %systemd_requires \ Requires(pre): systemd \ Requires(post): systemd \ Requires(preun): systemd \ Requires(postun): systemd \ %{nil} # In case you're wondering why "Suggests:" is also used: libzypp # doesn't understand "OrderWithRequires:" yet, see bsc#1187332 for # details. %systemd_ordering \ OrderWithRequires(pre): systemd \ OrderWithRequires(post): systemd \ OrderWithRequires(preun): systemd \ OrderWithRequires(postun): systemd \ Suggests: systemd \ %{nil} # Figure out when presets need to be applied. This information is only # recorded during %pre and is actually applied during %post. # # Presets might need to be applied during package install but also # during package update. On update, packages might introduce new # services but we need to make sure that's not happening during the # migration of SysV initscripts. On package install, presets might # have been already applied because of package renaming or split. # %service_add_pre() \ if [ -x /usr/bin/systemctl ]; then \ for service in %{?*} ; do \ if [ ! -e "/usr/lib/systemd/system/$service" ]; then \ mkdir -p /run/systemd/rpm/needs-preset \ touch "/run/systemd/rpm/needs-preset/$service" \ fi \ done \ fi \ %{nil} # Apply the presets if %pre told us to do so. # %service_add_post() \ if [ -x /usr/bin/systemctl ]; then \ for service in %{?*} ; do \ if [ -e "/run/systemd/rpm/needs-preset/$service" ]; then \ /usr/bin/systemctl preset "$service" || : \ rm "/run/systemd/rpm/needs-preset/$service" || : \ fi \ done \ fi \ %{nil} # On uninstall, disable and stop services # %service_del_preun() \ if [ $1 -eq 0 -a -x /usr/bin/systemctl ]; then \ # Package removal, not upgrade \ /usr/bin/systemctl --no-reload disable --now %{?*} || : \ fi \ %{nil} # On uninstall, tell systemd to reload its unit files. # On update, tell systemd to reload its unit files but don't restart service. # # It ignores the content of /etc/sysconfig/services # %service_del_postun_without_restart() \ if [ -x /usr/bin/systemctl ]; then \ /usr/bin/systemctl daemon-reload || : \ fi \ %{nil} # On uninstall, tell systemd to reload its unit files. # On update, tell systemd to reload its unit files and restart service. # # It ignores the content of /etc/sysconfig/services # %service_del_postun_with_restart() \ if [ -x /usr/bin/systemctl ]; then \ /usr/bin/systemctl daemon-reload || : \ if [ $1 -ge 1 ]; then \ # Package upgrade, not uninstall \ /usr/bin/systemctl try-restart %{?*} || : \ fi \ fi \ %{nil} # On uninstall, tell systemd to reload its unit files. # On update, tell systemd to reload and restart service unless # DISABLE_RESTART_ON_UPDATE from /etc/sysconfig/services says otherwise # %service_del_postun() \ if [ -x /usr/bin/systemctl ]; then \ /usr/bin/systemctl daemon-reload || : \ if [ $1 -ge 1 ]; then \ # Package upgrade, not uninstall \ DISABLE_RESTART_ON_UPDATE=no \ [ -e /etc/sysconfig/services ] && . /etc/sysconfig/services || : \ \ case "$DISABLE_RESTART_ON_UPDATE" in \ yes|1) ;; \ *) /usr/bin/systemctl try-restart %{*} || : \ esac \ fi \ fi \ %{nil} # # Upstream variants # %systemd_pre() %{expand::%%service_add_pre %{?**}} %systemd_post() %{expand::%%service_add_post %{?**}} %systemd_preun() %{expand::%%service_del_preun %{?**}} %systemd_postun() %{expand::%%service_del_postun_without_restart %{?**}} %systemd_postun_with_restart() %{expand::%%service_del_postun_with_restart %{?**}} %systemd_user_pre() \ if [ -x /usr/bin/systemctl ]; then \ for service in %{?*} ; do \ if [ ! -e "/usr/lib/systemd/user/$service" ]; then \ mkdir -p /run/systemd/rpm/needs-user-preset \ touch "/run/systemd/rpm/needs-user-preset/$service" \ fi \ done \ fi \ %{nil} %systemd_user_post() \ if [ -x /usr/bin/systemctl ]; then \ for service in %{?*} ; do \ if [ -e "/run/systemd/rpm/needs-user-preset/$service" ]; then \ /usr/bin/systemctl --global preset "$service" || : \ rm "/run/systemd/rpm/needs-user-preset/$service" || : \ fi \ done \ fi \ %{nil} %systemd_user_preun() \ if [ $1 -eq 0 -a -x /usr/bin/systemctl ]; then \ # Package removal, not upgrade \ /usr/bin/systemctl --global disable %{?*} || : \ fi \ %{nil} %systemd_user_postun() %{nil} %systemd_user_postun_with_restart() %{nil} %udev_hwdb_update() \ [ -x /usr/bin/systemd-hwdb ] && /usr/bin/systemd-hwdb update || : \ %{nil} %udev_rules_update() \ [ -x /usr/bin/udevadm ] && /usr/bin/udevadm control --reload || : \ %{nil} %journal_catalog_update() \ [ -x /usr/bin/journalctl ] && /usr/bin/journalctl --update-catalog || : \ %{nil} # Deprecated. Use %tmpfiles_create_package instead %tmpfiles_create() \ [ -z "${TRANSACTIONAL_UPDATE}" -a -x /usr/bin/systemd-tmpfiles ] && \ /usr/bin/systemd-tmpfiles --create %{?*} || : \ %{nil} # This may be used by package installation scripts to create files according to # their tmpfiles configuration from a package installation script, even before # the files of that package are installed on disk. # # Example: # Source1: %{name}-tmpfiles.conf # ... # %install # install -D %SOURCE1 %{buildroot}%{_tmpfilesdir}/%{name}.conf # %pre # %tmpfiles_create_package %{name} %SOURCE1 # %files # %{_tmpfilesdir}/%{name}.conf # %tmpfiles_create_package() \ if [ -z "${TRANSACTIONAL_UPDATE}" ]; then \ /usr/bin/systemd-tmpfiles --replace=%_tmpfilesdir/%1.conf --create - <