From 429fae8a7c1fa9d56c1f7eca163ef5a7b9eae92b Mon Sep 17 00:00:00 2001 From: James Yang Date: Tue, 7 Jul 2009 16:47:53 +0000 Subject: Made fixes to Metadata, Client, and Init, and added methods for bcfg2-admin group and bundle.x git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5312 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Server/Admin/Client.py | 1 + src/lib/Server/Admin/Init.py | 8 +- src/lib/Server/Plugins/Metadata.py | 146 +++++++++++++++++++++++++++++++------ 3 files changed, 132 insertions(+), 23 deletions(-) diff --git a/src/lib/Server/Admin/Client.py b/src/lib/Server/Admin/Client.py index db2e02761..11853f7a2 100644 --- a/src/lib/Server/Admin/Client.py +++ b/src/lib/Server/Admin/Client.py @@ -1,3 +1,4 @@ +import lxml.etree import Bcfg2.Server.Admin from Bcfg2.Server.Plugins.Metadata import MetadataConsistencyError diff --git a/src/lib/Server/Admin/Init.py b/src/lib/Server/Admin/Init.py index 0930fa1f3..0ad36b5d3 100644 --- a/src/lib/Server/Admin/Init.py +++ b/src/lib/Server/Admin/Init.py @@ -214,6 +214,12 @@ class Init(Bcfg2.Server.Admin.Mode): continue for plugin in plugins: - getattr(getattr(getattr(Bcfg2.Server.Plugins, plugin), plugin), 'init_repo')(repo) + if plugin = 'Metadata': + Bcfg2.Server.Plugins.Metadata.Metadata.init_repo(repo, groups, os_selection, clients) + else: + try: + getattr(getattr(getattr(Bcfg2.Server.Plugins, plugin), plugin), 'init_repo')(repo) + except: + print 'Plugin setup for %s failed. Check that dependencies are installed?' % plugin print "Repository created successfuly in %s" % (self.repopath) diff --git a/src/lib/Server/Plugins/Metadata.py b/src/lib/Server/Plugins/Metadata.py index df6e571e0..88b5092c8 100644 --- a/src/lib/Server/Plugins/Metadata.py +++ b/src/lib/Server/Plugins/Metadata.py @@ -100,8 +100,8 @@ class Metadata(Bcfg2.Server.Plugin.Plugin, self.get_all_group_names) @classmethod - def init_repo(self, repo): - Bcfg2.Server.Plugin.init_repo(repo) + def init_repo(self, repo, groups, os_selection, clients): + Bcfg2.Server.Plugin.Plugin.init_repo(repo) open("%s/Metadata/groups.xml" % repo, "w").write(groups % os_selection) open("%s/Metadata/clients.xml" % @@ -113,30 +113,30 @@ class Metadata(Bcfg2.Server.Plugin.Plugin, root = groups_tree.getroot() return root - def search_client(self, client_name, tree): - '''find a client''' - for node in tree.findall("//Client"): - if node.get("name") == client_name: + def search_group(self, group_name, tree): + '''find a group''' + for node in tree.findall("//Group"): + if node.get("name") == group_name: return node for child in node: - if child.tag == "Alias" and child.attrib["name"] == client_name: + if child.tag == "Alias" and child.attrib["name"] == group_name: return node return None - def add_client(self, client_name, attribs): - '''add client to clients.xml''' - tree = lxml.etree.parse(self.data + "/clients.xml") + def add_group(self, group_name, attribs): + '''add group to groups.xml''' + tree = lxml.etree.parse(self.data + "/groups.xml") root = tree.getroot() - element = lxml.etree.Element("Client", name=client_name) + element = lxml.etree.Element("Group", name=group_name) for key, val in attribs.iteritems(): element.set(key, val) - node = self.search_client(client_name, tree) + node = self.search_group(group_name, tree) if node != None: - self.logger.error("Client \"%s\" already exists" % (client_name)) + self.logger.error("Group \"%s\" already exists" % (group_name)) raise MetadataConsistencyError root.append(element) - client_tree = open(self.data + "/clients.xml","w") - fd = client_tree.fileno() + group_tree = open(self.data + "/groups.xml","w") + fd = group_tree.fileno() while True: try: fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) @@ -144,19 +144,121 @@ class Metadata(Bcfg2.Server.Plugin.Plugin, continue else: break - tree.write(client_tree) + tree.write(group_tree) fcntl.lockf(fd, fcntl.LOCK_UN) - client_tree.close() + group_tree.close() - def remove_client(self, client_name): - '''Remove a client''' - tree = lxml.etree.parse(self.data + "/clients.xml") + def update_group(self, group_name, attribs): + '''Update a group's attributes''' + tree = lxml.etree.parse(self.data + "/groups.xml") root = tree.getroot() - node = self.search_client(client_name, tree) + node = self.search_group(group_name, tree) if node == None: - self.logger.error("Client \"%s\" not found" % (client_name)) + self.logger.error("Group \"%s\" not found" % (group_name)) + raise MetadataConsistencyError + node.attrib.update(attribs) + group_tree = open(self.data + "/groups.xml","w") + fd = group_tree.fileno() + while True: + try: + fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + except IOError: + continue + else: + break + tree.write(group_tree) + fcntl.lockf(fd, fcntl.LOCK_UN) + group_tree.close() + + def remove_group(self, group_name): + '''Remove a group''' + tree = lxml.etree.parse(self.data + "/groups.xml") + root = tree.getroot() + node = self.search_group(group_name, tree) + if node == None: + self.logger.error("Client \"%s\" not found" % (group_name)) + raise MetadataConsistencyError + root.remove(node) + group_tree = open(self.data + "/groups.xml","w") + fd = group_tree.fileno() + while True: + try: + fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + except IOError: + continue + else: + break + tree.write(group_tree) + fcntl.lockf(fd, fcntl.LOCK_UN) + group_tree.close() + + def add_bundle(self, bundle_name): + '''add bundle to groups.xml''' + tree = lxml.etree.parse(self.data + "/groups.xml") + root = tree.getroot() + element = lxml.etree.Element("Bundle", name=bundle_name) + node = self.search_group(bundle_name, tree) + if node != None: + self.logger.error("Bundle \"%s\" already exists" % (bundle_name)) + raise MetadataConsistencyError + root.append(element) + group_tree = open(self.data + "/groups.xml","w") + fd = group_tree.fileno() + while True: + try: + fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + except IOError: + continue + else: + break + tree.write(group_tree) + fcntl.lockf(fd, fcntl.LOCK_UN) + group_tree.close() + + def remove_bundle(self, bundle_name): + '''Remove a bundle''' + tree = lxml.etree.parse(self.data + "/groups.xml") + root = tree.getroot() + node = self.search_group(bundle_name, tree) + if node == None: + self.logger.error("Bundle \"%s\" not found" % (bundle_name)) raise MetadataConsistencyError root.remove(node) + group_tree = open(self.data + "/groups.xml","w") + fd = group_tree.fileno() + while True: + try: + fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + except IOError: + continue + else: + break + tree.write(group_tree) + fcntl.lockf(fd, fcntl.LOCK_UN) + group_tree.close() + + def search_client(self, client_name, tree): + '''find a client''' + for node in tree.findall("//Client"): + if node.get("name") == client_name: + return node + for child in node: + if child.tag == "Alias" and child.attrib["name"] == client_name: + return node + return None + + def add_client(self, client_name, attribs): + '''add client to clients.xml''' + tree = lxml.etree.parse(self.data + "/clients.xml") + root = tree.getroot() + element = lxml.etree.Element("Client", name=client_name) + for key, val in attribs.iteritems(): + element.set(key, val) + node = self.search_client(client_name, tree) + if node != None: + self.logger.error("Client \"%s\" already exists" % (client_name)) + raise MetadataConsistencyError + root.append(element) client_tree = open(self.data + "/clients.xml","w") fd = client_tree.fileno() while True: -- cgit v1.2.3-1-g7c22