add support for diff in file settings

this allows modules to report on what specifically changed when using
common file functions
This commit is contained in:
Brian Coca 2016-01-01 21:52:41 -05:00
commit 6f2f7a79b3

View file

@ -751,7 +751,7 @@ class AnsibleModule(object):
context = self.selinux_default_context(path) context = self.selinux_default_context(path)
return self.set_context_if_different(path, context, False) return self.set_context_if_different(path, context, False)
def set_context_if_different(self, path, context, changed): def set_context_if_different(self, path, context, changed, diff=None):
if not HAVE_SELINUX or not self.selinux_enabled(): if not HAVE_SELINUX or not self.selinux_enabled():
return changed return changed
@ -772,6 +772,14 @@ class AnsibleModule(object):
new_context[i] = cur_context[i] new_context[i] = cur_context[i]
if cur_context != new_context: if cur_context != new_context:
if diff is not None:
if 'before' not in diff:
diff['before'] = {}
diff['before']['secontext'] = cur_context
if 'after' not in diff:
diff['after'] = {}
diff['after']['secontext'] = new_context
try: try:
if self.check_mode: if self.check_mode:
return True return True
@ -785,7 +793,7 @@ class AnsibleModule(object):
changed = True changed = True
return changed return changed
def set_owner_if_different(self, path, owner, changed): def set_owner_if_different(self, path, owner, changed, diff=None):
path = os.path.expanduser(path) path = os.path.expanduser(path)
if owner is None: if owner is None:
return changed return changed
@ -798,6 +806,15 @@ class AnsibleModule(object):
except KeyError: except KeyError:
self.fail_json(path=path, msg='chown failed: failed to look up user %s' % owner) self.fail_json(path=path, msg='chown failed: failed to look up user %s' % owner)
if orig_uid != uid: if orig_uid != uid:
if diff is not None:
if 'before' not in diff:
diff['before'] = {}
diff['before']['owner'] = orig_uid
if 'after' not in diff:
diff['after'] = {}
diff['after']['owner'] = uid
if self.check_mode: if self.check_mode:
return True return True
try: try:
@ -807,7 +824,7 @@ class AnsibleModule(object):
changed = True changed = True
return changed return changed
def set_group_if_different(self, path, group, changed): def set_group_if_different(self, path, group, changed, diff=None):
path = os.path.expanduser(path) path = os.path.expanduser(path)
if group is None: if group is None:
return changed return changed
@ -820,6 +837,15 @@ class AnsibleModule(object):
except KeyError: except KeyError:
self.fail_json(path=path, msg='chgrp failed: failed to look up group %s' % group) self.fail_json(path=path, msg='chgrp failed: failed to look up group %s' % group)
if orig_gid != gid: if orig_gid != gid:
if diff is not None:
if 'before' not in diff:
diff['before'] = {}
diff['before']['group'] = orig_gid
if 'after' not in diff:
diff['after'] = {}
diff['after']['group'] = gid
if self.check_mode: if self.check_mode:
return True return True
try: try:
@ -829,7 +855,7 @@ class AnsibleModule(object):
changed = True changed = True
return changed return changed
def set_mode_if_different(self, path, mode, changed): def set_mode_if_different(self, path, mode, changed, diff=None):
path = os.path.expanduser(path) path = os.path.expanduser(path)
path_stat = os.lstat(path) path_stat = os.lstat(path)
@ -851,6 +877,15 @@ class AnsibleModule(object):
prev_mode = stat.S_IMODE(path_stat.st_mode) prev_mode = stat.S_IMODE(path_stat.st_mode)
if prev_mode != mode: if prev_mode != mode:
if diff is not None:
if 'before' not in diff:
diff['before'] = {}
diff['before']['mode'] = prev_mode
if 'after' not in diff:
diff['after'] = {}
diff['after']['mode'] = mode
if self.check_mode: if self.check_mode:
return True return True
# FIXME: comparison against string above will cause this to be executed # FIXME: comparison against string above will cause this to be executed
@ -984,27 +1019,27 @@ class AnsibleModule(object):
or_reduce = lambda mode, perm: mode | user_perms_to_modes[user][perm] or_reduce = lambda mode, perm: mode | user_perms_to_modes[user][perm]
return reduce(or_reduce, perms, 0) return reduce(or_reduce, perms, 0)
def set_fs_attributes_if_different(self, file_args, changed): def set_fs_attributes_if_different(self, file_args, changed, diff=None):
# set modes owners and context as needed # set modes owners and context as needed
changed = self.set_context_if_different( changed = self.set_context_if_different(
file_args['path'], file_args['secontext'], changed file_args['path'], file_args['secontext'], changed, diff
) )
changed = self.set_owner_if_different( changed = self.set_owner_if_different(
file_args['path'], file_args['owner'], changed file_args['path'], file_args['owner'], changed, diff
) )
changed = self.set_group_if_different( changed = self.set_group_if_different(
file_args['path'], file_args['group'], changed file_args['path'], file_args['group'], changed, diff
) )
changed = self.set_mode_if_different( changed = self.set_mode_if_different(
file_args['path'], file_args['mode'], changed file_args['path'], file_args['mode'], changed, diff
) )
return changed return changed
def set_directory_attributes_if_different(self, file_args, changed): def set_directory_attributes_if_different(self, file_args, changed, diff=None):
return self.set_fs_attributes_if_different(file_args, changed) return self.set_fs_attributes_if_different(file_args, changed, diff)
def set_file_attributes_if_different(self, file_args, changed): def set_file_attributes_if_different(self, file_args, changed, diff=None):
return self.set_fs_attributes_if_different(file_args, changed) return self.set_fs_attributes_if_different(file_args, changed, diff)
def add_path_info(self, kwargs): def add_path_info(self, kwargs):
''' '''