43 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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.d/managed.conf': {
 | 
						|
        'content': '\n'.join(
 | 
						|
            sorted(
 | 
						|
                f"{'.'.join(path)}={value}"
 | 
						|
                    for path, value in key_value_pairs
 | 
						|
            ),
 | 
						|
        ),
 | 
						|
        'triggers': [
 | 
						|
            'svc_systemd:systemd-sysctl.service:restart',
 | 
						|
        ],
 | 
						|
    },
 | 
						|
    '/etc/modules-load.d/managed.conf': {
 | 
						|
        'content': '\n'.join(sorted(node.metadata.get('modules-load'))),
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
svc_systemd = {
 | 
						|
    'systemd-sysctl.service': {},
 | 
						|
}
 | 
						|
 | 
						|
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:systemd-sysctl.service',
 | 
						|
            f'action:systemd-sysctl.service:restart',
 | 
						|
        ],
 | 
						|
    }
 |