From b41f50e249ae6acff75a1c7838229a922fc58b21 Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Wed, 24 Dec 2008 04:31:55 +0000 Subject: Implement metadata connector functionality git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5000 ce84e21b-d406-0410-9b95-82705330c041 --- doc/composable-metadata | 39 ++++++--- src/lib/Options.py | 2 + src/lib/Server/Admin/Pull.py | 2 +- src/lib/Server/Core.py | 31 ++++--- src/lib/Server/Plugin.py | 12 +++ src/lib/Server/Plugins/Metadata.py | 160 +++++-------------------------------- src/lib/Server/Plugins/Probes.py | 144 +++++++++++++++++++++++++++++++++ src/lib/Server/Plugins/__init__.py | 3 +- src/sbin/bcfg2-info | 26 +++--- src/sbin/bcfg2-server | 12 +-- 10 files changed, 250 insertions(+), 181 deletions(-) create mode 100644 src/lib/Server/Plugins/Probes.py diff --git a/doc/composable-metadata b/doc/composable-metadata index 29673b315..10d55f7c1 100644 --- a/doc/composable-metadata +++ b/doc/composable-metadata @@ -27,20 +27,33 @@ Use Cases API * Bcfg2.Server.Core.Core -** get_metadata() +** build_metadata(client_name) * Bcfg2.Server.Plugin.MetadataPlugin -** add_client() -** remove_client() -** set_profile() -** resolve_client() -** get_initial_metadata() -** merge_additional_metadata() +** get_initial_metadata(client_name) +** merge_additional_metadata(metadata, + source, + group, + data_dict) * Bcfg2.Server.Plugin.MetadataConnectorPlugin -** get_additional_metadata() +** get_additional_metadata(client_metadata) Metadata Resolution Control Flow -1. B.S.P.MP.resolve_client() -> canonical client name -2. B.S.P.MP.get_initial_metadata() -> partial ClientMetadata inst -3. [B.S.P.MCP.get_additional_metadata()] -> - [([group list], {data dictionary})] -4. [B.S.P.MP.merge_additional_metadata()] +* B.S.P.MP.resolve_client() -> canonical client name +* B.S.C.C.build_metadata() +** B.S.P.MP.get_initial_metadata() -> partial ClientMetadata inst +** [B.S.P.MCP.get_additional_metadata()] -> + [([group list], {data dictionary})] +** [B.S.P.MP.merge_additional_metadata()] + +Implementation Plan (done) +* Define new plugin classes +* Split Probe code out to discrete plugin +* Implement connector support in Core +* switch callers to Core.build_metadata +* Implement group inheritance/category safety for Connector groups + +Next Steps +* Figure out new version of properties +* ICE integration? +* zultron's host properties +* other external data sources diff --git a/src/lib/Options.py b/src/lib/Options.py index 43f86956e..0933b61cf 100644 --- a/src/lib/Options.py +++ b/src/lib/Options.py @@ -185,6 +185,8 @@ SERVER_GENERATORS = Option('Server generator list', cf=('server', 'generators'), cook=list_split) SERVER_STRUCTURES = Option('Server structure list', cf=('server', 'structures'), default=['Bundler', 'Base'], cook=list_split) +SERVER_MCONNECT = Option('Server Metadata Connector list', cook=list_split, + cf=('server', 'connectors'), default=['Probes'], ) SERVER_FILEMONITOR = Option('Server file monitor', cf=('server', 'filemonitor'), default='default', odesc='File monitoring driver') SERVER_LOCATION = Option('Server Location', cf=('components', 'bcfg2'), diff --git a/src/lib/Server/Admin/Pull.py b/src/lib/Server/Admin/Pull.py index b5f869d07..ecf86787e 100644 --- a/src/lib/Server/Admin/Pull.py +++ b/src/lib/Server/Admin/Pull.py @@ -90,7 +90,7 @@ class Pull(Bcfg2.Server.Admin.MetadataCore): '''Make currently recorded client state correct for entry''' new_entry = self.BuildNewEntry(client, etype, ename) - meta = self.bcore.metadata.get_metadata(client) + meta = self.bcore.build_metadata(client) # find appropriate plugin in bcore glist = [gen for gen in self.bcore.generators if ename in gen.Entries.get(etype, {})] diff --git a/src/lib/Server/Core.py b/src/lib/Server/Core.py index e25bec4b2..3c8a8c429 100644 --- a/src/lib/Server/Core.py +++ b/src/lib/Server/Core.py @@ -24,8 +24,8 @@ class CoreInitError(Exception): class Core(object): '''The Core object is the container for all Bcfg2 Server logic, and modules''' - def __init__(self, repo, plugins, structures, generators, password, svn, - encoding, filemonitor='default'): + def __init__(self, repo, plugins, structures, generators, connectors, + password, svn, encoding, filemonitor='default'): object.__init__(self) self.datastore = repo if filemonitor not in Bcfg2.Server.FileMonitor.available: @@ -39,6 +39,7 @@ class Core(object): self.pubspace = {} self.generators = [] self.structures = [] + self.connectors = [] self.cron = {} self.plugins = {} self.revision = '-1' @@ -51,12 +52,12 @@ class Core(object): except: self.svn = False - [data.remove('') for data in [plugins, structures, generators] if '' in data] + [data.remove('') for data in [plugins, structures, generators] + if '' in data] - - for plugin in structures + generators + plugins: - if not plugin in self.plugins: - self.init_plugins(plugin) + for plugin in structures + generators + plugins + connectors: + if not plugin in self.plugins: + self.init_plugins(plugin) chk_plugins = self.plugins.values() while True: @@ -90,7 +91,10 @@ class Core(object): [(structures, 'structure', Bcfg2.Server.Plugin.StructurePlugin, self.structures), (generators, 'generator', Bcfg2.Server.Plugin.GeneratorPlugin, - self.generators)]: + self.generators), + (connectors, 'connector', Bcfg2.Server.Plugin.MetadataConnectorPlugin, + self.connectors), + ]: for plugin in plug_names: if plugin in self.plugins: if not isinstance(self.plugins[plugin], plug_type): @@ -179,7 +183,7 @@ class Core(object): start = time() config = lxml.etree.Element("Configuration", version='2.0', revision=self.revision) try: - meta = self.metadata.get_metadata(client) + meta = self.build_metadata(client) except Bcfg2.Server.Plugins.Metadata.MetadataConsistencyError: logger.error("Metadata consistency error for client %s" % client) return lxml.etree.Element("error", type='metadata error') @@ -247,3 +251,12 @@ class Core(object): except: logger.error("Plugin: %s failed to generate decision list" % plugin.__name__, exc_info=1) return result + + def build_metadata(self, client_name): + imd = self.metadata.get_initial_metadata(client_name) + for conn in self.connectors: + grps, data = conn.get_additional_metadata(imd) + self.metadata.merge_additional_metadata(imd, conn.__name__, + grps, data) + return imd + diff --git a/src/lib/Server/Plugin.py b/src/lib/Server/Plugin.py index 002709c2c..5a8731606 100644 --- a/src/lib/Server/Plugin.py +++ b/src/lib/Server/Plugin.py @@ -89,6 +89,18 @@ class MetadataPlugin(Plugin): '''create viz str for viz admin mode''' pass + def get_initial_metadata(self, client_name): + raise PluginExecutionError + + def merge_additional_metadata(self, imd, source, groups, data): + raise PluginExecutionError + +class MetadataConnectorPlugin(Plugin): + '''MetadataConnectorPlugins augment client metadata instances''' + def get_additional_metadata(self, metadata): + '''determine additional ([groups], {k:v}) for metadata''' + return (list(), dict()) + class ProbingPlugin(Plugin): '''Signal probe capability for this plugin''' def GetProbes(self, _): diff --git a/src/lib/Server/Plugins/Metadata.py b/src/lib/Server/Plugins/Metadata.py index 5ab1a9252..bb5a34cca 100644 --- a/src/lib/Server/Plugins/Metadata.py +++ b/src/lib/Server/Plugins/Metadata.py @@ -12,17 +12,14 @@ class MetadataRuntimeError(Exception): '''This error is raised when the metadata engine is called prior to reading enough data''' pass -probe_matcher = re.compile("(?P\S+)(.(?P[GH])_\S+)?") - class ClientMetadata(object): '''This object contains client metadata''' - def __init__(self, client, groups, bundles, categories, probed, uuid, + def __init__(self, client, groups, bundles, categories, uuid, password, overall): self.hostname = client self.bundles = bundles self.groups = groups self.categories = categories - self.probes = probed self.uuid = uuid self.password = password self.all = overall @@ -51,53 +48,9 @@ class ClientMetadata(object): return [key for key, value in self.all[1].iteritems() \ if value == profile] -class ProbeSet(Bcfg2.Server.Plugin.EntrySet): - def __init__(self, path, fam, encoding, plugin_name): - fpattern = '[0-9A-Za-z_\-]+' - self.plugin_name = plugin_name - Bcfg2.Server.Plugin.EntrySet.__init__(self, fpattern, path, True, - Bcfg2.Server.Plugin.SpecificData, - encoding) - fam.AddMonitor(path, self) - self.bangline = re.compile('^#!(?P(/\w+)+)$') - - def HandleEvent(self, event): - if event.filename != self.path: - return self.handle_event(event) - - def get_probe_data(self, metadata): - ret = [] - candidates = self.get_matching(metadata) - temp = {} - for cand in candidates: - if cand.specific.all: - if cand.name not in temp: - temp[cand.name] = (cand, 0) - continue - mdata = probe_matcher.match(cand.name).groupdict() - if mdata['basename'] in temp: - if mdata['mode'] > temp[mdata['basename']][1]: - temp[mdata['basename']] = (cand, mdata['mode']) - else: - temp[mdata['basename']] = (cand, mdata['mode']) - - for (name, data) in temp.iteritems(): - entry, prio = data - probe = lxml.etree.Element('probe') - probe.set('name', name.split('/')[-1]) - probe.set('source', self.plugin_name) - probe.text = entry.data - match = self.bangline.match(entry.data.split('\n')[0]) - if match: - probe.set('interpreter', match.group('interpreter')) - else: - probe.set('interpreter', '/bin/sh') - ret.append(probe) - return ret - class Metadata(Bcfg2.Server.Plugin.MetadataPlugin, - Bcfg2.Server.Plugin.ProbingPlugin): + ): '''This class contains data for bcfg2 server metadata''' __version__ = '$Id$' __author__ = 'bcfg-dev@mcs.anl.gov' @@ -133,15 +86,8 @@ class Metadata(Bcfg2.Server.Plugin.MetadataPlugin, self.clientdata_original = None self.default = None self.pdirty = False - try: - loc = datastore + "/Probes" - self.probes = ProbeSet(loc, core.fam, core.encoding, self.__name__) - except: - self.probes = False - self.probedata = {} self.extra = {'groups.xml':[], 'clients.xml':[]} self.password = core.password - self.load_probedata() def get_groups(self): '''return groups xml tree''' @@ -383,44 +329,6 @@ class Metadata(Bcfg2.Server.Plugin.MetadataPlugin, return True return False - def write_probedata(self): - '''write probe data out for use with bcfg2-info''' - if self.pdirty: - top = lxml.etree.Element("Probed") - for client, probed in self.probedata.iteritems(): - cx = lxml.etree.SubElement(top, 'Client', name=client) - for probe in probed: - lxml.etree.SubElement(cx, 'Probe', name=probe, - value=self.probedata[client][probe]) - for group in self.cgroups[client]: - lxml.etree.SubElement(cx, "Group", name=group) - data = lxml.etree.tostring(top, encoding='UTF-8', xml_declaration=True, - pretty_print='true') - try: - datafile = open("%s/%s" % (self.data, 'probed.xml'), 'w') - except IOError: - self.logger.error("Failed to write probed.xml") - raise MetadataRuntimeError - datafile.write(data) - self.pdirty = False - - def load_probedata(self): - try: - data = lxml.etree.parse(self.data + '/probed.xml').getroot() - except: - self.logger.error("Failed to read file probed.xml") - return - self.probedata = {} - self.cgroups = {} - for client in data.getchildren(): - self.probedata[client.get('name')] = {} - self.cgroups[client.get('name')]=[] - for pdata in client: - if (pdata.tag == 'Probe'): - self.probedata[client.get('name')][pdata.get('name')] = pdata.get('value') - elif (pdata.tag == 'Group'): - self.cgroups[client.get('name')].append(pdata.get('name')) - def resolve_client(self, addresspair): '''Lookup address locally or in DNS to get a hostname''' #print self.session_cache @@ -444,7 +352,7 @@ class Metadata(Bcfg2.Server.Plugin.MetadataPlugin, self.logger.warning(warning) raise MetadataConsistencyError - def get_metadata(self, client): + def get_initial_metadata(self, client): '''Return the metadata for a given client''' client = client.lower() if client in self.aliases: @@ -457,7 +365,6 @@ class Metadata(Bcfg2.Server.Plugin.MetadataPlugin, raise MetadataConsistencyError self.set_profile(client, self.default, (None, None)) [bundles, groups, categories] = self.groups[self.default] - probed = self.probedata.get(client, {}) newgroups = groups[:] newbundles = bundles[:] newcategories = {} @@ -482,49 +389,26 @@ class Metadata(Bcfg2.Server.Plugin.MetadataPlugin, groupscopy = copy.deepcopy(self.groups) clientscopy = copy.deepcopy(self.clients) return ClientMetadata(client, newgroups, newbundles, newcategories, - probed, uuid, password, (groupscopy, clientscopy)) + uuid, password, (groupscopy, clientscopy)) - def GetProbes(self, meta, force=False): - '''Return a set of probes for execution on client''' - if self.probes: - return self.probes.get_probe_data(meta) - return [] - - def ReceiveData(self, client, datalist): - self.cgroups[client.hostname] = [] - self.probedata[client.hostname] = {} - for data in datalist: - self.ReceiveDataItem(client, data) - self.pdirty = True - self.write_probedata() - - def ReceiveDataItem(self, client, data): - '''Receive probe results pertaining to client''' - if not client.hostname in self.cgroups: - self.cgroups[client.hostname] = [] - if data.text == None: - self.logger.error("Got null response to probe %s from %s" % \ - (data.get('name'), client.hostname)) - try: - self.probedata[client.hostname].update({data.get('name'): ''}) - except KeyError: - self.probedata[client.hostname] = {data.get('name'): ''} - return - dlines = data.text.split('\n') - self.logger.debug("%s:probe:%s:%s" % (client.hostname, - data.get('name'), [line.strip() for line in dlines])) - for line in dlines[:]: - if line.split(':')[0] == 'group': - newgroup = line.split(':')[1].strip() - if newgroup not in self.cgroups[client.hostname]: - self.cgroups[client.hostname].append(newgroup) - dlines.remove(line) - dtext = "\n".join(dlines) - try: - self.probedata[client.hostname].update({ data.get('name'):dtext }) - except KeyError: - self.probedata[client.hostname] = { data.get('name'):dtext } - + def merge_additional_metadata(self, imd, source, groups, data): + for group in groups: + if group in self.categories and \ + self.categories[group] in imd.categories: + continue + nb, ng, _ = self.groups.get(group, (list(), [group], dict())) + for b in nb: + if b not in imd.bundles: + imd.bundles.append(b) + for g in ng: + if g not in imd.groups: + if g in self.categories and \ + self.categories[g] in imd.categories: + continue + imd.groups.append(g) + if not hasattr(imd, source.lower()): + setattr(imd, source.lower(), data) + def AuthenticateConnection(self, user, password, address): '''This function checks user and password''' if user == 'root': diff --git a/src/lib/Server/Plugins/Probes.py b/src/lib/Server/Plugins/Probes.py new file mode 100644 index 000000000..adc920257 --- /dev/null +++ b/src/lib/Server/Plugins/Probes.py @@ -0,0 +1,144 @@ +import Bcfg2.Server.Plugin, lxml.etree, re + +probe_matcher = re.compile("(?P\S+)(.(?P[GH])_\S+)?") + +class ProbeSet(Bcfg2.Server.Plugin.EntrySet): + def __init__(self, path, fam, encoding, plugin_name): + fpattern = '[0-9A-Za-z_\-]+' + self.plugin_name = plugin_name + Bcfg2.Server.Plugin.EntrySet.__init__(self, fpattern, path, True, + Bcfg2.Server.Plugin.SpecificData, + encoding) + fam.AddMonitor(path, self) + self.bangline = re.compile('^#!(?P(/\w+)+)$') + + def HandleEvent(self, event): + if event.filename != self.path: + return self.handle_event(event) + + def get_probe_data(self, metadata): + ret = [] + candidates = self.get_matching(metadata) + temp = {} + for cand in candidates: + if cand.specific.all: + if cand.name not in temp: + temp[cand.name] = (cand, 0) + continue + mdata = probe_matcher.match(cand.name).groupdict() + if mdata['basename'] in temp: + if mdata['mode'] > temp[mdata['basename']][1]: + temp[mdata['basename']] = (cand, mdata['mode']) + else: + temp[mdata['basename']] = (cand, mdata['mode']) + + for (name, data) in temp.iteritems(): + entry, prio = data + probe = lxml.etree.Element('probe') + probe.set('name', name.split('/')[-1]) + probe.set('source', self.plugin_name) + probe.text = entry.data + match = self.bangline.match(entry.data.split('\n')[0]) + if match: + probe.set('interpreter', match.group('interpreter')) + else: + probe.set('interpreter', '/bin/sh') + ret.append(probe) + return ret + +class Probes(Bcfg2.Server.Plugin.MetadataConnectorPlugin, + Bcfg2.Server.Plugin.ProbingPlugin): + __name__ = 'Probes' + __version__ = '$Id: $' + __author__ = 'bcfg-dev@mcs.anl.gov' + + def __init__(self, core, datastore): + Bcfg2.Server.Plugin.MetadataConnectorPlugin.__init__(self, core, + datastore) + self.__name__ = 'Probes' + try: + self.probes = ProbeSet(self.data, core.fam, core.encoding, + self.__name__) + except: + raise Bcfg2.Server.Plugin.PluginInitError + + self.probedata = dict() + self.cgroups = dict() + self.load_data() + + def write_data(self): + '''write probe data out for use with bcfg2-info''' + top = lxml.etree.Element("Probed") + for client, probed in self.probedata.iteritems(): + cx = lxml.etree.SubElement(top, 'Client', name=client) + for probe in probed: + lxml.etree.SubElement(cx, 'Probe', name=probe, + value=self.probedata[client][probe]) + for group in self.cgroups[client]: + lxml.etree.SubElement(cx, "Group", name=group) + data = lxml.etree.tostring(top, encoding='UTF-8', xml_declaration=True, + pretty_print='true') + try: + datafile = open("%s/%s" % (self.data, 'probed.xml'), 'w') + except IOError: + self.logger.error("Failed to write probed.xml") + datafile.write(data) + + def load_data(self): + try: + data = lxml.etree.parse(self.data + '/probed.xml').getroot() + except: + self.logger.error("Failed to read file probed.xml") + return + self.probedata = {} + self.cgroups = {} + for client in data.getchildren(): + self.probedata[client.get('name')] = {} + self.cgroups[client.get('name')]=[] + for pdata in client: + if (pdata.tag == 'Probe'): + self.probedata[client.get('name')][pdata.get('name')] = pdata.get('value') + elif (pdata.tag == 'Group'): + self.cgroups[client.get('name')].append(pdata.get('name')) + + def GetProbes(self, meta, force=False): + '''Return a set of probes for execution on client''' + return self.probes.get_probe_data(meta) + + def ReceiveData(self, client, datalist): + self.cgroups[client.hostname] = [] + self.probedata[client.hostname] = {} + for data in datalist: + self.ReceiveDataItem(client, data) + self.write_data() + + def ReceiveDataItem(self, client, data): + '''Receive probe results pertaining to client''' + if not self.cgroups.has_key(client.hostname): + self.cgroups[client.hostname] = [] + if data.text == None: + self.logger.error("Got null response to probe %s from %s" % \ + (data.get('name'), client.hostname)) + try: + self.probedata[client.hostname].update({data.get('name'): ''}) + except KeyError: + self.probedata[client.hostname] = {data.get('name'): ''} + return + dlines = data.text.split('\n') + self.logger.debug("%s:probe:%s:%s" % (client.hostname, + data.get('name'), [line.strip() for line in dlines])) + for line in dlines[:]: + if line.split(':')[0] == 'group': + newgroup = line.split(':')[1].strip() + if newgroup not in self.cgroups[client.hostname]: + self.cgroups[client.hostname].append(newgroup) + dlines.remove(line) + dtext = "\n".join(dlines) + try: + self.probedata[client.hostname].update({ data.get('name'):dtext }) + except KeyError: + self.probedata[client.hostname] = { data.get('name'):dtext } + + def get_additional_metadata(self, meta): + return (self.cgroups.get(meta.hostname, list()), + self.probedata.get(meta.hostname, dict())) diff --git a/src/lib/Server/Plugins/__init__.py b/src/lib/Server/Plugins/__init__.py index f80fa1b11..ffab21b9a 100644 --- a/src/lib/Server/Plugins/__init__.py +++ b/src/lib/Server/Plugins/__init__.py @@ -1,6 +1,7 @@ '''imports for Bcfg2.Server.Plugins''' __revision__ = '$Revision$' -__all__ = ['Account', 'Base', 'Bundler', 'Cfg', 'Decisions', 'Hostbase', 'Metadata', 'NagiosGen', +__all__ = ['Account', 'Base', 'Bundler', 'Cfg', 'Decisions', 'Hostbase', + 'Metadata', 'NagiosGen', 'Probes', 'Pkgmgr', 'Rules', 'SSHbase', 'Statistics', 'Svcmgr', 'TCheetah', 'SGenshi', 'TGenshi', 'Vhost'] diff --git a/src/sbin/bcfg2-info b/src/sbin/bcfg2-info index c0c2673a5..bf88b1bfe 100755 --- a/src/sbin/bcfg2-info +++ b/src/sbin/bcfg2-info @@ -24,12 +24,12 @@ def printTabular(rows): class infoCore(cmd.Cmd, Bcfg2.Server.Core.Core): - def __init__(self, repo, plgs, struct, gens, passwd, svn, + def __init__(self, repo, plgs, struct, gens, conn, passwd, svn, encoding, event_debug): cmd.Cmd.__init__(self) try: Bcfg2.Server.Core.Core.__init__(self, repo, plgs, struct, gens, - passwd, svn, encoding) + conn, passwd, svn, encoding) if event_debug: self.fam.debug = True except Bcfg2.Server.Core.CoreInitError, msg: @@ -124,7 +124,7 @@ Usage: [quit|exit]""" if len(args.split()) == 2: fname, client = args.split() entry = lxml.etree.Element('ConfigFile', name=fname) - metadata = self.metadata.get_metadata(client) + metadata = self.build_metadata(client) self.Bind(entry, metadata) print lxml.etree.tostring(entry, encoding="UTF-8", xml_declaration=True) else: @@ -162,7 +162,7 @@ Usage: [quit|exit]""" return client = args.split()[0] try: - meta = self.metadata.get_metadata(client) + meta = self.build_metadata(client) except Bcfg2.Server.Plugins.Metadata.MetadataConsistencyError: print "Unable to find metadata for host %s" % client return @@ -268,7 +268,7 @@ Usage: [quit|exit]""" def do_cfgdebug(self, args): try: - meta = self.metadata.get_metadata(args) + meta = self.build_metadata(args) except Bcfg2.Server.Plugins.Metadata.MetadataConsistencyError: print "Unable to find metadata for host %s" % client return @@ -301,17 +301,15 @@ if __name__ == '__main__': 'generators': Bcfg2.Options.SERVER_GENERATORS, 'password': Bcfg2.Options.SERVER_PASSWORD, 'event debug': Bcfg2.Options.DEBUG, - 'encoding': Bcfg2.Options.ENCODING}) + 'encoding': Bcfg2.Options.ENCODING, + 'connectors': Bcfg2.Options.SERVER_MCONNECT}) setup = Bcfg2.Options.OptionParser(optinfo) setup.parse(sys.argv[1:]) - if "-d" in sys.argv: - loop = infoCore(setup['repo'], setup['plugins'], setup['structures'], - setup['generators'], setup['password'], setup['svn'], - setup['encoding'], True) - else: - loop = infoCore(setup['repo'], setup['plugins'], setup['structures'], - setup['generators'], setup['password'], setup['svn'], - setup['encoding'], False) + print setup + loop = infoCore(setup['repo'], setup['plugins'], setup['structures'], + setup['generators'], setup['connectors'], + setup['password'], setup['svn'], setup['encoding'], + '-d' in sys.argv) if "args" in setup and setup['args']: loop.onecmd(" ".join(setup['args'])) raise SystemExit(0) diff --git a/src/sbin/bcfg2-server b/src/sbin/bcfg2-server index c1d678a76..b190a6e16 100755 --- a/src/sbin/bcfg2-server +++ b/src/sbin/bcfg2-server @@ -34,7 +34,8 @@ class Bcfg2Serv(Bcfg2.Component.Component): def __init__(self, setup): try: self.Core = Core(setup['repo'], setup['plugins'], setup['structures'], - setup['generators'], setup['password'], + setup['generators'], setup['connectors'], + setup['password'], setup['svn'], setup['encoding'], setup['filemonitor']) except CoreInitError, msg: logger.critical("Fatal error: %s" % (msg)) @@ -105,7 +106,7 @@ class Bcfg2Serv(Bcfg2.Component.Component): resp = Element('probes') try: name = self.Core.metadata.resolve_client(address) - meta = self.Core.metadata.get_metadata(name) + meta = self.Core.build_metadata(name) for plugin in [p for p in self.Core.plugins.values() \ if isinstance(p, Bcfg2.Server.Plugin.ProbingPlugin)]: @@ -123,7 +124,7 @@ class Bcfg2Serv(Bcfg2.Component.Component): '''Receive probe data from clients''' try: name = self.Core.metadata.resolve_client(address) - meta = self.Core.metadata.get_metadata(name) + meta = self.Core.build_metadata(name) except Bcfg2.Server.Plugins.Metadata.MetadataConsistencyError: warning = 'metadata consistency error' self.logger.warning(warning) @@ -177,7 +178,7 @@ class Bcfg2Serv(Bcfg2.Component.Component): # Versioned stats to prevent tied client/server upgrade if state.get('version') >= '2.0': client = self.Core.metadata.resolve_client(address) - meta = self.Core.metadata.get_metadata(client) + meta = self.Core.build_metadata(client) # Update statistics self.Core.stats.StoreStatistics(meta, sdata) @@ -191,7 +192,7 @@ class Bcfg2Serv(Bcfg2.Component.Component): def Bcfg2GetDecisionList(self, address, mode): client = self.Core.metadata.resolve_client(address) - meta = self.Core.metadata.get_metadata(client) + meta = self.Core.build_metadata(client) return self.Core.GetDecisions(meta, mode) if __name__ == '__main__': @@ -218,6 +219,7 @@ if __name__ == '__main__': 'static' : Bcfg2.Options.SERVER_STATIC, 'encoding' : Bcfg2.Options.ENCODING, 'filelog' : Bcfg2.Options.LOGGING_FILE_PATH, + 'connectors': Bcfg2.Options.SERVER_MCONNECT, }) -- cgit v1.2.3-1-g7c22