remoteRF-server 1.4.6__tar.gz → 1.4.8__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 (189) hide show
  1. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/PKG-INFO +1 -1
  2. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/pyproject.toml +1 -1
  3. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/rtl_sdr/rtl_sdr_diag.py +12 -3
  4. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/diag.py +1 -1
  5. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/startup_check.py +5 -2
  6. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/user_group_cli.py +3 -0
  7. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server.egg-info/PKG-INFO +1 -1
  8. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_diag.py +16 -0
  9. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_startup_check.py +11 -0
  10. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/LICENSE +0 -0
  11. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/README.md +0 -0
  12. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/setup.cfg +0 -0
  13. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/__init__.py +0 -0
  14. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/__init__.py +0 -0
  15. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/__init__.py +0 -0
  16. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/deployment_capabilities.proto +0 -0
  17. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/deployment_capabilities_pb2.py +0 -0
  18. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/deployment_capabilities_pb2_grpc.py +0 -0
  19. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/federation.proto +0 -0
  20. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/federation_pb2.py +0 -0
  21. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/federation_pb2_grpc.py +0 -0
  22. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/grpc.proto +0 -0
  23. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/grpc_host.proto +0 -0
  24. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/grpc_host_pb2.py +0 -0
  25. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/grpc_host_pb2_grpc.py +0 -0
  26. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/grpc_pb2.py +0 -0
  27. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/grpc_pb2_grpc.py +0 -0
  28. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/grpc/v2_codec.py +0 -0
  29. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/idl/__init__.py +0 -0
  30. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/idl/device_schema.py +0 -0
  31. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/idl/pluto_mimo_schema.py +0 -0
  32. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/idl/pluto_schema.py +0 -0
  33. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/idl/schema.py +0 -0
  34. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/idl/v2.py +0 -0
  35. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/utils/__init__.py +0 -0
  36. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/utils/ansi_codes.py +0 -0
  37. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/utils/api_token.py +0 -0
  38. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/utils/db_connection.py +0 -0
  39. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/utils/db_location.py +0 -0
  40. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/utils/list_string.py +0 -0
  41. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/utils/panel.py +0 -0
  42. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/common/utils/process_arg.py +0 -0
  43. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/__init__.py +0 -0
  44. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/adalm_pluto/__init__.py +0 -0
  45. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/adalm_pluto/pluto_diag.py +0 -0
  46. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/adalm_pluto/pluto_mimo_schema.py +0 -0
  47. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/adalm_pluto/pluto_remote_server.py +0 -0
  48. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/adalm_pluto/pluto_schema.py +0 -0
  49. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/adalm_pluto/poe.py +0 -0
  50. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/bluetooth_diag.py +0 -0
  51. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/gps_diag.py +0 -0
  52. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/hackrf/__init__.py +0 -0
  53. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/hackrf/hackrf_schema.py +0 -0
  54. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/rtl_sdr/__init__.py +0 -0
  55. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/rtl_sdr/rtl_sdr_schema.py +0 -0
  56. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/ti_mmwave/__init__.py +0 -0
  57. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/ti_mmwave/ti_mmwave_schema.py +0 -0
  58. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/usrp/__init__.py +0 -0
  59. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/usrp/policy.py +0 -0
  60. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/usrp/profiles.py +0 -0
  61. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/usrp/uhd_manifest.py +0 -0
  62. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/usrp/usrp_diag.py +0 -0
  63. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/usrp/usrp_schema.py +0 -0
  64. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/usrp_phaser/__init__.py +0 -0
  65. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/drivers/usrp_phaser/usrp_phaser_schema.py +0 -0
  66. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/host/__init__.py +0 -0
  67. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/host/host_auth_token.py +0 -0
  68. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/host/host_directory_store.py +0 -0
  69. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/host/host_tunnel_server.py +0 -0
  70. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/__init__.py +0 -0
  71. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/acc_perms.py +0 -0
  72. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/cert_provider.py +0 -0
  73. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/commands.py +0 -0
  74. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/console.py +0 -0
  75. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/control.py +0 -0
  76. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/deployment/__init__.py +0 -0
  77. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/deployment/capabilities.py +0 -0
  78. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/device_manager.py +0 -0
  79. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/direct_path.py +0 -0
  80. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/dynamic_v2.py +0 -0
  81. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/dynamic_v2_bridge.py +0 -0
  82. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/__init__.py +0 -0
  83. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/admin.py +0 -0
  84. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/cli.py +0 -0
  85. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/cluster.py +0 -0
  86. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/contracts.py +0 -0
  87. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/destination.py +0 -0
  88. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/devices.py +0 -0
  89. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/enrollment.py +0 -0
  90. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/global_home.py +0 -0
  91. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/home.py +0 -0
  92. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/home_devices.py +0 -0
  93. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/identity.py +0 -0
  94. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/legacy_state.py +0 -0
  95. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/migrations.py +0 -0
  96. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/peers.py +0 -0
  97. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/permissions.py +0 -0
  98. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/principals.py +0 -0
  99. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/runtime.py +0 -0
  100. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/federation/trust.py +0 -0
  101. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/global_onboarding.py +0 -0
  102. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/grpc_server.py +0 -0
  103. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/host_dynamic_v2.py +0 -0
  104. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/reservation.py +0 -0
  105. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/rpc_manager.py +0 -0
  106. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/user_group_handler.py +0 -0
  107. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/server/v2_errors.py +0 -0
  108. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/serverrf_cli.py +0 -0
  109. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/tools/__init__.py +0 -0
  110. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/tools/gen_certs.py +0 -0
  111. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/tools/gist_status.py +0 -0
  112. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/tools/gist_status_testing.py +0 -0
  113. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server/tools/introspect_uhd.py +0 -0
  114. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server.egg-info/SOURCES.txt +0 -0
  115. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server.egg-info/dependency_links.txt +0 -0
  116. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server.egg-info/entry_points.txt +0 -0
  117. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server.egg-info/requires.txt +0 -0
  118. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/src/remoteRF_server.egg-info/top_level.txt +0 -0
  119. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_account_hardening.py +0 -0
  120. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_account_names.py +0 -0
  121. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_account_removal.py +0 -0
  122. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_activity_log.py +0 -0
  123. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_availability.py +0 -0
  124. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_bind_host.py +0 -0
  125. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_cert_provider.py +0 -0
  126. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_client_sessions.py +0 -0
  127. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_cluster.py +0 -0
  128. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_commands.py +0 -0
  129. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_console.py +0 -0
  130. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_contrib_drivers.py +0 -0
  131. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_default_rtl_sdr_schema.py +0 -0
  132. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_default_usrp_schema.py +0 -0
  133. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_deployment_capabilities.py +0 -0
  134. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_detached_device_rpc.py +0 -0
  135. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_device_handles.py +0 -0
  136. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_device_init.py +0 -0
  137. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_devices_add_wizard.py +0 -0
  138. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_devices_list.py +0 -0
  139. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_direct_fixed_port.py +0 -0
  140. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_direct_path_server.py +0 -0
  141. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_dynamic_v2.py +0 -0
  142. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_federated_direct_path.py +0 -0
  143. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_federated_dynamic_v2.py +0 -0
  144. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_federation_edges.py +0 -0
  145. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_first_run.py +0 -0
  146. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_gate_d_contracts.py +0 -0
  147. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_gate_e_federation.py +0 -0
  148. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_gate_e_proto.py +0 -0
  149. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_gate_f_enrollment.py +0 -0
  150. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_gate_g1_logging.py +0 -0
  151. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_gate_g_permissions.py +0 -0
  152. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_gate_h_devices.py +0 -0
  153. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_gate_i_direct_path.py +0 -0
  154. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_gen_certs.py +0 -0
  155. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_global_accounts_migration.py +0 -0
  156. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_global_home.py +0 -0
  157. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_global_onboarding.py +0 -0
  158. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_global_v1_disposal.py +0 -0
  159. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_hackrf_schema.py +0 -0
  160. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_home_device_plane.py +0 -0
  161. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_host_directory_store.py +0 -0
  162. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_host_dynamic_v2.py +0 -0
  163. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_idl_schema.py +0 -0
  164. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_panel.py +0 -0
  165. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_peer_transport.py +0 -0
  166. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_pluto_compat.py +0 -0
  167. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_pluto_poe.py +0 -0
  168. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_process_arg.py +0 -0
  169. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_reservation_handoff.py +0 -0
  170. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_reservation_policy_b.py +0 -0
  171. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_reservation_timestamps.py +0 -0
  172. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_rpc_manager_batch.py +0 -0
  173. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_rpc_manager_calln.py +0 -0
  174. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_rpc_manager_rx_n.py +0 -0
  175. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_rtl_sdr_schema.py +0 -0
  176. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_soak_federation.py +0 -0
  177. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_status_push.py +0 -0
  178. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_ti_mmwave_hardware.py +0 -0
  179. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_ti_mmwave_schema.py +0 -0
  180. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_user_group_cli.py +0 -0
  181. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_usrp_b205mini_uhd410_hardware.py +0 -0
  182. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_usrp_client_server_hardware.py +0 -0
  183. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_usrp_client_server_localhost.py +0 -0
  184. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_usrp_n210_client_server_hardware.py +0 -0
  185. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_usrp_preload.py +0 -0
  186. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_usrp_profiles.py +0 -0
  187. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_usrp_remoterf_rx_hardware.py +0 -0
  188. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_usrp_uhd410_hardware.py +0 -0
  189. {remoterf_server-1.4.6 → remoterf_server-1.4.8}/tests/test_wipe.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoteRF-server
3
- Version: 1.4.6
3
+ Version: 1.4.8
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.4.6"
7
+ version = "1.4.8"
8
8
  description = "RemoteRF server-side control package"
9
9
  license = { text = "GPL-3.0-or-later" }
10
10
  requires-python = ">=3.10"
@@ -55,17 +55,26 @@ def gains(ctx):
55
55
  valid = sorted(float(g) for g in schema.get_valid_gains_db())
56
56
  if not valid:
57
57
  raise RuntimeError("tuner reports no gains")
58
+ unreported = 0
58
59
  for gain in (valid[0], valid[len(valid) // 2], valid[-1]):
59
60
  schema.set_gain(gain)
60
- _close(schema.get_gain(), gain, 1, "gain")
61
- return f"{len(valid)} gains, {valid[0]:g}-{valid[-1]:g} dB set", {"gains": len(valid)}
61
+ got = schema.get_gain()
62
+ if gain and not float(got): # RTL-SDR Blog V4 (R828D) reads 0 for any manual gain
63
+ unreported += 1
64
+ continue
65
+ _close(got, gain, 1, "gain")
66
+ note = ", tuner does not report gain" if unreported else ""
67
+ return f"{len(valid)} gains, {valid[0]:g}-{valid[-1]:g} dB set{note}", {"gains": len(valid)}
62
68
 
63
69
 
64
70
  def byte_reads(ctx):
65
71
  schema = ctx["schema"]
66
72
  schema.set_sample_rate(2_048_000)
67
73
  schema.set_center_freq(100_000_000)
68
- schema.call_reset_buffer()
74
+ try:
75
+ schema.call_reset_buffer()
76
+ except Exception: # noqa: BLE001 - optional in pyrtlsdr; the server's reads never need it
77
+ pass
69
78
  for n in (512, 512 * 32, 512 * 256):
70
79
  data = np.frombuffer(bytes(schema.call_read_bytes(n)), dtype=np.uint8)
71
80
  if data.size != n or data.size % 512:
@@ -324,7 +324,7 @@ def run(*, force: bool = False, copy: bool = False, ask=None, cfg_dir: Path | No
324
324
  interrupted = False
325
325
  try:
326
326
  display._print(f"Diagnosing {len(todo)} of {len(rows)} devices", Sty.BOLD,
327
- f" · ETA ~{_fmt(total)}" if todo else "", Sty.GRAY)
327
+ f" · ETA ~{_fmt(total)} · Ctrl-C cancels" if todo else "", Sty.GRAY)
328
328
  left = total
329
329
  try:
330
330
  if force:
@@ -178,8 +178,11 @@ def _wait(display: _Display, fut: Future, until: float, text):
178
178
  def _new_log(cfg_dir: Path, prefix: str = "startup") -> Path:
179
179
  logs = cfg_dir / "logs"
180
180
  logs.mkdir(parents=True, exist_ok=True)
181
- for old in sorted(logs.glob(f"{prefix}-*.log"))[: -(KEEP_LOGS - 1)]:
182
- old.unlink(missing_ok=True)
181
+ # A run's .log/.json/.txt share a stem: keep the newest runs whole.
182
+ stems = sorted({path.name.split(".")[0] for path in logs.glob(f"{prefix}-*")})
183
+ for stem in stems[: -(KEEP_LOGS - 1)]:
184
+ for old in logs.glob(f"{stem}.*"):
185
+ old.unlink(missing_ok=True)
183
186
  return logs / f"{prefix}-{datetime.now(timezone.utc).strftime('%Y%m%dT%H%M%SZ')}.log"
184
187
 
185
188
 
@@ -187,6 +187,9 @@ def make_user_group_local(session) -> None:
187
187
  lan_only = not _prompt_yes_no("Reachable from outside your network (via Global)? (Y/n): ", default_no=False)
188
188
 
189
189
  public = not lan_only and _prompt_yes_no("Public: open to anyone on RemoteRF Global? (y/N): ", default_no=True)
190
+ if public:
191
+ public = _prompt_yes_no("Are you sure? Anyone with a RemoteRF Global account, and the users of every lab in the "
192
+ "public cluster, can then see and reserve this group's devices. (Y/n): ", default_no=False)
190
193
  partners = [name for name in _clusters_here() if name != "global"] if not lan_only else []
191
194
  if partners:
192
195
  raw = _prompt_str(f"Also share with partner clusters ({', '.join(partners)}; comma-separated, "
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoteRF-server
3
- Version: 1.4.6
3
+ Version: 1.4.8
4
4
  Summary: RemoteRF server-side control package
5
5
  License: GPL-3.0-or-later
6
6
  Classifier: Programming Language :: Python :: 3
@@ -325,6 +325,22 @@ def test_rtl_pass_and_short_read():
325
325
  assert tests["byte reads"]["status"] == "fail"
326
326
 
327
327
 
328
+ class FakeRtlBlogV4(FakeRtl):
329
+ """R828D on the installed librtlsdr: gain reads back 0 and there is no reset_buffer."""
330
+
331
+ def get_gain(self):
332
+ return 0
333
+
334
+ def call_reset_buffer(self):
335
+ raise RuntimeError("the installed PyRtlSdr/librtlsdr runtime does not support reset_buffer")
336
+
337
+
338
+ def test_rtl_blog_v4_unreported_gain_and_no_reset_buffer_pass():
339
+ row, tests = run_one(state("RTLSDR 0", FakeRtlBlogV4(), "rtl_sdr"))
340
+ assert row["status"] == "ok", tests
341
+ assert "does not report gain" in tests["gain"]["detail"]
342
+
343
+
328
344
  def test_usrp_rx_only_preloads_then_closes():
329
345
  schema = FakeUsrpSchema()
330
346
  row, tests = run_one(state("B205", schema, "usrp"))
@@ -207,3 +207,14 @@ def test_tty_spinner_redraws_in_place():
207
207
  os.close(master)
208
208
  assert "\r\x1b[2K" in text and "testing…" in text and "operational" in text
209
209
  assert text.index("testing…") < text.rindex("\r\x1b[2K") < text.index("✓")
210
+
211
+
212
+ def test_diag_reports_rotate_with_their_log(tmp_path):
213
+ logs = tmp_path / "logs"
214
+ logs.mkdir()
215
+ for i in range(12):
216
+ for ext in ("log", "json", "txt"):
217
+ (logs / f"diag-20260101T0000{i:02d}Z.{ext}").write_text("x")
218
+ sc._new_log(tmp_path, prefix="diag")
219
+ stems = {p.name.split(".")[0] for p in logs.glob("diag-*")}
220
+ assert len(stems) == sc.KEEP_LOGS - 1 and len(list(logs.glob("diag-*"))) == 3 * (sc.KEEP_LOGS - 1)
File without changes