%bcond_without manpages
%bcond_without shared
%bcond_without static
+%bcond_with systemd
%if %{without servers}
# --without servers overrides --with {ldiskfs|zfs}
%endif
%endif
+# Generic enable switch for systemd
+%if %{with systemd}
+%define _systemd 1
+%endif
+
+# RHEL >= 7 comes with systemd
+%if 0%{?rhel} >= 7
+%define _systemd 1
+%endif
+
+# Fedora >= 15 comes with systemd, but only >= 18 has
+# the proper macros
+%if 0%{?fedora} >= 18
+%define _systemd 1
+%endif
+
+# opensuse >= 12.1 comes with systemd, but only >= 13.1
+# has the proper macros
+%if 0%{?suse_version} >= 1310
+%define _systemd 1
+%endif
+
Summary: Lustre File System
Name: %{lustre_name}
Version: %{version}
%endif
%endif
+%if 0%{?_systemd}
+Requires(post): systemd
+Requires(preun): systemd
+Requires(postun): systemd
+BuildRequires: systemd
+%endif
+
%description
Userspace tools and files for the Lustre file system.
ln lnet/ChangeLog ChangeLog-lnet
%build
-
# Set an explicit path to our Linux tree, if we can.
cd $RPM_BUILD_DIR/lustre-%{version}
# override %optflags so that the vendor's overzealous flags don't create
# build failures
%define optflags -g -O2 -Werror
+%if 0%{?_systemd}
+ %define systemd --with-systemdsystemunitdir=%{_unitdir}
+%else
+ %define systemd --with-systemdsystemunitdir=no
+%endif
+
CONFIGURE_ARGS="%{?configure_args}"
if [ -n "$CONFIGURE_ARGS" ]; then
# make sure %%kdir and %%kobjdir are not in the configure arguments
%{!?with_zfs:--without-zfs} \
%{!?with_lnet_dlc:--disable-dlc} \
%{!?with_manpages:--disable-manpages} \
+ %{systemd} \
--with-linux=%{kdir} \
--with-linux-obj=%{kobjdir} \
--with-kmp-moddir=%{kmoddir}/%{name}
echo '%{_sysconfdir}/ha.d/resource.d/Lustre' >>lustre.files
%endif
+# systemd is on redhat, fedora, and suse
+%if 0%{?_systemd}
+echo '%{_unitdir}/lnet.service' >>lustre.files
+%endif
+
%if %{_vendor}=="redhat"
# The following scripts are Red Hat specific
%if %{with servers}
echo '%{_sysconfdir}/sysconfig/lsvcgss' >>lustre.files
echo '%{_sysconfdir}/init.d/lustre' >>lustre.files
%endif
+
+%if 0%{!?_systemd:1}
echo '%{_sysconfdir}/init.d/lnet' >>lustre.files
+%endif
+
echo '%{_sysconfdir}/init.d/lsvcgss' >>lustre.files
%endif
%doc lustre-iokit/stats-collect/README.iokit-lstats
%endif
+%post
+%if 0%{?_systemd}
+%systemd_post lnet.service
+%endif
+
+%preun
+%if 0%{?_systemd}
+%systemd_preun lnet.service
+%endif
+
+%postun
+%if 0%{?_systemd}
+%systemd_postun_with_restart lnet.service
+%endif
+
%clean
rm -rf $RPM_BUILD_ROOT
rm -rf %{_tmppath}/kmp
AS_IF([test "x$enable_pgstat_track" = xyes],
[AC_DEFINE([CONFIG_DEBUG_PAGESTATE_TRACKING], 1,
[enable page state tracking code])])
+
+PKG_PROG_PKG_CONFIG
+AC_MSG_CHECKING([systemd unit file directory])
+AC_ARG_WITH([systemdsystemunitdir],
+ [AS_HELP_STRING([--with-systemdsystemunitdir=DIR],
+ [Directory for systemd service files])],
+ [], [with_systemdsystemunitdir=auto])
+AS_IF([test "x$with_systemdsystemunitdir" = "xyes" -o "x$with_systemdsystemunitdir" = "xauto"],
+ [def_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)
+ AS_IF([test "x$def_systemdsystemunitdir" = "x"],
+ [AS_IF([test "x$with_systemdsystemunitdir" = "xyes"],
+ [AC_MSG_ERROR([systemd support requested but pkg-config unable to query systemd package])])
+ with_systemdsystemunitdir=no],
+ [with_systemdsystemunitdir="$def_systemdsystemunitdir"])])
+AS_IF([test "x$with_systemdsystemunitdir" != "xno"],
+ [AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])])
+AC_MSG_RESULT([$with_systemdsystemunitdir])
]) # LC_CONFIGURE
#
AM_CONDITIONAL(GSS_PIPEFS, test x$enable_gss_pipefs = xyes)
AM_CONDITIONAL(GSS_SSK, test x$enable_ssk = xyes)
AM_CONDITIONAL(LIBPTHREAD, test x$enable_libpthread = xyes)
+AM_CONDITIONAL(HAVE_SYSTEMD, test "x$with_systemdsystemunitdir" != "xno")
]) # LC_CONDITIONALS
#
lustre/quota/Makefile
lustre/quota/autoMakefile
lustre/scripts/Makefile
+lustre/scripts/systemd/Makefile
lustre/tests/Makefile
lustre/tests/mpi/Makefile
lustre/utils/Makefile
# These are scripts that are generated from .in files
genscripts = lc_modprobe lc_net lc_hb lc_cluman lc_md lc_lvm lustre_start
+SUBDIRS = systemd
+
sbin_SCRIPTS = lustre_rmmod ko2iblnd-probe
if RHEL
initdir = $(sysconfdir)/init.d
-init_SCRIPTS = lnet lsvcgss
+init_SCRIPTS = lsvcgss
+
+if !HAVE_SYSTEMD
+init_SCRIPTS += lnet
+endif
+
if SERVER
init_SCRIPTS += lustre
endif
--- /dev/null
+/Makefile.in
+/lnet.service
--- /dev/null
+# These are scripts that are generated from .in files
+genunitfiles = lnet.service
+sysconfigdir = $(sysconfdir)/sysconfig
+
+if HAVE_SYSTEMD
+systemdsystemunit_DATA = lnet.service
+endif
+
+EXTRA_DIST = $(addsuffix .in,$(genunitfiles))
+
+CLEANFILES = $(genunitfiles)
+
+$(genunitfiles): %: %.in
+if BUILD_DLC
+ sed -e 's,@sbindir\@,$(sbindir),g' \
+ -e 's,@sysconfigdir\@,$(sysconfigdir),g' \
+ -e 's,@sysconfdir\@,$(sysconfdir),g' \
+ -e 's,@BUILD_DLC_TRUE\@,,g' \
+ -e 's,@BUILD_DLC_FALSE\@,\#,g' $< > $@
+else
+ sed -e 's,@sbindir\@,$(sbindir),g' \
+ -e 's,@sysconfigdir\@,$(sysconfigdir),g' \
+ -e 's,@sysconfdir\@,$(sysconfdir),g' \
+ -e 's,@BUILD_DLC_TRUE\@,\#,g' \
+ -e 's,@BUILD_DLC_FALSE\@,,g' $< > $@
+endif
--- /dev/null
+[Unit]
+Description=lnet management
+
+Requires=network-online.target
+After=network-online.target
+
+ConditionPathExists=!/proc/sys/lnet/
+
+[Service]
+Type=oneshot
+RemainAfterExit=true
+ExecStart=@sbindir@/modprobe lnet
+@BUILD_DLC_FALSE@ExecStart=@sbindir@/lctl network up
+@BUILD_DLC_FALSE@ExecStart=@sbindir@/lustre_routes_config @sysconfdir@/lnet_routes.conf
+@BUILD_DLC_TRUE@ExecStart=@sbindir@/lnetctl lnet configure
+@BUILD_DLC_TRUE@ExecStart=@sbindir@/lnetctl import < @sysconfigdir@/lnet.conf
+ExecStop=@sbindir@/lustre_rmmod ptlrpc
+@BUILD_DLC_FALSE@ExecStop=@sbindir@/lctl network down
+@BUILD_DLC_TRUE@ExecStop=@sbindir@/lnetctl lnet unconfigure
+ExecStop=@sbindir@/lustre_rmmod libcfs ldiskfs
+
+[Install]
+WantedBy=multi-user.target