Compare commits
7 Commits
48df6e4534
...
0.4.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3a8c2011c | ||
|
7099853125
|
|||
|
|
a1afd261d5 | ||
|
29ed2c8e5d
|
|||
|
|
b8fe5d66d4 | ||
| 4ee7a56695 | |||
|
eb46889157
|
18
CHANGELOG.md
18
CHANGELOG.md
@@ -2,6 +2,24 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [0.4.3] - 2026-03-01
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- [`7099853`](https://gitea.pufereq.pl/judas/judas_client/commit/709985312514f866b760610fe7d8374763d188b2) **connector.py**: fix no timeout on connection error
|
||||
|
||||
## [0.4.2] - 2026-03-01
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- [`29ed2c8`](https://gitea.pufereq.pl/judas/judas_client/commit/29ed2c8e5d256aa7b75424e6d71e14463f8b9caa) **connector.py**: do not connect multiple times when BlockingIOError encountered in `Connector.connect()`
|
||||
|
||||
## [0.4.1] - 2026-02-28
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- [`eb46889`](https://gitea.pufereq.pl/judas/judas_client/commit/eb4688915747e2dcff3b331618c2b0185f1b611d) **connector.py**: fix `address already in use` error
|
||||
|
||||
## [0.4.0] - 2026-02-28
|
||||
|
||||
### Features
|
||||
|
||||
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
||||
|
||||
[project]
|
||||
name = "judas_client"
|
||||
version = "0.4.0"
|
||||
version = "0.4.3"
|
||||
description = "A client for judas, a remote PC fleet management system."
|
||||
readme = "README.md"
|
||||
authors = []
|
||||
|
||||
@@ -41,6 +41,7 @@ class Connector:
|
||||
self.socket: socket.socket = socket.socket(
|
||||
socket.AF_INET, socket.SOCK_STREAM
|
||||
)
|
||||
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
self.socket.setblocking(False)
|
||||
|
||||
self.selector.register(
|
||||
@@ -144,8 +145,24 @@ class Connector:
|
||||
self.socket.connect((self.host, self.port))
|
||||
connected = True
|
||||
except BlockingIOError:
|
||||
# Connection in progress
|
||||
time.sleep(0.1)
|
||||
# connection in progress, wait for socket to become writable
|
||||
self.logger.debug(
|
||||
"[.] Connection in progress, waiting for completion..."
|
||||
)
|
||||
events = self.selector.select(timeout=1)
|
||||
for _, mask in events:
|
||||
if mask & selectors.EVENT_WRITE:
|
||||
err = self.socket.getsockopt(
|
||||
socket.SOL_SOCKET, socket.SO_ERROR
|
||||
)
|
||||
if err == 0:
|
||||
connected = True
|
||||
else:
|
||||
self.logger.error(
|
||||
f"[!] Connection failed with error code: {err}"
|
||||
)
|
||||
if not connected:
|
||||
continue
|
||||
except socket.error as e:
|
||||
self.logger.error(f"[!] Connection error: {e}")
|
||||
self.logger.debug(f"[.] Retrying in {delay} seconds...")
|
||||
|
||||
Reference in New Issue
Block a user