remoteRF-server-testing 0.0.6__tar.gz → 0.0.7__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.
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/PKG-INFO +1 -1
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/pyproject.toml +1 -1
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/tools/gist_status.py +14 -22
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server_testing.egg-info/PKG-INFO +1 -1
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server_testing.egg-info/SOURCES.txt +1 -2
- remoterf_server_testing-0.0.6/tests/test_rpc_manager.py +0 -166
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/README.md +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/setup.cfg +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/__init__.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/__init__.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/grpc/__init__.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/grpc/grpc_host_pb2.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/grpc/grpc_host_pb2_grpc.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/grpc/grpc_pb2.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/grpc/grpc_pb2_grpc.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/idl/__init__.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/idl/device_schema.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/idl/pluto_schema.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/idl/schema.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/utils/__init__.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/utils/ansi_codes.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/utils/api_token.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/utils/db_connection.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/utils/db_location.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/utils/list_string.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/common/utils/process_arg.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/drivers/__init__.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/drivers/adalm_pluto/__init__.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/drivers/adalm_pluto/pluto_remote_server.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/host/__init__.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/host/host_auth_token.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/host/host_directory_store.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/host/host_tunnel_server.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/server/__init__.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/server/acc_perms.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/server/cert_provider.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/server/device_manager.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/server/grpc_server.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/server/reservation.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/server/rpc_manager.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/server/user_group_cli.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/server/user_group_handler.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/serverrf_cli.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/tools/__init__.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/tools/gen_certs.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/tools/gist_status_testing.py +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server_testing.egg-info/dependency_links.txt +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server_testing.egg-info/entry_points.txt +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server_testing.egg-info/requires.txt +0 -0
- {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server_testing.egg-info/top_level.txt +0 -0
|
@@ -8,7 +8,7 @@ import sys
|
|
|
8
8
|
import time
|
|
9
9
|
import threading
|
|
10
10
|
from pathlib import Path
|
|
11
|
-
from typing import Dict, Optional
|
|
11
|
+
from typing import Dict, Optional, Tuple
|
|
12
12
|
|
|
13
13
|
import requests
|
|
14
14
|
|
|
@@ -34,7 +34,7 @@ def _read_env_kv(path: Path) -> Dict[str, str]:
|
|
|
34
34
|
return out
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
def _load_gist_env() ->
|
|
37
|
+
def _load_gist_env() -> Optional[Tuple[str, str, str]]:
|
|
38
38
|
p = _cfg_dir() / "gist.env"
|
|
39
39
|
kv = _read_env_kv(p)
|
|
40
40
|
|
|
@@ -42,25 +42,10 @@ def _load_gist_env() -> tuple[str, str, str]:
|
|
|
42
42
|
token = kv.get("GITHUB_TOKEN", "").strip()
|
|
43
43
|
filename = kv.get("STATUS_GIST_FILENAME", "").strip()
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
missing.append("STATUS_GIST_ID")
|
|
48
|
-
if not token:
|
|
49
|
-
missing.append("GITHUB_TOKEN")
|
|
50
|
-
if not filename:
|
|
51
|
-
missing.append("STATUS_GIST_FILENAME")
|
|
52
|
-
|
|
53
|
-
if missing:
|
|
54
|
-
print(f"[gist_status] Missing {', '.join(missing)} in {p}", file=sys.stderr)
|
|
55
|
-
print(
|
|
56
|
-
"[gist_status] Fix: run:\n"
|
|
57
|
-
" serverrf --gist --set --id <gist_id> --file <filename>\n"
|
|
58
|
-
"Or manually create gist.env with those keys.",
|
|
59
|
-
file=sys.stderr,
|
|
60
|
-
)
|
|
61
|
-
raise SystemExit(2)
|
|
45
|
+
if not gist_id or not token or not filename:
|
|
46
|
+
return None
|
|
62
47
|
|
|
63
|
-
return gist_id, token, filename
|
|
48
|
+
return (gist_id, token, filename)
|
|
64
49
|
|
|
65
50
|
|
|
66
51
|
def build_status() -> dict:
|
|
@@ -96,7 +81,10 @@ def push_gist(*, gist_id: str, gh_token: str, filename: str, payload: dict) -> N
|
|
|
96
81
|
|
|
97
82
|
|
|
98
83
|
def _publisher_loop(period_sec: int) -> None:
|
|
99
|
-
|
|
84
|
+
cfg = _load_gist_env()
|
|
85
|
+
if cfg is None:
|
|
86
|
+
return
|
|
87
|
+
gist_id, gh_token, filename = cfg
|
|
100
88
|
|
|
101
89
|
try:
|
|
102
90
|
push_gist(gist_id=gist_id, gh_token=gh_token, filename=filename, payload=build_status())
|
|
@@ -122,6 +110,10 @@ def start_status_publisher() -> None:
|
|
|
122
110
|
if _publisher_thread is not None and _publisher_thread.is_alive():
|
|
123
111
|
return
|
|
124
112
|
|
|
113
|
+
if _load_gist_env() is None:
|
|
114
|
+
print("[gist_status] off (not configured; see README gist docs)", file=sys.stderr)
|
|
115
|
+
return
|
|
116
|
+
|
|
125
117
|
t = threading.Thread(
|
|
126
118
|
target=_publisher_loop,
|
|
127
119
|
args=(int(120),),
|
|
@@ -136,4 +128,4 @@ def start_status_publisher() -> None:
|
|
|
136
128
|
# if __name__ == "__main__":
|
|
137
129
|
# start_status_publisher(period_sec=120)
|
|
138
130
|
# while True:
|
|
139
|
-
# time.sleep(3600)
|
|
131
|
+
# time.sleep(3600)
|
|
@@ -44,5 +44,4 @@ src/remoteRF_server_testing.egg-info/SOURCES.txt
|
|
|
44
44
|
src/remoteRF_server_testing.egg-info/dependency_links.txt
|
|
45
45
|
src/remoteRF_server_testing.egg-info/entry_points.txt
|
|
46
46
|
src/remoteRF_server_testing.egg-info/requires.txt
|
|
47
|
-
src/remoteRF_server_testing.egg-info/top_level.txt
|
|
48
|
-
tests/test_rpc_manager.py
|
|
47
|
+
src/remoteRF_server_testing.egg-info/top_level.txt
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
from contextlib import contextmanager
|
|
2
|
-
import importlib
|
|
3
|
-
import sys
|
|
4
|
-
import types
|
|
5
|
-
import unittest
|
|
6
|
-
from unittest.mock import patch
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def _install_rpc_manager_stubs():
|
|
10
|
-
reservation_mod = types.ModuleType("remoteRF_server.server.reservation")
|
|
11
|
-
|
|
12
|
-
class _ReservationHandler:
|
|
13
|
-
def handle_call(self, *, function_name, args):
|
|
14
|
-
return {"handled": (function_name, args)}
|
|
15
|
-
|
|
16
|
-
reservation_mod.reservation_handler = _ReservationHandler()
|
|
17
|
-
sys.modules["remoteRF_server.server.reservation"] = reservation_mod
|
|
18
|
-
|
|
19
|
-
utils_mod = types.ModuleType("remoteRF_server.common.utils")
|
|
20
|
-
utils_mod.map_arg = lambda value: value
|
|
21
|
-
utils_mod.unmap_arg = lambda value: value
|
|
22
|
-
sys.modules["remoteRF_server.common.utils"] = utils_mod
|
|
23
|
-
|
|
24
|
-
device_manager_mod = types.ModuleType("remoteRF_server.server.device_manager")
|
|
25
|
-
|
|
26
|
-
class VirtualDevice:
|
|
27
|
-
def __init__(self, *, gid, host_id, device_id, label="", serial="", kind=""):
|
|
28
|
-
self.gid = gid
|
|
29
|
-
self.host_id = host_id
|
|
30
|
-
self.device_id = device_id
|
|
31
|
-
self.label = label
|
|
32
|
-
self.serial = serial
|
|
33
|
-
self.kind = kind
|
|
34
|
-
|
|
35
|
-
@contextmanager
|
|
36
|
-
def acquire_device(_api_token):
|
|
37
|
-
raise NotImplementedError("patched per test")
|
|
38
|
-
yield
|
|
39
|
-
|
|
40
|
-
device_manager_mod.VirtualDevice = VirtualDevice
|
|
41
|
-
device_manager_mod.acquire_device = acquire_device
|
|
42
|
-
device_manager_mod.get_device_schema = lambda _gid: None
|
|
43
|
-
device_manager_mod.find_device_id_by_name = lambda _name: None
|
|
44
|
-
device_manager_mod.get_schema_by_token = lambda _token: None
|
|
45
|
-
device_manager_mod.resolve_gid_for_token = lambda _token: None
|
|
46
|
-
sys.modules["remoteRF_server.server.device_manager"] = device_manager_mod
|
|
47
|
-
|
|
48
|
-
host_tunnel_mod = types.ModuleType("remoteRF_server.host.host_tunnel_server")
|
|
49
|
-
host_tunnel_mod.get_tunnel_registry = lambda create=False: None
|
|
50
|
-
host_tunnel_mod.handle_host_device = lambda *args, **kwargs: {}
|
|
51
|
-
sys.modules["remoteRF_server.host.host_tunnel_server"] = host_tunnel_mod
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
_install_rpc_manager_stubs()
|
|
55
|
-
sys.modules.pop("remoteRF_server.server.rpc_manager", None)
|
|
56
|
-
rpc_manager_module = importlib.import_module("remoteRF_server.server.rpc_manager")
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class _FakeSchemaDevice:
|
|
60
|
-
device_type = "hackrf"
|
|
61
|
-
|
|
62
|
-
def __init__(self):
|
|
63
|
-
self.calls = []
|
|
64
|
-
|
|
65
|
-
def dispatch(self, method_name, args):
|
|
66
|
-
self.calls.append((method_name, args))
|
|
67
|
-
|
|
68
|
-
if method_name == "call_get_serial_no":
|
|
69
|
-
return "SERIAL-123"
|
|
70
|
-
|
|
71
|
-
if method_name == "set_center_freq":
|
|
72
|
-
return None
|
|
73
|
-
|
|
74
|
-
raise AssertionError(f"Unexpected dispatch: {method_name} {args}")
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
@contextmanager
|
|
78
|
-
def _acquired_device(gid, dev):
|
|
79
|
-
yield gid, dev
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
class RpcManagerDeviceDispatchTests(unittest.TestCase):
|
|
83
|
-
def setUp(self):
|
|
84
|
-
self.rpc = rpc_manager_module.RpcManager()
|
|
85
|
-
|
|
86
|
-
def test_routes_non_pluto_schema_call(self):
|
|
87
|
-
dev = _FakeSchemaDevice()
|
|
88
|
-
|
|
89
|
-
with patch.object(
|
|
90
|
-
rpc_manager_module,
|
|
91
|
-
"acquire_device",
|
|
92
|
-
return_value=_acquired_device(7, dev),
|
|
93
|
-
):
|
|
94
|
-
result = self.rpc.run_rpc(
|
|
95
|
-
function_name="Hackrf:get_serial_no:CALL0",
|
|
96
|
-
args={"a": "token"},
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
self.assertEqual(result["get_serial_no"], "SERIAL-123")
|
|
100
|
-
self.assertEqual(dev.calls, [("call_get_serial_no", {})])
|
|
101
|
-
|
|
102
|
-
def test_rejects_mismatched_schema_namespace(self):
|
|
103
|
-
dev = _FakeSchemaDevice()
|
|
104
|
-
|
|
105
|
-
with patch.object(
|
|
106
|
-
rpc_manager_module,
|
|
107
|
-
"acquire_device",
|
|
108
|
-
return_value=_acquired_device(7, dev),
|
|
109
|
-
):
|
|
110
|
-
result = self.rpc.run_rpc(
|
|
111
|
-
function_name="Pluto:get_serial_no:CALL0",
|
|
112
|
-
args={"a": "token"},
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
self.assertIn("does not match", result["a"])
|
|
116
|
-
|
|
117
|
-
def test_uses_builtin_ip_ping_for_schemas_without_call_ip(self):
|
|
118
|
-
dev = _FakeSchemaDevice()
|
|
119
|
-
|
|
120
|
-
with patch.object(
|
|
121
|
-
rpc_manager_module,
|
|
122
|
-
"acquire_device",
|
|
123
|
-
return_value=_acquired_device(7, dev),
|
|
124
|
-
):
|
|
125
|
-
result = self.rpc.run_rpc(
|
|
126
|
-
function_name="Hackrf:ip:CALL0",
|
|
127
|
-
args={"a": "token"},
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
self.assertEqual(result["ip"], "hackrf:7")
|
|
131
|
-
self.assertEqual(dev.calls, [])
|
|
132
|
-
|
|
133
|
-
def test_forwards_host_devices_for_non_pluto_schema_calls(self):
|
|
134
|
-
dev = rpc_manager_module.VirtualDevice(
|
|
135
|
-
gid=9,
|
|
136
|
-
host_id="host-1",
|
|
137
|
-
device_id="9",
|
|
138
|
-
kind="hackrf",
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
with patch.object(
|
|
142
|
-
rpc_manager_module,
|
|
143
|
-
"acquire_device",
|
|
144
|
-
return_value=_acquired_device(9, dev),
|
|
145
|
-
), patch.object(
|
|
146
|
-
rpc_manager_module.hts,
|
|
147
|
-
"get_tunnel_registry",
|
|
148
|
-
return_value=object(),
|
|
149
|
-
), patch.object(
|
|
150
|
-
rpc_manager_module.hts,
|
|
151
|
-
"handle_host_device",
|
|
152
|
-
return_value={"get_serial_no": "HOST-SERIAL"},
|
|
153
|
-
) as handle_host_device:
|
|
154
|
-
result = self.rpc.run_rpc(
|
|
155
|
-
function_name="Hackrf:get_serial_no:CALL0",
|
|
156
|
-
args={"a": "token"},
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
self.assertEqual(result["get_serial_no"], "HOST-SERIAL")
|
|
160
|
-
forwarded_args = handle_host_device.call_args.kwargs["args"]
|
|
161
|
-
self.assertNotIn("a", forwarded_args)
|
|
162
|
-
self.assertEqual(forwarded_args["g"], 9)
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
if __name__ == "__main__":
|
|
166
|
-
unittest.main()
|
|
File without changes
|
|
File without changes
|
{remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/host/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.7}/src/remoteRF_server/serverrf_cli.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|