91 lines
2.5 KiB
Python
Executable File
91 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python2
|
|
"""
|
|
Patch the HSM config file to set correct settings for use with a Vagrant
|
|
development setup.
|
|
|
|
Note: this used to be a simple patch file but since the format changed, it
|
|
seems better to parse the file, change the json object and dump it back to the
|
|
file.
|
|
"""
|
|
import simplejson as json
|
|
import yaml
|
|
import sys
|
|
import os.path
|
|
|
|
MAX_RECURSION = 100
|
|
|
|
PATCHES = {
|
|
"test/config/va.json": {
|
|
"va": {
|
|
"portConfig": {
|
|
"httpPort": 80,
|
|
"httpsPort": 443
|
|
}
|
|
}
|
|
},
|
|
"test/rate-limit-policies.yml": {
|
|
"certificatesPerName": {
|
|
"threshold": 1000
|
|
},
|
|
"certificatesPerFQDNSet": {
|
|
"threshold": 1000
|
|
}
|
|
},
|
|
"test/test-ca.key-pkcs11.json": {
|
|
"module": "/usr/lib/softhsm/libsofthsm.so",
|
|
}
|
|
}
|
|
|
|
|
|
def recursive_update(old_obj, new_obj, depth=0):
|
|
if depth > MAX_RECURSION:
|
|
raise RuntimeError("Maximum recursion level reached.")
|
|
|
|
if isinstance(new_obj, dict):
|
|
for key, value in new_obj.items():
|
|
old_obj[key] = recursive_update(
|
|
old_obj[key], new_obj[key], depth+1)
|
|
elif isinstance(new_obj, (list, tuple)):
|
|
# Merge lists/tuples.
|
|
old_obj = old_obj + new_obj
|
|
else:
|
|
# Set strings, integers, etc. and set() so arrays can be
|
|
# overridden.
|
|
old_obj = new_obj
|
|
return old_obj
|
|
|
|
|
|
def patch_yaml(file, obj):
|
|
with open(file, "r") as fp:
|
|
yaml_obj = yaml.load(fp)
|
|
yaml_obj = recursive_update(yaml_obj, obj)
|
|
with open(file, "w") as fp:
|
|
yaml.dump(yaml_obj, fp, default_flow_style=False)
|
|
|
|
|
|
def patch_json(file, obj):
|
|
with open(file, "r") as fp:
|
|
json_obj = json.load(fp)
|
|
json_obj = recursive_update(json_obj, obj)
|
|
with open(file, "w") as fp:
|
|
json.dump(json_obj, fp, indent=4)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
for patch_file, patch_obj in PATCHES.items():
|
|
_, file_extension = os.path.splitext(patch_file)
|
|
if file_extension in (".yml", ".yaml"):
|
|
patch_yaml(patch_file, patch_obj)
|
|
elif file_extension in (".json", ".js"):
|
|
patch_json(patch_file, patch_obj)
|
|
else:
|
|
raise NotImplementedError(
|
|
"Can't patch files with %s extension" % file_extension)
|
|
print("Patched {}".format(os.path.abspath(patch_file)))
|
|
|
|
except (OSError, IOError), exc:
|
|
print(
|
|
"Failed to patch the HSM for development, reason: {}".format(exc))
|
|
sys.exit(1)
|