remoteRF-server 1.7.3__tar.gz → 1.7.6__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 (200) hide show
  1. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/PKG-INFO +1 -1
  2. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/pyproject.toml +1 -1
  3. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/device_manager.py +4 -1
  4. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/cluster.py +11 -2
  5. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/grpc_server.py +15 -9
  6. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server.egg-info/PKG-INFO +1 -1
  7. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_contrib_drivers.py +20 -0
  8. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_deployment_capabilities.py +2 -2
  9. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_gate_e_proto.py +1 -1
  10. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_gate_i_direct_path.py +3 -3
  11. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_global_home.py +15 -0
  12. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_usrp_client_server_hardware.py +1 -1
  13. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_usrp_client_server_localhost.py +1 -1
  14. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_usrp_n210_client_server_hardware.py +1 -1
  15. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/LICENSE +0 -0
  16. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/README.md +0 -0
  17. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/setup.cfg +0 -0
  18. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/__init__.py +0 -0
  19. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/__init__.py +0 -0
  20. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/__init__.py +0 -0
  21. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/deployment_capabilities.proto +0 -0
  22. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/deployment_capabilities_pb2.py +0 -0
  23. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/deployment_capabilities_pb2_grpc.py +0 -0
  24. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/federation.proto +0 -0
  25. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/federation_pb2.py +0 -0
  26. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/federation_pb2_grpc.py +0 -0
  27. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/grpc_host_pb2.py +0 -0
  28. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/grpc_host_pb2_grpc.py +0 -0
  29. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/grpc_pb2.py +0 -0
  30. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/grpc_pb2_grpc.py +0 -0
  31. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/grpc/v2_codec.py +0 -0
  32. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/idl/__init__.py +0 -0
  33. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/idl/device_schema.py +0 -0
  34. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/idl/pluto_mimo_schema.py +0 -0
  35. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/idl/pluto_schema.py +0 -0
  36. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/idl/schema.py +0 -0
  37. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/idl/v2.py +0 -0
  38. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/utils/__init__.py +0 -0
  39. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/utils/ansi_codes.py +0 -0
  40. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/utils/api_token.py +0 -0
  41. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/utils/db_connection.py +0 -0
  42. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/utils/db_location.py +0 -0
  43. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/utils/list_string.py +0 -0
  44. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/utils/panel.py +0 -0
  45. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/common/utils/process_arg.py +0 -0
  46. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/__init__.py +0 -0
  47. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/adalm_pluto/__init__.py +0 -0
  48. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/adalm_pluto/pluto_diag.py +0 -0
  49. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/adalm_pluto/pluto_mimo_schema.py +0 -0
  50. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/adalm_pluto/pluto_remote_server.py +0 -0
  51. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/adalm_pluto/pluto_schema.py +0 -0
  52. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/adalm_pluto/poe.py +0 -0
  53. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/bluetooth_diag.py +0 -0
  54. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/gps_diag.py +0 -0
  55. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/hackrf/__init__.py +0 -0
  56. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/hackrf/hackrf_schema.py +0 -0
  57. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/rtl_sdr/__init__.py +0 -0
  58. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/rtl_sdr/rtl_sdr_diag.py +0 -0
  59. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/rtl_sdr/rtl_sdr_schema.py +0 -0
  60. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/ti_mmwave/__init__.py +0 -0
  61. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/ti_mmwave/ti_mmwave_schema.py +0 -0
  62. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/usrp/__init__.py +0 -0
  63. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/usrp/policy.py +0 -0
  64. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/usrp/profiles.py +0 -0
  65. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/usrp/uhd_manifest.py +0 -0
  66. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/usrp/usrp_diag.py +0 -0
  67. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/usrp/usrp_schema.py +0 -0
  68. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/usrp_phaser/__init__.py +0 -0
  69. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/drivers/usrp_phaser/usrp_phaser_schema.py +0 -0
  70. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/host/__init__.py +0 -0
  71. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/host/host_auth_token.py +0 -0
  72. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/host/host_directory_store.py +0 -0
  73. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/host/host_tunnel_server.py +0 -0
  74. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/remote_admin_shell.py +0 -0
  75. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/__init__.py +0 -0
  76. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/acc_perms.py +0 -0
  77. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/cert_provider.py +0 -0
  78. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/commands.py +0 -0
  79. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/console.py +0 -0
  80. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/control.py +0 -0
  81. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/deployment/__init__.py +0 -0
  82. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/deployment/capabilities.py +0 -0
  83. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/diag.py +0 -0
  84. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/direct_path.py +0 -0
  85. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/dynamic_v2.py +0 -0
  86. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/dynamic_v2_bridge.py +0 -0
  87. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/__init__.py +0 -0
  88. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/admin.py +0 -0
  89. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/cli.py +0 -0
  90. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/contracts.py +0 -0
  91. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/destination.py +0 -0
  92. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/devices.py +0 -0
  93. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/enrollment.py +0 -0
  94. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/global_home.py +0 -0
  95. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/home.py +0 -0
  96. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/home_devices.py +0 -0
  97. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/identity.py +0 -0
  98. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/legacy_state.py +0 -0
  99. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/links.py +0 -0
  100. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/migrations.py +0 -0
  101. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/peers.py +0 -0
  102. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/permissions.py +0 -0
  103. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/principals.py +0 -0
  104. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/runtime.py +0 -0
  105. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/federation/trust.py +0 -0
  106. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/global_onboarding.py +0 -0
  107. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/host_direct.py +0 -0
  108. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/host_dynamic_v2.py +0 -0
  109. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/remote_admin.py +0 -0
  110. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/remote_admin_ssh.py +0 -0
  111. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/reservation.py +0 -0
  112. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/rpc_manager.py +0 -0
  113. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/schema_registry.py +0 -0
  114. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/startup_check.py +0 -0
  115. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/user_group_cli.py +0 -0
  116. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/user_group_handler.py +0 -0
  117. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/server/v2_errors.py +0 -0
  118. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/serverrf_cli.py +0 -0
  119. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/tools/__init__.py +0 -0
  120. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/tools/gen_certs.py +0 -0
  121. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/tools/gist_status.py +0 -0
  122. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/tools/gist_status_testing.py +0 -0
  123. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server/tools/introspect_uhd.py +0 -0
  124. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server.egg-info/SOURCES.txt +0 -0
  125. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server.egg-info/dependency_links.txt +0 -0
  126. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server.egg-info/entry_points.txt +0 -0
  127. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server.egg-info/requires.txt +0 -0
  128. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/src/remoteRF_server.egg-info/top_level.txt +0 -0
  129. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_account_hardening.py +0 -0
  130. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_account_names.py +0 -0
  131. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_account_removal.py +0 -0
  132. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_activity_log.py +0 -0
  133. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_availability.py +0 -0
  134. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_bind_host.py +0 -0
  135. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_cert_provider.py +0 -0
  136. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_client_sessions.py +0 -0
  137. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_cluster.py +0 -0
  138. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_commands.py +0 -0
  139. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_console.py +0 -0
  140. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_default_rtl_sdr_schema.py +0 -0
  141. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_default_usrp_schema.py +0 -0
  142. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_detached_device_rpc.py +0 -0
  143. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_device_core_aliases.py +0 -0
  144. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_device_handles.py +0 -0
  145. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_device_init.py +0 -0
  146. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_devices_add_wizard.py +0 -0
  147. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_devices_list.py +0 -0
  148. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_diag.py +0 -0
  149. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_direct_fixed_port.py +0 -0
  150. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_direct_path_server.py +0 -0
  151. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_dynamic_v2.py +0 -0
  152. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_federated_direct_path.py +0 -0
  153. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_federated_dynamic_v2.py +0 -0
  154. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_federation_edges.py +0 -0
  155. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_first_run.py +0 -0
  156. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_gate_d_contracts.py +0 -0
  157. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_gate_e_federation.py +0 -0
  158. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_gate_f_enrollment.py +0 -0
  159. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_gate_g1_logging.py +0 -0
  160. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_gate_g_permissions.py +0 -0
  161. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_gate_h_devices.py +0 -0
  162. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_gen_certs.py +0 -0
  163. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_global_accounts_migration.py +0 -0
  164. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_global_onboarding.py +0 -0
  165. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_global_v1_disposal.py +0 -0
  166. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_hackrf_schema.py +0 -0
  167. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_home_device_plane.py +0 -0
  168. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_host_direct.py +0 -0
  169. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_host_directory_store.py +0 -0
  170. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_host_dynamic_v2.py +0 -0
  171. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_idl_schema.py +0 -0
  172. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_lab_logins.py +0 -0
  173. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_panel.py +0 -0
  174. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_peer_transport.py +0 -0
  175. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_pluto_compat.py +0 -0
  176. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_pluto_poe.py +0 -0
  177. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_process_arg.py +0 -0
  178. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_proxy_lifecycle.py +0 -0
  179. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_remote_admin.py +0 -0
  180. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_reservation_handoff.py +0 -0
  181. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_reservation_policy_b.py +0 -0
  182. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_reservation_timestamps.py +0 -0
  183. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_rpc_manager_batch.py +0 -0
  184. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_rpc_manager_calln.py +0 -0
  185. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_rpc_manager_host_legacy.py +0 -0
  186. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_rpc_manager_rx_n.py +0 -0
  187. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_rtl_sdr_schema.py +0 -0
  188. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_schema_registry.py +0 -0
  189. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_soak_federation.py +0 -0
  190. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_startup_check.py +0 -0
  191. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_status_push.py +0 -0
  192. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_ti_mmwave_hardware.py +0 -0
  193. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_ti_mmwave_schema.py +0 -0
  194. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_user_group_cli.py +0 -0
  195. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_usrp_b205mini_uhd410_hardware.py +0 -0
  196. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_usrp_preload.py +0 -0
  197. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_usrp_profiles.py +0 -0
  198. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_usrp_remoterf_rx_hardware.py +0 -0
  199. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_usrp_uhd410_hardware.py +0 -0
  200. {remoterf_server-1.7.3 → remoterf_server-1.7.6}/tests/test_wipe.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoteRF-server
3
- Version: 1.7.3
3
+ Version: 1.7.6
4
4
  Summary: RemoteRF server-side control package
5
5
  License: GPL-3.0-or-later
6
6
  Classifier: Programming Language :: Python :: 3
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "remoteRF-server"
7
- version = "1.7.3"
7
+ version = "1.7.6"
8
8
  description = "RemoteRF server-side control package"
9
9
  license = { text = "GPL-3.0-or-later" }
10
10
  requires-python = ">=3.10"
@@ -86,7 +86,10 @@ def _name_handle(name: str) -> str:
86
86
 
87
87
  def _is_connected(st: _DeviceState) -> bool:
88
88
  if st.origin == "local":
89
- return st.dev is not None
89
+ # Drivers that survive an unplug (e.g. GPS reconnect loop) expose device.connected.
90
+ # Read __dict__ directly: PoePluto's __getattr__ would power the board on.
91
+ dev = getattr(st.dev, "device", None)
92
+ return st.dev is not None and getattr(dev, "__dict__", {}).get("connected", True) is not False
90
93
  # host
91
94
  return bool(st.online)
92
95
 
@@ -1303,13 +1303,22 @@ def _walk_in(pools: list[dict], notify) -> None:
1303
1303
  active. Any other open door (an older lab's own) is ignored."""
1304
1304
  from . import global_home
1305
1305
 
1306
- if GLOBAL in load():
1307
- return
1308
1306
  state = global_home.load()
1309
1307
  home = (state.get("identity") or {}).get("deployment_id")
1310
1308
  party = state.get("party") or {}
1309
+ clusters = load()
1310
+ if GLOBAL in clusters and (clusters[GLOBAL].get("peer") == home or not home):
1311
+ return
1311
1312
  if not home or party.get("state") != "active":
1312
1313
  return
1314
+ if GLOBAL in clusters:
1315
+ # Joined under an earlier Global home (this lab's state outlived a Global
1316
+ # reset): drop it and rejoin the current one, keeping what it shared.
1317
+ stale = clusters.pop(GLOBAL)
1318
+ queued = state.setdefault("public_groups", [])
1319
+ queued += [group_id for group_id in stale.get("groups", []) if group_id not in queued]
1320
+ save(clusters)
1321
+ global_home.save(state)
1313
1322
  for pool in pools:
1314
1323
  owner = (pool.get("owner") or {}).get("identity") or {}
1315
1324
  if pool.get("cluster_name") != GLOBAL or owner.get("deployment_id") != home:
@@ -65,6 +65,7 @@ from ..common.grpc import grpc_host_pb2_grpc as host_tunnel_pb2_grpc
65
65
 
66
66
  from pathlib import Path
67
67
  from prompt_toolkit import PromptSession
68
+ from prompt_toolkit.input import DummyInput
68
69
  from prompt_toolkit.output import DummyOutput
69
70
 
70
71
  from ..tools.gist_status import start_status_publisher
@@ -120,15 +121,20 @@ def _get_port(name: str, *, default: int | None = None) -> int:
120
121
  raise SystemExit(f"{name} out of range (1..65535): {n}")
121
122
  return n
122
123
 
123
- try:
124
- session = PromptSession()
125
- except Exception as exc:
126
- if type(exc).__name__ != "NoConsoleScreenBufferError":
127
- raise
128
- # Importing the server in a headless process (tests, services, containers)
129
- # may not provide a real console screen buffer. The interactive serve path
130
- # still gets the normal output whenever one is available.
131
- session = PromptSession(output=DummyOutput())
124
+ if sys.stdin is not None and sys.stdin.isatty():
125
+ try:
126
+ session = PromptSession()
127
+ except Exception as exc:
128
+ if type(exc).__name__ != "NoConsoleScreenBufferError":
129
+ raise
130
+ # Importing the server in a headless process (tests, services, containers)
131
+ # may not provide a real console screen buffer. The interactive serve path
132
+ # still gets the normal output whenever one is available.
133
+ session = PromptSession(output=DummyOutput())
134
+ else:
135
+ # No terminal on stdin (systemd, --headless, pipes): avoid prompt_toolkit's
136
+ # "Input is not a terminal" warning. Prompts hit EOF immediately.
137
+ session = PromptSession(input=DummyInput(), output=DummyOutput())
132
138
  BANNER_CREDIT = "Created by the Wireless Lab at UCLA"
133
139
 
134
140
  from dotenv import load_dotenv, find_dotenv
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoteRF-server
3
- Version: 1.7.3
3
+ Version: 1.7.6
4
4
  Summary: RemoteRF server-side control package
5
5
  License: GPL-3.0-or-later
6
6
  Classifier: Programming Language :: Python :: 3
@@ -236,3 +236,23 @@ def test_a_renumbered_csr_is_found_again_when_bluez_forgets_it(bt, sysfs):
236
236
  # A pinned adapter is not swapped for another one, and an error is no success.
237
237
  assert bt._run_coroutine_sync(pinned.set_powered_async, True) is False
238
238
  assert pinned.adapter_name == "hci1"
239
+
240
+
241
+ # -- simulated SDR ----------------------------------------------------------
242
+
243
+
244
+ def test_sim_sdr_matches_bundled_client_and_returns_tone():
245
+ import re
246
+
247
+ import numpy as np
248
+
249
+ sim = _load("sim_sdr_schema", {})
250
+ client = Path(__file__).resolve().parents[2] / "client/src/remoterf/drivers/sim_sdr/sim_sdr_remote.py"
251
+ bundled = re.search(r'_SCHEMA_HASH = "([^"]+)"', client.read_text()).group(1)
252
+ assert sim.SimSdrSchema().get_idl_hash() == bundled
253
+
254
+ dev = sim.SimSdrSchema.make_device()
255
+ dev.rx_buffer_size = 4096
256
+ iq = dev.rx()
257
+ assert iq.shape == (4096,) and iq.dtype == np.complex64
258
+ assert int(np.argmax(np.abs(np.fft.fft(iq)))) == 512
@@ -35,8 +35,8 @@ class CapabilityTests(unittest.TestCase):
35
35
  def test_protected_proto_bytes(self):
36
36
  root=Path(__file__).resolve().parents[1]
37
37
  path='src/remoteRF_server/common/grpc/grpc.proto'
38
- base=subprocess.check_output(['git','show','1452ad042782c659a2891e84e8d72f9d1ba3d9a1:'+path],cwd=root)
39
- core=root/'packages/remoterf-device-core/src/remoterf_device_core/grpc/grpc.proto' # moved here, same bytes
38
+ base=subprocess.check_output(['git','show','c2b5a414e1c316406b020c6731fdf91d8ad8bfac:./'+path],cwd=root)
39
+ core=root.parent/'packages/remoterf-device-core/src/remoterf_device_core/grpc/grpc.proto' # moved here, same bytes
40
40
  self.assertEqual(base,core.read_bytes())
41
41
  fields=pb.DeploymentCapabilitiesResponse.DESCRIPTOR.fields_by_name
42
42
  self.assertEqual(fields['capabilities_json'].number,1)
@@ -7,7 +7,7 @@ from remoteRF_server.common.grpc import federation_pb2
7
7
  def test_federation_proto_source_hash_and_descriptor_are_canonical():
8
8
  root = Path(__file__).resolve().parents[1]
9
9
  proto = root / "src/remoteRF_server/common/grpc/federation.proto"
10
- protected = root / "packages/remoterf-device-core/src/remoterf_device_core/grpc/grpc.proto"
10
+ protected = root.parent / "packages/remoterf-device-core/src/remoterf_device_core/grpc/grpc.proto"
11
11
  assert hashlib.sha256(proto.read_bytes()).hexdigest() == (
12
12
  "e890c399b61e8eb92e67762661c0ce99f3daacdb06b0139b34f26a749ff736c1"
13
13
  )
@@ -114,7 +114,7 @@ class PeerClassificationTests(unittest.TestCase):
114
114
  for host in ("127.0.0.1", "::1", "fe80::1", "10.4.5.6", "192.168.1.20",
115
115
  "::ffff:192.168.1.20", "164.67.195.7"):
116
116
  self.assertFalse(is_offsite(host), host)
117
- for host in ("142.129.140.254", "164.67.196.1", "100.64.0.1", "2607:f8b0::1",
117
+ for host in ("8.8.4.4", "164.67.196.1", "100.64.0.1", "2607:f8b0::1",
118
118
  "fd7a:115c:a1e0::8601:f120", "bogus"):
119
119
  self.assertTrue(is_offsite(host), host)
120
120
 
@@ -194,12 +194,12 @@ class DispatchTests(unittest.TestCase):
194
194
 
195
195
  def test_control_plane_is_refused(self):
196
196
  for name in ("ACC:login", "ACC:get_dev", "echo", "RemoteAdmin:x"):
197
- results, seen = self._run(name, "142.129.140.254")
197
+ results, seen = self._run(name, "8.8.4.4")
198
198
  self.assertIn("not available on the direct path", unmap_arg(results["a"]), name)
199
199
  self.assertEqual(seen, {})
200
200
 
201
201
  def test_device_plane_sets_relayed_from_the_peer(self):
202
- results, seen = self._run("adalm_pluto:rx_lo:GET", "142.129.140.254")
202
+ results, seen = self._run("adalm_pluto:rx_lo:GET", "8.8.4.4")
203
203
  self.assertEqual(unmap_arg(results["echo"]), "adalm_pluto:rx_lo:GET")
204
204
  self.assertTrue(seen["relayed"])
205
205
  _, seen = self._run("IDL:get_drivers", "192.168.4.2")
@@ -81,6 +81,21 @@ class GlobalHomeContractTests(unittest.TestCase):
81
81
  self.assertEqual([c["contract_id"] for c in self.broker.call("GET", "/v2/broker/contracts")["contracts"]],
82
82
  [party["contract_id"]])
83
83
 
84
+ def test_a_global_cluster_joined_under_an_earlier_home_is_rejoined_with_its_groups(self):
85
+ with self.server(H):
86
+ home_identity = cluster._identity()
87
+ cluster._public_note(cluster.GLOBAL, "open")
88
+ self._standing(B, home_identity)
89
+ with self.server(B):
90
+ # State from before a Global reset: the cluster names a home that is gone.
91
+ cluster.save({cluster.GLOBAL: {"role": "member", "state": "active", "public": True, "peer": C,
92
+ "contract_id": "8a2e3f10-0000-4000-8000-0000000000ff",
93
+ "published": [], "groups": [7]}})
94
+ cluster.tick(self.notes.append)
95
+ item = cluster.load()[cluster.GLOBAL]
96
+ self.assertEqual((item["peer"], item["contract_id"], item["groups"]), (H, global_home.contract_id(), [7]))
97
+ self.assertNotIn("public_groups", global_home.load())
98
+
84
99
  def _standing(self, lab, home_identity):
85
100
  """The lab proposes its standing contract; the home accepts; the lab sees it active."""
86
101
  with self.server(lab), mock.patch.object(global_home, "fetch_identity", return_value=home_identity):
@@ -41,7 +41,7 @@ def _add_client_source() -> None:
41
41
  if configured:
42
42
  candidates.append(Path(configured).expanduser())
43
43
  candidates.append(
44
- Path(__file__).resolve().parents[2] / "RemoteRF-Client" / "src"
44
+ Path(__file__).resolve().parents[2] / "client" / "src"
45
45
  )
46
46
  for candidate in candidates:
47
47
  if (candidate / "remoteRF").is_dir():
@@ -43,7 +43,7 @@ def _add_client_source() -> None:
43
43
  if configured:
44
44
  candidates.append(Path(configured).expanduser())
45
45
  candidates.append(
46
- Path(__file__).resolve().parents[2] / "RemoteRF-Client" / "src"
46
+ Path(__file__).resolve().parents[2] / "client" / "src"
47
47
  )
48
48
  for candidate in candidates:
49
49
  if (candidate / "remoteRF").is_dir():
@@ -41,7 +41,7 @@ def _add_client_source() -> None:
41
41
  if configured:
42
42
  candidates.append(Path(configured).expanduser())
43
43
  candidates.append(
44
- Path(__file__).resolve().parents[2] / "RemoteRF-Client" / "src"
44
+ Path(__file__).resolve().parents[2] / "client" / "src"
45
45
  )
46
46
  for candidate in candidates:
47
47
  if (candidate / "remoteRF").is_dir():
File without changes