selectors is now part of stdlib. (#1166)

This commit is contained in:
Felix Fontein 2025-10-12 22:00:51 +02:00 committed by GitHub
parent c75aa5dd64
commit 17e30adb93
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 21 additions and 25 deletions

View File

@ -9,6 +9,7 @@ from __future__ import annotations
import os import os
import os.path import os.path
import selectors
import socket as pysocket import socket as pysocket
import struct import struct
@ -26,10 +27,9 @@ PARAMIKO_POLL_TIMEOUT = 0.01 # 10 milliseconds
class DockerSocketHandlerBase: class DockerSocketHandlerBase:
def __init__(self, sock, selectors, log=None): def __init__(self, sock, log=None):
make_unblocking(sock) make_unblocking(sock)
self._selectors = selectors
if log is not None: if log is not None:
self._log = log self._log = log
else: else:
@ -50,8 +50,8 @@ class DockerSocketHandlerBase:
self._current_missing = 0 self._current_missing = 0
self._current_buffer = b"" self._current_buffer = b""
self._selector = self._selectors.DefaultSelector() self._selector = selectors.DefaultSelector()
self._selector.register(self._sock, self._selectors.EVENT_READ) self._selector.register(self._sock, selectors.EVENT_READ)
def __enter__(self): def __enter__(self):
return self return self
@ -132,10 +132,10 @@ class DockerSocketHandlerBase:
self._log(f"wrote {written} bytes, {len(self._write_buffer)} are left") self._log(f"wrote {written} bytes, {len(self._write_buffer)} are left")
if len(self._write_buffer) > 0: if len(self._write_buffer) > 0:
self._selector.modify( self._selector.modify(
self._sock, self._selectors.EVENT_READ | self._selectors.EVENT_WRITE self._sock, selectors.EVENT_READ | selectors.EVENT_WRITE
) )
else: else:
self._selector.modify(self._sock, self._selectors.EVENT_READ) self._selector.modify(self._sock, selectors.EVENT_READ)
self._handle_end_of_writing() self._handle_end_of_writing()
def select(self, timeout=None, _internal_recursion=False): def select(self, timeout=None, _internal_recursion=False):
@ -163,12 +163,12 @@ class DockerSocketHandlerBase:
events = self._selector.select(timeout) events = self._selector.select(timeout)
for key, event in events: for key, event in events:
if key.fileobj == self._sock: if key.fileobj == self._sock:
ev_read = event & self._selectors.EVENT_READ != 0 ev_read = event & selectors.EVENT_READ != 0
ev_write = event & self._selectors.EVENT_WRITE != 0 ev_write = event & selectors.EVENT_WRITE != 0
self._log(f"select event read:{ev_read} write:{ev_write}") 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() self._read()
if event & self._selectors.EVENT_WRITE != 0: if event & selectors.EVENT_WRITE != 0:
self._write() self._write()
result = len(events) result = len(events)
if self._paramiko_read_workaround and len(self._write_buffer) > 0: if self._paramiko_read_workaround and len(self._write_buffer) > 0:
@ -210,5 +210,5 @@ class DockerSocketHandlerBase:
class DockerSocketHandlerModule(DockerSocketHandlerBase): class DockerSocketHandlerModule(DockerSocketHandlerBase):
def __init__(self, sock, module, selectors): def __init__(self, sock, module):
super().__init__(sock, selectors, module.debug) super().__init__(sock, module.debug)

View File

@ -11,9 +11,10 @@ import fcntl
import os import os
import os.path import os.path
import socket as pysocket import socket as pysocket
import typing as t
def make_file_unblocking(file): def make_file_unblocking(file) -> None:
fcntl.fcntl( fcntl.fcntl(
file.fileno(), file.fileno(),
fcntl.F_SETFL, 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( fcntl.fcntl(
file.fileno(), file.fileno(),
fcntl.F_SETFL, 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"): if hasattr(sock, "_sock"):
sock._sock.setblocking(0) sock._sock.setblocking(0)
elif hasattr(sock, "setblocking"): elif hasattr(sock, "setblocking"):
@ -38,11 +39,11 @@ def make_unblocking(sock):
make_file_unblocking(sock) make_file_unblocking(sock)
def _empty_writer(msg): def _empty_writer(msg: str) -> None:
pass 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 # 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. # 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 # 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") 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"): if hasattr(sock, "_send_until_done"):
# WrappedSocket (urllib3/contrib/pyopenssl) does not have `send`, but # WrappedSocket (urllib3/contrib/pyopenssl) does not have `send`, but
# only `sendall`, which uses `_send_until_done` under the hood. # only `sendall`, which uses `_send_until_done` under the hood.

View File

@ -163,7 +163,6 @@ exec_id:
version_added: 2.1.0 version_added: 2.1.0
""" """
import selectors
import shlex import shlex
import traceback import traceback
@ -276,7 +275,7 @@ def main():
) )
try: try:
with DockerSocketHandlerModule( with DockerSocketHandlerModule(
exec_socket, client.module, selectors exec_socket, client.module
) as exec_socket_handler: ) as exec_socket_handler:
if stdin: if stdin:
exec_socket_handler.write(to_bytes(stdin)) exec_socket_handler.write(to_bytes(stdin))

View File

@ -7,8 +7,6 @@
from __future__ import annotations from __future__ import annotations
import selectors
from ansible_collections.community.docker.plugins.module_utils._socket_handler import ( from ansible_collections.community.docker.plugins.module_utils._socket_handler import (
DockerSocketHandlerBase, DockerSocketHandlerBase,
) )
@ -16,6 +14,4 @@ from ansible_collections.community.docker.plugins.module_utils._socket_handler i
class DockerSocketHandler(DockerSocketHandlerBase): class DockerSocketHandler(DockerSocketHandlerBase):
def __init__(self, display, sock, log=None, container=None): def __init__(self, display, sock, log=None, container=None):
super().__init__( super().__init__(sock, log=lambda msg: display.vvvv(msg, host=container))
sock, selectors, log=lambda msg: display.vvvv(msg, host=container)
)