summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Yang <jjyang@mcs.anl.gov>2009-07-07 16:47:53 +0000
committerJames Yang <jjyang@mcs.anl.gov>2009-07-07 16:47:53 +0000
commit429fae8a7c1fa9d56c1f7eca163ef5a7b9eae92b (patch)
tree231064b0805f68bc6db95d2ac20b441cb88a6e00
parent476cb9ac769b3cb43f7da80933d6ea6126aed1dc (diff)
downloadbcfg2-429fae8a7c1fa9d56c1f7eca163ef5a7b9eae92b.tar.gz
bcfg2-429fae8a7c1fa9d56c1f7eca163ef5a7b9eae92b.tar.bz2
bcfg2-429fae8a7c1fa9d56c1f7eca163ef5a7b9eae92b.zip
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
-rw-r--r--src/lib/Server/Admin/Client.py1
-rw-r--r--src/lib/Server/Admin/Init.py8
-rw-r--r--src/lib/Server/Plugins/Metadata.py146
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: