1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

final form, use_regex now controls if patterns is glob or regex - fixed cases in which stat fails (dangling symlink) - now properly reports name of skipped paths

This commit is contained in:
Brian Coca 2015-10-19 20:43:50 -04:00 committed by Matt Clay
parent 3e5dc1fd74
commit 14455f4acc

View file

@ -25,8 +25,6 @@ import stat
import fnmatch import fnmatch
import time import time
import re import re
import shutil
DOCUMENTATION = ''' DOCUMENTATION = '''
--- ---
@ -50,9 +48,9 @@ options:
required: false required: false
default: '*' default: '*'
description: description:
- One or more (shell or regex) patterns, which restrict the list of files to be returned to - One or more (shell or regex) patterns, which type is controled by C(use_regex) option.
those whose basenames match at least one of the patterns specified. Multiple patterns can be - The patterns restrict the list of files to be returned to those whose basenames match at
specified using a list. least one of the patterns specified. Multiple patterns can be specified using a list.
aliases: ['pattern'] aliases: ['pattern']
contains: contains:
required: false required: false
@ -109,6 +107,12 @@ options:
choices: [ True, False ] choices: [ True, False ]
description: description:
- Set this to true to retrieve a file's sha1 checksum - Set this to true to retrieve a file's sha1 checksum
use_regex:
required: false
default: "False"
choices: [ True, False ]
description:
- If false the patterns are file globs (shell) if true they are python regexes
''' '''
@ -122,9 +126,11 @@ EXAMPLES = '''
# Recursively find /var/tmp files with last access time greater than 3600 seconds # Recursively find /var/tmp files with last access time greater than 3600 seconds
- find: paths="/var/tmp" age="3600" age_stamp=atime recurse=yes - find: paths="/var/tmp" age="3600" age_stamp=atime recurse=yes
# find /var/log files equal or greater than 10 megabytes ending with .old or .log.gz via regex # find /var/log files equal or greater than 10 megabytes ending with .old or .log.gz
- find: paths="/var/tmp" patterns="^.*?\.(?:old|log\.gz)$" size="10m" - find: paths="/var/tmp" patterns="'*.old','*.log.gz'" size="10m"
# find /var/log files equal or greater than 10 megabytes ending with .old or .log.gz via regex
- find: paths="/var/tmp" patterns="^.*?\.(?:old|log\.gz)$" size="10m" use_regex=True
''' '''
RETURN = ''' RETURN = '''
@ -154,27 +160,24 @@ examined:
sample: 34 sample: 34
''' '''
def pfilter(f, patterns=None): def pfilter(f, patterns=None, use_regex=False):
'''filter using glob patterns''' '''filter using glob patterns'''
if patterns is None: if patterns is None:
return True return True
match = False if use_regex:
for p in patterns: for p in patterns:
try:
r = re.compile(p) r = re.compile(p)
match = r.match(f) if r.match(f):
except: return True
pass else:
if not match: for p in patterns:
match = fnmatch.fnmatch(f, p) if fnmatch.fnmatch(f, p):
return True
if match: return False
break
return match
def agefilter(st, now, age, timestamp): def agefilter(st, now, age, timestamp):
@ -262,6 +265,7 @@ def main():
hidden = dict(default="False", type='bool'), hidden = dict(default="False", type='bool'),
follow = dict(default="False", type='bool'), follow = dict(default="False", type='bool'),
get_checksum = dict(default="False", type='bool'), get_checksum = dict(default="False", type='bool'),
use_regex = dict(default="False", type='bool'),
), ),
) )
@ -307,16 +311,21 @@ def main():
if os.path.basename(fsname).startswith('.') and not params['hidden']: if os.path.basename(fsname).startswith('.') and not params['hidden']:
continue continue
st = os.stat(fsname) try:
st = os.stat(fsname)
except:
msg+="%s was skipped as it does not seem to be a valid file or it cannot be accessed\n" % fsname
continue
r = {'path': fsname} r = {'path': fsname}
if stat.S_ISDIR(st.st_mode) and params['file_type'] == 'directory': if stat.S_ISDIR(st.st_mode) and params['file_type'] == 'directory':
if pfilter(fsobj, params['patterns']) and agefilter(st, now, age, params['age_stamp']): if pfilter(fsobj, params['patterns'], params['use_regex']) and agefilter(st, now, age, params['age_stamp']):
r.update(statinfo(st)) r.update(statinfo(st))
filelist.append(r) filelist.append(r)
elif stat.S_ISREG(st.st_mode) and params['file_type'] == 'file': elif stat.S_ISREG(st.st_mode) and params['file_type'] == 'file':
if pfilter(fsobj, params['patterns']) and \ if pfilter(fsobj, params['patterns'], params['use_regex']) and \
agefilter(st, now, age, params['age_stamp']) and \ agefilter(st, now, age, params['age_stamp']) and \
sizefilter(st, size) and \ sizefilter(st, size) and \
contentfilter(fsname, params['contains']): contentfilter(fsname, params['contains']):
@ -329,7 +338,7 @@ def main():
if not params['recurse']: if not params['recurse']:
break break
else: else:
msg+="%s was skipped as it does not seem to be a valid directory or it cannot be accessed\n" msg+="%s was skipped as it does not seem to be a valid directory or it cannot be accessed\n" % npath
matched = len(filelist) matched = len(filelist)
module.exit_json(files=filelist, changed=False, msg=msg, matched=matched, examined=looked) module.exit_json(files=filelist, changed=False, msg=msg, matched=matched, examined=looked)