diff --git a/modules/configfile b/modules/configfile new file mode 100644 index 0000000..85e0d05 --- /dev/null +++ b/modules/configfile @@ -0,0 +1,83 @@ +#!/usr/bin/python +from __future__ import print_function + +ANSIBLE_METADATA = { + 'metadata_version': '1.0', + 'status': ['preview'], + 'supported_by': 'ISTI-CNR' +} + +import glob +import json + +import tempfile +import filecmp +import os +import re +from ansible.module_utils.basic import AnsibleModule + +def run_configfile_module(): + module = AnsibleModule( + argument_spec = dict( + path=dict(required=True), + key=dict(required=True), + value=dict(required=True), + syntax=dict(required=False, choices=['standard', 'shell'], default='standard'), + ) + ) + + path = module.params['path'] + syntax = module.params['syntax'] + key = module.params['key'] + value = module.params['value'] + + found = [False] + + def expand(line): + if syntax == 'standard': + if re.match("[ #]*%s *=.*" % (key), line): + found[0] = True + return re.sub("[ #]*%s *=.*" % (key), "%s = %s" % (key, value), line) + elif syntax == 'shell': + if re.match("[ #]*%s *=.*" % (key), line): + found[0] = True + return re.sub("[ #]*%s *=.*" % (key), "%s=%s" % (key, value), line) + else: + raise Exception("unsupported syntax %s" % syntax) + + changed = False + + with open(path) as input: + with tempfile.NamedTemporaryFile(dir=os.path.dirname(path)) as temp: + for line in input: + print(expand(line), end=' ', file=temp) + + if not found[0]: + if not line.endswith('\n'): + print('', file=temp) + if syntax == 'standard': + print("%s = %s" % (key, value), file=temp) + elif syntax == 'shell': + print("%s=%s" % (key, value), file=temp) + else: + raise Exception("unsupported syntax %s" % syntax) + + temp.delete = False + temp.close() + + changed = not filecmp.cmp(path, temp.name) + if changed: + os.rename(temp.name, path) + else: + os.remove(temp.name) + + module.exit_json(changed=changed) + +# include magic from lib/ansible/module_common.py +#<> +def main(): + run_configfile_module() + +if __name__ == '__main__': + main() +