openc3 7.3.0 → 7.4.0
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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Guardfile +0 -0
- data/LICENSE.md +0 -0
- data/README.md +0 -0
- data/Rakefile +0 -0
- data/bin/openc3cli +138 -0
- data/bin/pipuninstall +0 -0
- data/bin/uvinstall +10 -3
- data/data/config/_array_params.yaml +0 -0
- data/data/config/_canvas_values.yaml +0 -0
- data/data/config/_graph_params.yaml +0 -0
- data/data/config/_id_items.yaml +0 -0
- data/data/config/_id_params.yaml +0 -0
- data/data/config/_interfaces.yaml +0 -0
- data/data/config/_items.yaml +0 -0
- data/data/config/_params.yaml +0 -0
- data/data/config/command.yaml +0 -0
- data/data/config/command_modifiers.yaml +2 -0
- data/data/config/command_telemetry.yaml +0 -0
- data/data/config/conversions.yaml +0 -0
- data/data/config/graph_settings.yaml +0 -0
- data/data/config/interface_modifiers.yaml +103 -1
- data/data/config/item_modifiers.yaml +0 -0
- data/data/config/microservice.yaml +5 -2
- data/data/config/param_item_modifiers.yaml +0 -0
- data/data/config/parameter_modifiers.yaml +0 -0
- data/data/config/plugins.yaml +0 -0
- data/data/config/processors.yaml +0 -0
- data/data/config/protocols.yaml +0 -0
- data/data/config/screen.yaml +0 -0
- data/data/config/settings.yaml +0 -0
- data/data/config/table_manager.yaml +0 -0
- data/data/config/table_parameter_modifiers.yaml +0 -0
- data/data/config/target.yaml +0 -0
- data/data/config/target_config.yaml +0 -0
- data/data/config/telemetry.yaml +0 -0
- data/data/config/telemetry_modifiers.yaml +2 -0
- data/data/config/tool.yaml +0 -0
- data/data/config/unknown.yaml +0 -0
- data/data/config/widgets.yaml +6 -0
- data/data/xtce_schemas/SpaceSystem_20180204.xsd +0 -0
- data/data/xtce_schemas/xml.xsd +0 -0
- data/ext/openc3/ext/array/array.c +0 -0
- data/ext/openc3/ext/array/extconf.rb +0 -0
- data/ext/openc3/ext/buffered_file/buffered_file.c +0 -0
- data/ext/openc3/ext/buffered_file/extconf.rb +0 -0
- data/ext/openc3/ext/burst_protocol/burst_protocol.c +6 -0
- data/ext/openc3/ext/burst_protocol/extconf.rb +0 -0
- data/ext/openc3/ext/config_parser/config_parser.c +0 -0
- data/ext/openc3/ext/config_parser/extconf.rb +0 -0
- data/ext/openc3/ext/crc/crc.c +0 -0
- data/ext/openc3/ext/crc/extconf.rb +0 -0
- data/ext/openc3/ext/openc3_io/extconf.rb +0 -0
- data/ext/openc3/ext/openc3_io/openc3_io.c +0 -0
- data/ext/openc3/ext/packet/extconf.rb +0 -0
- data/ext/openc3/ext/packet/packet.c +0 -0
- data/ext/openc3/ext/platform/extconf.rb +0 -0
- data/ext/openc3/ext/platform/platform.c +4 -1
- data/ext/openc3/ext/polynomial_conversion/extconf.rb +0 -0
- data/ext/openc3/ext/polynomial_conversion/polynomial_conversion.c +0 -0
- data/ext/openc3/ext/string/extconf.rb +0 -0
- data/ext/openc3/ext/string/string.c +0 -0
- data/ext/openc3/ext/structure/structure.c +49 -17
- data/ext/openc3/ext/tabbed_plots_config/extconf.rb +0 -0
- data/ext/openc3/ext/tabbed_plots_config/tabbed_plots_config.c +0 -0
- data/ext/openc3/ext/telemetry/extconf.rb +0 -0
- data/ext/openc3/ext/telemetry/telemetry.c +0 -0
- data/lib/cosmos.rb +0 -0
- data/lib/cosmosc2.rb +0 -0
- data/lib/openc3/accessors/accessor.rb +0 -0
- data/lib/openc3/accessors/binary_accessor.rb +63 -9
- data/lib/openc3/accessors/cbor_accessor.rb +0 -0
- data/lib/openc3/accessors/form_accessor.rb +0 -0
- data/lib/openc3/accessors/html_accessor.rb +0 -0
- data/lib/openc3/accessors/http_accessor.rb +0 -0
- data/lib/openc3/accessors/json_accessor.rb +0 -0
- data/lib/openc3/accessors/template_accessor.rb +0 -0
- data/lib/openc3/accessors/xml_accessor.rb +0 -0
- data/lib/openc3/accessors.rb +0 -0
- data/lib/openc3/api/README.md +0 -0
- data/lib/openc3/api/api.rb +0 -0
- data/lib/openc3/api/authorized_api.rb +0 -0
- data/lib/openc3/api/calendar_api.rb +0 -0
- data/lib/openc3/api/cmd_api.rb +1 -1
- data/lib/openc3/api/config_api.rb +0 -0
- data/lib/openc3/api/interface_api.rb +0 -0
- data/lib/openc3/api/limits_api.rb +0 -0
- data/lib/openc3/api/metrics_api.rb +1 -1
- data/lib/openc3/api/offline_access_api.rb +1 -1
- data/lib/openc3/api/router_api.rb +0 -0
- data/lib/openc3/api/settings_api.rb +22 -18
- data/lib/openc3/api/stash_api.rb +1 -1
- data/lib/openc3/api/target_api.rb +0 -0
- data/lib/openc3/api/tlm_api.rb +4 -3
- data/lib/openc3/bridge/bridge.rb +0 -0
- data/lib/openc3/bridge/bridge_config.rb +0 -0
- data/lib/openc3/bridge/bridge_interface_thread.rb +0 -0
- data/lib/openc3/bridge/bridge_router_thread.rb +0 -0
- data/lib/openc3/ccsds/ccsds_packet.rb +0 -0
- data/lib/openc3/ccsds/ccsds_parser.rb +0 -0
- data/lib/openc3/config/config_parser.rb +78 -17
- data/lib/openc3/config/meta_config_parser.rb +0 -0
- data/lib/openc3/conversions/bit_reverse_conversion.rb +0 -0
- data/lib/openc3/conversions/conversion.rb +0 -0
- data/lib/openc3/conversions/generic_conversion.rb +0 -0
- data/lib/openc3/conversions/ip_read_conversion.rb +0 -0
- data/lib/openc3/conversions/ip_write_conversion.rb +0 -0
- data/lib/openc3/conversions/object_read_conversion.rb +0 -0
- data/lib/openc3/conversions/object_write_conversion.rb +0 -0
- data/lib/openc3/conversions/packet_time_formatted_conversion.rb +0 -0
- data/lib/openc3/conversions/packet_time_seconds_conversion.rb +0 -0
- data/lib/openc3/conversions/polynomial_conversion.rb +0 -0
- data/lib/openc3/conversions/processor_conversion.rb +0 -0
- data/lib/openc3/conversions/received_count_conversion.rb +0 -0
- data/lib/openc3/conversions/received_time_formatted_conversion.rb +0 -0
- data/lib/openc3/conversions/received_time_seconds_conversion.rb +0 -0
- data/lib/openc3/conversions/segmented_polynomial_conversion.rb +0 -0
- data/lib/openc3/conversions/unix_time_conversion.rb +0 -0
- data/lib/openc3/conversions/unix_time_formatted_conversion.rb +0 -0
- data/lib/openc3/conversions/unix_time_seconds_conversion.rb +0 -0
- data/lib/openc3/conversions.rb +0 -0
- data/lib/openc3/core_ext/array.rb +0 -0
- data/lib/openc3/core_ext/binding.rb +0 -0
- data/lib/openc3/core_ext/class.rb +0 -0
- data/lib/openc3/core_ext/exception.rb +0 -0
- data/lib/openc3/core_ext/faraday.rb +0 -0
- data/lib/openc3/core_ext/file.rb +0 -0
- data/lib/openc3/core_ext/io.rb +0 -0
- data/lib/openc3/core_ext/kernel.rb +0 -0
- data/lib/openc3/core_ext/math.rb +0 -0
- data/lib/openc3/core_ext/matrix.rb +0 -0
- data/lib/openc3/core_ext/objectspace.rb +0 -0
- data/lib/openc3/core_ext/openc3_io.rb +0 -0
- data/lib/openc3/core_ext/range.rb +0 -0
- data/lib/openc3/core_ext/socket.rb +0 -0
- data/lib/openc3/core_ext/string.rb +0 -0
- data/lib/openc3/core_ext/stringio.rb +0 -0
- data/lib/openc3/core_ext/tempfile.rb +0 -0
- data/lib/openc3/core_ext/time.rb +0 -0
- data/lib/openc3/core_ext.rb +0 -0
- data/lib/openc3/ext/.keep +0 -0
- data/lib/openc3/interfaces/file_interface.rb +0 -0
- data/lib/openc3/interfaces/http_client_interface.rb +0 -0
- data/lib/openc3/interfaces/http_server_interface.rb +0 -0
- data/lib/openc3/interfaces/interface.rb +5 -4
- data/lib/openc3/interfaces/mqtt_interface.rb +0 -0
- data/lib/openc3/interfaces/mqtt_stream_interface.rb +2 -0
- data/lib/openc3/interfaces/protocols/burst_protocol.rb +27 -0
- data/lib/openc3/interfaces/protocols/cmd_response_protocol.rb +0 -0
- data/lib/openc3/interfaces/protocols/cobs_protocol.rb +0 -0
- data/lib/openc3/interfaces/protocols/crc_protocol.rb +0 -0
- data/lib/openc3/interfaces/protocols/fixed_protocol.rb +0 -0
- data/lib/openc3/interfaces/protocols/ignore_packet_protocol.rb +0 -0
- data/lib/openc3/interfaces/protocols/length_protocol.rb +7 -0
- data/lib/openc3/interfaces/protocols/preidentified_protocol.rb +7 -0
- data/lib/openc3/interfaces/protocols/protocol.rb +4 -4
- data/lib/openc3/interfaces/protocols/slip_protocol.rb +0 -0
- data/lib/openc3/interfaces/protocols/template_protocol.rb +2 -2
- data/lib/openc3/interfaces/protocols/terminated_protocol.rb +0 -0
- data/lib/openc3/interfaces/serial_interface.rb +2 -0
- data/lib/openc3/interfaces/simulated_target_interface.rb +0 -0
- data/lib/openc3/interfaces/stream_interface.rb +0 -0
- data/lib/openc3/interfaces/tcpip_client_interface.rb +2 -0
- data/lib/openc3/interfaces/tcpip_server_interface.rb +0 -0
- data/lib/openc3/interfaces/udp_interface.rb +16 -5
- data/lib/openc3/interfaces.rb +0 -0
- data/lib/openc3/io/buffered_file.rb +0 -0
- data/lib/openc3/io/io_multiplexer.rb +0 -0
- data/lib/openc3/io/json_api.rb +3 -2
- data/lib/openc3/io/json_api_object.rb +0 -0
- data/lib/openc3/io/json_drb.rb +20 -4
- data/lib/openc3/io/json_drb_object.rb +0 -0
- data/lib/openc3/io/json_drb_rack.rb +0 -0
- data/lib/openc3/io/json_rpc.rb +0 -0
- data/lib/openc3/io/posix_serial_driver.rb +0 -0
- data/lib/openc3/io/serial_driver.rb +0 -0
- data/lib/openc3/io/stderr.rb +0 -0
- data/lib/openc3/io/stdout.rb +0 -0
- data/lib/openc3/io/udp_sockets.rb +38 -8
- data/lib/openc3/io/win32_serial_driver.rb +1 -0
- data/lib/openc3/logs/buffered_packet_log_reader.rb +0 -0
- data/lib/openc3/logs/buffered_packet_log_writer.rb +0 -0
- data/lib/openc3/logs/log_writer.rb +0 -0
- data/lib/openc3/logs/packet_log_constants.rb +0 -0
- data/lib/openc3/logs/packet_log_reader.rb +23 -2
- data/lib/openc3/logs/packet_log_writer.rb +5 -0
- data/lib/openc3/logs/stream_log.rb +1 -1
- data/lib/openc3/logs/stream_log_pair.rb +0 -0
- data/lib/openc3/logs/text_log_writer.rb +0 -0
- data/lib/openc3/logs.rb +0 -0
- data/lib/openc3/microservices/cleanup_microservice.rb +0 -0
- data/lib/openc3/microservices/decom_common.rb +0 -0
- data/lib/openc3/microservices/decom_microservice.rb +0 -0
- data/lib/openc3/microservices/interface_decom_common.rb +2 -1
- data/lib/openc3/microservices/interface_microservice.rb +72 -25
- data/lib/openc3/microservices/log_microservice.rb +0 -0
- data/lib/openc3/microservices/microservice.rb +3 -3
- data/lib/openc3/microservices/multi_microservice.rb +1 -1
- data/lib/openc3/microservices/periodic_microservice.rb +2 -2
- data/lib/openc3/microservices/plugin_microservice.rb +0 -0
- data/lib/openc3/microservices/queue_microservice.rb +0 -0
- data/lib/openc3/microservices/router_microservice.rb +0 -0
- data/lib/openc3/microservices/scope_cleanup_microservice.rb +0 -0
- data/lib/openc3/microservices/text_log_microservice.rb +0 -0
- data/lib/openc3/migrations/20220420190000_log_stuff.rb +0 -0
- data/lib/openc3/migrations/20221202214600_add_target_names.rb +0 -0
- data/lib/openc3/migrations/20221210174900_convert_to_multi.rb +0 -0
- data/lib/openc3/migrations/20230915000002_no_scope_log_messages.rb +0 -0
- data/lib/openc3/migrations/20231022000000_tlm_viewer_config.rb +0 -0
- data/lib/openc3/migrations/20241208080000_no_critical_cmd.rb +0 -0
- data/lib/openc3/migrations/20241208080001_no_trigger_group.rb +0 -0
- data/lib/openc3/migrations/20250108060000_news_feed.rb +0 -0
- data/lib/openc3/migrations/20250402000000_periodic_only_default.rb +0 -0
- data/lib/openc3/migrations/20260203000000_remove_store_id.rb +0 -0
- data/lib/openc3/migrations/20260204000000_remove_decom_reducer.rb +0 -0
- data/lib/openc3/migrations/20260701000000_updated_at_to_int.rb +0 -0
- data/lib/openc3/migrations/20260704000000_default_bridge.rb +38 -0
- data/lib/openc3/migrations/20260731000000_system_health_json.rb +11 -0
- data/lib/openc3/models/activity_model.rb +0 -0
- data/lib/openc3/models/auth_model.rb +35 -7
- data/lib/openc3/models/bridge_model.rb +133 -0
- data/lib/openc3/models/config_keyword_model.rb +63 -0
- data/lib/openc3/models/cvt_model.rb +0 -0
- data/lib/openc3/models/db_sharded_model.rb +0 -0
- data/lib/openc3/models/environment_model.rb +0 -0
- data/lib/openc3/models/gem_model.rb +12 -9
- data/lib/openc3/models/host_interface_microservice_model.rb +114 -0
- data/lib/openc3/models/info_model.rb +0 -0
- data/lib/openc3/models/interface_model.rb +178 -19
- data/lib/openc3/models/interface_status_model.rb +0 -0
- data/lib/openc3/models/metadata_model.rb +0 -0
- data/lib/openc3/models/metric_model.rb +0 -0
- data/lib/openc3/models/microservice_model.rb +9 -22
- data/lib/openc3/models/microservice_status_model.rb +0 -0
- data/lib/openc3/models/migration_model.rb +0 -0
- data/lib/openc3/models/model.rb +0 -0
- data/lib/openc3/models/news_model.rb +0 -0
- data/lib/openc3/models/note_model.rb +0 -0
- data/lib/openc3/models/offline_access_model.rb +0 -0
- data/lib/openc3/models/ping_model.rb +0 -0
- data/lib/openc3/models/plugin_model.rb +9 -2
- data/lib/openc3/models/plugin_store_model.rb +0 -0
- data/lib/openc3/models/process_status_model.rb +0 -0
- data/lib/openc3/models/python_package_model.rb +4 -4
- data/lib/openc3/models/queue_model.rb +0 -0
- data/lib/openc3/models/reaction_model.rb +0 -0
- data/lib/openc3/models/reingest_job_model.rb +0 -0
- data/lib/openc3/models/router_model.rb +0 -0
- data/lib/openc3/models/router_status_model.rb +0 -0
- data/lib/openc3/models/scope_model.rb +51 -26
- data/lib/openc3/models/script_engine_model.rb +0 -0
- data/lib/openc3/models/script_status_model.rb +0 -0
- data/lib/openc3/models/secret_model.rb +0 -0
- data/lib/openc3/models/setting_model.rb +546 -3
- data/lib/openc3/models/sorted_model.rb +0 -0
- data/lib/openc3/models/stash_model.rb +0 -0
- data/lib/openc3/models/target_model.rb +30 -25
- data/lib/openc3/models/timeline_model.rb +0 -0
- data/lib/openc3/models/tool_config_model.rb +0 -0
- data/lib/openc3/models/tool_model.rb +1 -0
- data/lib/openc3/models/trigger_group_model.rb +0 -0
- data/lib/openc3/models/trigger_model.rb +20 -0
- data/lib/openc3/models/widget_model.rb +0 -0
- data/lib/openc3/operators/microservice_operator.rb +64 -22
- data/lib/openc3/operators/operator.rb +4 -4
- data/lib/openc3/packets/binary_accessor.rb +0 -0
- data/lib/openc3/packets/command_validator.rb +0 -0
- data/lib/openc3/packets/commands.rb +0 -0
- data/lib/openc3/packets/json_packet.rb +0 -0
- data/lib/openc3/packets/limits.rb +0 -0
- data/lib/openc3/packets/limits_response.rb +0 -0
- data/lib/openc3/packets/packet.rb +4 -0
- data/lib/openc3/packets/packet_config.rb +0 -0
- data/lib/openc3/packets/packet_item.rb +0 -0
- data/lib/openc3/packets/packet_item_limits.rb +0 -0
- data/lib/openc3/packets/parsers/format_string_parser.rb +0 -0
- data/lib/openc3/packets/parsers/limits_parser.rb +0 -0
- data/lib/openc3/packets/parsers/limits_response_parser.rb +0 -0
- data/lib/openc3/packets/parsers/packet_item_parser.rb +0 -0
- data/lib/openc3/packets/parsers/packet_parser.rb +0 -0
- data/lib/openc3/packets/parsers/processor_parser.rb +0 -0
- data/lib/openc3/packets/parsers/state_parser.rb +0 -0
- data/lib/openc3/packets/parsers/xtce_converter.rb +0 -0
- data/lib/openc3/packets/parsers/xtce_parser.rb +0 -0
- data/lib/openc3/packets/structure.rb +7 -1
- data/lib/openc3/packets/structure_item.rb +0 -0
- data/lib/openc3/packets/telemetry.rb +0 -0
- data/lib/openc3/processors/processor.rb +2 -0
- data/lib/openc3/processors/statistics_processor.rb +0 -0
- data/lib/openc3/processors/watermark_processor.rb +0 -0
- data/lib/openc3/processors.rb +0 -0
- data/lib/openc3/script/api_shared.rb +0 -0
- data/lib/openc3/script/autonomic.rb +12 -12
- data/lib/openc3/script/calendar.rb +0 -0
- data/lib/openc3/script/commands.rb +0 -0
- data/lib/openc3/script/critical_cmd.rb +0 -0
- data/lib/openc3/script/exceptions.rb +0 -0
- data/lib/openc3/script/extract.rb +0 -0
- data/lib/openc3/script/limits.rb +0 -0
- data/lib/openc3/script/metadata.rb +0 -0
- data/lib/openc3/script/packages.rb +0 -0
- data/lib/openc3/script/plugins.rb +0 -0
- data/lib/openc3/script/queue.rb +0 -0
- data/lib/openc3/script/screen.rb +0 -0
- data/lib/openc3/script/script.rb +2 -2
- data/lib/openc3/script/script_runner.rb +0 -0
- data/lib/openc3/script/storage.rb +4 -4
- data/lib/openc3/script/suite.rb +0 -0
- data/lib/openc3/script/suite_results.rb +0 -0
- data/lib/openc3/script/suite_runner.rb +26 -0
- data/lib/openc3/script/tables.rb +0 -0
- data/lib/openc3/script/telemetry.rb +9 -3
- data/lib/openc3/script/web_socket_api.rb +218 -145
- data/lib/openc3/script.rb +0 -0
- data/lib/openc3/script_engines/script_engine.rb +0 -0
- data/lib/openc3/streams/mqtt_stream.rb +0 -0
- data/lib/openc3/streams/serial_stream.rb +0 -0
- data/lib/openc3/streams/stream.rb +0 -0
- data/lib/openc3/streams/tcpip_client_stream.rb +0 -0
- data/lib/openc3/streams/tcpip_socket_stream.rb +0 -0
- data/lib/openc3/streams/web_socket_client_stream.rb +0 -0
- data/lib/openc3/subpacketizers/subpacketizer.rb +0 -0
- data/lib/openc3/system/system.rb +0 -0
- data/lib/openc3/system/target.rb +0 -0
- data/lib/openc3/system.rb +0 -0
- data/lib/openc3/tools/cmd_tlm_server/api.rb +0 -0
- data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +7 -0
- data/lib/openc3/tools/table_manager/table.rb +0 -0
- data/lib/openc3/tools/table_manager/table_config.rb +0 -0
- data/lib/openc3/tools/table_manager/table_item.rb +0 -0
- data/lib/openc3/tools/table_manager/table_item_parser.rb +0 -0
- data/lib/openc3/tools/table_manager/table_manager_core.rb +0 -0
- data/lib/openc3/tools/table_manager/table_parser.rb +0 -0
- data/lib/openc3/tools/test_runner/test.rb +0 -0
- data/lib/openc3/top_level.rb +1 -1
- data/lib/openc3/topics/autonomic_topic.rb +0 -0
- data/lib/openc3/topics/calendar_topic.rb +0 -0
- data/lib/openc3/topics/command_decom_topic.rb +0 -0
- data/lib/openc3/topics/command_topic.rb +0 -0
- data/lib/openc3/topics/config_topic.rb +0 -0
- data/lib/openc3/topics/decom_interface_topic.rb +2 -1
- data/lib/openc3/topics/interface_topic.rb +8 -2
- data/lib/openc3/topics/limits_event_topic.rb +0 -0
- data/lib/openc3/topics/notebook_topic.rb +0 -0
- data/lib/openc3/topics/queue_topic.rb +0 -0
- data/lib/openc3/topics/router_topic.rb +6 -1
- data/lib/openc3/topics/system_events_topic.rb +0 -0
- data/lib/openc3/topics/telemetry_decom_topic.rb +0 -0
- data/lib/openc3/topics/telemetry_topic.rb +0 -0
- data/lib/openc3/topics/timeline_topic.rb +0 -0
- data/lib/openc3/topics/topic.rb +0 -0
- data/lib/openc3/utilities/authentication.rb +4 -4
- data/lib/openc3/utilities/authorization.rb +0 -0
- data/lib/openc3/utilities/aws_bucket.rb +2 -2
- data/lib/openc3/utilities/bucket.rb +1 -1
- data/lib/openc3/utilities/bucket_file_cache.rb +55 -22
- data/lib/openc3/utilities/bucket_require.rb +0 -0
- data/lib/openc3/utilities/bucket_utilities.rb +3 -4
- data/lib/openc3/utilities/cli_generator.rb +0 -0
- data/lib/openc3/utilities/cmd_log.rb +0 -0
- data/lib/openc3/utilities/config_overlay.rb +75 -0
- data/lib/openc3/utilities/cosmos_rails_formatter.rb +0 -0
- data/lib/openc3/utilities/crc.rb +59 -32
- data/lib/openc3/utilities/csv.rb +0 -0
- data/lib/openc3/utilities/ctrf.rb +0 -0
- data/lib/openc3/utilities/env_helper.rb +0 -0
- data/lib/openc3/utilities/local_bucket.rb +0 -0
- data/lib/openc3/utilities/local_mode.rb +32 -6
- data/lib/openc3/utilities/logger.rb +30 -8
- data/lib/openc3/utilities/message_log.rb +0 -0
- data/lib/openc3/utilities/metric.rb +0 -0
- data/lib/openc3/utilities/migration.rb +0 -0
- data/lib/openc3/utilities/open_telemetry.rb +0 -0
- data/lib/openc3/utilities/process_manager.rb +0 -0
- data/lib/openc3/utilities/pypi_url.rb +0 -0
- data/lib/openc3/utilities/python_proxy.rb +0 -0
- data/lib/openc3/utilities/python_venv.rb +135 -0
- data/lib/openc3/utilities/quaternion.rb +0 -0
- data/lib/openc3/utilities/questdb_client.rb +0 -0
- data/lib/openc3/utilities/redis_secrets.rb +0 -0
- data/lib/openc3/utilities/reingest_job.rb +0 -0
- data/lib/openc3/utilities/ruby_lex_utils.rb +0 -0
- data/lib/openc3/utilities/rubygems_url.rb +39 -0
- data/lib/openc3/utilities/running_script.rb +24 -55
- data/lib/openc3/utilities/s3_autoload.rb +5 -5
- data/lib/openc3/utilities/script.rb +12 -8
- data/lib/openc3/utilities/secrets.rb +48 -3
- data/lib/openc3/utilities/simulated_target.rb +0 -0
- data/lib/openc3/utilities/sleeper.rb +0 -0
- data/lib/openc3/utilities/store.rb +0 -0
- data/lib/openc3/utilities/store_autoload.rb +2 -2
- data/lib/openc3/utilities/store_queued.rb +0 -0
- data/lib/openc3/utilities/target_file.rb +18 -1
- data/lib/openc3/utilities/thread_manager.rb +0 -0
- data/lib/openc3/utilities/throttle.rb +0 -0
- data/lib/openc3/utilities/zip.rb +0 -0
- data/lib/openc3/utilities.rb +0 -0
- data/lib/openc3/version.rb +5 -5
- data/lib/openc3/win32/excel.rb +0 -0
- data/lib/openc3/win32/win32.rb +0 -0
- data/lib/openc3/win32/win32_main.rb +0 -0
- data/lib/openc3.rb +2 -2
- data/tasks/gemfile_stats.rake +0 -0
- data/tasks/spec.rake +0 -0
- data/templates/command_validator/command_validator.py +0 -0
- data/templates/command_validator/command_validator.rb +0 -0
- data/templates/conversion/conversion.py +0 -0
- data/templates/conversion/conversion.rb +0 -0
- data/templates/limits_response/response.py +0 -0
- data/templates/limits_response/response.rb +0 -0
- data/templates/microservice/microservices/TEMPLATE/microservice.py +0 -0
- data/templates/microservice/microservices/TEMPLATE/microservice.rb +0 -0
- data/templates/plugin/.gitignore +0 -0
- data/templates/plugin/LICENSE.md +0 -0
- data/templates/plugin/README.md +0 -0
- data/templates/plugin/Rakefile +0 -0
- data/templates/plugin/plugin.gemspec +0 -0
- data/templates/plugin/plugin.txt +0 -0
- data/templates/processor/processor.py +1 -1
- data/templates/processor/processor.rb +0 -0
- data/templates/target/targets/TARGET/cmd_tlm/cmd.txt +0 -0
- data/templates/target/targets/TARGET/cmd_tlm/tlm.txt +0 -0
- data/templates/target/targets/TARGET/lib/target.py +0 -0
- data/templates/target/targets/TARGET/lib/target.rb +0 -0
- data/templates/target/targets/TARGET/procedures/procedure.py +0 -0
- data/templates/target/targets/TARGET/procedures/procedure.rb +0 -0
- data/templates/target/targets/TARGET/public/README.txt +0 -0
- data/templates/target/targets/TARGET/screens/status.txt +0 -0
- data/templates/target/targets/TARGET/target.txt +0 -0
- data/templates/tool_angular/.editorconfig +0 -0
- data/templates/tool_angular/.gitignore +0 -0
- data/templates/tool_angular/.vscode/extensions.json +0 -0
- data/templates/tool_angular/.vscode/launch.json +0 -0
- data/templates/tool_angular/.vscode/tasks.json +0 -0
- data/templates/tool_angular/angular.json +0 -0
- data/templates/tool_angular/extra-webpack.config.js +0 -0
- data/templates/tool_angular/package.json +2 -2
- data/templates/tool_angular/src/app/app-routing.module.ts +0 -0
- data/templates/tool_angular/src/app/app.component.html +0 -0
- data/templates/tool_angular/src/app/app.component.scss +0 -0
- data/templates/tool_angular/src/app/app.component.spec.ts +0 -0
- data/templates/tool_angular/src/app/app.component.ts +0 -0
- data/templates/tool_angular/src/app/app.module.ts +0 -0
- data/templates/tool_angular/src/app/custom-overlay-container.ts +0 -0
- data/templates/tool_angular/src/app/empty-route/empty-route.component.ts +0 -0
- data/templates/tool_angular/src/app/openc3-api.d.ts +0 -0
- data/templates/tool_angular/src/assets/.gitkeep +0 -0
- data/templates/tool_angular/src/environments/environment.prod.ts +0 -0
- data/templates/tool_angular/src/environments/environment.ts +0 -0
- data/templates/tool_angular/src/favicon.ico +0 -0
- data/templates/tool_angular/src/index.html +0 -0
- data/templates/tool_angular/src/main.single-spa.ts +0 -0
- data/templates/tool_angular/src/single-spa/asset-url.ts +0 -0
- data/templates/tool_angular/src/single-spa/single-spa-props.ts +0 -0
- data/templates/tool_angular/src/styles.scss +0 -0
- data/templates/tool_angular/tsconfig.app.json +0 -0
- data/templates/tool_angular/tsconfig.json +0 -0
- data/templates/tool_angular/tsconfig.spec.json +0 -0
- data/templates/tool_react/.eslintrc +0 -0
- data/templates/tool_react/.gitignore +0 -0
- data/templates/tool_react/.prettierignore +0 -0
- data/templates/tool_react/babel.config.json +0 -0
- data/templates/tool_react/jest.config.js +0 -0
- data/templates/tool_react/package.json +1 -1
- data/templates/tool_react/src/openc3-tool_name.js +0 -0
- data/templates/tool_react/src/root.component.js +0 -0
- data/templates/tool_react/src/root.component.test.js +0 -0
- data/templates/tool_react/webpack.config.js +0 -0
- data/templates/tool_svelte/.gitignore +0 -0
- data/templates/tool_svelte/.prettierignore +0 -0
- data/templates/tool_svelte/.prettierrc.js +0 -0
- data/templates/tool_svelte/babel.config.js +0 -0
- data/templates/tool_svelte/build/smui.css +0 -0
- data/templates/tool_svelte/jest.config.js +0 -0
- data/templates/tool_svelte/package.json +1 -1
- data/templates/tool_svelte/rollup.config.js +0 -0
- data/templates/tool_svelte/src/App.svelte +0 -0
- data/templates/tool_svelte/src/App.test.js +0 -0
- data/templates/tool_svelte/src/theme/_smui-theme.scss +0 -0
- data/templates/tool_svelte/src/tool_name.js +0 -0
- data/templates/tool_vue/.env.standalone +0 -0
- data/templates/tool_vue/.gitignore +0 -0
- data/templates/tool_vue/.prettierrc.cjs +0 -0
- data/templates/tool_vue/eslint.config.mjs +0 -0
- data/templates/tool_vue/jsconfig.json +0 -0
- data/templates/tool_vue/package.json +3 -3
- data/templates/tool_vue/src/App.vue +0 -0
- data/templates/tool_vue/src/main.js +0 -0
- data/templates/tool_vue/src/router.js +0 -0
- data/templates/tool_vue/src/tools/tool_name/tool_name.vue +0 -0
- data/templates/tool_vue/vite.config.js +1 -1
- data/templates/widget/.prettierrc.cjs +0 -0
- data/templates/widget/LICENSE.md +0 -0
- data/templates/widget/Rakefile +0 -0
- data/templates/widget/package.json +2 -2
- data/templates/widget/src/Widget.vue +0 -0
- data/templates/widget/vite.config.js +0 -0
- metadata +36 -9
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
#include "ruby.h"
|
|
21
|
+
#include "stdint.h"
|
|
21
22
|
#include "stdio.h"
|
|
22
23
|
|
|
23
24
|
#define TO_BIGNUM(x) (FIXNUM_P(x) ? rb_int2big(FIX2LONG(x)) : x)
|
|
@@ -400,11 +401,13 @@ static void check_bit_offset_and_size(VALUE self, VALUE type_param, VALUE bit_of
|
|
|
400
401
|
|
|
401
402
|
if (bit_offset < 0)
|
|
402
403
|
{
|
|
403
|
-
|
|
404
|
-
|
|
404
|
+
/* Calculate in 64 bits since a large buffer times 8 does not fit in an int */
|
|
405
|
+
int64_t calculated_bit_offset = (((int64_t)RSTRING_LEN(buffer_param)) * 8) + bit_offset;
|
|
406
|
+
if ((calculated_bit_offset < 0) || (calculated_bit_offset > INT32_MAX))
|
|
405
407
|
{
|
|
406
408
|
rb_funcall(self, id_method_raise_buffer_error, 5, type_param, buffer_param, data_type_param, bit_offset_param, bit_size_param);
|
|
407
409
|
}
|
|
410
|
+
bit_offset = (int)calculated_bit_offset;
|
|
408
411
|
}
|
|
409
412
|
|
|
410
413
|
*new_bit_offset = bit_offset;
|
|
@@ -418,23 +421,45 @@ static int even_bit_size(int bit_size)
|
|
|
418
421
|
|
|
419
422
|
/* Calculate the bounds of the string to access the item based on the bit_offset and bit_size.
|
|
420
423
|
* Also determine if the buffer size is sufficient. */
|
|
421
|
-
static int check_bounds_and_buffer_size(int bit_offset, int bit_size,
|
|
424
|
+
static int check_bounds_and_buffer_size(int bit_offset, int bit_size, long buffer_length, VALUE endianness, VALUE data_type, int *lower_bound, int *upper_bound)
|
|
422
425
|
{
|
|
423
426
|
int result = 1; /* Assume ok */
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
427
|
+
int64_t calculated_lower_bound = 0;
|
|
428
|
+
int64_t calculated_upper_bound = 0;
|
|
429
|
+
|
|
430
|
+
/* Calculate in 64 bits so attacker-controlled offsets and sizes cannot
|
|
431
|
+
* overflow before the buffer bounds are checked. */
|
|
432
|
+
calculated_lower_bound = ((int64_t)bit_offset) / 8;
|
|
433
|
+
calculated_upper_bound = (((int64_t)bit_offset) + ((int64_t)bit_size) - 1) / 8;
|
|
434
|
+
*lower_bound = (int)calculated_lower_bound;
|
|
435
|
+
*upper_bound = (int)calculated_upper_bound;
|
|
436
|
+
|
|
437
|
+
/* The read starts at lower_bound, so it must be checked independently of
|
|
438
|
+
* upper_bound. Also reject reversed bounds before considering the special
|
|
439
|
+
* little-endian bitfield case below. */
|
|
440
|
+
if ((calculated_lower_bound < 0) ||
|
|
441
|
+
(calculated_lower_bound >= buffer_length) ||
|
|
442
|
+
(calculated_upper_bound < calculated_lower_bound))
|
|
443
|
+
{
|
|
444
|
+
return 0;
|
|
445
|
+
}
|
|
428
446
|
|
|
429
447
|
/* Sanity check buffer size */
|
|
430
|
-
if (
|
|
448
|
+
if (calculated_upper_bound >= buffer_length)
|
|
431
449
|
{
|
|
432
450
|
/* If it's not the special case of little endian bit field then we fail and return 0 */
|
|
451
|
+
/* Note lower_bound is already known to be inside the buffer */
|
|
433
452
|
if (!((endianness == symbol_LITTLE_ENDIAN) &&
|
|
434
453
|
((data_type == symbol_INT) || (data_type == symbol_UINT)) &&
|
|
435
454
|
/* Not byte aligned with an even bit size */
|
|
436
|
-
(!((BYTE_ALIGNED(bit_offset)) && (even_bit_size(bit_size))))
|
|
437
|
-
|
|
455
|
+
(!((BYTE_ALIGNED(bit_offset)) && (even_bit_size(bit_size))))))
|
|
456
|
+
{
|
|
457
|
+
result = 0;
|
|
458
|
+
}
|
|
459
|
+
/* Little endian bitfields are accessed backwards from bit_offset, so the bytes
|
|
460
|
+
* they span must all be inside the buffer. Checking this here keeps a huge
|
|
461
|
+
* bit_size from allocating memory before it is rejected. */
|
|
462
|
+
else if ((calculated_lower_bound - ((((bit_offset % 8) + ((int64_t)bit_size) - 1) / 8) + 1) + 1) < 0)
|
|
438
463
|
{
|
|
439
464
|
result = 0;
|
|
440
465
|
}
|
|
@@ -456,8 +481,8 @@ static int check_bounds_and_buffer_size(int bit_offset, int bit_size, int buffer
|
|
|
456
481
|
static VALUE binary_accessor_read(VALUE self, VALUE param_bit_offset, VALUE param_bit_size, VALUE param_data_type, VALUE param_buffer, VALUE param_endianness)
|
|
457
482
|
{
|
|
458
483
|
/* Convert Parameters to C Data Types */
|
|
459
|
-
int bit_offset =
|
|
460
|
-
int bit_size =
|
|
484
|
+
int bit_offset = NUM2INT(param_bit_offset);
|
|
485
|
+
int bit_size = NUM2INT(param_bit_size);
|
|
461
486
|
|
|
462
487
|
/* Local Variables */
|
|
463
488
|
int given_bit_offset = bit_offset;
|
|
@@ -502,18 +527,20 @@ static VALUE binary_accessor_read(VALUE self, VALUE param_bit_offset, VALUE para
|
|
|
502
527
|
* recalculate based on the buffer length */
|
|
503
528
|
if ((bit_size <= 0) && ((param_data_type == symbol_STRING) || (param_data_type == symbol_BLOCK)))
|
|
504
529
|
{
|
|
505
|
-
|
|
506
|
-
|
|
530
|
+
/* Calculate in 64 bits since a large buffer times 8 does not fit in an int */
|
|
531
|
+
int64_t calculated_bit_size = (((int64_t)buffer_length) * 8) - bit_offset + bit_size;
|
|
532
|
+
if (calculated_bit_size == 0)
|
|
507
533
|
{
|
|
508
534
|
return rb_str_new2("");
|
|
509
535
|
}
|
|
510
|
-
else if (
|
|
536
|
+
else if ((calculated_bit_size < 0) || (calculated_bit_size > INT32_MAX))
|
|
511
537
|
{
|
|
512
538
|
rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
|
|
513
539
|
}
|
|
540
|
+
bit_size = (int)calculated_bit_size;
|
|
514
541
|
}
|
|
515
542
|
|
|
516
|
-
if (!check_bounds_and_buffer_size(bit_offset, bit_size,
|
|
543
|
+
if (!check_bounds_and_buffer_size(bit_offset, bit_size, buffer_length, param_endianness, param_data_type, &lower_bound, &upper_bound))
|
|
517
544
|
{
|
|
518
545
|
/* Return nil for out-of-bounds reads (supports undersized packets with ALLOW_SHORT) */
|
|
519
546
|
return Qnil;
|
|
@@ -1005,10 +1032,15 @@ static VALUE binary_accessor_write(VALUE self, VALUE value, VALUE param_bit_offs
|
|
|
1005
1032
|
{
|
|
1006
1033
|
value = rb_funcall(value, id_method_to_s, 0);
|
|
1007
1034
|
}
|
|
1035
|
+
/* Calculate in 64 bits since a large value times 8 does not fit in an int */
|
|
1036
|
+
if ((((int64_t)RSTRING_LEN(value)) * 8) > INT32_MAX)
|
|
1037
|
+
{
|
|
1038
|
+
rb_funcall(self, id_method_raise_buffer_error, 5, symbol_write, param_buffer, param_data_type, param_bit_offset, param_bit_size);
|
|
1039
|
+
}
|
|
1008
1040
|
bit_size = (int)RSTRING_LEN(value) * 8;
|
|
1009
1041
|
}
|
|
1010
1042
|
|
|
1011
|
-
if ((!check_bounds_and_buffer_size(bit_offset, bit_size,
|
|
1043
|
+
if ((!check_bounds_and_buffer_size(bit_offset, bit_size, buffer_length, param_endianness, param_data_type, &lower_bound, &upper_bound)) && (given_bit_size > 0))
|
|
1012
1044
|
{
|
|
1013
1045
|
rb_funcall(self, id_method_raise_buffer_error, 5, symbol_write, param_buffer, param_data_type, param_bit_offset, param_bit_size);
|
|
1014
1046
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
data/lib/cosmos.rb
CHANGED
|
File without changes
|
data/lib/cosmosc2.rb
CHANGED
|
File without changes
|
|
File without changes
|
|
@@ -105,35 +105,70 @@ module OpenC3
|
|
|
105
105
|
HOST_ENDIANNESS = get_host_endianness()
|
|
106
106
|
# Valid endianness
|
|
107
107
|
ENDIANNESS = [:BIG_ENDIAN, :LITTLE_ENDIAN]
|
|
108
|
+
NATIVE_INT_MIN = -(2**31)
|
|
109
|
+
NATIVE_INT_MAX = (2**31) - 1
|
|
108
110
|
|
|
109
|
-
def handle_read_variable_bit_size(item,
|
|
111
|
+
def handle_read_variable_bit_size(item, buffer)
|
|
110
112
|
length_value = @packet.read(item.variable_bit_size['length_item_name'], :CONVERTED)
|
|
111
113
|
# length_value can be nil when reading an undersized packet where the length
|
|
112
114
|
# item falls outside the buffer bounds
|
|
113
115
|
raise "Length value #{item.variable_bit_size['length_item_name']} for item #{item.name} is nil" if length_value.nil?
|
|
114
116
|
|
|
115
117
|
if item.array_size
|
|
116
|
-
|
|
118
|
+
array_size = (length_value * item.variable_bit_size['length_bits_per_count']) + item.variable_bit_size['length_value_bit_offset']
|
|
119
|
+
validate_variable_bit_size(item, array_size, buffer)
|
|
120
|
+
item.array_size = array_size
|
|
117
121
|
else
|
|
118
122
|
if item.data_type == :INT or item.data_type == :UINT
|
|
119
123
|
# QUIC encoding is currently assumed for individual variable sized integers
|
|
120
124
|
# see https://datatracker.ietf.org/doc/html/rfc9000#name-variable-length-integer-enc
|
|
121
125
|
case length_value
|
|
122
126
|
when 0
|
|
123
|
-
|
|
127
|
+
bit_size = 6
|
|
124
128
|
when 1
|
|
125
|
-
|
|
129
|
+
bit_size = 14
|
|
126
130
|
when 2
|
|
127
|
-
|
|
131
|
+
bit_size = 30
|
|
128
132
|
else
|
|
129
|
-
|
|
133
|
+
bit_size = 62
|
|
130
134
|
end
|
|
131
135
|
else
|
|
132
|
-
|
|
136
|
+
bit_size = (length_value * item.variable_bit_size['length_bits_per_count']) + item.variable_bit_size['length_value_bit_offset']
|
|
133
137
|
end
|
|
138
|
+
validate_variable_bit_size(item, bit_size, buffer)
|
|
139
|
+
item.bit_size = bit_size
|
|
134
140
|
end
|
|
135
141
|
end
|
|
136
142
|
|
|
143
|
+
# A negative bit size is always invalid. A bit size larger than the buffer is
|
|
144
|
+
# only an error when the packet does not allow short buffers, otherwise the
|
|
145
|
+
# oversized item simply reads as nil (ALLOW_SHORT).
|
|
146
|
+
def validate_variable_bit_size(item, bit_size, buffer)
|
|
147
|
+
available_bit_size = (buffer.length * 8) - item.bit_offset
|
|
148
|
+
if bit_size < 0 || (!@packet.short_buffer_allowed && (available_bit_size < 0 || bit_size > available_bit_size))
|
|
149
|
+
raise ArgumentError, "Variable bit size #{bit_size} for item #{item.name} exceeds the #{[available_bit_size, 0].max} bits available in the buffer"
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# The native accessor takes C ints, so values outside that range must be
|
|
154
|
+
# rejected here rather than raising RangeError out of the extension.
|
|
155
|
+
def native_value_out_of_range?(item)
|
|
156
|
+
[item.bit_offset, item.bit_size, item.array_size].compact.any? do |value|
|
|
157
|
+
value < NATIVE_INT_MIN || value > NATIVE_INT_MAX
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Items that derive their size from the buffer (0 or negative bit_size or
|
|
162
|
+
# array_size) calculate a negative size when the buffer ends before the item
|
|
163
|
+
# starts. Such an item is simply not present in a short buffer.
|
|
164
|
+
def derived_size_negative?(item, buffer)
|
|
165
|
+
available_bit_size = (buffer.length * 8) - item.bit_offset
|
|
166
|
+
if item.array_size
|
|
167
|
+
return item.array_size <= 0 && (available_bit_size + item.array_size) < 0
|
|
168
|
+
end
|
|
169
|
+
return item.bit_size <= 0 && (available_bit_size + item.bit_size) < 0
|
|
170
|
+
end
|
|
171
|
+
|
|
137
172
|
def read_item(item, buffer)
|
|
138
173
|
return nil if item.data_type == :DERIVED
|
|
139
174
|
if item.parent_item
|
|
@@ -145,6 +180,9 @@ module OpenC3
|
|
|
145
180
|
structure.read(item.key, :RAW, structure_buffer)
|
|
146
181
|
else
|
|
147
182
|
handle_read_variable_bit_size(item, buffer) if item.variable_bit_size
|
|
183
|
+
if @packet.short_buffer_allowed && (native_value_out_of_range?(item) || derived_size_negative?(item, buffer))
|
|
184
|
+
return nil
|
|
185
|
+
end
|
|
148
186
|
self.class.read_item(item, buffer)
|
|
149
187
|
end
|
|
150
188
|
end
|
|
@@ -288,6 +326,11 @@ module OpenC3
|
|
|
288
326
|
self.class.write_item(parent_item, structure_buffer, buffer)
|
|
289
327
|
else
|
|
290
328
|
handle_write_variable_bit_size(item, value, buffer) if item.variable_bit_size
|
|
329
|
+
# Raise the normal buffer error rather than letting the native accessor
|
|
330
|
+
# raise RangeError when converting the offset or size to a C int
|
|
331
|
+
if native_value_out_of_range?(item)
|
|
332
|
+
self.class.raise_buffer_error(:write, buffer, item.data_type, item.bit_offset, item.bit_size)
|
|
333
|
+
end
|
|
291
334
|
self.class.write_item(item, value, buffer)
|
|
292
335
|
end
|
|
293
336
|
end
|
|
@@ -800,16 +843,27 @@ module OpenC3
|
|
|
800
843
|
lower_bound = bit_offset / 8
|
|
801
844
|
upper_bound = (bit_offset + bit_size - 1) / 8
|
|
802
845
|
|
|
846
|
+
# The access starts at lower_bound, so validate it independently rather
|
|
847
|
+
# than relying on upper_bound to imply that it is safe.
|
|
848
|
+
if lower_bound < 0 || lower_bound >= buffer_length || upper_bound < lower_bound
|
|
849
|
+
return false, lower_bound, upper_bound
|
|
850
|
+
end
|
|
851
|
+
|
|
803
852
|
# Sanity check buffer size
|
|
804
853
|
if upper_bound >= buffer_length
|
|
805
854
|
# If it's not the special case of little endian bit field then we fail and return false
|
|
855
|
+
# Note lower_bound is already known to be inside the buffer
|
|
806
856
|
if !((endianness == :LITTLE_ENDIAN) &&
|
|
807
857
|
((data_type == :INT) || (data_type == :UINT)) &&
|
|
808
858
|
# Not byte aligned with an even bit size
|
|
809
|
-
(!((byte_aligned(bit_offset)) && (even_bit_size(bit_size))))
|
|
810
|
-
(lower_bound < buffer_length)
|
|
859
|
+
(!((byte_aligned(bit_offset)) && (even_bit_size(bit_size))))
|
|
811
860
|
)
|
|
812
861
|
result = false
|
|
862
|
+
# Little endian bitfields are accessed backwards from bit_offset, so the
|
|
863
|
+
# bytes they span must all be inside the buffer. Checking this here keeps
|
|
864
|
+
# a huge bit_size from allocating memory before it is rejected.
|
|
865
|
+
elsif (lower_bound - ((((bit_offset % 8) + bit_size - 1) / 8) + 1) + 1) < 0
|
|
866
|
+
result = false
|
|
813
867
|
end
|
|
814
868
|
end
|
|
815
869
|
return result, lower_bound, upper_bound
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
data/lib/openc3/accessors.rb
CHANGED
|
File without changes
|
data/lib/openc3/api/README.md
CHANGED
|
File without changes
|
data/lib/openc3/api/api.rb
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
data/lib/openc3/api/cmd_api.rb
CHANGED
|
@@ -484,7 +484,7 @@ module OpenC3
|
|
|
484
484
|
user = authorize(permission: 'cmd', target_name: target_name, packet_name: cmd_name, manual: manual, scope: scope, token: token)
|
|
485
485
|
if user.nil?
|
|
486
486
|
user = {}
|
|
487
|
-
user['username'] = ENV
|
|
487
|
+
user['username'] = ENV.fetch('OPENC3_MICROSERVICE_NAME', nil)
|
|
488
488
|
|
|
489
489
|
# Get the caller stack trace to determine the point in the code where the command was called
|
|
490
490
|
# This code works but ultimately we didn't want to overload 'username' and take a performance hit
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -81,26 +81,30 @@ module OpenC3
|
|
|
81
81
|
|
|
82
82
|
# Update the news feed on demand to respond to frontend setting changes
|
|
83
83
|
def update_news(manual: false, scope: $openc3_scope, token: $openc3_token)
|
|
84
|
+
# Authorize outside the begin/rescue so AuthError propagates to the caller
|
|
85
|
+
# rather than being swallowed and written into the news feed
|
|
84
86
|
authorize(permission: 'admin', manual: manual, scope: scope, token: token)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
87
|
+
begin
|
|
88
|
+
conn = Faraday.new(
|
|
89
|
+
url: 'https://news.openc3.com',
|
|
90
|
+
params: {version: VERSION, enterprise: ENTERPRISE},
|
|
91
|
+
)
|
|
92
|
+
response = conn.get('/news')
|
|
93
|
+
if response.success?
|
|
94
|
+
NewsModel.set(response.body)
|
|
95
|
+
else
|
|
96
|
+
NewsModel.news_error("Error contacting OpenC3 news feed (status: #{response.status})")
|
|
97
|
+
end
|
|
95
98
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
99
|
+
# Test code to update the news feed with a dummy message
|
|
100
|
+
# data = NewsModel.all()
|
|
101
|
+
# json = JSON.parse(data)
|
|
102
|
+
# json.unshift( { date: Time.now.utc.iso8601, title: "News at #{Time.now}", body: "The news feed has been updated at #{Time.now}." })
|
|
103
|
+
# json.pop if json.length > 5
|
|
104
|
+
# NewsModel.set(json.to_json)
|
|
105
|
+
rescue StandardError => e
|
|
106
|
+
NewsModel.news_error("Error contacting OpenC3 news feed. #{e.message}")
|
|
107
|
+
end
|
|
104
108
|
end
|
|
105
109
|
|
|
106
110
|
# Update the local copy of the plugin store data
|
data/lib/openc3/api/stash_api.rb
CHANGED
|
File without changes
|
data/lib/openc3/api/tlm_api.rb
CHANGED
|
@@ -117,7 +117,8 @@ module OpenC3
|
|
|
117
117
|
# @param packet_name [String] Packet name of the packet
|
|
118
118
|
# @param item_hash [Hash] Hash of item_name and value for each item you want to change from the current value table
|
|
119
119
|
# @param type [Symbol] Telemetry type, :RAW, :CONVERTED (default), :FORMATTED
|
|
120
|
-
|
|
120
|
+
# @param received_time [Integer, nil] Optional received time as nanoseconds since Unix epoch
|
|
121
|
+
def inject_tlm(target_name, packet_name, item_hash = nil, type: :CONVERTED, stored: false, received_time: nil, manual: false, scope: $openc3_scope, token: $openc3_token)
|
|
121
122
|
authorize(permission: 'tlm_set', target_name: target_name, packet_name: packet_name, manual: manual, scope: scope, token: token)
|
|
122
123
|
type = type.to_s.intern
|
|
123
124
|
target_name = target_name.upcase
|
|
@@ -155,9 +156,9 @@ module OpenC3
|
|
|
155
156
|
|
|
156
157
|
# Use an interface microservice if it exists, other use the decom microservice
|
|
157
158
|
if interface_name
|
|
158
|
-
InterfaceTopic.inject_tlm(interface_name, target_name, packet_name, item_hash, type: type, stored: stored, scope: scope)
|
|
159
|
+
InterfaceTopic.inject_tlm(interface_name, target_name, packet_name, item_hash, type: type, stored: stored, received_time: received_time, scope: scope)
|
|
159
160
|
else
|
|
160
|
-
DecomInterfaceTopic.inject_tlm(target_name, packet_name, item_hash, type: type, stored: stored, scope: scope)
|
|
161
|
+
DecomInterfaceTopic.inject_tlm(target_name, packet_name, item_hash, type: type, stored: stored, received_time: received_time, scope: scope)
|
|
161
162
|
end
|
|
162
163
|
end
|
|
163
164
|
|
data/lib/openc3/bridge/bridge.rb
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -166,19 +166,46 @@ module OpenC3
|
|
|
166
166
|
return ERB.new(read_file(template_name).comment_erb(), trim_mode: "-").result(b)
|
|
167
167
|
end
|
|
168
168
|
|
|
169
|
-
# Can be called during parsing to read a referenced file
|
|
169
|
+
# Can be called during parsing to read a referenced file. The filename must
|
|
170
|
+
# be relative to the configuration file being parsed and must resolve to a
|
|
171
|
+
# location inside that file's directory.
|
|
170
172
|
def read_file(filename)
|
|
171
|
-
|
|
172
|
-
if File.expand_path(filename) == filename # absolute path
|
|
173
|
-
path = filename
|
|
174
|
-
else # relative to the current @filename
|
|
175
|
-
path = File.join(File.dirname(@filename), filename)
|
|
176
|
-
end
|
|
173
|
+
path = resolve_config_path(filename)
|
|
177
174
|
OpenC3.set_working_dir(File.dirname(path)) do
|
|
178
175
|
return File.read(path).force_encoding("UTF-8")
|
|
179
176
|
end
|
|
180
177
|
end
|
|
181
178
|
|
|
179
|
+
# Resolves a filename referenced by a configuration file (TEMPLATE_FILE, ERB
|
|
180
|
+
# render, etc) into an absolute path contained by the directory of the file
|
|
181
|
+
# being parsed. Absolute paths and paths containing '..' are rejected so a
|
|
182
|
+
# configuration file can not read arbitrary files on the filesystem.
|
|
183
|
+
#
|
|
184
|
+
# @param filename [String] Relative path from the configuration file
|
|
185
|
+
# @return [String] Absolute path to the referenced file
|
|
186
|
+
private def resolve_config_path(filename)
|
|
187
|
+
filename = filename.to_s
|
|
188
|
+
raise Error.new(self, "Filename must be given") if filename.strip.empty?
|
|
189
|
+
|
|
190
|
+
if File.absolute_path?(filename) or File.expand_path(filename) == filename
|
|
191
|
+
raise Error.new(self, "Absolute paths are not allowed: #{filename}")
|
|
192
|
+
end
|
|
193
|
+
if filename.include?('..')
|
|
194
|
+
raise Error.new(self, "Path traversal is not allowed: #{filename}")
|
|
195
|
+
end
|
|
196
|
+
if @filename.nil? or @filename.to_s.empty?
|
|
197
|
+
raise Error.new(self, "No configuration file is being parsed, can not resolve: #{filename}")
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
base = File.expand_path(File.dirname(@filename))
|
|
201
|
+
path = File.expand_path(File.join(base, filename))
|
|
202
|
+
# Final containment check in case the OS or Ruby normalizes something unexpected
|
|
203
|
+
unless path.start_with?(base + File::SEPARATOR)
|
|
204
|
+
raise Error.new(self, "Path is outside the configuration directory: #{filename}")
|
|
205
|
+
end
|
|
206
|
+
path
|
|
207
|
+
end
|
|
208
|
+
|
|
182
209
|
# Processes a file and yields |config| to the given block
|
|
183
210
|
#
|
|
184
211
|
# @param filename [String] The full name and path of the configuration file
|
|
@@ -307,6 +334,38 @@ module OpenC3
|
|
|
307
334
|
return value
|
|
308
335
|
end
|
|
309
336
|
|
|
337
|
+
# Values handle_true_false_strict accepts. Deliberately NOT shared with
|
|
338
|
+
# handle_true_false, which passes unrecognized values through and so can't
|
|
339
|
+
# tell the number 1 from a boolean - TABLE_MANAGER item defaults rely on 1
|
|
340
|
+
# staying 1. Named and scoped so they can't be mistaken for a truth table
|
|
341
|
+
# the whole parser honors.
|
|
342
|
+
STRICT_TRUE_VALUES = ['TRUE', '1']
|
|
343
|
+
STRICT_FALSE_VALUES = ['FALSE', '0', '']
|
|
344
|
+
private_constant :STRICT_TRUE_VALUES, :STRICT_FALSE_VALUES
|
|
345
|
+
|
|
346
|
+
# Converts a String containing 'TRUE', '1', 'FALSE', '0' or '' to a true or
|
|
347
|
+
# false Ruby primitive. Unlike handle_true_false, which returns anything it
|
|
348
|
+
# doesn't recognize unchanged, an unrecognized value raises.
|
|
349
|
+
#
|
|
350
|
+
# Use this for a flag where guessing is worse than failing - notably an
|
|
351
|
+
# environment variable that is enabled by presence elsewhere in COSMOS, so
|
|
352
|
+
# that 'VAR=false' (or 'VAR=0') means off here rather than the surprising on.
|
|
353
|
+
#
|
|
354
|
+
# @param value [Object] value to convert, nil returns the default
|
|
355
|
+
# @param description [String] what the value is, used in the error message
|
|
356
|
+
# @param default [true|false] returned when value is nil
|
|
357
|
+
# @return [true|false]
|
|
358
|
+
def self.handle_true_false_strict(value, description: 'value', default: false)
|
|
359
|
+
return default if value.nil?
|
|
360
|
+
normalized = value.to_s.strip.upcase
|
|
361
|
+
return true if STRICT_TRUE_VALUES.include?(normalized)
|
|
362
|
+
return false if STRICT_FALSE_VALUES.include?(normalized)
|
|
363
|
+
# Name empty explicitly - it is accepted (as false) but isn't a value
|
|
364
|
+
# anyone can read off the list
|
|
365
|
+
raise ArgumentError, "Invalid value #{value.to_s.strip.inspect} for #{description}. " \
|
|
366
|
+
"Must be one of: #{(STRICT_TRUE_VALUES + STRICT_FALSE_VALUES - ['']).join(', ')}, or empty"
|
|
367
|
+
end
|
|
368
|
+
|
|
310
369
|
# Converts a String containing '', 'NIL', 'NULL', 'TRUE' or 'FALSE' to nil,
|
|
311
370
|
# true or false Ruby primitives. All other values are simply returned.
|
|
312
371
|
#
|
|
@@ -321,6 +380,8 @@ module OpenC3
|
|
|
321
380
|
return false
|
|
322
381
|
when '', 'NIL', 'NULL'
|
|
323
382
|
return nil
|
|
383
|
+
else
|
|
384
|
+
# All other strings are returned unmodified below
|
|
324
385
|
end
|
|
325
386
|
end
|
|
326
387
|
return value
|
|
@@ -378,11 +439,12 @@ module OpenC3
|
|
|
378
439
|
return Float::INFINITY
|
|
379
440
|
when 'NEG_INFINITY'
|
|
380
441
|
return -Float::INFINITY
|
|
442
|
+
else
|
|
443
|
+
# NOTE: The else case does not raise because of the following scenario:
|
|
444
|
+
# If the value type is a UINT but they have a WRITE_CONVERSION that takes a string
|
|
445
|
+
# then the default value will be a string. In that case we just want to return the string.
|
|
446
|
+
# For example, the IP_ADDRESS parameter in the TIME_OFFSET command in the Demo plugin.
|
|
381
447
|
end
|
|
382
|
-
# NOTE: No else case because of the following scenario:
|
|
383
|
-
# If the value type is a UINT but they have a WRITE_CONVERSION that takes a string
|
|
384
|
-
# then the default value will be a string. In that case we just want to return the string.
|
|
385
|
-
# For example, the IP_ADDRESS parameter in the TIME_OFFSET command in the Demo plugin.
|
|
386
448
|
end
|
|
387
449
|
return value
|
|
388
450
|
end
|
|
@@ -494,8 +556,8 @@ module OpenC3
|
|
|
494
556
|
while true
|
|
495
557
|
@line_number += 1
|
|
496
558
|
|
|
497
|
-
if @@progress_callback && ((@line_number % 10) == 0)
|
|
498
|
-
@@progress_callback.call(io.pos / size)
|
|
559
|
+
if @@progress_callback && ((@line_number % 10) == 0) && size > 0.0
|
|
560
|
+
@@progress_callback.call(io.pos / size)
|
|
499
561
|
end
|
|
500
562
|
|
|
501
563
|
begin
|
|
@@ -586,10 +648,9 @@ module OpenC3
|
|
|
586
648
|
# KEYWORD PARAM #This is a comment
|
|
587
649
|
# But still process Ruby string interpolations such as:
|
|
588
650
|
# KEYWORD PARAM #{var}
|
|
589
|
-
if (string.length > 0) && (string[0] == '#')
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
end
|
|
651
|
+
if (string.length > 0) && (string[0] == '#') &&
|
|
652
|
+
!((string.length > 1) && (string[1] == '{'))
|
|
653
|
+
break
|
|
593
654
|
end
|
|
594
655
|
|
|
595
656
|
if remove_quotes
|
|
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
|
data/lib/openc3/conversions.rb
CHANGED
|
File without changes
|
|
File without changes
|