diff options
-rwxr-xr-x | tools/compileconfig.py | 69 | ||||
-rw-r--r-- | tools/configschema.py | 65 | ||||
-rw-r--r-- | tools/readconfig.py | 40 |
3 files changed, 97 insertions, 77 deletions
diff --git a/tools/compileconfig.py b/tools/compileconfig.py index 35ecb91..e6c5ec6 100755 --- a/tools/compileconfig.py +++ b/tools/compileconfig.py @@ -566,65 +566,6 @@ def gen_manpage(manpagedir): manpage.rewrite_manpage(manpagedir + "/catlfish-log.cfg.in.5.adoc", globalconfigschema, "Catlfish", "Catlfish Manual", "CATLFISH-LOG.CFG.IN(5)", "catlfish-log.cfg.in - catlfish log configuration") manpage.rewrite_manpage(manpagedir + "/catlfish-node.cfg.5.adoc", localconfigschema, "Catlfish", "Catlfish Manual", "CATLFISH-NODE.CFG(5)", "catlfish-node.cfg - catlfish node configuration") -localconfigschema = [ - ("nodename", "string", "nodename"), - ("frontendaddress", "string", "ip address"), - ("ctapiaddress", "string", "ip address"), - ("storageaddress", "string", "ip address"), - ("signingaddress", "string", "ip address"), - ("mergeaddress", "string", "ip address"), - ("publichttpaddress", "string", "ip address"), - ("configurl", "string", "url"), - ("logadminkey", "string", "key"), - ("dbbackend", "string", ["permdb", "fsdb"]), - ("paths/configdir", "string", "path"), - ("paths/db", "string", "path"), - ("paths/https_cacertfile", "string", "path"), - ("paths/https_certfile", "string", "path"), - ("paths/https_keyfile", "string", "path"), - ("paths/knownroots", "string", "path"), - ("paths/logpublickey", "string", "path"), - ("paths/privatekeys", "string", "path"), - ("paths/public_cacertfile", "string", "path"), - ("paths/publickeys", "string", "path"), - ("paths/verifycert_bin", "string", "path"), - ("paths/mergedb", "string", "path"), - ("paths/logprivatekey", "string", "path"), - ("ratelimits/add_chain", "string", "rate"), - ("merge/min-delay", "integer", "seconds"), - ("merge/backup-window-size", "integer", "number of entries"), - ("merge/backup-sendlog-chunksize", "integer", "number of entries"), - ("merge/backup-sendentries-chunksize", "integer", "number of entries"), - ("merge/dist-window-size", "integer", "number of entries"), - ("merge/dist-sendlog-chunksize", "integer", "number of entries"), - ("merge/dist-sendentries-chunksize", "integer", "number of entries"), -] - -globalconfigschema = [ - ("frontendnodes/[]/name", "string", "nodename"), - ("frontendnodes/[]/address", "string", "ip address"), - ("frontendnodes/[]/publicaddress", "string", "ip address"), - ("mergenodes/[]/name", "string", "nodename"), - ("mergenodes/[]/address", "string", "ip address"), - ("signingnodes/[]/name", "string", "nodename"), - ("signingnodes/[]/address", "string", "ip address"), - ("storagenodes/[]/name", "string", "nodename"), - ("storagenodes/[]/address", "string", "ip address"), - ("statusservers/[]/name", "string", "nodename"), - ("statusservers/[]/address", "string", "ip address"), - ("statusservers/[]/publicaddress", "string", "ip address"), - ("apikeys/[]/nodename", "string", "nodename"), - ("apikeys/[]/publickey", "string", "key"), - ("baseurl", "string", "url"), - ("primarymergenode", "string", "nodename"), - ("storage-quorum-size", "integer", "number of nodes"), - ("backup-quorum-size", "integer", "number of nodes"), - ("logpublickey", "string", "key"), - ("cafingerprint", "string", "fingerprint"), - ("version", "integer", "version"), - ("mmd", "integer", "seconds"), -] - def main(): parser = argparse.ArgumentParser(description="") parser.add_argument('--config', help="System configuration") @@ -644,17 +585,17 @@ def main(): sys.exit(1) if args.testmakefile: - config = readconfig.read_config(args.config, schema=globalconfigschema) + config = readconfig.read_config(args.config, localconfig=False) gen_testmakefile(config, args.testmakefile) elif args.testshellvars: - config = readconfig.read_config(args.config, schema=globalconfigschema) + config = readconfig.read_config(args.config, localconfig=False) gen_testmakefile(config, args.testshellvars, shellvars=True) elif args.getnodenames: - config = readconfig.read_config(args.config, schema=globalconfigschema) + config = readconfig.read_config(args.config, localconfig=False) printnodenames(config) elif args.localconfig: - localconfig = readconfig.read_config(args.localconfig, schema=localconfigschema) - config = readconfig.verify_and_read_config(args.config, localconfig["logadminkey"], schema=globalconfigschema) + localconfig = readconfig.read_config(args.localconfig) + config = readconfig.verify_and_read_config(args.config, localconfig["logadminkey"]) gen_config(localconfig["nodename"], config, localconfig) else: diff --git a/tools/configschema.py b/tools/configschema.py new file mode 100644 index 0000000..9bb4b15 --- /dev/null +++ b/tools/configschema.py @@ -0,0 +1,65 @@ +# Copyright (c) 2017, NORDUnet A/S. +# See LICENSE for licensing information. + +localconfigschema = [ + ("nodename", "string", "nodename"), + ("frontendaddress", "string", "ip address"), + ("ctapiaddress", "string", "ip address"), + ("storageaddress", "string", "ip address"), + ("signingaddress", "string", "ip address"), + ("mergeaddress", "string", "ip address"), + ("publichttpaddress", "string", "ip address"), + ("configurl", "string", "url"), + ("logadminkey", "string", "key"), + ("dbbackend", "string", ["permdb", "fsdb"]), + ("paths/configdir", "string", "path"), + ("paths/db", "string", "path"), + ("paths/https_cacertfile", "string", "path"), + ("paths/https_certfile", "string", "path"), + ("paths/https_keyfile", "string", "path"), + ("paths/knownroots", "string", "path"), + ("paths/logpublickey", "string", "path"), + ("paths/privatekeys", "string", "path"), + ("paths/public_cacertfile", "string", "path"), + ("paths/publickeys", "string", "path"), + ("paths/verifycert_bin", "string", "path"), + ("paths/mergedb", "string", "path"), + ("paths/logprivatekey", "string", "path"), + ("ratelimits/add_chain", "string", "rate"), + ("merge/min-delay", "integer", "seconds"), + ("merge/backup-window-size", "integer", "number of entries"), + ("merge/backup-sendlog-chunksize", "integer", "number of entries"), + ("merge/backup-sendentries-chunksize", "integer", "number of entries"), + ("merge/dist-window-size", "integer", "number of entries"), + ("merge/dist-sendlog-chunksize", "integer", "number of entries"), + ("merge/dist-sendentries-chunksize", "integer", "number of entries"), +] + +globalconfigschema = [ + ("frontendnodes/[]/name", "string", "nodename"), + ("frontendnodes/[]/address", "string", "ip address"), + ("frontendnodes/[]/publicaddress", "string", "ip address"), + ("mergenodes/[]/name", "string", "nodename"), + ("mergenodes/[]/address", "string", "ip address"), + ("signingnodes/[]/name", "string", "nodename"), + ("signingnodes/[]/address", "string", "ip address"), + ("storagenodes/[]/name", "string", "nodename"), + ("storagenodes/[]/address", "string", "ip address"), + ("statusservers/[]/name", "string", "nodename"), + ("statusservers/[]/address", "string", "ip address"), + ("statusservers/[]/publicaddress", "string", "ip address"), + ("apikeys/[]/nodename", "string", "nodename"), + ("apikeys/[]/publickey", "string", "key"), + ("baseurl", "string", "url"), + ("primarymergenode", "string", "nodename"), + ("storage-quorum-size", "integer", "number of nodes"), + ("backup-quorum-size", "integer", "number of nodes"), + ("logpublickey", "string", "key"), + ("cafingerprint", "string", "fingerprint"), + ("version", "integer", "version"), + ("mmd", "integer", "seconds"), +] + +globalconfigdefaults = [ + ("statusservers", []), +] diff --git a/tools/readconfig.py b/tools/readconfig.py index 15b9c61..9c023b1 100644 --- a/tools/readconfig.py +++ b/tools/readconfig.py @@ -4,6 +4,7 @@ import hashlib import yaml import base64 import sys +import configschema def render_path(path): if path: @@ -47,18 +48,12 @@ def verify_config(rawconfig, signature, publickey_base64, filename): except ecdsa.keys.BadSignatureError: print >>sys.stderr, "error: configuration file %s did not have a correct signature" % (filename,) sys.exit(1) + return common_read_config(io.BytesIO(rawconfig), filename, localconfig=False) - return errorhandlify(yaml.load(io.BytesIO(rawconfig), yaml.SafeLoader), filename) - -def verify_and_read_config(filename, publickey_base64, schema=None): +def verify_and_read_config(filename, publickey_base64): rawconfig = open(filename).read() signature = open(filename + ".sig").read() - - verify_config(rawconfig, signature, publickey_base64, filename) - config = yaml.load(io.BytesIO(rawconfig), yaml.SafeLoader) - if schema: - check_config_schema(config, schema) - return errorhandlify(config, filename) + return verify_config(rawconfig, signature, publickey_base64, filename) def insert_schema_path(schema, path, datatype, highleveldatatype): if len(path) == 1: @@ -122,9 +117,28 @@ def check_config_schema_part(term, schema, path=[]): print >>sys.stderr, "unknown type", type(term) sys.exit(1) +def insert_defaults(config, configdefaults): + for (rawpath, value) in configdefaults: + path = rawpath.split("/") + node = config + for e in path[:-1]: + assert(e != "[]") + node = node[e] + lastelem = path[-1] + if lastelem not in node: + node[lastelem] = value -def read_config(filename, schema=None): - config = yaml.load(open(filename), yaml.SafeLoader) - if schema: - check_config_schema(config, schema) +def common_read_config(f, filename, localconfig=True): + if localconfig: + schema = configschema.localconfigschema + configdefaults = [] + else: + schema = configschema.globalconfigschema + configdefaults = configschema.globalconfigdefaults + config = yaml.load(f, yaml.SafeLoader) + insert_defaults(config, configdefaults) + check_config_schema(config, schema) return errorhandlify(config, filename) + +def read_config(filename, localconfig=True): + return common_read_config(open(filename), filename, localconfig=localconfig) |