from shlex import quote def generate_sysctl_key_value_pairs_from_json(json_data, parents=[]): if isinstance(json_data, dict): for key, value in json_data.items(): yield from generate_sysctl_key_value_pairs_from_json(value, [*parents, key]) elif isinstance(json_data, list): raise ValueError(f"List not supported: '{json_data}'") else: # If it's a leaf node, yield the path yield (parents, json_data) key_value_pairs = generate_sysctl_key_value_pairs_from_json(node.metadata.get('sysctl')) files= { '/etc/sysctl.conf': { 'content': '\n'.join( sorted( f"{'.'.join(path)}={value}" for path, value in key_value_pairs ), ), 'triggers': [ 'action:reload_sysctl.conf', ], }, } actions = { 'reload_sysctl.conf': { 'command': 'sysctl --system', 'triggered': True, }, } for path, value in key_value_pairs: actions[f'reload_sysctl.conf_{path}'] = { 'command': f"sysctl --values {'.'.join(path)} | grep -q {quote('^'+value+'$')}", 'needs': [ f'action:reload_sysctl.conf', ], }