16 Commits

Author SHA1 Message Date
github-actions[bot]
a6363f8591 chore(release): 0.4.4 2026-03-05 20:06:45 +00:00
f065d26a5f Merge pull request 'chore(release): 0.4.4' (#9) from release/0.4.4 into main
Reviewed-on: #9
2026-03-05 20:06:22 +00:00
0a46ac4527 build(uv.lock): update judas_protocol to 0.8.0 2026-03-03 19:34:50 +01:00
85553eefc5 refactor(connector.py): refactor calls to Message class constructors after protocol changes 2026-03-01 20:17:19 +01:00
f24f7c9b08 build(uv.lock): update judas_protocol to 0.7.0 2026-03-01 20:14:18 +01:00
github-actions[bot]
c3a8c2011c chore(release): 0.4.3 2026-03-01 18:38:46 +00:00
7099853125 fix(connector.py): fix no timeout on connection error 2026-03-01 19:37:24 +01:00
github-actions[bot]
a1afd261d5 chore(release): 0.4.2 2026-03-01 17:58:09 +00:00
29ed2c8e5d fix(connector.py): do not connect multiple times when BlockingIOError encountered in Connector.connect() 2026-03-01 18:56:44 +01:00
github-actions[bot]
b8fe5d66d4 chore(release): 0.4.1 2026-02-28 23:02:09 +00:00
4ee7a56695 Merge pull request 'chore(release): 0.4.1' (#7) from release/0.4.1 into main
Reviewed-on: #7
2026-02-28 23:01:09 +00:00
eb46889157 fix(connector.py): fix address already in use error 2026-03-01 00:00:27 +01:00
github-actions[bot]
48df6e4534 chore(release): 0.4.0 2026-02-28 22:53:34 +00:00
76ef047551 Merge pull request 'chore(release): 0.4.0' (#6) from release/0.4.0 into main
Reviewed-on: #6
2026-02-28 22:52:43 +00:00
2d8dc06fa1 build(uv.lock): update judas_protocol to 0.6.0 2026-02-28 20:58:40 +01:00
11ae93ed3c refactor(client.py): rename Client.mac_address -> Client.id 2026-02-28 20:58:27 +01:00
5 changed files with 81 additions and 14 deletions

View File

@@ -2,6 +2,54 @@
All notable changes to this project will be documented in this file.
## [0.4.4] - 2026-03-05
### Refactor
- [`85553ee`](https://gitea.pufereq.pl/judas/judas_client/commit/85553eefc56e30f6d6ce40ff428fa46dc0c880fa) **connector.py**: refactor calls to Message class constructors after protocol changes
### Build
- [`0a46ac4`](https://gitea.pufereq.pl/judas/judas_client/commit/0a46ac45273d516ac061fd3ef2515281a3adb1de) **uv.lock**: update judas_protocol to 0.8.0
- [`f24f7c9`](https://gitea.pufereq.pl/judas/judas_client/commit/f24f7c9b08624a7ce3a765fb259d6f126dec82fa) **uv.lock**: update judas_protocol to 0.7.0
## [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
- [`ac55216`](https://gitea.pufereq.pl/judas/judas_client/commit/ac5521618ba89b25fd31f09357470ed96cd405cf) **client.py**: add custom ID support with `JUDAS_ID` env variable
- [`6486607`](https://gitea.pufereq.pl/judas/judas_client/commit/64866079d7e2087be7dd8588b22be73006605a91) **connector.py**: handle `CONTROL.CLOSE` msgs
### Miscellaneous Tasks
- [`448ffa4`](https://gitea.pufereq.pl/judas/judas_client/commit/448ffa443d0b7b464d3f70f81a0b1b3f17765484) **uv.lock**: update depedencies for Python 3.14
### Refactor
- [`11ae93e`](https://gitea.pufereq.pl/judas/judas_client/commit/11ae93ed3ceac148097f4246e53e2150a653fcf8) **client.py**: rename `Client.mac_address` -> `Client.id`
### Build
- [`2d8dc06`](https://gitea.pufereq.pl/judas/judas_client/commit/2d8dc06fa1087bb1ed968d798dc82cd0c6159e16) **uv.lock**: update judas_protocol to 0.6.0
## [0.3.0] - 2025-11-30
### Bug Fixes

View File

@@ -4,7 +4,7 @@ build-backend = "uv_build"
[project]
name = "judas_client"
version = "0.3.0"
version = "0.4.4"
description = "A client for judas, a remote PC fleet management system."
readme = "README.md"
authors = []

View File

@@ -31,17 +31,17 @@ class Client:
self.server_port: int = server_port
if "JUDAS_ID" in os.environ:
self.mac_address: str = os.environ["JUDAS_ID"]
self.id: str = os.environ["JUDAS_ID"]
self.logger.debug(
f"Using MAC address from environment variable JUDAS_ID: {self.mac_address}"
f"Using ID from environment variable JUDAS_ID: {self.id}"
)
else:
self.mac_address = self._get_mac_address()
self.id = self._get_mac_address()
self.logger.debug(f"MAC address: {self.mac_address}")
self.logger.debug(f"ID: {self.id}")
self.connector: Connector = Connector(
mac_address=self.mac_address,
mac_address=self.id,
host=self.server_host,
port=self.server_port,
on_message=self.handle_message,
@@ -71,5 +71,5 @@ class Client:
def run(self) -> None:
"""Run the client."""
self.logger.info(f"Starting Client ({self.mac_address})...")
self.logger.info(f"Starting Client ({self.id})...")
self.connector.run()

View File

@@ -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(
@@ -106,7 +107,7 @@ class Connector:
def send_hello(self) -> None:
"""Send a HELLO message to the server."""
self.logger.debug("[*] Sending HELLO message...")
hello_message: Message = Message.hello(self.mac_address)
hello_message: Message = Message.Control.hello(self.mac_address)
self.send(hello_message)
def close(self) -> None:
@@ -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...")
@@ -201,7 +218,9 @@ class Connector:
self.on_message(message)
if message.ack_required:
ack_message: Message = Message.ack(message.id)
ack_message: Message = Message.Control.ack(
message.id
)
self.send(ack_message)
self._send_outbound()
except Exception as e:

6
uv.lock generated
View File

@@ -275,7 +275,7 @@ wheels = [
[[package]]
name = "judas-client"
version = "0.3.0"
version = "0.4.4"
source = { editable = "." }
dependencies = [
{ name = "judas-protocol" },
@@ -318,8 +318,8 @@ test = [
[[package]]
name = "judas-protocol"
version = "0.5.0"
source = { git = "https://gitea.pufereq.pl/judas/judas_protocol.git#c48b69ecee16f5824ffd8bce8921341d5fa326b7" }
version = "0.8.0"
source = { git = "https://gitea.pufereq.pl/judas/judas_protocol.git#a805ccf38edffadc1b8c8b276e60758c86516cd3" }
[[package]]
name = "markdown-it-py"