From 9c3f9d23c8ea31ed92a200a1ef94ff659fb97291 Mon Sep 17 00:00:00 2001 From: Ritesh Khadgaray Date: Thu, 18 Jun 2015 20:38:19 +0530 Subject: [PATCH] Add the ability to grep for content --- lib/ansible/modules/files/find.py | 32 ++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/ansible/modules/files/find.py b/lib/ansible/modules/files/find.py index d5441aad27..659ec16026 100644 --- a/lib/ansible/modules/files/find.py +++ b/lib/ansible/modules/files/find.py @@ -53,6 +53,11 @@ options: - One or more (shell type) file glob patterns, which restrict the list of files to be returned to those whose basenames match at least one of the patterns specified. Multiple patterns can be specified using a list. + contains: + required: false + default: null + description: + - One or more re patterns which should be matched against the file content paths: required: true aliases: [ "name" ] @@ -96,7 +101,7 @@ options: default: "False" choices: [ True, False ] description: - - Set this to true to follow symlinks in path. + - Set this to true to follow symlinks in path for systems with python 2.6+ get_checksum: required: false default: "False" @@ -177,6 +182,23 @@ def sizefilter(st, size): return False +def contentfilter(fsname, pattern): + '''filter files which contain the given expression''' + if pattern is None: return True + + try: + f = open(fsname) + prog = re.compile(pattern) + for line in f: + if prog.match (line): + f.close() + return True + + f.close() + except: + pass + + return False def statinfo(st): return { @@ -216,6 +238,7 @@ def main(): argument_spec = dict( paths = dict(required=True, aliases=['name'], type='list'), patterns = dict(default=['*'], type='list'), + contains = dict(default=None, type='str'), file_type = dict(default="file", choices=['file', 'directory'], type='str'), age = dict(default=None, type='str'), age_stamp = dict(default="mtime", choices=['atime','mtime','ctime'], type='str'), @@ -258,8 +281,10 @@ def main(): looked = 0 for npath in params['paths']: if os.path.isdir(npath): - for root,dirs,files in os.walk( npath, followlinks=params['follow'] ): + ''' ignore followlinks for python version < 2.6 ''' + for root,dirs,files in (sys.version_info < (2,6,0) and os.walk(npath)) or \ + os.walk( npath, followlinks=params['follow']): looked = looked + len(files) + len(dirs) for fsobj in (files + dirs): fsname=os.path.normpath(os.path.join(root, fsobj)) @@ -278,7 +303,8 @@ def main(): elif stat.S_ISREG(st.st_mode) and params['file_type'] == 'file': if pfilter(fsobj, params['patterns']) and \ agefilter(st, now, age, params['age_stamp']) and \ - sizefilter(st, size): + sizefilter(st, size) and \ + contentfilter(fsname, params['contains']): r.update(statinfo(st)) if params['get_checksum']: