diff options
Diffstat (limited to 'json_updater.py')
-rw-r--r-- | json_updater.py | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/json_updater.py b/json_updater.py new file mode 100644 index 0000000..17841fe --- /dev/null +++ b/json_updater.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +import json +import os +import sys + +#chef_update_string = '{"default_attributes": {"asdc-connections": {"asdc-controller1": {"environmentName": "test"}}}}' +#json_file_to_update="./volumes/mso/chef-config/mso-docker.json" + +def usage(): + print('Usage:') + print(" echo <json> | %s <file> " % ( sys.argv[0], )) + print() + print("file\tpath of the valid json file to update") + print("json\ta json string containing the values to update in <file>") + print("") + print("Example : ") + print(""" + echo '{"default_attributes": {"asdc-connections": {"asdc-controller1": {"environmentName": "test"}}}}' | %s ./volumes/mso/chef-config/mso-docker.json + """ % (sys.argv[0])) + + +if len(sys.argv) < 2: + usage() + exit(1) + +if sys.argv[1] in ('--help','-h'): + usage() + exit(0) + +# get updates +updates_json = sys.stdin.read() +print(updates_json[81:]) +updates = json.loads(updates_json) + +# get file to update +json_file_to_update = sys.argv[1] +with open(json_file_to_update) as f: + to_update = json.load(f) + +# update config with updates +def update(config, updates): + #assert isinstance(config, dict) + #assert isinstance(updates, dict) + + # if key is a simple type, update it. Otherwise, update sub values + + + for update_key,update_value in updates.items(): + if update_key not in config: + raise Exception('Incorrect parameter : %s' % (update_key,)) + if isinstance(update_value, (int, str)): + config[update_key] = update_value + elif isinstance (update_value,list) and isinstance (config[update_key],list): + config[update_key] = update_value + else: + update(config[update_key], update_value) + +update(to_update, updates) + +# replace the file +tmp_file = '%s.tmp' % (json_file_to_update,) +with open(tmp_file, 'w') as f: + json.dump(to_update, f, sort_keys=True, indent=2) +os.rename(tmp_file, json_file_to_update) + |