Merge branch 'main' into 147-sig-activity-changes

# Conflicts:
#	core/constants.py
#	pyproject.toml
This commit is contained in:
Ian Renton
2026-09-20 09:51:29 +01:00
26 changed files with 93 additions and 44 deletions
+19 -5
View File
@@ -1,7 +1,8 @@
import logging
import re
import socket
from datetime import datetime
from threading import Event, Thread
from threading import Event, Lock, Thread
import pytz
import telnetlib3
@@ -29,6 +30,7 @@ class RBN(SpotProvider):
super().__init__(name, provider_config)
self._port = provider_config["port"]
self._telnet = None
self._telnet_lock = Lock()
self._thread = None
self._stop_event = Event()
@@ -38,10 +40,15 @@ class RBN(SpotProvider):
def stop(self):
self._stop_event.set()
if self._telnet:
self._telnet.close()
with self._telnet_lock:
if self._telnet:
try:
self._telnet.sock.shutdown(socket.SHUT_RDWR)
except (AttributeError, OSError):
pass
self._telnet.close()
if self._thread:
self._thread.join(timeout=15)
self._thread.join(timeout=5)
if self._thread.is_alive():
logger.warning(f"RBN (port {self._port!s}) worker thread did not exit on time and will be killed.")
@@ -52,7 +59,14 @@ class RBN(SpotProvider):
try:
self.status = "Connecting"
logger.info(f"RBN port {self._port!s} connecting...")
self._telnet = telnetlib3.Telnet("telnet.reversebeacon.net", self._port)
new_telnet = telnetlib3.Telnet("telnet.reversebeacon.net", self._port)
with self._telnet_lock:
self._telnet = new_telnet
if self._stop_event.is_set():
# stop() was called while we were connecting, close the connection rather than trying to
# read when we know it won't work
new_telnet.close()
break
self._telnet.read_until("Please enter your call: ".encode("latin-1"))
self._telnet.write(f"{SERVER_OWNER_CALLSIGN}\n".encode("latin-1"))
connected = True