summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--cobbler.spec24
-rw-r--r--cobbler/collection.py24
-rw-r--r--cobbler/collection_distros.py3
-rw-r--r--cobbler/collection_profiles.py3
-rw-r--r--cobbler/collection_repos.py3
-rw-r--r--cobbler/collection_systems.py3
-rw-r--r--setup.py24
-rw-r--r--tests/tests.py8
9 files changed, 61 insertions, 32 deletions
diff --git a/AUTHORS b/AUTHORS
index d29fa74..9fe4bba 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -13,6 +13,7 @@ Patches and other contributions from:
Jim Meyering <jim@meyering.net>
Mihai Ibanescu <mihai.ibanescu@gmail.com>
Tru Huynh <tru@pasteur.fr>
+ Adam Rosenwald <thestrider@gmail.com>
Scott Seago <sseago@redhat.com>
[...send patches to get your name here...]
diff --git a/cobbler.spec b/cobbler.spec
index a18a053..8835d83 100644
--- a/cobbler.spec
+++ b/cobbler.spec
@@ -110,14 +110,22 @@ test "x$RPM_BUILD_ROOT" != "x" && rm -rf $RPM_BUILD_ROOT
%dir /var/log/cobbler/syslog
%defattr(2550,root,root)
%dir /var/lib/cobbler
-%dir /var/lib/cobbler/triggers/add/distro
-%dir /var/lib/cobbler/triggers/add/profile
-%dir /var/lib/cobbler/triggers/add/system
-%dir /var/lib/cobbler/triggers/add/repo
-%dir /var/lib/cobbler/triggers/delete/distro
-%dir /var/lib/cobbler/triggers/delete/profile
-%dir /var/lib/cobbler/triggers/delete/system
-%dir /var/lib/cobbler/triggers/delete/repo
+%dir /var/lib/cobbler/triggers/add/distro/pre
+%dir /var/lib/cobbler/triggers/add/distro/post
+%dir /var/lib/cobbler/triggers/add/profile/pre
+%dir /var/lib/cobbler/triggers/add/profile/post
+%dir /var/lib/cobbler/triggers/add/system/pre
+%dir /var/lib/cobbler/triggers/add/system/post
+%dir /var/lib/cobbler/triggers/add/repo/pre
+%dir /var/lib/cobbler/triggers/add/repo/post
+%dir /var/lib/cobbler/triggers/delete/distro/pre
+%dir /var/lib/cobbler/triggers/delete/distro/post
+%dir /var/lib/cobbler/triggers/delete/profile/pre
+%dir /var/lib/cobbler/triggers/delete/profile/post
+%dir /var/lib/cobbler/triggers/delete/system/pre
+%dir /var/lib/cobbler/triggers/delete/system/post
+%dir /var/lib/cobbler/triggers/delete/repo/pre
+%dir /var/lib/cobbler/triggers/delete/repo/post
/var/lib/cobbler/elilo-3.6-ia64.efi
/var/lib/cobbler/menu.c32
%defattr(-,root,root)
diff --git a/cobbler/collection.py b/cobbler/collection.py
index b1c3be4..6a8c787 100644
--- a/cobbler/collection.py
+++ b/cobbler/collection.py
@@ -85,13 +85,27 @@ class Collection(serializable.Serializable):
if the object was added to the collection. Returns False if the
object specified by ref deems itself invalid (and therefore
won't be added to the collection).
+
+ with_copy is a bit of a misnomer, but lots of internal add operations
+ can run with "with_copy" as False. True means a real final commit, as if
+ entered from the command line (or basically, by a user).
+
+ With with_copy as False, the particular add call might just be being run
+ during deserialization, in which case extra semantics around the add don't really apply.
+ So, in that case, don't run any triggers and don't deal with any actual files.
+
"""
if ref is None or not ref.is_valid():
raise CX(_("invalid parameter"))
- self.listing[ref.name] = ref
+ if not with_copy:
+ # don't need to run triggers, so add it already ...
+ self.listing[ref.name] = ref
# perform filesystem operations
if with_copy:
+ # failure of a pre trigger will prevent the object from being added
+ self._run_triggers(ref,"/var/lib/cobbler/triggers/add/%s/pre/*" % self.collection_type())
+ self.listing[ref.name] = ref
lite_sync = action_litesync.BootLiteSync(self.config)
if isinstance(ref, item_system.System):
lite_sync.add_single_system(ref.name)
@@ -104,15 +118,17 @@ class Collection(serializable.Serializable):
# save the tree, so if neccessary, scripts can examine it.
self.config.api.serialize()
-
- self._run_triggers(ref,"/var/lib/cobbler/triggers/add/%s/*" % self.collection_type())
+ self._run_triggers(ref,"/var/lib/cobbler/triggers/add/%s/post/*" % self.collection_type())
+
return True
def _run_triggers(self,ref,globber):
triggers = glob.glob(globber)
for file in triggers:
- sub_process.call("%s %s" % (file,ref.name), shell=True)
+ rc = sub_process.call("%s %s" % (file,ref.name), shell=True)
+ if rc != 0:
+ raise CX(_("cobbler trigger failed: %(file)s returns %(code)d") % { "file" : file, "code" : rc })
def printable(self):
"""
diff --git a/cobbler/collection_distros.py b/cobbler/collection_distros.py
index 3fe45ed..4b88002 100644
--- a/cobbler/collection_distros.py
+++ b/cobbler/collection_distros.py
@@ -52,9 +52,10 @@ class Distros(collection.Collection):
raise CX(_("removal would orphan profile: %s") % v.name)
if self.find(name):
if with_delete:
+ self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/distro/pre/*")
lite_sync = action_litesync.BootLiteSync(self.config)
lite_sync.remove_single_profile(name)
- self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/distro/*")
+ self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/distro/post/*")
del self.listing[name]
return True
raise CX(_("cannot delete object that does not exist"))
diff --git a/cobbler/collection_profiles.py b/cobbler/collection_profiles.py
index cd1d104..bebaf49 100644
--- a/cobbler/collection_profiles.py
+++ b/cobbler/collection_profiles.py
@@ -50,9 +50,10 @@ class Profiles(collection.Collection):
raise CX(_("removal would orphan system: %s") % v.name)
if self.find(name):
if with_delete:
+ self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/profile/pre/*")
lite_sync = action_litesync.BootLiteSync(self.config)
lite_sync.remove_single_profile(name)
- self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/profile/*")
+ self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/profile/post/*")
del self.listing[name]
return True
raise CX(_("cannot delete an object that does not exist"))
diff --git a/cobbler/collection_repos.py b/cobbler/collection_repos.py
index 922a1ad..e4e5219 100644
--- a/cobbler/collection_repos.py
+++ b/cobbler/collection_repos.py
@@ -54,8 +54,9 @@ class Repos(collection.Collection):
# but is left in for consistancy in the API.
if self.find(name):
- self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/repo/*")
+ self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/repo/pre/*")
del self.listing[name]
+ self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/repo/post/*")
return True
raise CX(_("cannot delete an object that does not exist"))
diff --git a/cobbler/collection_systems.py b/cobbler/collection_systems.py
index 4eff2fb..952fdba 100644
--- a/cobbler/collection_systems.py
+++ b/cobbler/collection_systems.py
@@ -50,9 +50,10 @@ class Systems(collection.Collection):
"""
if self.find(name):
if with_delete:
+ self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/system/pre/*")
lite_sync = action_litesync.BootLiteSync(self.config)
lite_sync.remove_single_system(name)
- self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/system/*")
+ self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/system/post/*")
del self.listing[name]
return True
raise CX(_("cannot delete an object that does not exist"))
diff --git a/setup.py b/setup.py
index b8a716e..4c30771 100644
--- a/setup.py
+++ b/setup.py
@@ -79,14 +79,22 @@ if __name__ == "__main__":
(vw_links, []),
(tftp_cfg, []),
(tftp_images, []),
- ("/var/lib/cobbler/triggers/add/distro", []),
- ("/var/lib/cobbler/triggers/add/profile", []),
- ("/var/lib/cobbler/triggers/add/system", []),
- ("/var/lib/cobbler/triggers/add/repo", []),
- ("/var/lib/cobbler/triggers/delete/distro", []),
- ("/var/lib/cobbler/triggers/delete/profile", []),
- ("/var/lib/cobbler/triggers/delete/system", []),
- ("/var/lib/cobbler/triggers/delete/repo", [])
+ ("/var/lib/cobbler/triggers/add/distro/pre", []),
+ ("/var/lib/cobbler/triggers/add/distro/post", []),
+ ("/var/lib/cobbler/triggers/add/profile/pre", []),
+ ("/var/lib/cobbler/triggers/add/profile/post", []),
+ ("/var/lib/cobbler/triggers/add/system/pre", []),
+ ("/var/lib/cobbler/triggers/add/system/post", []),
+ ("/var/lib/cobbler/triggers/add/repo/pre", []),
+ ("/var/lib/cobbler/triggers/add/repo/post", []),
+ ("/var/lib/cobbler/triggers/delete/distro/pre", []),
+ ("/var/lib/cobbler/triggers/delete/distro/post", []),
+ ("/var/lib/cobbler/triggers/delete/profile/pre", []),
+ ("/var/lib/cobbler/triggers/delete/profile/post", []),
+ ("/var/lib/cobbler/triggers/delete/system/pre", []),
+ ("/var/lib/cobbler/triggers/delete/system/post", []),
+ ("/var/lib/cobbler/triggers/delete/repo/pre", [])
+ ("/var/lib/cobbler/triggers/delete/repo/post", [])
],
description = SHORT_DESC,
long_description = LONG_DESC
diff --git a/tests/tests.py b/tests/tests.py
index e2b41e1..2f082e7 100644
--- a/tests/tests.py
+++ b/tests/tests.py
@@ -193,14 +193,6 @@ class Additions(BootTest):
# self.failUnlessRaises(CobblerException, profile.set_virt_file_size, "54321.23")
self.assertTrue(self.api.profiles().add(profile))
- def test_invalid_system_bad_name_host(self):
- system = self.api.new_system()
- name = "hostnamewontresolveanyway"
- self.failUnlessRaises(CobblerException, system.set_name, name)
- self.assertTrue(system.set_profile("testprofile0"))
- self.failUnlessRaises(CobblerException, self.api.systems().add, system)
- self.assertFalse(self.api.systems().find(name))
-
def test_system_name_is_a_MAC(self):
system = self.api.new_system()
name = "00:16:41:14:B7:71"