This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
certbot-haproxy/hsmpatch.py

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)