[Freeipa-devel] [PATCH 2/3] Save service name on service startup/shutdown

Simo Sorce simo at redhat.com
Tue Oct 30 17:05:25 UTC 2012


From: Simo Sorce <ssorce at redhat.com>

This is done as a default action of the ancestor class so that no matter what
platform is currently used this code is always the same and the name is the
wellknown service name.
This information will be used by ipactl to stop only and all the services that
have been started by any ipa tool/install script
---
 ipapython/platform/base.py    |   42 +++++++++++++++++++++++++++++++++++++++++
 ipapython/platform/redhat.py  |    2 +
 ipapython/platform/systemd.py |    2 +
 ipapython/services.py.in      |    4 +++
 4 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/ipapython/platform/base.py b/ipapython/platform/base.py
index 2d39d216991c08c4d439a34af99b67b250058889..8385e1038c0609ae06a7a4a25d844de48360f19e 100644
--- a/ipapython/platform/base.py
+++ b/ipapython/platform/base.py
@@ -17,6 +17,8 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 from ipalib.plugable import MagicDict
+import json
+import os
 
 # Canonical names of services as IPA wants to see them. As we need to have
 # *some* naming, set them as in Red Hat distributions. Actual implementation
@@ -40,6 +42,8 @@ wellknownports = {
     'pki-tomcatd': [8080, 8443],  # used if the incoming instance name is blank
 }
 
+SVC_LIST_FILE = "/var/run/ipa/services.list"
+
 class AuthConfig(object):
     """
     AuthConfig class implements system-independent interface to configure
@@ -133,9 +137,47 @@ class PlatformService(object):
         self.service_name = service_name
 
     def start(self, instance_name="", capture_output=True, wait=True):
+        """
+        When a service is started record the fact in a special file.
+        This allows ipactl stop to always stop all services that have
+        been started via ipa tools
+        """
+        svc_list = []
+        try:
+            f = open(SVC_LIST_FILE, 'r')
+            svc_list = json.load(f)
+        except Exception:
+            # not fatal, may be the first service
+            pass
+
+        if self.service_name not in svc_list:
+            svc_list.append(self.service_name)
+
+        f = open(SVC_LIST_FILE, 'w')
+        json.dump(svc_list, f)
+        f.flush()
+        f.close()
         return
 
     def stop(self, instance_name="", capture_output=True):
+        """
+        When a service is stopped remove it from the service list file.
+        """
+        svc_list = []
+        try:
+            f = open(SVC_LIST_FILE, 'r')
+            svc_list = json.load(f)
+        except Exception:
+            # not fatal, may be the first service
+            pass
+
+        while self.service_name in svc_list:
+            svc_list.remove(self.service_name)
+
+        f = open(SVC_LIST_FILE, 'w')
+        json.dump(svc_list, f)
+        f.flush()
+        f.close()
         return
 
     def restart(self, instance_name="", capture_output=True, wait=True):
diff --git a/ipapython/platform/redhat.py b/ipapython/platform/redhat.py
index 3551c28410ceeabfc1064ac79e86dc7ee40dd8c3..1de035568265aeac2a6ab10d2575e2cbeb3579dc 100644
--- a/ipapython/platform/redhat.py
+++ b/ipapython/platform/redhat.py
@@ -66,11 +66,13 @@ class RedHatService(base.PlatformService):
 
     def stop(self, instance_name="", capture_output=True):
         ipautil.run(["/sbin/service", self.service_name, "stop", instance_name], capture_output=capture_output)
+        super(RedHatService, self).stop(instance_name)
 
     def start(self, instance_name="", capture_output=True, wait=True):
         ipautil.run(["/sbin/service", self.service_name, "start", instance_name], capture_output=capture_output)
         if wait and self.is_running(instance_name):
             self.__wait_for_open_ports(instance_name)
+        super(RedHatService, self).start(instance_name)
 
     def restart(self, instance_name="", capture_output=True, wait=True):
         ipautil.run(["/sbin/service", self.service_name, "restart", instance_name], capture_output=capture_output)
diff --git a/ipapython/platform/systemd.py b/ipapython/platform/systemd.py
index 6c25a79b6ecdfbda1c85ada6642a656d704fdb2d..bb6c009299adc9ca8488308afffdd767975fc2ae 100644
--- a/ipapython/platform/systemd.py
+++ b/ipapython/platform/systemd.py
@@ -91,11 +91,13 @@ class SystemdService(base.PlatformService):
 
     def stop(self, instance_name="", capture_output=True):
         ipautil.run(["/bin/systemctl", "stop", self.service_instance(instance_name)], capture_output=capture_output)
+        super(SystemdService, self).stop(instance_name)
 
     def start(self, instance_name="", capture_output=True, wait=True):
         ipautil.run(["/bin/systemctl", "start", self.service_instance(instance_name)], capture_output=capture_output)
         if wait and self.is_running(instance_name):
             self.__wait_for_open_ports(self.service_instance(instance_name))
+        super(SystemdService, self).start(instance_name)
 
     def restart(self, instance_name="", capture_output=True, wait=True):
         # Restart command is broken before systemd-36-3.fc16
diff --git a/ipapython/services.py.in b/ipapython/services.py.in
index 8fe663763d06d89c62604086a3eea7a9a983f49d..16b62ca8508d4078e896cd1da6fd664f52a3930e 100644
--- a/ipapython/services.py.in
+++ b/ipapython/services.py.in
@@ -51,4 +51,8 @@ backup_and_replace_hostname = backup_and_replace_hostname_default
 def check_selinux_status():
     return
 
+from ipapython.platform.base import SVC_LIST_FILE
+def get_svc_list_file():
+    return SVC_LIST_FILE
+
 from ipapython.platform.SUPPORTED_PLATFORM import *
-- 
1.7.1




More information about the Freeipa-devel mailing list