Fix fileglob plugin with non-existent subdirectory (#69451)

Since Ansible 2.9.8, if the fileglob plugin is passed a path containing
a subdirectory of a non-existent directory, it will fail. For example:

lookup('fileglob', '/'): ok
lookup('fileglob', '/foo'): (non-existent): ok
lookup('fileglob', '/foo/bar'): (non-existent): FAIL

The exact error depends on Python 2 or 3, but here is the error on
Python 2:

    AttributeError: 'NoneType' object has no attribute 'endswith'

And on Python 3:

    TypeError: expected str, bytes or os.PathLike object, not NoneType

This change fixes the issue by skipping paths that are falsey before
passing them to os.path.join().

Fixes: #69450
pull/69459/head
Mark Goddard 4 years ago committed by GitHub
parent 01258580b9
commit aa36b02ede
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,4 @@
bugfixes:
- Fix an issue with the ``fileglob`` plugin where passing a subdirectory of
non-existent directory would cause it to fail -
https://github.com/ansible/ansible/issues/69450

@ -72,8 +72,9 @@ class LookupModule(LookupBase):
found_paths.append(p)
for dwimmed_path in found_paths:
globbed = glob.glob(to_bytes(os.path.join(dwimmed_path, term_file), errors='surrogate_or_strict'))
ret.extend(to_text(g, errors='surrogate_or_strict') for g in globbed if os.path.isfile(g))
if ret:
break
if dwimmed_path:
globbed = glob.glob(to_bytes(os.path.join(dwimmed_path, term_file), errors='surrogate_or_strict'))
ret.extend(to_text(g, errors='surrogate_or_strict') for g in globbed if os.path.isfile(g))
if ret:
break
return ret

@ -0,0 +1,6 @@
- hosts: localhost
gather_facts: false
tasks:
- name: fileglob should be empty
assert:
that: q("fileglob", seed) | length == 0

@ -7,3 +7,9 @@ for seed in play_adj play_adj_subdir somepath/play_adj_subsubdir in_role otherpa
do
ansible-playbook find_levels/play.yml -e "seed='${seed}'" "$@"
done
# non-existent paths
for seed in foo foo/bar foo/bar/baz
do
ansible-playbook non_existent/play.yml -e "seed='${seed}'" "$@"
done

Loading…
Cancel
Save