Squashed commit of the following:

commit 80a26a8175b779b707bc08e9d28c451c30ee4ada
Merge: b25b9fd 61e9b27
Author: Michael DeHaan <michael.dehaan@gmail.com>
Date:   Tue Sep 18 21:01:47 2012 -0400

    Merge branch 'devel' of git://github.com/alopropoz/ansible into file-force

commit 61e9b27df2
Merge: 3f6f329 16bf3e1
Author: Aleksej Romanov <alopropoz2@yandex.ru>
Date:   Thu Sep 13 20:48:02 2012 +0700

    Merge remote branch 'upstream/devel' into devel

commit 3f6f3291df
Author: Aleksej Romanov <alopropoz2@yandex.ru>
Date:   Thu Sep 13 20:41:31 2012 +0700

    'force' option for 'file' module.

commit 6223bba941
Author: Aleksej Romanov <alopropoz2@yandex.ru>
Date:   Thu Sep 13 20:40:19 2012 +0700

    changed = True when changing symlink referent, #1008. Needed for tests.
This commit is contained in:
Aleksej Romanov 2012-09-18 21:02:16 -04:00 committed by Michael DeHaan
parent 9f417e3502
commit 31711062f7

24
file
View file

@ -224,6 +224,7 @@ def main():
state = dict(choices=['file','directory','link','absent'], default='file'),
path = dict(aliases=['dest', 'name'], required=True),
src = dict(),
force = dict(default='no', choices=['yes', 'no']),
mode = dict(),
owner = dict(),
group = dict(),
@ -240,6 +241,7 @@ def main():
src = params.get('src', None)
if src:
src = os.path.expanduser(src)
force = module.boolean(params['force'])
mode = params.get('mode', None)
owner = params.get('owner', None)
@ -288,7 +290,7 @@ def main():
module_fail_json(path=path, msg=str(e))
module_exit_json(path=path, changed=True)
if prev_state != 'absent' and prev_state != state:
if prev_state != 'absent' and prev_state != state and not force:
module_fail_json(path=path, msg='refusing to convert between %s and %s' % (prev_state, state))
if prev_state == 'absent' and state == 'absent':
@ -296,7 +298,7 @@ def main():
if state == 'file':
if prev_state == 'absent':
if prev_state != 'file':
module_fail_json(path=path, msg='file does not exist, use copy or template module to create')
# set modes owners and context as needed
@ -312,6 +314,13 @@ def main():
if prev_state == 'absent':
os.makedirs(path)
changed = True
elif prev_state != 'directory' and force:
try:
os.unlink(path)
except Exception, e:
module_fail_json(path=path, msg=str(e))
os.makedirs(path)
changed = True
# set modes owners and context as needed
changed = set_context_if_different(path, secontext, changed)
@ -333,6 +342,16 @@ def main():
if prev_state == 'absent':
os.symlink(src, path)
changed = True
elif prev_state != 'link' and force:
try:
if os.path.isfile(path):
os.unlink(path)
else:
shutil.rmtree(path, ignore_errors=False, onerror=rmtree_error)
except Exception, e:
module_fail_json(path=path, msg=str(e))
os.symlink(src, path)
changed = True
elif prev_state == 'link':
old_src = os.readlink(path)
if not os.path.isabs(old_src):
@ -340,6 +359,7 @@ def main():
if old_src != src:
os.unlink(path)
os.symlink(src, path)
changed = True
else:
module_fail_json(dest=path, src=src, msg='unexpected position reached')