Blob Blame Raw
From f808062081e1cbfeaf1419ba037aa0aa677a0e44 Mon Sep 17 00:00:00 2001
From: Mark Reynolds <mreynolds@redhat.com>
Date: Wed, 4 Sep 2013 11:43:22 -0400
Subject: [PATCH 3/4] Ticket 47500 - start-dirsrv/restart-dirsrv/stop-disrv do not register with systemd correctly

Description:  If "systemctl" is available on the system, and the user is root, then
              use systemctl to start & stop the server.

https://fedorahosted.org/389/ticket/47500

Reviewed by: richm(Thanks!)
(cherry picked from commit ba00d4885b93f8cc8d6eb1460bd0b5019e4d2fc2)
(cherry picked from commit 060c05c1d89ee92e17c797aa27d4a87a9f4789de)
---
 ldap/admin/src/scripts/start-dirsrv.in |   18 ++++++++++++++----
 ldap/admin/src/scripts/stop-dirsrv.in  |   29 ++++++++++++++++++++++++++---
 2 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/ldap/admin/src/scripts/start-dirsrv.in b/ldap/admin/src/scripts/start-dirsrv.in
index a163cef..481797d 100755
--- a/ldap/admin/src/scripts/start-dirsrv.in
+++ b/ldap/admin/src/scripts/start-dirsrv.in
@@ -60,11 +60,21 @@ start_instance() {
             rm -f $PIDFILE
         fi
     fi
-    cd $SERVERBIN_DIR; ./ns-slapd -D $CONFIG_DIR -i $PIDFILE -w $STARTPIDFILE "$@"
-    if [ $? -ne 0 ]; then
-        return 1
+    #
+    # Use systemctl if available and running as root, 
+    # otherwise start the instance the old way.
+    #
+    if [ -d "@systemdsystemunitdir@" ] && [ "$(id -u)" == "0" ];then
+        @bindir@/systemctl start @package_name@@$SERV_ID.service
+        if [ $? -ne 0 ]; then
+            return 1
+        fi
+    else
+        cd $SERVERBIN_DIR; ./ns-slapd -D $CONFIG_DIR -i $PIDFILE -w $STARTPIDFILE "$@"
+        if [ $? -ne 0 ]; then
+            return 1
+        fi
     fi
-
     loop_counter=1
     # wait for 10 seconds for the start pid file to appear
     max_count=${STARTPID_TIME:-10}
diff --git a/ldap/admin/src/scripts/stop-dirsrv.in b/ldap/admin/src/scripts/stop-dirsrv.in
index bc38134..3f02e78 100755
--- a/ldap/admin/src/scripts/stop-dirsrv.in
+++ b/ldap/admin/src/scripts/stop-dirsrv.in
@@ -35,10 +35,33 @@ stop_instance() {
         fi
         return 2
     }
-    # server is running - kill it
-    kill $PID
-    loop_counter=1
+    
+    #
+    # use systemctl if running as root
+    #
+    if [ -d "@systemdsystemunitdir@" ] && [ "$(id -u)" == "0" ];then
+        # 
+        # Now, check if systemctl is aware of this running instance
+        #
+        @bindir@/systemctl is-active @package_name@@$SERV_ID.service > /dev/null 2>&1
+        if [ $? -eq 0 ]; then
+            # 
+            # systemctl sees the running process, so stop it correctly
+            #
+            @bindir@/systemctl stop @package_name@@$SERV_ID.service
+        else
+            # 
+            # Have to kill it since systemctl doesn't think it's running
+            #
+            kill $PID
+        fi
+    else
+        # server is running - kill it
+        kill $PID
+    fi
+    
     # wait for 10 minutes (600 times 1 second)
+    loop_counter=1
     max_count=600
     while test $loop_counter -le $max_count; do
         loop_counter=`expr $loop_counter + 1`
-- 
1.7.1