Skip to content

Commit 416517c

Browse files
authored
[stable-2.16] find: do not fail on PermissionError (#82880)
* Log and skip permission errors on files and directories Fixes: #82027 (cherry picked from commit f73d72e) Signed-off-by: Abhijeet Kasurde <[email protected]>
1 parent edbb6d1 commit 416517c

File tree

5 files changed

+69
-4
lines changed

5 files changed

+69
-4
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
---
2+
bugfixes:
3+
- find - do not fail on Permission errors (https://github.com/ansible/ansible/issues/82027).

lib/ansible/modules/find.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@
258258
version_added: '2.12'
259259
'''
260260

261+
import errno
261262
import fnmatch
262263
import grp
263264
import os
@@ -434,10 +435,6 @@ def statinfo(st):
434435
}
435436

436437

437-
def handle_walk_errors(e):
438-
raise e
439-
440-
441438
def main():
442439
module = AnsibleModule(
443440
argument_spec=dict(
@@ -482,6 +479,12 @@ def main():
482479
filelist = []
483480
skipped = {}
484481

482+
def handle_walk_errors(e):
483+
if e.errno in (errno.EPERM, errno.EACCES):
484+
skipped[e.filename] = to_text(e)
485+
return
486+
raise e
487+
485488
if params['age'] is None:
486489
age = None
487490
else:
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
shippable/posix/group1
2+
destructive
3+
needs/root
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
dependencies:
22
- prepare_tests
3+
- setup_test_user
34
- setup_remote_tmp_dir

test/integration/targets/find/tasks/main.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,5 +375,61 @@
375375
- 'remote_tmp_dir_test ~ "/astest/.hidden.txt" in astest_list'
376376
- '"checksum" in result.files[0]'
377377

378+
# Test permission error is correctly handled by find module
379+
- vars:
380+
test_dir: /tmp/permission_test
381+
block:
382+
- name: Set up content
383+
file:
384+
path: "{{ test_dir }}/{{ item.name }}"
385+
state: "{{ item.state }}"
386+
mode: "{{ item.mode }}"
387+
owner: "{{ item.owner | default(omit) }}"
388+
group: "{{ item.group | default(omit) }}"
389+
loop:
390+
- name: readable
391+
state: directory
392+
owner: "{{ test_user_name }}"
393+
mode: "1711"
394+
- name: readable/1-unreadable
395+
state: directory
396+
mode: "0700"
397+
- name: readable/2-readable
398+
state: touch
399+
owner: "{{ test_user_name }}"
400+
mode: "0777"
401+
402+
- name: Find a file in readable directory
403+
find:
404+
paths: "{{ test_dir }}/readable/"
405+
patterns: "*"
406+
recurse: true
407+
register: permission_issue
408+
become_user: "{{ test_user_name }}"
409+
410+
- name: Find a file in readable directory
411+
find:
412+
paths: "{{ test_dir }}/readable/"
413+
patterns: "*"
414+
recurse: true
415+
register: permission_issue
416+
become_user: "{{ test_user_name }}"
417+
become: yes
418+
419+
- name: Check if the skipped_paths are populated correctly with permission error
420+
assert:
421+
that:
422+
- permission_issue is success
423+
- not permission_issue.changed
424+
- permission_issue.skipped_paths|length == 1
425+
- "'{{ test_dir }}/readable/1-unreadable' in permission_issue.skipped_paths"
426+
- "'Permission denied' in permission_issue.skipped_paths['{{ test_dir }}/readable/1-unreadable']"
427+
- permission_issue.matched == 1
428+
always:
429+
- name: cleanup test directory
430+
file:
431+
dest: "{{ test_dir }}"
432+
state: absent
433+
378434
- name: Run mode tests
379435
import_tasks: mode.yml

0 commit comments

Comments
 (0)