diff --git a/plugins/module_utils/_socket_handler.py b/plugins/module_utils/_socket_handler.py index 315af0cf..f2a4aa7d 100644 --- a/plugins/module_utils/_socket_handler.py +++ b/plugins/module_utils/_socket_handler.py @@ -9,6 +9,7 @@ from __future__ import annotations import os import os.path +import selectors import socket as pysocket import struct @@ -26,10 +27,9 @@ PARAMIKO_POLL_TIMEOUT = 0.01 # 10 milliseconds class DockerSocketHandlerBase: - def __init__(self, sock, selectors, log=None): + def __init__(self, sock, log=None): make_unblocking(sock) - self._selectors = selectors if log is not None: self._log = log else: @@ -50,8 +50,8 @@ class DockerSocketHandlerBase: self._current_missing = 0 self._current_buffer = b"" - self._selector = self._selectors.DefaultSelector() - self._selector.register(self._sock, self._selectors.EVENT_READ) + self._selector = selectors.DefaultSelector() + self._selector.register(self._sock, selectors.EVENT_READ) def __enter__(self): return self @@ -132,10 +132,10 @@ class DockerSocketHandlerBase: self._log(f"wrote {written} bytes, {len(self._write_buffer)} are left") if len(self._write_buffer) > 0: self._selector.modify( - self._sock, self._selectors.EVENT_READ | self._selectors.EVENT_WRITE + self._sock, selectors.EVENT_READ | selectors.EVENT_WRITE ) else: - self._selector.modify(self._sock, self._selectors.EVENT_READ) + self._selector.modify(self._sock, selectors.EVENT_READ) self._handle_end_of_writing() def select(self, timeout=None, _internal_recursion=False): @@ -163,12 +163,12 @@ class DockerSocketHandlerBase: events = self._selector.select(timeout) for key, event in events: if key.fileobj == self._sock: - ev_read = event & self._selectors.EVENT_READ != 0 - ev_write = event & self._selectors.EVENT_WRITE != 0 + ev_read = event & selectors.EVENT_READ != 0 + ev_write = event & selectors.EVENT_WRITE != 0 self._log(f"select event read:{ev_read} write:{ev_write}") - if event & self._selectors.EVENT_READ != 0: + if event & selectors.EVENT_READ != 0: self._read() - if event & self._selectors.EVENT_WRITE != 0: + if event & selectors.EVENT_WRITE != 0: self._write() result = len(events) if self._paramiko_read_workaround and len(self._write_buffer) > 0: @@ -210,5 +210,5 @@ class DockerSocketHandlerBase: class DockerSocketHandlerModule(DockerSocketHandlerBase): - def __init__(self, sock, module, selectors): - super().__init__(sock, selectors, module.debug) + def __init__(self, sock, module): + super().__init__(sock, module.debug) diff --git a/plugins/module_utils/_socket_helper.py b/plugins/module_utils/_socket_helper.py index defaf252..6158f4e5 100644 --- a/plugins/module_utils/_socket_helper.py +++ b/plugins/module_utils/_socket_helper.py @@ -11,9 +11,10 @@ import fcntl import os import os.path import socket as pysocket +import typing as t -def make_file_unblocking(file): +def make_file_unblocking(file) -> None: fcntl.fcntl( file.fileno(), fcntl.F_SETFL, @@ -21,7 +22,7 @@ def make_file_unblocking(file): ) -def make_file_blocking(file): +def make_file_blocking(file) -> None: fcntl.fcntl( file.fileno(), fcntl.F_SETFL, @@ -29,7 +30,7 @@ def make_file_blocking(file): ) -def make_unblocking(sock): +def make_unblocking(sock) -> None: if hasattr(sock, "_sock"): sock._sock.setblocking(0) elif hasattr(sock, "setblocking"): @@ -38,11 +39,11 @@ def make_unblocking(sock): make_file_unblocking(sock) -def _empty_writer(msg): +def _empty_writer(msg: str) -> None: pass -def shutdown_writing(sock, log=_empty_writer): +def shutdown_writing(sock, log: t.Callable[[str], None] = _empty_writer) -> None: # FIXME: This does **not work with SSLSocket**! Apparently SSLSocket does not allow to send # a close_notify TLS alert without completely shutting down the connection. # Calling sock.shutdown(pysocket.SHUT_WR) simply turns of TLS encryption and from that @@ -62,7 +63,7 @@ def shutdown_writing(sock, log=_empty_writer): log("No idea how to signal end of writing") -def write_to_socket(sock, data): +def write_to_socket(sock, data: bytes) -> None: if hasattr(sock, "_send_until_done"): # WrappedSocket (urllib3/contrib/pyopenssl) does not have `send`, but # only `sendall`, which uses `_send_until_done` under the hood. diff --git a/plugins/modules/docker_container_exec.py b/plugins/modules/docker_container_exec.py index bcbe4616..b8bf8049 100644 --- a/plugins/modules/docker_container_exec.py +++ b/plugins/modules/docker_container_exec.py @@ -163,7 +163,6 @@ exec_id: version_added: 2.1.0 """ -import selectors import shlex import traceback @@ -276,7 +275,7 @@ def main(): ) try: with DockerSocketHandlerModule( - exec_socket, client.module, selectors + exec_socket, client.module ) as exec_socket_handler: if stdin: exec_socket_handler.write(to_bytes(stdin)) diff --git a/plugins/plugin_utils/_socket_handler.py b/plugins/plugin_utils/_socket_handler.py index 81350ffd..2bdf8817 100644 --- a/plugins/plugin_utils/_socket_handler.py +++ b/plugins/plugin_utils/_socket_handler.py @@ -7,8 +7,6 @@ from __future__ import annotations -import selectors - from ansible_collections.community.docker.plugins.module_utils._socket_handler import ( DockerSocketHandlerBase, ) @@ -16,6 +14,4 @@ from ansible_collections.community.docker.plugins.module_utils._socket_handler i class DockerSocketHandler(DockerSocketHandlerBase): def __init__(self, display, sock, log=None, container=None): - super().__init__( - sock, selectors, log=lambda msg: display.vvvv(msg, host=container) - ) + super().__init__(sock, log=lambda msg: display.vvvv(msg, host=container))