Implement configuration reader

develop
Sven Slootweg 11 years ago
parent 42832a6dd1
commit 4ce97c7eac

@ -0,0 +1,103 @@
import yaml, glob, os
import logging
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")
from util import dict_combine_recursive
class ConfigurationError(Exception):
pass
class ConfigurationReader(object):
def __init__(self, file_):
self.sources = []
self.configdata = self.read_config(file_)
self.config_includes(self.configdata)
self.process_config(self.configdata)
def read_config(self, file_):
try:
# File-like object
data = file_.read()
self.sources.append(":local:")
except AttributeError, e:
# Filename
f = open(file_, "r")
data = f.read()
f.close()
self.sources.append(file_)
return yaml.safe_load(data)
def process_config(self, configdata):
self.config_identity(configdata)
self.config_nodes(configdata)
self.config_package_settings(configdata)
def config_identity(self, configdata):
try:
self.uuid = configdata['self']['uuid']
logging.debug("Own UUID is %s" % self.uuid)
except KeyError, e:
raise ConfigurationError("A UUID for the node ('self') must be specified.")
try:
self.pubkey = configdata['self']['pubkey']
logging.debug("Own pubkey is %s" % self.pubkey)
except KeyError, e:
raise ConfigurationError("You must specify a public key for this node.")
try:
self.privkey = configdata['self']['privkey']
logging.debug("Own privkey is %s" % self.privkey)
except KeyError, e:
raise ConfigurationError("You must specify a private key for this node.")
def config_nodes(self, configdata):
try:
self.nodes = configdata['nodes']
except KeyError, e:
self.nodes = {} # Optional
for uuid, node in self.nodes.iteritems():
if "ip" not in node:
raise ConfigurationError("IP is missing for node %s." % uuid)
if "port" not in node:
raise ConfigurationError("Port is missing for node %s." % uuid)
if "pubkey" not in node:
raise ConfigurationError("Public key is missing for node %s." % uuid)
if "permissions" not in node:
node['permissions'] = [] # Optional
logging.debug("Node %s : IP %s, port %s, pubkey %s, permissions %s" % (uuid, node["ip"], node["port"], node["pubkey"], "|".join(node["permissions"])))
def config_package_settings(self, configdata):
try:
self.package_settings = configdata['package-settings']
for key in self.package_settings:
logging.debug("Package settings found for package %s" % key)
except KeyError, e:
self.package_settings = {} # Optional
def config_includes(self, configdata):
try:
include_list = configdata['include']
except KeyError, e:
return # Optional
try:
include_list.append
except:
include_list = [include_list]
for include in include_list:
for file_ in glob.iglob(os.path.expanduser(include)):
if file_ not in self.sources:
self.sources.append(file_)
includedata = self.read_config(file_)
self.configdata = dict_combine_recursive(self.configdata, includedata)
self.config_includes(includedata)
if __name__ == "__main__":
c = ConfigurationReader("test.yaml")

@ -0,0 +1,11 @@
def dict_combine_recursive(a, b):
# Based on http://stackoverflow.com/a/8725321
if a is None: return b
if b is None: return a
if isinstance(a, list) and isinstance(b, list):
return list(set(a + b))
elif isinstance(a, dict) and isinstance(b, dict):
keys = set(a.iterkeys()) | set(b.iterkeys())
return dict((key, dict_combine_recursive(a.get(key), b.get(key))) for key in keys)
else:
return b
Loading…
Cancel
Save