Avoid losing data from events if multiple arrive at the same time. (#1158) (#1159) (#1160)

(cherry picked from commit f7e976f3da)
(cherry picked from commit db20b1876d)

Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
patchback[bot] 2025-10-10 21:02:50 +02:00 committed by GitHub
parent 1b9461325c
commit 3a7030426e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 17 additions and 4 deletions

View File

@ -0,0 +1,3 @@
bugfixes:
- "docker, nsenter connection plugins - fix handling of ``become`` plugin password prompt handling in case multiple events arrive at the same time
(https://github.com/ansible-collections/community.docker/pull/1158)."

View File

@ -388,16 +388,21 @@ class Connection(ConnectionBase):
stdout, stderr = p.communicate() stdout, stderr = p.communicate()
raise AnsibleError('timeout waiting for privilege escalation password prompt:\n' + to_native(become_output)) raise AnsibleError('timeout waiting for privilege escalation password prompt:\n' + to_native(become_output))
chunks = b""
for key, event in events: for key, event in events:
if key.fileobj == p.stdout: if key.fileobj == p.stdout:
chunk = p.stdout.read() chunk = p.stdout.read()
if chunk:
chunks += chunk
elif key.fileobj == p.stderr: elif key.fileobj == p.stderr:
chunk = p.stderr.read() chunk = p.stderr.read()
if chunk:
chunks += chunk
if not chunk: if not chunks:
stdout, stderr = p.communicate() stdout, stderr = p.communicate()
raise AnsibleError('privilege output closed while waiting for password prompt:\n' + to_native(become_output)) raise AnsibleError('privilege output closed while waiting for password prompt:\n' + to_native(become_output))
become_output += chunk become_output += chunks
finally: finally:
selector.close() selector.close()

View File

@ -170,16 +170,21 @@ class Connection(ConnectionBase):
stdout, stderr = p.communicate() stdout, stderr = p.communicate()
raise AnsibleError('timeout waiting for privilege escalation password prompt:\n' + to_native(become_output)) raise AnsibleError('timeout waiting for privilege escalation password prompt:\n' + to_native(become_output))
chunks = b""
for key, event in events: for key, event in events:
if key.fileobj == p.stdout: if key.fileobj == p.stdout:
chunk = p.stdout.read() chunk = p.stdout.read()
if chunk:
chunks += chunk
elif key.fileobj == p.stderr: elif key.fileobj == p.stderr:
chunk = p.stderr.read() chunk = p.stderr.read()
if chunk:
chunks += chunk
if not chunk: if not chunks:
stdout, stderr = p.communicate() stdout, stderr = p.communicate()
raise AnsibleError('privilege output closed while waiting for password prompt:\n' + to_native(become_output)) raise AnsibleError('privilege output closed while waiting for password prompt:\n' + to_native(become_output))
become_output += chunk become_output += chunks
finally: finally:
selector.close() selector.close()