Skip to content

Commit

Permalink
Fix stealth exceptions and blocking select() in daemonize() (ansible#…
Browse files Browse the repository at this point in the history
…81064) - 2.15 (ansible#81581)

* Fix stealth exceptions and blocking select() in daemonize() (ansible#81064)

* Fix stealth exceptions and blocking select() in daemonize()

* Add changelog entry

(cherry picked from commit 894c339)

* Daemonize follow-up fixes (ansible#81584)

* Ensure binary data transmission in daemonize

* Add changelog fragment

(cherry picked from commit 91f94fb)
  • Loading branch information
vaygr committed Oct 2, 2023
1 parent 83c0118 commit 7ed557c
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 5 deletions.
2 changes: 2 additions & 0 deletions changelogs/fragments/81064-daemonize-fixes.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
bugfixes:
- "``ansible.module_utils.service`` - fix inter-process communication in ``daemonize()``"
2 changes: 2 additions & 0 deletions changelogs/fragments/81584-daemonize-follow-up-fixes.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
bugfixes:
- "``ansible.module_utils.service`` - ensure binary data transmission in ``daemonize()``"
13 changes: 8 additions & 5 deletions lib/ansible/module_utils/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,17 +207,20 @@ def daemonize(module, cmd):
p = subprocess.Popen(run_cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=lambda: os.close(pipe[1]))
fds = [p.stdout, p.stderr]

# loop reading output till its done
# loop reading output till it is done
output = {p.stdout: b(""), p.stderr: b("")}
while fds:
rfd, wfd, efd = select.select(fds, [], fds, 1)
if (rfd + wfd + efd) or p.poll():
if (rfd + wfd + efd) or p.poll() is None:
for out in list(fds):
if out in rfd:
data = os.read(out.fileno(), chunk)
if not data:
if data:
output[out] += to_bytes(data, errors=errors)
else:
fds.remove(out)
output[out] += b(data)
else:
break

# even after fds close, we might want to wait for pid to die
p.wait()
Expand Down Expand Up @@ -246,7 +249,7 @@ def daemonize(module, cmd):
data = os.read(pipe[0], chunk)
if not data:
break
return_data += b(data)
return_data += to_bytes(data, errors=errors)

# Note: no need to specify encoding on py3 as this module sends the
# pickle to itself (thus same python interpreter so we aren't mixing
Expand Down

0 comments on commit 7ed557c

Please sign in to comment.