Be careful not to set the permissions of the destination of a symlink.

It's up to the module using the set_fs_attributes*/set_mode* methods to
specify the filename of the destination of the symlink if that's really
the file that should be modified.

Half of the fix for:
https://github.com/ansible/ansible-modules-core/issues/778
This commit is contained in:
Toshio Kuratomi 2015-02-16 07:07:58 -08:00
parent 1e867b0b8e
commit c9fb97cc86

View file

@ -656,14 +656,25 @@ class AnsibleModule(object):
# FIXME: comparison against string above will cause this to be executed # FIXME: comparison against string above will cause this to be executed
# every time # every time
try: try:
if 'lchmod' in dir(os): if hasattr(os, 'lchmod'):
os.lchmod(path, mode) os.lchmod(path, mode)
else: else:
os.chmod(path, mode) if not os.path.islink(path):
os.chmod(path, mode)
else:
# Attempt to set the perms of the symlink but be
# careful not to change the perms of the underlying
# file while trying
underlying_stat = os.stat(path)
os.chmod(path, mode)
new_underlying_stat = os.stat(path)
if underlying_stat.st_mode != new_underlying_stat.st_mode:
os.chmod(path, stat.S_IMODE(underlying_stat.st_mode))
q_stat = os.stat(path)
except OSError, e: except OSError, e:
if os.path.islink(path) and e.errno == errno.EPERM: # Can't set mode on symbolic links if os.path.islink(path) and e.errno == errno.EPERM: # Can't set mode on symbolic links
pass pass
elif e.errno == errno.ENOENT: # Can't set mode on broken symbolic links elif e.errno in (errno.ENOENT, errno.ELOOP): # Can't set mode on broken symbolic links
pass pass
else: else:
raise e raise e