From e9e94e78bb52ca2ec36e3f3402dbde3f8289cdf3 Mon Sep 17 00:00:00 2001 From: Andrew Brestick Date: Thu, 31 Jul 2008 20:50:44 +0000 Subject: 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 --- src/lib/Server/Plugins/BB.py | 58 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) (limited to 'src/lib/Server/Plugins/BB.py') 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: -- cgit v1.2.3-1-g7c22