Hi,

I have noticed that there are no methods for manipulating the services option of [sssd] in SSSDConfig. I have created a patch that adds these methods, see attachment.

Honza

--
Jan Cholasta
>From 2c7b1fe62e5bc6169bab49a27802c51a066588ed Mon Sep 17 00:00:00 2001
From: Jan Cholasta <[email protected]>
Date: Wed, 8 Feb 2012 10:42:04 -0500
Subject: [PATCH] Add methods for activating and deactivating services to
 SSSDConfig

---
 src/config/SSSDConfig.py     |   84 ++++++++++++++++++++++++++++++++++++++++++
 src/config/SSSDConfigTest.py |   62 +++++++++++++++++++++++++++++++
 2 files changed, 146 insertions(+), 0 deletions(-)

diff --git a/src/config/SSSDConfig.py b/src/config/SSSDConfig.py
index 9fbe674..4974a6b 100644
--- a/src/config/SSSDConfig.py
+++ b/src/config/SSSDConfig.py
@@ -1433,6 +1433,90 @@ class SSSDConfig(SSSDChangeConf):
         self.save_service(service)
         return service
 
+    def activate_service(self, name):
+        """
+        Activate a service
+
+        name:
+          The name of the service to activate
+
+        === Returns ===
+        No return value
+
+        === Errors ===
+        NotInitializedError:
+          This SSSDConfig object has not had import_config() or new_config()
+          run on it yet.
+        NoServiceError:
+          There is no such service with the specified name in the SSSDConfig.
+        """
+
+        if not self.initialized:
+            raise NotInitializedError
+
+        if name not in self.list_services():
+            raise NoServiceError
+
+        item = self.get_option_index('sssd', 'services')[1]
+        if not item:
+            self.set('sssd','services', name)
+            return
+
+        # Turn the items into a set of dictionary keys
+        # This guarantees uniqueness and makes it easy
+        # to add a new value
+        service_dict = dict.fromkeys(striplist(item['value'].split(',')))
+        if service_dict.has_key(''):
+            del service_dict['']
+
+        # Add a new key for the service being activated
+        service_dict[name] = None
+
+        # Write out the joined keys
+        self.set('sssd','services', ", ".join(service_dict.keys()))
+
+    def deactivate_service(self, name):
+        """
+        Deactivate a service
+
+        name:
+          The name of the service to deactivate
+
+        === Returns ===
+        No return value
+
+        === Errors ===
+        NotInitializedError:
+          This SSSDConfig object has not had import_config() or new_config()
+          run on it yet.
+        NoServiceError:
+          There is no such service with the specified name in the SSSDConfig.
+        """
+
+        if not self.initialized:
+            raise NotInitializedError
+
+        if name not in self.list_services():
+            raise NoServiceError
+        item = self.get_option_index('sssd', 'services')[1]
+        if not item:
+            self.set('sssd','services', '')
+            return
+
+        # Turn the items into a set of dictionary keys
+        # This guarantees uniqueness and makes it easy
+        # to remove the one unwanted value.
+        service_dict = dict.fromkeys(striplist(item['value'].split(',')))
+        if service_dict.has_key(''):
+            del service_dict['']
+
+        # Remove the unwanted service from the lest
+        if service_dict.has_key(name):
+            del service_dict[name]
+
+        # Write out the joined keys
+        self.set('sssd','services', ", ".join(service_dict.keys()))
+
     def delete_service(self, name):
         """
         Remove a service from the SSSDConfig object. This function will also
diff --git a/src/config/SSSDConfigTest.py b/src/config/SSSDConfigTest.py
index 5583f56..cfb1e01 100755
--- a/src/config/SSSDConfigTest.py
+++ b/src/config/SSSDConfigTest.py
@@ -1283,6 +1283,68 @@ class SSSDConfigTestSSSDConfig(unittest.TestCase):
         # Negative Test - Type Error
         self.assertRaises(TypeError, sssdconfig.save_service, self)
 
+    def testActivateService(self):
+        sssdconfig = SSSDConfig.SSSDConfig(srcdir + "/etc/sssd.api.conf",
+                                           srcdir + "/etc/sssd.api.d")
+
+        service_name = 'pam'
+
+        # Negative test - Not initialized
+        self.assertRaises(SSSDConfig.NotInitializedError,
+                          sssdconfig.activate_service, service_name)
+
+        sssdconfig.import_config(srcdir + "/testconfigs/sssd-valid.conf")
+
+        # Positive test - Activate an inactive service
+        self.assertTrue(service_name in sssdconfig.list_services())
+
+        sssdconfig.activate_service(service_name)
+        self.assertTrue(service_name in sssdconfig.list_services())
+
+        # Positive test - Activate an active service
+        # This should succeed
+        sssdconfig.activate_service(service_name)
+        self.assertTrue(service_name in sssdconfig.list_services())
+
+        # Negative test - Invalid service name
+        self.assertRaises(SSSDConfig.NoServiceError,
+                          sssdconfig.activate_service, 'nosuchservice')
+
+        # Negative test - Invalid service name type
+        self.assertRaises(SSSDConfig.NoServiceError,
+                          sssdconfig.activate_service, self)
+
+    def testDeactivateService(self):
+        sssdconfig = SSSDConfig.SSSDConfig(srcdir + "/etc/sssd.api.conf",
+                                           srcdir + "/etc/sssd.api.d")
+
+        service_name = 'pam'
+
+        # Negative test - Not initialized
+        self.assertRaises(SSSDConfig.NotInitializedError,
+                          sssdconfig.activate_service, service_name)
+
+        sssdconfig.import_config(srcdir + "/testconfigs/sssd-valid.conf")
+
+        # Positive test -Deactivate an active service
+        self.assertTrue(service_name in sssdconfig.list_services())
+
+        sssdconfig.deactivate_service(service_name)
+        self.assertTrue(service_name in sssdconfig.list_services())
+
+        # Positive test - Deactivate an inactive service
+        # This should succeed
+        sssdconfig.deactivate_service(service_name)
+        self.assertTrue(service_name in sssdconfig.list_services())
+
+        # Negative test - Invalid service name
+        self.assertRaises(SSSDConfig.NoServiceError,
+                          sssdconfig.activate_service, 'nosuchservice')
+
+        # Negative test - Invalid service name type
+        self.assertRaises(SSSDConfig.NoServiceError,
+                          sssdconfig.activate_service, self)
+
     def testListActiveDomains(self):
         sssdconfig = SSSDConfig.SSSDConfig(srcdir + "/etc/sssd.api.conf",
                                            srcdir + "/etc/sssd.api.d")
-- 
1.7.6.5

_______________________________________________
sssd-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to