From fccaf883da5d7d2c69bc5f346fc1fd7cf5ee7336 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Sat, 22 Oct 2016 13:21:20 -0400 Subject: [PATCH] refactor stat make format function 'format only' added platform dependant info, when it is available avoid rechecking same info added comments to each info gathering section (cherry picked from commit a79acf73d7eb79b76d808ff8a1d6c505dfd9ec82) --- lib/ansible/modules/files/stat.py | 103 ++++++++++++++++++------------ 1 file changed, 62 insertions(+), 41 deletions(-) diff --git a/lib/ansible/modules/files/stat.py b/lib/ansible/modules/files/stat.py index 10ed4e0ebe..c07cf699d8 100644 --- a/lib/ansible/modules/files/stat.py +++ b/lib/ansible/modules/files/stat.py @@ -331,8 +331,7 @@ from ansible.module_utils.pycompat24 import get_exception from ansible.module_utils._text import to_bytes -def format_output(module, path, st, follow, get_md5, get_checksum, - checksum_algorithm, mimetype=None, charset=None): +def format_output(module, path, st): mode = st.st_mode # back to ansible @@ -367,37 +366,30 @@ def format_output(module, path, st, follow, get_md5, get_checksum, xoth=bool(mode & stat.S_IXOTH), isuid=bool(mode & stat.S_ISUID), isgid=bool(mode & stat.S_ISGID), - readable=os.access(path, os.R_OK), - writeable=os.access(path, os.W_OK), - executable=os.access(path, os.X_OK), ) - if stat.S_ISLNK(mode): - output['lnk_source'] = os.path.realpath(path) + # Platform dependant flags: + for other in [ + # Some Linux + ('st_blocks','blocks'), + ('st_blksize', 'block_size'), + ('st_rdev','device_type'), + ('st_flags', 'flags'), + # Some Berkley based + ('st_gen', 'generation'), + ('st_birthtime', 'birthtime'), + # RISCOS + ('st_ftype', 'file_type'), + ('st_attrs', 'attributes'), + ('st_obtype', 'object_type'), + # OS X + ('st_rsize', 'real_size'), + ('st_creator', 'creator'), + ('st_type', 'file_type'), + ]: + if hasattr(st, other[0]): + output[other[1]] = getattr(st, other[0]) - if stat.S_ISREG(mode) and get_md5 and os.access(path, os.R_OK): - # Will fail on FIPS-140 compliant systems - try: - output['md5'] = module.md5(path) - except ValueError: - output['md5'] = None - - if stat.S_ISREG(mode) and get_checksum and os.access(path, os.R_OK): - output['checksum'] = module.digest_from_file(path, checksum_algorithm) - - try: - pw = pwd.getpwuid(st.st_uid) - - output['pw_name'] = pw.pw_name - - grp_info = grp.getgrgid(st.st_gid) - output['gr_name'] = grp_info.gr_name - except: - pass - - if not (mimetype is None and charset is None): - output['mime_type'] = mimetype - output['charset'] = charset return output @@ -425,6 +417,7 @@ def main(): get_checksum = module.params.get('get_checksum') checksum_algorithm = module.params.get('checksum_algorithm') + # main stat data try: if follow: st = os.stat(b_path) @@ -438,26 +431,54 @@ def main(): module.fail_json(msg=e.strerror) - mimetype = None - charset = None - if get_mime: - mimetype = 'unknown' - charset = 'unknown' + # process base results + output = format_output(module, path, st) + # resolved permissions + for perm in [('readable', os.R_OK), ('writeable', os.W_OK), ('executable', os.X_OK)]: + output[perm[0]] = os.access(path, perm[1]) + + # symlink info + if output.get('islnk'): + output['lnk_source'] = os.path.realpath(path) + + try: # user data + pw = pwd.getpwuid(st.st_uid) + output['pw_name'] = pw.pw_name + except: + pass + + try: # group data + grp_info = grp.getgrgid(st.st_gid) + output['gr_name'] = grp_info.gr_name + except: + pass + + # checksums + if output.get('isreg') and output.get('readable'): + if get_md5: + # Will fail on FIPS-140 compliant systems + try: + output['md5'] = module.md5(path) + except ValueError: + output['md5'] = None + + if get_checksum: + output['checksum'] = module.digest_from_file(path, checksum_algorithm) + + # try to get mime data if requested + if get_mime: + output['mimetype'] = output['charset'] = 'unknown' filecmd = [module.get_bin_path('file', True), '-i', path] try: rc, out, err = module.run_command(filecmd) if rc == 0: mimetype, charset = out.split(':')[1].split(';') - mimetype = mimetype.strip() - charset = charset.split('=')[1].strip() + output['mimetype'] = mimetype.strip() + output['charset'] = charset.split('=')[1].strip() except: pass - output = format_output(module, path, st, follow, get_md5, get_checksum, - checksum_algorithm, mimetype=mimetype, - charset=charset) - module.exit_json(changed=False, stat=output) if __name__ == '__main__':