84 lines
2.3 KiB
Python
84 lines
2.3 KiB
Python
|
#!/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
|
||
|
#<<INCLUDE_ANSIBLE_MODULE_COMMON>>
|
||
|
def main():
|
||
|
run_configfile_module()
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|
||
|
|