[freeipmi] added systemd unit files Resolves: #767611

Jan Šafránek jsafrane at fedoraproject.org
Mon Jan 9 07:55:26 UTC 2012


commit bd54804ae7628bda9865b4544e7b8ee33b37a3f7
Author: Jan Safranek <jsafrane at redhat.com>
Date:   Mon Jan 9 08:55:01 2012 +0100

    added systemd unit files
    Resolves: #767611

 bmc-watchdog.service   |   12 ++++++
 freeipmi-systemd.patch |   81 +++++++++++++++++++++++++++++++++++++++++
 freeipmi.spec          |   95 ++++++++++++++++++++++++++++++++----------------
 ipmidetectd.service    |   10 +++++
 4 files changed, 167 insertions(+), 31 deletions(-)
---
diff --git a/bmc-watchdog.service b/bmc-watchdog.service
new file mode 100644
index 0000000..c7ada84
--- /dev/null
+++ b/bmc-watchdog.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=BMC Watchdog Timer Daemon
+After=network.target
+
+[Service]
+Type=forking
+PIDFile=/run/bmc-watchdog.pid
+EnvironmentFile=-/etc/sysconfig/bmc-watchdog
+ExecStart=/usr/sbin/bmc-watchdog $OPTIONS
+
+[Install]
+WantedBy=multi-user.target
diff --git a/freeipmi-systemd.patch b/freeipmi-systemd.patch
new file mode 100644
index 0000000..2c273ba
--- /dev/null
+++ b/freeipmi-systemd.patch
@@ -0,0 +1,81 @@
+Fix daemon startup race.
+
+Accepted upstream as SVN rev. 8299
+diff -up freeipmi-1.1.1/bmc-watchdog/bmc-watchdog.c.systemd freeipmi-1.1.1/bmc-watchdog/bmc-watchdog.c
+--- freeipmi-1.1.1/bmc-watchdog/bmc-watchdog.c.systemd	2012-01-02 20:26:09.000000000 +0100
++++ freeipmi-1.1.1/bmc-watchdog/bmc-watchdog.c	2012-01-06 16:28:55.966295836 +0100
+@@ -1677,6 +1677,10 @@ _daemon_init ()
+       unsigned int i;
+       pid_t pid;
+       FILE *pidfile;
++      int fds[2];
++
++      if ( pipe(fds) < 0 )
++        _err_exit ("pipe: %s", strerror (errno));
+ 
+       if ( (pidfile = fopen(BMC_WATCHDOG_PIDFILE, "w")) == NULL )
+         _err_exit ("fopen: %s", strerror (errno));
+@@ -1684,7 +1688,14 @@ _daemon_init ()
+       if ((pid = fork ()) < 0)
+         _err_exit ("fork: %s", strerror (errno));
+       if (pid)
+-        exit (0);                   /* parent terminates */
++        {
++          /* parent terminates */
++          char buf;
++          read(fds[0], &buf, 1);
++          close(fds[1]);
++          close(fds[0]);
++          exit (0);
++        }
+ 
+       setsid ();
+ 
+@@ -1706,6 +1717,9 @@ _daemon_init ()
+ 
+       umask (0);
+ 
++      write(fds[1], "a", 1);
++      close(fds[1]);
++      close(fds[0]);
+       for (i = 0; i < 64; i++)
+         close (i);
+     }
+diff -up freeipmi-1.1.1/ipmidetectd/ipmidetectd.c.systemd freeipmi-1.1.1/ipmidetectd/ipmidetectd.c
+--- freeipmi-1.1.1/ipmidetectd/ipmidetectd.c.systemd	2012-01-02 20:26:13.000000000 +0100
++++ freeipmi-1.1.1/ipmidetectd/ipmidetectd.c	2012-01-06 16:28:09.309420665 +0100
+@@ -58,12 +58,22 @@ _daemon_init (void)
+   /* Based on code in Unix network programming by R. Stevens */
+   pid_t pid;
+   unsigned int i;
++  int fds[2];
+ 
++  if (pipe(fds) < 0)
++    IPMIDETECTD_EXIT (("pipe: %s", strerror (errno)));
+   if ((pid = fork ()) < 0)
+     IPMIDETECTD_EXIT (("fork: %s", strerror (errno)));
+ 
+-  if (pid != 0)                 /* Terminate Parent */
+-    exit (0);
++  if (pid != 0)
++    {
++      /* Terminate Parent */
++      char buf;
++      read(fds[0], &buf, 1);
++      close(fds[1]);
++      close(fds[0]);
++      exit (0);
++    }
+ 
+   setsid ();
+ 
+@@ -79,6 +89,9 @@ _daemon_init (void)
+   chdir ("/");
+ 
+   umask (0);
++  write(fds[1], "a", 1);
++  close(fds[1]);
++  close(fds[0]);
+ 
+   for (i = 0; i < 64; i++)
+     close (i);
diff --git a/freeipmi.spec b/freeipmi.spec
index 3cb0d24..9856aaa 100644
--- a/freeipmi.spec
+++ b/freeipmi.spec
@@ -2,7 +2,7 @@
 # Copyright (c) 2003 FreeIPMI Core Team
 #
 
-Release: 1%{?dist}
+Release: 2%{?dist}
 
 Name: freeipmi
 Version: 1.1.1
@@ -10,15 +10,15 @@ License: GPLv2+
 Group: Applications/System
 URL: http://www.gnu.org/software/freeipmi/
 Source: ftp://ftp.gluster.com/pub/freeipmi/%{version}/%{name}-%{version}.tar.gz
+Source1: bmc-watchdog.service
+Source2: ipmidetectd.service
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-BuildRequires: libgcrypt-devel texinfo
-Requires(pre): chkconfig
-Requires(post): chkconfig
-Requires(preun): chkconfig
-# for /sbin/service 
-Requires(preun): initscripts
-Requires(post): info
-Requires(preun): info
+BuildRequires: libgcrypt-devel texinfo systemd-units
+Requires(preun): info systemd-units
+Requires(post): info systemd-units systemd-sysv
+Requires(postun): systemd-units
+Patch1: freeipmi-systemd.patch
+
 Summary: IPMI remote console and system management software
 %description
 The FreeIPMI project provides "Remote-Console" (out-of-band) and
@@ -58,6 +58,7 @@ Provides a tool and a daemon for IPMI node detection.
 
 %prep
 %setup -q
+%patch1 -p1 -b .systemd
 
 %build
 export CFLAGS="-D_GNU_SOURCE $RPM_OPT_FLAGS"
@@ -68,19 +69,16 @@ make %{?_smp_mflags}
 %install
 rm -rf $RPM_BUILD_ROOT
 make install DESTDIR="$RPM_BUILD_ROOT"
-# fix coherance problems with associated script filenames
-mkdir -p $RPM_BUILD_ROOT/%{_initrddir}/
-# if check needed for SLES systems
-if [[ "%{_sysconfdir}/init.d" != "%{_initrddir}" ]]
-then
-mv $RPM_BUILD_ROOT/%{_sysconfdir}/init.d/bmc-watchdog $RPM_BUILD_ROOT/%{_initrddir}/bmc-watchdog
-mv $RPM_BUILD_ROOT/%{_sysconfdir}/init.d/ipmidetectd $RPM_BUILD_ROOT/%{_initrddir}/ipmidetectd
-fi
 rm -f %{buildroot}%{_infodir}/dir
 # kludge to get around rpmlint complaining about 0 length semephore file
 echo freeipmi > %{buildroot}%{_localstatedir}/lib/freeipmi/ipckey
 # Remove .la files
 rm -rf $RPM_BUILD_ROOT/%{_libdir}/*.la
+# Install systemd units
+install -m 755 -d $RPM_BUILD_ROOT/%{_unitdir}
+install -m 644 %SOURCE1 %SOURCE2 $RPM_BUILD_ROOT/%{_unitdir}/
+# Remove initscripts
+rm -rf $RPM_BUILD_ROOT/%{_initrddir} $RPM_BUILD_ROOT/%{_sysconfdir}/init.d
 
 %clean
 rm -rf $RPM_BUILD_ROOT
@@ -97,33 +95,65 @@ fi
 %postun -p /sbin/ldconfig
 
 %post bmc-watchdog
-/sbin/chkconfig --add bmc-watchdog
+if [ $1 -eq 1 ] ; then 
+    # Initial installation 
+    /bin/systemctl daemon-reload >/dev/null 2>&1 || :
+fi
 
 %preun bmc-watchdog
-if [ "$1" = 0 ]; then
-    /sbin/service bmc-watchdog stop >/dev/null 2>&1
-    /sbin/chkconfig --del bmc-watchdog
+if [ $1 -eq 0 ] ; then
+    # Package removal, not upgrade
+    /bin/systemctl --no-reload disable bmc-watchdog.service > /dev/null 2>&1 || :
+    /bin/systemctl stop bmc-watchdog.service > /dev/null 2>&1 || :
 fi
 
 %postun bmc-watchdog
-if [ "$1" -ge "1" ] ; then
-    /sbin/service bmc-watchdog condrestart >/dev/null 2>&1 || :
+/bin/systemctl daemon-reload >/dev/null 2>&1 || :
+if [ $1 -ge 1 ] ; then
+    # Package upgrade, not uninstall
+    /bin/systemctl try-restart bmc-watchdog.service >/dev/null 2>&1 || :
 fi
 
 %post ipmidetectd
-/sbin/chkconfig --add ipmidetectd
+if [ $1 -eq 1 ] ; then 
+    # Initial installation 
+    /bin/systemctl daemon-reload >/dev/null 2>&1 || :
+fi
 
 %preun ipmidetectd
-if [ "$1" = 0 ]; then
-    /sbin/service ipmidetectd stop >/dev/null 2>&1
-    /sbin/chkconfig --del ipmidetectd
+if [ $1 -eq 0 ] ; then
+    # Package removal, not upgrade
+    /bin/systemctl --no-reload disable ipmidetectd.service > /dev/null 2>&1 || :
+    /bin/systemctl stop ipmidetectd.service > /dev/null 2>&1 || :
 fi
 
 %postun ipmidetectd
-if [ "$1" -ge "1" ] ; then
-    /sbin/service ipmidetectd condrestart >/dev/null 2>&1 || :
+/bin/systemctl daemon-reload >/dev/null 2>&1 || :
+if [ $1 -ge 1 ] ; then
+    # Package upgrade, not uninstall
+    /bin/systemctl try-restart ipmidetectd.service >/dev/null 2>&1 || :
 fi
 
+%triggerun -- freeipmi-bmc-watchdog < 1.1.1-2
+# Save the current service runlevel info
+# User must manually run systemd-sysv-convert --apply httpd
+# to migrate them to systemd targets
+/usr/bin/systemd-sysv-convert --save bmc-watchdog >/dev/null 2>&1 ||:
+
+# Run these because the SysV package being removed won't do them
+/sbin/chkconfig --del bmc-watchdog >/dev/null 2>&1 || :
+/bin/systemctl try-restart bmc-watchdog.service >/dev/null 2>&1 || :
+
+%triggerun -- freeipmi-ipmidetectd < 1.1.1-2
+# Save the current service runlevel info
+# User must manually run systemd-sysv-convert --apply httpd
+# to migrate them to systemd targets
+/usr/bin/systemd-sysv-convert --save ipmidetectd >/dev/null 2>&1 ||:
+
+# Run these because the SysV package being removed won't do them
+/sbin/chkconfig --del ipmidetectd >/dev/null 2>&1 || :
+/bin/systemctl try-restart ipmidetectd.service >/dev/null 2>&1 || :
+
 %files
 %defattr(-,root,root)
 %dir %{_sysconfdir}/freeipmi/
@@ -315,22 +345,25 @@ fi
 %doc %{_datadir}/doc/%{name}/COPYING.bmc-watchdog
 %doc %{_datadir}/doc/%{name}/DISCLAIMER.bmc-watchdog
 %doc %{_datadir}/doc/%{name}/DISCLAIMER.bmc-watchdog.UC
-%{_initrddir}/bmc-watchdog
 %config(noreplace) %{_sysconfdir}/sysconfig/bmc-watchdog
 %config(noreplace) %{_sysconfdir}/logrotate.d/bmc-watchdog
 %{_sbindir}/bmc-watchdog
 %{_mandir}/man8/bmc-watchdog.8*
+%{_unitdir}/bmc-watchdog.service
 %dir %{_localstatedir}/log/freeipmi
 
 %files ipmidetectd
 %defattr(-,root,root)
-%{_initrddir}/ipmidetectd
 %attr(0600,root,root) %config(noreplace) %{_sysconfdir}/freeipmi/ipmidetectd.conf
 %{_sbindir}/ipmidetectd
 %{_mandir}/man5/ipmidetectd.conf.5*
 %{_mandir}/man8/ipmidetectd.8*
+%{_unitdir}/ipmidetectd.service
 
 %changelog
+* Fri Jan  6 2012 Jan Safranek <jsafrane at redhat.com> - 1.1.1-2
+- added systemd unit files (#767611)
+
 * Wed Jan  4 2012 Jan Safranek <jsafrane at redhat.com> - 1.1.1-1
 - Updated to freeipmi-1.1.1:
   - Support new tool ipmi-pet, tool to parse/interpret platform event
diff --git a/ipmidetectd.service b/ipmidetectd.service
new file mode 100644
index 0000000..60f38cd
--- /dev/null
+++ b/ipmidetectd.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=IPMI Node Detection Monitoring Daemon
+After=network.target
+
+[Service]
+Type=forking
+ExecStart=/usr/sbin/ipmidetectd 
+
+[Install]
+WantedBy=multi-user.target


More information about the scm-commits mailing list