remoteRF-server 0.1.85__tar.gz → 0.1.87__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/PKG-INFO +1 -1
  2. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/pyproject.toml +1 -1
  3. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/host/host_tunnel_server.py +40 -2
  4. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/server/device_manager.py +19 -9
  5. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/server/grpc_server.py +7 -10
  6. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server.egg-info/PKG-INFO +1 -1
  7. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/README.md +0 -0
  8. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/setup.cfg +0 -0
  9. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/__init__.py +0 -0
  10. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/__init__.py +0 -0
  11. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/grpc/__init__.py +0 -0
  12. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/grpc/grpc_host_pb2.py +0 -0
  13. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/grpc/grpc_host_pb2_grpc.py +0 -0
  14. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/grpc/grpc_pb2.py +0 -0
  15. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/grpc/grpc_pb2_grpc.py +0 -0
  16. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/utils/__init__.py +0 -0
  17. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/utils/ansi_codes.py +0 -0
  18. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/utils/api_token.py +0 -0
  19. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/utils/db_connection.py +0 -0
  20. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/utils/db_location.py +0 -0
  21. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/utils/list_string.py +0 -0
  22. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/common/utils/process_arg.py +0 -0
  23. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/drivers/__init__.py +0 -0
  24. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/drivers/adalm_pluto/__init__.py +0 -0
  25. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/drivers/adalm_pluto/pluto_remote_server.py +0 -0
  26. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/host/__init__.py +0 -0
  27. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/host/host_directory_store.py +0 -0
  28. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/server/__init__.py +0 -0
  29. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/server/acc_perms.py +0 -0
  30. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/server/cert_provider.py +0 -0
  31. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/server/reservation.py +0 -0
  32. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/server/rpc_manager.py +0 -0
  33. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/server/user_group_cli.py +0 -0
  34. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/server/user_group_handler.py +0 -0
  35. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/serverrf_cli.py +0 -0
  36. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/tools/__init__.py +0 -0
  37. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server/tools/gen_certs.py +0 -0
  38. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server.egg-info/SOURCES.txt +0 -0
  39. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server.egg-info/dependency_links.txt +0 -0
  40. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server.egg-info/entry_points.txt +0 -0
  41. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server.egg-info/requires.txt +0 -0
  42. {remoterf_server-0.1.85 → remoterf_server-0.1.87}/src/remoteRF_server.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoteRF-server
3
- Version: 0.1.85
3
+ Version: 0.1.87
4
4
  Description-Content-Type: text/markdown
5
5
  Requires-Dist: grpcio
6
6
  Requires-Dist: protobuf
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "remoteRF-server"
7
- version = "0.1.85"
7
+ version = "0.1.87"
8
8
  dependencies = [
9
9
  "grpcio",
10
10
  "protobuf",
@@ -1258,7 +1258,11 @@ def start_host_tunnel_server(
1258
1258
  registry: Optional[HostTunnelRegistry] = None,
1259
1259
  max_workers: int = 32,
1260
1260
  ) -> Tuple[grpc.Server, threading.Thread, HostTunnelRegistry]:
1261
- reg = registry or HostTunnelRegistry()
1261
+ if registry is not None:
1262
+ reg = set_tunnel_registry(registry)
1263
+ else:
1264
+ reg = get_tunnel_registry(create=True)
1265
+ assert reg is not None
1262
1266
 
1263
1267
  options = [
1264
1268
  ("grpc.max_send_message_length", 100 * 1024 * 1024),
@@ -1301,4 +1305,38 @@ def start_host_tunnel_server(
1301
1305
  th.start()
1302
1306
  return server, th, reg
1303
1307
 
1304
- TUNNEL_REGISTRY = None
1308
+ # -----------------------------------------------------------------------------
1309
+ # Singleton registry (process-wide)
1310
+ # -----------------------------------------------------------------------------
1311
+
1312
+ _TUNNEL_REGISTRY_LOCK = threading.Lock()
1313
+ TUNNEL_REGISTRY: Optional["HostTunnelRegistry"] = None
1314
+
1315
+ def get_tunnel_registry(*, create: bool = True) -> Optional["HostTunnelRegistry"]:
1316
+ """
1317
+ Returns the process-wide HostTunnelRegistry instance.
1318
+
1319
+ IMPORTANT: Import the MODULE (e.g. `import ... as hts`) and access
1320
+ `hts.get_tunnel_registry()` or `hts.TUNNEL_REGISTRY`.
1321
+
1322
+ Avoid `from host_tunnel_server import TUNNEL_REGISTRY` if you ever plan
1323
+ to replace it, because that snapshots the value at import time.
1324
+ """
1325
+ global TUNNEL_REGISTRY
1326
+
1327
+ if TUNNEL_REGISTRY is not None:
1328
+ return TUNNEL_REGISTRY
1329
+ if not create:
1330
+ return None
1331
+
1332
+ with _TUNNEL_REGISTRY_LOCK:
1333
+ if TUNNEL_REGISTRY is None:
1334
+ TUNNEL_REGISTRY = HostTunnelRegistry()
1335
+ return TUNNEL_REGISTRY
1336
+
1337
+ def set_tunnel_registry(reg: "HostTunnelRegistry") -> "HostTunnelRegistry":
1338
+ """Force the singleton to a specific instance."""
1339
+ global TUNNEL_REGISTRY
1340
+ with _TUNNEL_REGISTRY_LOCK:
1341
+ TUNNEL_REGISTRY = reg
1342
+ return reg
@@ -41,8 +41,7 @@ _devices: Dict[int, _DeviceState] = {}
41
41
  # -----------------------------
42
42
 
43
43
  def _get_host_registry():
44
- # host_tunnel_server sets this when the tunnel server starts
45
- return getattr(hts, "TUNNEL_REGISTRY", None)
44
+ return hts.get_tunnel_registry()
46
45
 
47
46
  def _local_devices_str_snapshot() -> Dict[int, str]:
48
47
  """
@@ -71,13 +70,6 @@ def _local_devices_str_snapshot() -> Dict[int, str]:
71
70
  return out
72
71
 
73
72
  def _host_devices_str_snapshot() -> Dict[int, str]:
74
- """
75
- Pull a FRESH host-device directory snapshot every call.
76
-
77
- Includes:
78
- - devices on currently connected hosts (online)
79
- - devices on disconnected hosts that were previously seen/persisted (offline)
80
- """
81
73
  reg = _get_host_registry()
82
74
  if reg is None:
83
75
  return {}
@@ -405,6 +397,24 @@ def get_all_devices_str() -> Dict[int, str]:
405
397
  # host snapshot (includes online + offline-but-known host devices)
406
398
  host_out = _host_devices_str_snapshot()
407
399
 
400
+ # ---- DEBUG: print full host_out ----
401
+ try:
402
+ from ..host import host_tunnel_server as hts # adjust if your canonical import differs
403
+ reg = hts.get_tunnel_registry(create=False) if hasattr(hts, "get_tunnel_registry") else None
404
+ print("\n[device_manager] host_out dump")
405
+ print(f" hts module: {getattr(hts, '__name__', '<?>')}")
406
+ print(f" registry id: {id(reg) if reg is not None else None}")
407
+ print(f" host_out count: {len(host_out)}")
408
+
409
+ if not host_out:
410
+ print(" (empty)")
411
+ else:
412
+ for gid, s in sorted(host_out.items(), key=lambda kv: int(kv[0])):
413
+ print(f" {gid}: {s}")
414
+ print()
415
+ except Exception as e:
416
+ print(f"[device_manager] host_out dump failed: {e}")
417
+
408
418
  # merge with collision handling
409
419
  for gid, s in host_out.items():
410
420
  if gid in out:
@@ -207,7 +207,8 @@ def serve():
207
207
  server_credentials = grpc.ssl_server_credentials(
208
208
  ((private_key, certificate_chain,),))
209
209
 
210
- reg = HostTunnelRegistry()
210
+ reg = hts.get_tunnel_registry()
211
+ assert reg is not None
211
212
 
212
213
  # publish registry where device_manager expects it
213
214
  hts.TUNNEL_REGISTRY = reg
@@ -387,10 +388,8 @@ def _fmt_ms_ago(ms: int) -> str:
387
388
  return f"{dt/60_000:.1f}m"
388
389
 
389
390
  def _cmd_hosts_status() -> None:
390
- reg = getattr(hts, "TUNNEL_REGISTRY", None)
391
- if reg is None:
392
- printf("Host tunnel registry not initialized yet.", Sty.RED)
393
- return
391
+ reg = hts.get_tunnel_registry()
392
+ assert reg is not None
394
393
 
395
394
  hosts = reg.list_hosts() # host_id -> HostStatus
396
395
  devices = reg.list_devices() # device_id -> DeviceStatus
@@ -427,10 +426,8 @@ def _cmd_hosts_status() -> None:
427
426
  )
428
427
 
429
428
  def _cmd_devices_status() -> None:
430
- reg = getattr(hts, "TUNNEL_REGISTRY", None)
431
- if reg is None:
432
- printf("Host tunnel registry not initialized yet.", Sty.RED)
433
- return
429
+ reg = hts.get_tunnel_registry()
430
+ assert reg is not None
434
431
 
435
432
  devices = reg.list_devices()
436
433
  printf("Devices (live):", Sty.BOLD)
@@ -747,7 +744,7 @@ def _cmd_hosts_wipe(*, yes: bool = False) -> None:
747
744
  return
748
745
 
749
746
  # 2) clear in-memory registry (THIS is what drives `hosts status`)
750
- reg = getattr(hts, "TUNNEL_REGISTRY", None)
747
+ reg = hts.get_tunnel_registry()
751
748
  if reg is None:
752
749
  printf("Host tunnel registry not initialized; only persisted wipe attempted.", Sty.GRAY)
753
750
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoteRF-server
3
- Version: 0.1.85
3
+ Version: 0.1.87
4
4
  Description-Content-Type: text/markdown
5
5
  Requires-Dist: grpcio
6
6
  Requires-Dist: protobuf