diff options
author | Narayan Desai <desai@mcs.anl.gov> | 2005-01-31 04:44:48 +0000 |
---|---|---|
committer | Narayan Desai <desai@mcs.anl.gov> | 2005-01-31 04:44:48 +0000 |
commit | 2a800dbfd1e847f7d9e6a455dc5a270adcbf069a (patch) | |
tree | d2358d7a0d97abc1a69289fbaf86437f5c73959c /src | |
parent | 988ff532573b247356e749878818b4b7a0fd1325 (diff) | |
download | bcfg2-2a800dbfd1e847f7d9e6a455dc5a270adcbf069a.tar.gz bcfg2-2a800dbfd1e847f7d9e6a455dc5a270adcbf069a.tar.bz2 bcfg2-2a800dbfd1e847f7d9e6a455dc5a270adcbf069a.zip |
incorporate Bcfg2Server code into Core for easier instantiation
outside of servers
(Logical change 1.196)
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@836 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/Server/Core.py | 64 |
1 files changed, 55 insertions, 9 deletions
diff --git a/src/lib/Server/Core.py b/src/lib/Server/Core.py index ff03a8715..b250fa0dd 100644 --- a/src/lib/Server/Core.py +++ b/src/lib/Server/Core.py @@ -4,19 +4,22 @@ __revision__ = '$Revision$' from os import stat from stat import ST_MODE, S_ISDIR from sys import exc_info -from syslog import syslog, LOG_ERR +from syslog import syslog, LOG_ERR, LOG_INFO from traceback import extract_tb from time import time - +from ConfigParser import ConfigParser +from elementtree.ElementTree import Element import _fam from Bcfg2.Server.Generator import GeneratorError, GeneratorInitError +from Bcfg2.Server.Metadata import MetadataStore, MetadataConsistencyError +from Bcfg2.Server.Statistics import Statistics class PublishError(Exception): '''This error is raised upon publication failures''' pass -class fam(object): +class Fam(object): '''The fam object is a set of callbacks for file alteration events''' def __init__(self): @@ -66,14 +69,23 @@ class PublishedValue(object): class Core(object): '''The Core object is the container for all Bcfg2 Server logic, and modules''' - def __init__(self, repository, structures, generators): + def __init__(self, setup, configfile='/etc/bcfg2.conf'): object.__init__(self) - self.datastore = repository - self.fam = fam() + cfile = ConfigParser() + cfile.read([configfile]) + self.datastore = cfile.get('server','repository') + self.fam = Fam() self.pubspace = {} self.structures = [] + self.generators = [] self.cron = {} - for structure in structures: + self.setup = setup + + mpath = cfile.get('server','metadata') + self.metadata = MetadataStore("%s/metadata.xml" % mpath, self.fam) + self.stats = Statistics("%s/statistics.xml" % (mpath)) + + for structure in cfile.get('server', 'structures').split(','): try: mod = getattr(__import__("Bcfg2.Server.Structures.%s" % (structure)).Server.Structures, structure) @@ -82,8 +94,8 @@ class Core(object): continue struct = getattr(mod, structure) self.structures.append(struct(self, self.datastore)) - self.generators = [] - for generator in generators: + + for generator in cfile.get('server', 'generators').split(','): try: mod = getattr(__import__("Bcfg2.Server.Generators.%s" % (generator)).Server.Generators, generator) @@ -166,3 +178,37 @@ class Core(object): generator.Cron() self.cron[generator] = current + def BuildConfiguration(self, client): + '''Build Configuration for client''' + start = time() + config = Element("Configuration", version='2.0') + try: + meta = self.metadata.FetchMetadata(client) + except MetadataConsistencyError: + syslog(LOG_ERR, "Metadata consistency error for client %s" % client) + return Element("error", type='metadata error') + + config.set('toolset', meta.toolset) + try: + structures = self.GetStructures(meta) + except: + self.LogFailure("GetStructures") + return Element("error", type='structure error') + + for astruct in structures: + try: + self.BindStructure(astruct, meta) + config.append(astruct) + except: + self.LogFailure("BindStructure") + syslog(LOG_INFO, "Generated config for %s in %s seconds"%(client, time() - start)) + return config + + def LogFailure(self, failure): + '''Log Failures in unexpected cases''' + (trace, val, trb) = exc_info() + syslog(LOG_ERR, "Unexpected failure in %s" % (failure)) + for line in extract_tb(trb): + syslog(LOG_ERR, ' File "%s", line %i, in %s\n %s\n' % line) + syslog(LOG_ERR, "%s: %s\n"%(trace, val)) + del trace, val, trb |