import os import re import sys import copy import logging import lxml.etree import Bcfg2.Server.Plugin logger = logging.getLogger('Bcfg2.Plugins.Pinnings') class PinningFile(Bcfg2.Server.Plugin.StructFile): """Class for pinning files.""" def get_additional_data(self, meta): data = self.Match(meta) results = {} for d in data: name = d.get('name', '') src = d.get('src', '') results[name] = src return results class PinDirectoryBacked(Bcfg2.Server.Plugin.DirectoryBacked): __child__ = PinningFile patterns = re.compile(r'.*\.xml$') def get_additional_data(self, meta): results = {} for files in self.entries: results.update(self.entries[files].get_additional_data(meta)) return results class Pinning(Bcfg2.Server.Plugin.Plugin, Bcfg2.Server.Plugin.Connector): name = 'Pinning' version = '$Revision$' def __init__(self, core, datastore): Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore) Bcfg2.Server.Plugin.Connector.__init__(self) try: self.store = PinDirectoryBacked(self.data, core.fam) except OSError: e = sys.exc_info()[1] self.logger.error("Error while creating Pinning store: %s %s" % (e.strerror, e.filename)) raise Bcfg2.Server.Plugin.PluginInitError def get_additional_data(self, meta): return self.store.get_additional_data(meta)