From 09e510adfa71985c6dec8fb501fa3b18b7b28649 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Tue, 18 Sep 2012 08:25:12 -0400 Subject: SEModules: fixed handling of module names again --- src/lib/Bcfg2/Client/Tools/SELinux.py | 12 ++---- src/lib/Bcfg2/Server/Plugins/SEModules.py | 21 +++++++-- .../TestServer/TestPlugins/TestSEModules.py | 50 ++++++++++++---------- 3 files changed, 49 insertions(+), 34 deletions(-) diff --git a/src/lib/Bcfg2/Client/Tools/SELinux.py b/src/lib/Bcfg2/Client/Tools/SELinux.py index f060a1374..babdaf6bf 100644 --- a/src/lib/Bcfg2/Client/Tools/SELinux.py +++ b/src/lib/Bcfg2/Client/Tools/SELinux.py @@ -703,14 +703,8 @@ class SELinuxModuleHandler(SELinuxEntryHandler): return rv def _filepath(self, entry): - path = os.path.join("/usr/share/selinux", self.setype, - entry.get("name").lstrip("/")) - if not path.endswith(".pp"): - # the entry name we get from the SEModules plugin should - # always have .pp on the end, but we double check just to - # make absolutely certain - path = path + ".pp" - return path + return os.path.join("/usr/share/selinux", self.setype, + entry.get("name") + '.pp') def _pathentry(self, entry): pathentry = copy.deepcopy(entry) @@ -737,7 +731,7 @@ class SELinuxModuleHandler(SELinuxEntryHandler): try: # if seobject has the moduleRecords attribute, install the # module using the seobject library - self.records + self.records # pylint: disable=W0104 return self._install_seobject(entry) except AttributeError: # seobject doesn't have the moduleRecords attribute, so diff --git a/src/lib/Bcfg2/Server/Plugins/SEModules.py b/src/lib/Bcfg2/Server/Plugins/SEModules.py index 324c2309f..ce75be044 100644 --- a/src/lib/Bcfg2/Server/Plugins/SEModules.py +++ b/src/lib/Bcfg2/Server/Plugins/SEModules.py @@ -20,7 +20,7 @@ class SEModules(Bcfg2.Server.Plugin.GroupSpool): entry_type = 'SELinux' experimental = True - def _get_module_name(self, entry): + def _get_module_filename(self, entry): """ GroupSpool stores entries as /foo.pp, but we want people to be able to specify module entries as name='foo' or name='foo.pp', so we put this abstraction in between """ @@ -28,17 +28,32 @@ class SEModules(Bcfg2.Server.Plugin.GroupSpool): name = entry.get("name") else: name = entry.get("name") + ".pp" + return "/" + name + + def _get_module_name(self, entry): + """ On the client we do most of our logic on just the module + name, but we want people to be able to specify module entries + as name='foo' or name='foo.pp', so we put this abstraction in + between""" + if entry.get("name").endswith(".pp"): + name = entry.get("name")[:-3] + else: + name = entry.get("name") return name.lstrip("/") def HandlesEntry(self, entry, metadata): + print "entry.tag = %s, self.Entries = %s" % (entry.tag, self.Entries.keys()) + print "entry type = %s" % entry.get('type') if entry.tag in self.Entries and entry.get('type') == 'module': - return "/" + self._get_module_name(entry) in self.Entries[entry.tag] + print " filename = %s, self.Entries[%s] = %s" % (self._get_module_filename(entry), entry.tag, self.Entries[entry.tag].keys()) + return self._get_module_filename(entry) in self.Entries[entry.tag] return Bcfg2.Server.Plugin.GroupSpool.HandlesEntry(self, entry, metadata) def HandleEntry(self, entry, metadata): entry.set("name", self._get_module_name(entry)) - return self.Entries[entry.tag]["/" + entry.get("name")](entry, metadata) + bind = self.Entries[entry.tag][self._get_module_filename(entry)] + return bind(entry, metadata) def add_entry(self, event): self.filename_pattern = \ diff --git a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestSEModules.py b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestSEModules.py index bf9ef681a..b13a6b3fb 100644 --- a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestSEModules.py +++ b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestSEModules.py @@ -1,7 +1,6 @@ import os import sys import lxml.etree -import Bcfg2.Server.Plugin from Bcfg2.Compat import b64encode from mock import Mock, MagicMock, patch from Bcfg2.Server.Plugins.SEModules import * @@ -41,11 +40,17 @@ class TestSEModules(TestGroupSpool): modules = self.get_obj() for mname in ["foo", "foo.pp"]: entry = lxml.etree.Element("SELinux", type="module", name=mname) - self.assertEqual(modules._get_module_name(entry), "foo.pp") + self.assertEqual(modules._get_module_name(entry), "foo") - @patch("Bcfg2.Server.Plugins.SEModules.SEModules._get_module_name") - def test_HandlesEntry(self, mock_get_name): + def test__get_module_filename(self): modules = self.get_obj() + for mname in ["foo", "foo.pp"]: + entry = lxml.etree.Element("SELinux", type="module", name=mname) + self.assertEqual(modules._get_module_filename(entry), "/foo.pp") + + def test_HandlesEntry(self): + modules = self.get_obj() + modules._get_module_filename = Mock() modules.Entries['SELinux']['/foo.pp'] = Mock() modules.Entries['SELinux']['/bar.pp'] = Mock() for el in [lxml.etree.Element("Path", name="foo.pp"), @@ -53,58 +58,59 @@ class TestSEModules(TestGroupSpool): name="foo.pp"), lxml.etree.Element("SELinux", type="module", name="baz.pp")]: - mock_get_name.return_value = el.get("name") + modules._get_module_filename.return_value = "/" + el.get("name") self.assertFalse(modules.HandlesEntry(el, Mock())) if el.get("type") == "module": - mock_get_name.assert_called_with(el) + modules._get_module_filename.assert_called_with(el) for el in [lxml.etree.Element("SELinux", type="module", name="foo.pp"), lxml.etree.Element("SELinux", type="module", name="bar.pp")]: - mock_get_name.return_value = el.get("name") + modules._get_module_filename.return_value = "/" + el.get("name") self.assertTrue(modules.HandlesEntry(el, Mock()), msg="SEModules fails to handle %s" % el.get("name")) - mock_get_name.assert_called_with(el) + modules._get_module_filename.assert_called_with(el) TestGroupSpool.test_HandlesEntry(self) - @patch("Bcfg2.Server.Plugins.SEModules.SEModules._get_module_name") - def test_HandleEntry(self, mock_get_name): + def test_HandleEntry(self): modules = self.get_obj() + modules._get_module_name = Mock() handler = Mock() modules.Entries['SELinux']['/foo.pp'] = handler - mock_get_name.return_value = "foo.pp" - + modules._get_module_name.return_value = "foo" + entry = lxml.etree.Element("SELinux", type="module", name="foo") metadata = Mock() self.assertEqual(modules.HandleEntry(entry, metadata), handler.return_value) - mock_get_name.assert_called_with(entry) - self.assertEqual(entry.get("name"), mock_get_name.return_value) + modules._get_module_name.assert_called_with(entry) + self.assertEqual(entry.get("name"), + modules._get_module_name.return_value) handler.assert_called_with(entry, metadata) TestGroupSpool.test_HandlesEntry(self) def test_add_entry(self): - @patch("%s.%s.event_path" % - (self.test_obj.__module__, self.test_obj.__name__)) @patch("%s.%s.add_entry" % (self.test_obj.__base__.__module__, self.test_obj.__base__.__name__)) - def inner(mock_add_entry, mock_event_path): + def inner(mock_add_entry): modules = self.get_obj() + modules.event_path = Mock() evt = Mock() evt.filename = "test.pp.G10_foo" - mock_event_path.return_value = os.path.join(datastore, - self.test_obj.__name__, - "test.pp", - "test.pp.G10_foo") + modules.event_path.return_value = \ + os.path.join(datastore, + self.test_obj.__name__, + "test.pp", + "test.pp.G10_foo") modules.add_entry(evt) self.assertEqual(modules.filename_pattern, "test.pp") mock_add_entry.assert_called_with(modules, evt) - mock_event_path.assert_called_with(evt) + modules.event_path.assert_called_with(evt) inner() TestGroupSpool.test_add_entry(self) -- cgit v1.2.3-1-g7c22