From 4b42c3d665d4d92068e4319dfd35e83a54443f3b Mon Sep 17 00:00:00 2001
From: Jun Futagawa <jfut@integ.jp>
Date: Tue, 15 May 2012 16:38:07 +0900
Subject: [PATCH] Add support to daemon-util for distributions without
 start-stop-daemon

This adds support to daemon-util for Red Hat based distributions that
do not have a start-stop-daemon. If /sbin/start-stop-daemon is not
available, daemon-util will source /etc/rc.d/init.d/functions.
check(), start(), and stop() are updated to use the relevant functions
from /etc/rc.d/init.d/functions.

Thanks to Stephen Fromm and Michael Hanselmann for improving the error
handling, style, and comments.

Signed-off-by: Jun Futagawa <jfut@integ.jp>
Reviewed-by: Michael Hanselmann <hansmi@google.com>
---
 daemons/daemon-util.in | 57 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 47 insertions(+), 10 deletions(-)

diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
index 03decbffb..5bf2c3fa0 100644
--- a/daemons/daemon-util.in
+++ b/daemons/daemon-util.in
@@ -45,6 +45,12 @@ if [[ -s $defaults_file ]]; then
   . $defaults_file
 fi
 
+# Meant to facilitate use utilities in /etc/rc.d/init.d/functions in case
+# start-stop-daemon is not available.
+_ignore_error() {
+  eval "$@" || :
+}
+
 _daemon_pidfile() {
   echo "@LOCALSTATEDIR@/run/ganeti/$1.pid"
 }
@@ -176,9 +182,17 @@ check() {
   fi
 
   local name="$1"; shift
-
-  start-stop-daemon --stop --signal 0 --quiet \
-    --pidfile $(_daemon_pidfile $name)
+  local pidfile=$(_daemon_pidfile $name)
+  local daemonexec=$(_daemon_executable $name)
+
+  if type -p start-stop-daemon >/dev/null; then
+    start-stop-daemon --stop --signal 0 --quiet \
+      --pidfile $pidfile
+  else
+    _ignore_error status \
+      -p $pidfile \
+      $daemonexec
+  fi
 }
 
 # Starts a daemon
@@ -189,6 +203,9 @@ start() {
   fi
 
   local name="$1"; shift
+  local pidfile=$(_daemon_pidfile $name)
+  local usergroup=$(_daemon_usergroup $plain_name)
+  local daemonexec=$(_daemon_executable $name)
 
   if [[ "$name" == ganeti-confd &&
         "@CUSTOM_ENABLE_CONFD@" == False ]]; then
@@ -205,11 +222,20 @@ start() {
 
   @PKGLIBDIR@/ensure-dirs
 
-  start-stop-daemon --start --quiet --oknodo \
-    --pidfile $(_daemon_pidfile $name) \
-    --startas $(_daemon_executable $name) \
-    --chuid $(_daemon_usergroup $plain_name) \
-    -- $args "$@"
+  if type -p start-stop-daemon >/dev/null; then
+    start-stop-daemon --start --quiet --oknodo \
+      --pidfile $pidfile \
+      --startas $daemonexec \
+      --chuid $usergroup \
+      -- $args "$@"
+  else
+    # TODO: Find a way to start daemon with a group, until then the group must
+    # be removed
+    _ignore_error daemon \
+      --pidfile $pidfile \
+      --user ${usergroup%:*} \
+      $daemonexec $args "$@"
+  fi
 }
 
 # Stops a daemon
@@ -220,9 +246,14 @@ stop() {
   fi
 
   local name="$1"; shift
+  local pidfile=$(_daemon_pidfile $name)
 
-  start-stop-daemon --stop --quiet --oknodo --retry 30 \
-    --pidfile $(_daemon_pidfile $name)
+  if type -p start-stop-daemon >/dev/null; then
+    start-stop-daemon --stop --quiet --oknodo --retry 30 \
+      --pidfile $pidfile
+  else
+    _ignore_error killproc -p $pidfile $name
+  fi
 }
 
 # Starts a daemon if it's not yet running
@@ -275,6 +306,12 @@ reload_ssh_keys() {
   @RPL_SSH_INITD_SCRIPT@ restart
 }
 
+# Read @SYSCONFDIR@/rc.d/init.d/functions if start-stop-daemon not available
+if ! type -p start-stop-daemon >/dev/null && \
+   [[ -f @SYSCONFDIR@/rc.d/init.d/functions ]]; then
+  _ignore_error . @SYSCONFDIR@/rc.d/init.d/functions
+fi
+
 if [[ "$#" -lt 1 ]]; then
   echo "Usage: $0 <action>" >&2
   exit 1
-- 
GitLab