summaryrefslogtreecommitdiffstats
path: root/src/lib/Server/Plugins/BB.py
diff options
context:
space:
mode:
authorAndrew Brestick <brestick@mcs.anl.gov>2008-07-31 20:50:44 +0000
committerAndrew Brestick <brestick@mcs.anl.gov>2008-07-31 20:50:44 +0000
commite9e94e78bb52ca2ec36e3f3402dbde3f8289cdf3 (patch)
tree5f8c573da32e0f3dba86555a3534909abd2bb2d2 /src/lib/Server/Plugins/BB.py
parent7c6c1636a0841ea9c5b28a4223c0cd3677eede53 (diff)
downloadbcfg2-e9e94e78bb52ca2ec36e3f3402dbde3f8289cdf3.tar.gz
bcfg2-e9e94e78bb52ca2ec36e3f3402dbde3f8289cdf3.tar.bz2
bcfg2-e9e94e78bb52ca2ec36e3f3402dbde3f8289cdf3.zip
added support for alternate metadata plugins in bcfg2-admin
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@4845 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib/Server/Plugins/BB.py')
-rw-r--r--src/lib/Server/Plugins/BB.py58
1 files changed, 56 insertions, 2 deletions
diff --git a/src/lib/Server/Plugins/BB.py b/src/lib/Server/Plugins/BB.py
index af3f3d379..50badb7a3 100644
--- a/src/lib/Server/Plugins/BB.py
+++ b/src/lib/Server/Plugins/BB.py
@@ -2,8 +2,9 @@
import Bcfg2.Server.Plugin
import lxml.etree
-import sys, os
+import os, fcntl
from socket import gethostbyname
+from Bcfg2.Server.Plugins.Metadata import MetadataConsistencyError
# map of keywords to profiles
# probably need a better way to do this
@@ -44,6 +45,56 @@ class BB(Bcfg2.Server.Plugin.GeneratorPlugin,
self.nodes = {}
self.dhcpd_loaded = False
self.need_update = False
+
+ def get_groups(self):
+ '''get groups xml tree'''
+ groups_tree = lxml.etree.parse(self.data + "/groups.xml")
+ root = groups_tree.getroot()
+ return root
+
+ def remove_client(self, client_name):
+ '''Remove client from bb.xml'''
+ bb_tree = lxml.etree.parse(self.data + "/bb.xml")
+ root = bb_tree.getroot()
+ if DOMAIN_SUFFIX in client_name:
+ client_name = client_name.split('.')[0]
+ if len(root.xpath(".//Node[@name='%s']" % client_name)) != 1:
+ self.logger.error("Client \"%s\" does not exist" % client_name)
+ raise MetadataConsistencyError
+ else:
+ root.remove(root.xpath(".//Node[@name='%s']" % client_name)[0])
+ self.write_metadata(bb_tree)
+
+ def add_client(self, client_name, attribs):
+ '''Add a client to bb.xml'''
+ bb_tree = lxml.etree.parse(self.data + "/bb.xml")
+ root = bb_tree.getroot()
+ if DOMAIN_SUFFIX in client_name:
+ client_name = client_name.split('.')[0]
+ if len(root.xpath(".//Node[@name='%s']" % client_name)) != 0:
+ self.logger.error("Client \"%s\" already exists" % client_name)
+ raise MetadataConsistencyError
+ else:
+ element = lxml.etree.Element("Client", name=client_name)
+ for key, val in attribs.iteritems():
+ element.set(key, val)
+ root.append(element)
+ self.write_metadata(bb_tree)
+
+ def write_metadata(self, tree):
+ '''write metadata back to bb.xml'''
+ data_file = open(self.data + "/bb.xml","w")
+ fd = data_file.fileno()
+ while True:
+ try:
+ fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
+ except IOError:
+ continue
+ else:
+ break
+ tree.write(data_file)
+ fcntl.lockf(fd, fcntl.LOCK_UN)
+ data_file.close()
def gen_dhcpd(self, entry, metadata):
'''Generate dhcpd.conf to serve to dhcp server'''
@@ -149,7 +200,7 @@ class BB(Bcfg2.Server.Plugin.GeneratorPlugin,
if node.attrib['name'] == metadata.hostname.split('.')[0]:
node.attrib['action'] = action
break
- bb_tree.write("%s/%s" % (self.data, 'bb.xml'))
+ self.write_metadata(bb_tree)
return bundles
def HandleEvent(self, event=None):
@@ -209,6 +260,9 @@ class BB(Bcfg2.Server.Plugin.GeneratorPlugin,
self.nodes[host] = node_dict
# update symlinks and /etc/dhcp3/dhcpd.conf
if self.write_to_disk:
+ if not node_dict.has_key('mac'):
+ self.logger.error("no mac address for %s" % host)
+ continue
mac = node_dict['mac'].replace(':','-').lower()
linkname = "/tftpboot/pxelinux.cfg/01-%s" % (mac)
try: