openc3 5.0.6
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 +7 -0
- data/Gemfile +18 -0
- data/Guardfile +35 -0
- data/LICENSE.txt +727 -0
- data/README.md +37 -0
- data/Rakefile +131 -0
- data/bin/cstol_converter +1178 -0
- data/bin/openc3cli +531 -0
- data/bin/rubysloc +139 -0
- data/data/config/_array_params.yaml +23 -0
- data/data/config/_id_items.yaml +24 -0
- data/data/config/_id_params.yaml +58 -0
- data/data/config/_interfaces.yaml +214 -0
- data/data/config/_interfaces.yaml.err +1017 -0
- data/data/config/_items.yaml +20 -0
- data/data/config/_params.yaml +60 -0
- data/data/config/cmd_tlm_server.yaml +136 -0
- data/data/config/command.yaml +44 -0
- data/data/config/command_modifiers.yaml +160 -0
- data/data/config/command_telemetry.yaml +3 -0
- data/data/config/interface_modifiers.yaml +104 -0
- data/data/config/item_modifiers.yaml +221 -0
- data/data/config/microservice.yaml +78 -0
- data/data/config/param_item_modifiers.yaml +52 -0
- data/data/config/parameter_modifiers.yaml +200 -0
- data/data/config/plugins.yaml +80 -0
- data/data/config/protocols.yaml +290 -0
- data/data/config/screen.yaml +147 -0
- data/data/config/table_manager.yaml +89 -0
- data/data/config/table_parameter_modifiers.yaml +9 -0
- data/data/config/target.yaml +142 -0
- data/data/config/target_config.yaml +94 -0
- data/data/config/telemetry.yaml +87 -0
- data/data/config/telemetry_modifiers.yaml +159 -0
- data/data/config/tool.yaml +63 -0
- data/data/config/unknown.yaml +3 -0
- data/data/config/widgets.yaml +1505 -0
- data/ext/mkrf_conf.rb +49 -0
- data/ext/openc3/ext/array/array.c +122 -0
- data/ext/openc3/ext/array/extconf.rb +13 -0
- data/ext/openc3/ext/buffered_file/buffered_file.c +198 -0
- data/ext/openc3/ext/buffered_file/extconf.rb +13 -0
- data/ext/openc3/ext/config_parser/config_parser.c +280 -0
- data/ext/openc3/ext/config_parser/extconf.rb +13 -0
- data/ext/openc3/ext/crc/crc.c +351 -0
- data/ext/openc3/ext/crc/extconf.rb +13 -0
- data/ext/openc3/ext/openc3_io/extconf.rb +13 -0
- data/ext/openc3/ext/openc3_io/openc3_io.c +158 -0
- data/ext/openc3/ext/packet/extconf.rb +13 -0
- data/ext/openc3/ext/packet/packet.c +318 -0
- data/ext/openc3/ext/platform/extconf.rb +13 -0
- data/ext/openc3/ext/platform/platform.c +134 -0
- data/ext/openc3/ext/polynomial_conversion/extconf.rb +13 -0
- data/ext/openc3/ext/polynomial_conversion/polynomial_conversion.c +79 -0
- data/ext/openc3/ext/string/extconf.rb +13 -0
- data/ext/openc3/ext/string/string.c +63 -0
- data/ext/openc3/ext/structure/structure.c +1719 -0
- data/ext/openc3/ext/tabbed_plots_config/extconf.rb +13 -0
- data/ext/openc3/ext/tabbed_plots_config/tabbed_plots_config.c +62 -0
- data/ext/openc3/ext/telemetry/extconf.rb +13 -0
- data/ext/openc3/ext/telemetry/telemetry.c +336 -0
- data/lib/cosmos.rb +20 -0
- data/lib/cosmosc2.rb +20 -0
- data/lib/openc3/api/api.rb +39 -0
- data/lib/openc3/api/authorized_api.rb +30 -0
- data/lib/openc3/api/cmd_api.rb +451 -0
- data/lib/openc3/api/config_api.rb +58 -0
- data/lib/openc3/api/interface_api.rb +117 -0
- data/lib/openc3/api/limits_api.rb +375 -0
- data/lib/openc3/api/router_api.rb +117 -0
- data/lib/openc3/api/settings_api.rb +70 -0
- data/lib/openc3/api/target_api.rb +78 -0
- data/lib/openc3/api/tlm_api.rb +455 -0
- data/lib/openc3/bridge/bridge.rb +54 -0
- data/lib/openc3/bridge/bridge_config.rb +167 -0
- data/lib/openc3/bridge/bridge_interface_thread.rb +42 -0
- data/lib/openc3/bridge/bridge_router_thread.rb +42 -0
- data/lib/openc3/ccsds/ccsds_packet.rb +68 -0
- data/lib/openc3/ccsds/ccsds_parser.rb +148 -0
- data/lib/openc3/config/config_parser.rb +549 -0
- data/lib/openc3/config/meta_config_parser.rb +74 -0
- data/lib/openc3/conversions/conversion.rb +70 -0
- data/lib/openc3/conversions/generic_conversion.rb +83 -0
- data/lib/openc3/conversions/packet_time_formatted_conversion.rb +43 -0
- data/lib/openc3/conversions/packet_time_seconds_conversion.rb +43 -0
- data/lib/openc3/conversions/polynomial_conversion.rb +87 -0
- data/lib/openc3/conversions/processor_conversion.rb +70 -0
- data/lib/openc3/conversions/received_count_conversion.rb +38 -0
- data/lib/openc3/conversions/received_time_formatted_conversion.rb +42 -0
- data/lib/openc3/conversions/received_time_seconds_conversion.rb +42 -0
- data/lib/openc3/conversions/segmented_polynomial_conversion.rb +171 -0
- data/lib/openc3/conversions/unix_time_conversion.rb +68 -0
- data/lib/openc3/conversions/unix_time_formatted_conversion.rb +49 -0
- data/lib/openc3/conversions/unix_time_seconds_conversion.rb +49 -0
- data/lib/openc3/conversions.rb +34 -0
- data/lib/openc3/core_ext/array.rb +416 -0
- data/lib/openc3/core_ext/binding.rb +29 -0
- data/lib/openc3/core_ext/class.rb +72 -0
- data/lib/openc3/core_ext/exception.rb +61 -0
- data/lib/openc3/core_ext/file.rb +83 -0
- data/lib/openc3/core_ext/hash.rb +37 -0
- data/lib/openc3/core_ext/io.rb +134 -0
- data/lib/openc3/core_ext/kernel.rb +42 -0
- data/lib/openc3/core_ext/math.rb +128 -0
- data/lib/openc3/core_ext/matrix.rb +156 -0
- data/lib/openc3/core_ext/objectspace.rb +36 -0
- data/lib/openc3/core_ext/openc3_io.rb +57 -0
- data/lib/openc3/core_ext/range.rb +27 -0
- data/lib/openc3/core_ext/socket.rb +38 -0
- data/lib/openc3/core_ext/string.rb +389 -0
- data/lib/openc3/core_ext/stringio.rb +33 -0
- data/lib/openc3/core_ext/time.rb +508 -0
- data/lib/openc3/core_ext.rb +36 -0
- data/lib/openc3/interfaces/interface.rb +498 -0
- data/lib/openc3/interfaces/linc_interface.rb +475 -0
- data/lib/openc3/interfaces/protocols/burst_protocol.rb +192 -0
- data/lib/openc3/interfaces/protocols/crc_protocol.rb +193 -0
- data/lib/openc3/interfaces/protocols/fixed_protocol.rb +155 -0
- data/lib/openc3/interfaces/protocols/ignore_packet_protocol.rb +56 -0
- data/lib/openc3/interfaces/protocols/length_protocol.rb +165 -0
- data/lib/openc3/interfaces/protocols/override_protocol.rb +60 -0
- data/lib/openc3/interfaces/protocols/preidentified_protocol.rb +206 -0
- data/lib/openc3/interfaces/protocols/protocol.rb +82 -0
- data/lib/openc3/interfaces/protocols/template_protocol.rb +261 -0
- data/lib/openc3/interfaces/protocols/terminated_protocol.rb +93 -0
- data/lib/openc3/interfaces/serial_interface.rb +94 -0
- data/lib/openc3/interfaces/simulated_target_interface.rb +168 -0
- data/lib/openc3/interfaces/stream_interface.rb +81 -0
- data/lib/openc3/interfaces/tcpip_client_interface.rb +69 -0
- data/lib/openc3/interfaces/tcpip_server_interface.rb +629 -0
- data/lib/openc3/interfaces/udp_interface.rb +169 -0
- data/lib/openc3/interfaces.rb +44 -0
- data/lib/openc3/io/buffered_file.rb +109 -0
- data/lib/openc3/io/io_multiplexer.rb +80 -0
- data/lib/openc3/io/json_api_object.rb +208 -0
- data/lib/openc3/io/json_drb.rb +335 -0
- data/lib/openc3/io/json_drb_object.rb +114 -0
- data/lib/openc3/io/json_drb_rack.rb +84 -0
- data/lib/openc3/io/json_rpc.rb +420 -0
- data/lib/openc3/io/openc3_snmp.rb +58 -0
- data/lib/openc3/io/posix_serial_driver.rb +156 -0
- data/lib/openc3/io/raw_logger.rb +167 -0
- data/lib/openc3/io/raw_logger_pair.rb +77 -0
- data/lib/openc3/io/serial_driver.rb +105 -0
- data/lib/openc3/io/stderr.rb +43 -0
- data/lib/openc3/io/stdout.rb +43 -0
- data/lib/openc3/io/udp_sockets.rb +194 -0
- data/lib/openc3/io/win32_serial_driver.rb +196 -0
- data/lib/openc3/logs/log_writer.rb +302 -0
- data/lib/openc3/logs/packet_log_constants.rb +62 -0
- data/lib/openc3/logs/packet_log_reader.rb +345 -0
- data/lib/openc3/logs/packet_log_writer.rb +299 -0
- data/lib/openc3/logs/text_log_writer.rb +68 -0
- data/lib/openc3/logs.rb +25 -0
- data/lib/openc3/microservices/cleanup_microservice.rb +68 -0
- data/lib/openc3/microservices/decom_microservice.rb +136 -0
- data/lib/openc3/microservices/interface_microservice.rb +532 -0
- data/lib/openc3/microservices/log_microservice.rb +108 -0
- data/lib/openc3/microservices/microservice.rb +204 -0
- data/lib/openc3/microservices/plugin_microservice.rb +43 -0
- data/lib/openc3/microservices/reaction_microservice.rb +541 -0
- data/lib/openc3/microservices/reducer_microservice.rb +313 -0
- data/lib/openc3/microservices/router_microservice.rb +44 -0
- data/lib/openc3/microservices/text_log_microservice.rb +84 -0
- data/lib/openc3/microservices/timeline_microservice.rb +363 -0
- data/lib/openc3/microservices/trigger_group_microservice.rb +638 -0
- data/lib/openc3/models/activity_model.rb +319 -0
- data/lib/openc3/models/auth_model.rb +65 -0
- data/lib/openc3/models/cvt_model.rb +185 -0
- data/lib/openc3/models/environment_model.rb +58 -0
- data/lib/openc3/models/gem_model.rb +137 -0
- data/lib/openc3/models/info_model.rb +31 -0
- data/lib/openc3/models/interface_model.rb +281 -0
- data/lib/openc3/models/interface_status_model.rb +117 -0
- data/lib/openc3/models/metadata_model.rb +139 -0
- data/lib/openc3/models/metric_model.rb +59 -0
- data/lib/openc3/models/microservice_model.rb +206 -0
- data/lib/openc3/models/microservice_status_model.rb +74 -0
- data/lib/openc3/models/model.rb +204 -0
- data/lib/openc3/models/note_model.rb +122 -0
- data/lib/openc3/models/notification_model.rb +40 -0
- data/lib/openc3/models/ping_model.rb +35 -0
- data/lib/openc3/models/plugin_model.rb +292 -0
- data/lib/openc3/models/process_status_model.rb +76 -0
- data/lib/openc3/models/reaction_model.rb +322 -0
- data/lib/openc3/models/reducer_model.rb +65 -0
- data/lib/openc3/models/router_model.rb +35 -0
- data/lib/openc3/models/router_status_model.rb +27 -0
- data/lib/openc3/models/scope_model.rb +153 -0
- data/lib/openc3/models/settings_model.rb +55 -0
- data/lib/openc3/models/sorted_model.rb +167 -0
- data/lib/openc3/models/target_model.rb +759 -0
- data/lib/openc3/models/timeline_model.rb +154 -0
- data/lib/openc3/models/tool_config_model.rb +38 -0
- data/lib/openc3/models/tool_model.rb +262 -0
- data/lib/openc3/models/trigger_group_model.rb +186 -0
- data/lib/openc3/models/trigger_model.rb +330 -0
- data/lib/openc3/models/widget_model.rb +138 -0
- data/lib/openc3/operators/microservice_operator.rb +128 -0
- data/lib/openc3/operators/operator.rb +277 -0
- data/lib/openc3/packets/binary_accessor.rb +1207 -0
- data/lib/openc3/packets/commands.rb +373 -0
- data/lib/openc3/packets/json_packet.rb +134 -0
- data/lib/openc3/packets/limits.rb +271 -0
- data/lib/openc3/packets/limits_response.rb +53 -0
- data/lib/openc3/packets/packet.rb +1168 -0
- data/lib/openc3/packets/packet_config.rb +625 -0
- data/lib/openc3/packets/packet_item.rb +586 -0
- data/lib/openc3/packets/packet_item_limits.rb +162 -0
- data/lib/openc3/packets/parsers/format_string_parser.rb +65 -0
- data/lib/openc3/packets/parsers/limits_parser.rb +159 -0
- data/lib/openc3/packets/parsers/limits_response_parser.rb +61 -0
- data/lib/openc3/packets/parsers/packet_item_parser.rb +272 -0
- data/lib/openc3/packets/parsers/packet_parser.rb +134 -0
- data/lib/openc3/packets/parsers/processor_parser.rb +73 -0
- data/lib/openc3/packets/parsers/state_parser.rb +127 -0
- data/lib/openc3/packets/parsers/xtce_converter.rb +442 -0
- data/lib/openc3/packets/parsers/xtce_parser.rb +722 -0
- data/lib/openc3/packets/structure.rb +553 -0
- data/lib/openc3/packets/structure_item.rb +365 -0
- data/lib/openc3/packets/telemetry.rb +487 -0
- data/lib/openc3/processors/processor.rb +86 -0
- data/lib/openc3/processors/statistics_processor.rb +82 -0
- data/lib/openc3/processors/watermark_processor.rb +58 -0
- data/lib/openc3/processors.rb +24 -0
- data/lib/openc3/script/api_shared.rb +828 -0
- data/lib/openc3/script/calendar.rb +89 -0
- data/lib/openc3/script/commands.rb +227 -0
- data/lib/openc3/script/exceptions.rb +29 -0
- data/lib/openc3/script/extract.rb +161 -0
- data/lib/openc3/script/limits.rb +60 -0
- data/lib/openc3/script/script.rb +299 -0
- data/lib/openc3/script/script_runner.rb +238 -0
- data/lib/openc3/script/storage.rb +146 -0
- data/lib/openc3/script/suite.rb +542 -0
- data/lib/openc3/script/suite_results.rb +196 -0
- data/lib/openc3/script/suite_runner.rb +217 -0
- data/lib/openc3/script.rb +21 -0
- data/lib/openc3/streams/serial_stream.rb +167 -0
- data/lib/openc3/streams/stream.rb +63 -0
- data/lib/openc3/streams/tcpip_client_stream.rb +116 -0
- data/lib/openc3/streams/tcpip_socket_stream.rb +195 -0
- data/lib/openc3/system/system.rb +127 -0
- data/lib/openc3/system/system_config.rb +411 -0
- data/lib/openc3/system/target.rb +269 -0
- data/lib/openc3/system.rb +24 -0
- data/lib/openc3/tools/cmd_tlm_server/api.rb +20 -0
- data/lib/openc3/tools/cmd_tlm_server/cmd_tlm_server_config.rb +320 -0
- data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +294 -0
- data/lib/openc3/tools/table_manager/table.rb +77 -0
- data/lib/openc3/tools/table_manager/table_config.rb +273 -0
- data/lib/openc3/tools/table_manager/table_item.rb +90 -0
- data/lib/openc3/tools/table_manager/table_item_parser.rb +66 -0
- data/lib/openc3/tools/table_manager/table_manager_core.rb +333 -0
- data/lib/openc3/tools/table_manager/table_parser.rb +93 -0
- data/lib/openc3/tools/test_runner/test.rb +67 -0
- data/lib/openc3/top_level.rb +595 -0
- data/lib/openc3/topics/autonomic_topic.rb +52 -0
- data/lib/openc3/topics/calendar_topic.rb +44 -0
- data/lib/openc3/topics/command_decom_topic.rb +76 -0
- data/lib/openc3/topics/command_topic.rb +83 -0
- data/lib/openc3/topics/config_topic.rb +68 -0
- data/lib/openc3/topics/interface_topic.rb +73 -0
- data/lib/openc3/topics/limits_event_topic.rb +109 -0
- data/lib/openc3/topics/notifications_topic.rb +28 -0
- data/lib/openc3/topics/router_topic.rb +85 -0
- data/lib/openc3/topics/telemetry_decom_topic.rb +54 -0
- data/lib/openc3/topics/telemetry_topic.rb +36 -0
- data/lib/openc3/topics/timeline_topic.rb +45 -0
- data/lib/openc3/topics/topic.rb +53 -0
- data/lib/openc3/utilities/authentication.rb +141 -0
- data/lib/openc3/utilities/authorization.rb +51 -0
- data/lib/openc3/utilities/crc.rb +278 -0
- data/lib/openc3/utilities/csv.rb +153 -0
- data/lib/openc3/utilities/logger.rb +187 -0
- data/lib/openc3/utilities/message_log.rb +91 -0
- data/lib/openc3/utilities/metric.rb +141 -0
- data/lib/openc3/utilities/process_manager.rb +139 -0
- data/lib/openc3/utilities/quaternion.rb +257 -0
- data/lib/openc3/utilities/ruby_lex_utils.rb +568 -0
- data/lib/openc3/utilities/s3.rb +202 -0
- data/lib/openc3/utilities/s3_autoload.rb +9 -0
- data/lib/openc3/utilities/s3_file_cache.rb +274 -0
- data/lib/openc3/utilities/simulated_target.rb +117 -0
- data/lib/openc3/utilities/sleeper.rb +51 -0
- data/lib/openc3/utilities/store.rb +23 -0
- data/lib/openc3/utilities/store_autoload.rb +237 -0
- data/lib/openc3/utilities/zip.rb +21 -0
- data/lib/openc3/utilities.rb +35 -0
- data/lib/openc3/version.rb +14 -0
- data/lib/openc3/win32/excel.rb +132 -0
- data/lib/openc3/win32/win32.rb +402 -0
- data/lib/openc3/win32/win32_main.rb +333 -0
- data/lib/openc3.rb +49 -0
- data/tasks/gemfile_stats.rake +113 -0
- data/tasks/spec.rake +30 -0
- data/templates/plugin-template/README.md +15 -0
- data/templates/plugin-template/Rakefile +12 -0
- data/templates/plugin-template/plugin.gemspec +23 -0
- data/templates/plugin-template/plugin.txt +9 -0
- data/templates/plugin-template/targets/TARGET/cmd_tlm/cmd.txt +8 -0
- data/templates/plugin-template/targets/TARGET/cmd_tlm/tlm.txt +8 -0
- data/templates/plugin-template/targets/TARGET/lib/target.rb +10 -0
- data/templates/plugin-template/targets/TARGET/procedures/procedure.rb +3 -0
- data/templates/plugin-template/targets/TARGET/screens/status.txt +9 -0
- data/templates/plugin-template/targets/TARGET/target.txt +5 -0
- metadata +849 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2022 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU Affero General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
#
|
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
# GNU Affero General Public License for more details.
|
|
15
|
+
|
|
16
|
+
# Modified by OpenC3, Inc.
|
|
17
|
+
# All changes Copyright 2022, OpenC3, Inc.
|
|
18
|
+
# All Rights Reserved
|
|
19
|
+
|
|
20
|
+
require 'openc3/interfaces/interface'
|
|
21
|
+
require 'openc3/io/udp_sockets'
|
|
22
|
+
require 'openc3/config/config_parser'
|
|
23
|
+
|
|
24
|
+
module OpenC3
|
|
25
|
+
# Base class for interfaces that send and receive messages over UDP
|
|
26
|
+
class UdpInterface < Interface
|
|
27
|
+
# @param hostname [String] Machine to connect to
|
|
28
|
+
# @param write_dest_port [Integer] Port to write commands to
|
|
29
|
+
# @param read_port [Integer] Port to read telemetry from
|
|
30
|
+
# @param write_src_port [Integer] Port to allow replies if needed
|
|
31
|
+
# @param interface_address [String] If the destination machine represented
|
|
32
|
+
# by hostname supports multicast, then interface_address is used to
|
|
33
|
+
# configure the outgoing multicast address.
|
|
34
|
+
# @param ttl [Integer] Time To Live value. The number of intermediate
|
|
35
|
+
# routers allowed before dropping the packet.
|
|
36
|
+
# @param write_timeout [Integer] Seconds to wait before aborting writes
|
|
37
|
+
# @param read_timeout [Integer] Seconds to wait before aborting reads
|
|
38
|
+
# @param bind_address [String] Address to bind UDP ports to
|
|
39
|
+
def initialize(
|
|
40
|
+
hostname,
|
|
41
|
+
write_dest_port,
|
|
42
|
+
read_port,
|
|
43
|
+
write_src_port = nil,
|
|
44
|
+
interface_address = nil,
|
|
45
|
+
ttl = 128, # default for Windows
|
|
46
|
+
write_timeout = 10.0,
|
|
47
|
+
read_timeout = nil,
|
|
48
|
+
bind_address = '0.0.0.0'
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
super()
|
|
52
|
+
@hostname = ConfigParser.handle_nil(hostname)
|
|
53
|
+
if @hostname
|
|
54
|
+
@hostname = @hostname.to_s
|
|
55
|
+
@hostname = '127.0.0.1' if @hostname.casecmp('LOCALHOST').zero?
|
|
56
|
+
end
|
|
57
|
+
@write_dest_port = ConfigParser.handle_nil(write_dest_port)
|
|
58
|
+
@write_dest_port = write_dest_port.to_i if @write_dest_port
|
|
59
|
+
@read_port = ConfigParser.handle_nil(read_port)
|
|
60
|
+
@read_port = read_port.to_i if @read_port
|
|
61
|
+
@write_src_port = ConfigParser.handle_nil(write_src_port)
|
|
62
|
+
@write_src_port = @write_src_port.to_i if @write_src_port
|
|
63
|
+
@interface_address = ConfigParser.handle_nil(interface_address)
|
|
64
|
+
if @interface_address && @interface_address.casecmp('LOCALHOST').zero?
|
|
65
|
+
@interface_address = '127.0.0.1'
|
|
66
|
+
end
|
|
67
|
+
@ttl = ttl.to_i
|
|
68
|
+
@ttl = 1 if @ttl < 1
|
|
69
|
+
@write_timeout = ConfigParser.handle_nil(write_timeout)
|
|
70
|
+
@write_timeout = @write_timeout.to_f if @write_timeout
|
|
71
|
+
@read_timeout = ConfigParser.handle_nil(read_timeout)
|
|
72
|
+
@read_timeout = @read_timeout.to_f if @read_timeout
|
|
73
|
+
@bind_address = ConfigParser.handle_nil(bind_address)
|
|
74
|
+
if @bind_address && @bind_address.casecmp('LOCALHOST').zero?
|
|
75
|
+
@bind_address = '127.0.0.1'
|
|
76
|
+
end
|
|
77
|
+
@write_socket = nil
|
|
78
|
+
@read_socket = nil
|
|
79
|
+
@read_allowed = false unless @read_port
|
|
80
|
+
@write_allowed = false unless @write_dest_port
|
|
81
|
+
@write_raw_allowed = false unless @write_dest_port
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Creates a new {UdpWriteSocket} if the the write_dest_port was given in
|
|
85
|
+
# the constructor and a new {UdpReadSocket} if the read_port was given in
|
|
86
|
+
# the constructor.
|
|
87
|
+
def connect
|
|
88
|
+
if @read_port and @write_dest_port and @write_src_port and (@read_port == @write_src_port)
|
|
89
|
+
@read_socket = UdpReadWriteSocket.new(
|
|
90
|
+
@read_port,
|
|
91
|
+
@bind_address,
|
|
92
|
+
@write_dest_port,
|
|
93
|
+
@hostname,
|
|
94
|
+
@interface_address,
|
|
95
|
+
@ttl
|
|
96
|
+
)
|
|
97
|
+
@write_socket = @read_socket
|
|
98
|
+
else
|
|
99
|
+
@read_socket = UdpReadSocket.new(
|
|
100
|
+
@read_port,
|
|
101
|
+
@hostname,
|
|
102
|
+
@interface_address,
|
|
103
|
+
@bind_address
|
|
104
|
+
) if @read_port
|
|
105
|
+
@write_socket = UdpWriteSocket.new(
|
|
106
|
+
@hostname,
|
|
107
|
+
@write_dest_port,
|
|
108
|
+
@write_src_port,
|
|
109
|
+
@interface_address,
|
|
110
|
+
@ttl,
|
|
111
|
+
@bind_address
|
|
112
|
+
) if @write_dest_port
|
|
113
|
+
end
|
|
114
|
+
@thread_sleeper = nil
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# @return [Boolean] Whether the active ports (read and/or write) have
|
|
118
|
+
# created sockets. Since UDP is connectionless, creation of the sockets
|
|
119
|
+
# is used to determine connection.
|
|
120
|
+
def connected?
|
|
121
|
+
if @write_dest_port && @read_port
|
|
122
|
+
(@write_socket && @read_socket) ? true : false
|
|
123
|
+
elsif @write_dest_port
|
|
124
|
+
@write_socket ? true : false
|
|
125
|
+
else
|
|
126
|
+
@read_socket ? true : false
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Close the active ports (read and/or write) and set the sockets to nil.
|
|
131
|
+
def disconnect
|
|
132
|
+
if @write_socket != @read_socket
|
|
133
|
+
OpenC3.close_socket(@write_socket)
|
|
134
|
+
end
|
|
135
|
+
OpenC3.close_socket(@read_socket)
|
|
136
|
+
@write_socket = nil
|
|
137
|
+
@read_socket = nil
|
|
138
|
+
@thread_sleeper.cancel if @thread_sleeper
|
|
139
|
+
@thread_sleeper = nil
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def read
|
|
143
|
+
return super() if @read_port
|
|
144
|
+
|
|
145
|
+
# Write only interface so stop the thread which calls read
|
|
146
|
+
@thread_sleeper = Sleeper.new
|
|
147
|
+
@thread_sleeper.sleep(1_000_000_000) while connected?
|
|
148
|
+
return nil
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Reads from the socket if the read_port is defined
|
|
152
|
+
def read_interface
|
|
153
|
+
data = @read_socket.read(@read_timeout)
|
|
154
|
+
Logger.info "#{@name}: Udp read returned 0 bytes (stream closed)" if data.length <= 0
|
|
155
|
+
read_interface_base(data)
|
|
156
|
+
return data
|
|
157
|
+
rescue IOError # Disconnected
|
|
158
|
+
return nil
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Writes to the socket
|
|
162
|
+
# @param data [String] Raw packet data
|
|
163
|
+
def write_interface(data)
|
|
164
|
+
write_interface_base(data)
|
|
165
|
+
@write_socket.write(data, @write_timeout)
|
|
166
|
+
data
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2022 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU Affero General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
#
|
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
# GNU Affero General Public License for more details.
|
|
15
|
+
|
|
16
|
+
# Modified by OpenC3, Inc.
|
|
17
|
+
# All changes Copyright 2022, OpenC3, Inc.
|
|
18
|
+
# All Rights Reserved
|
|
19
|
+
|
|
20
|
+
module OpenC3
|
|
21
|
+
autoload(:Interface, 'openc3/interfaces/interface.rb')
|
|
22
|
+
autoload(:StreamInterface, 'openc3/interfaces/stream_interface.rb')
|
|
23
|
+
autoload(:SerialInterface, 'openc3/interfaces/serial_interface.rb')
|
|
24
|
+
autoload(:SimulatedTargetInterface, 'openc3/interfaces/simulated_target_interface.rb')
|
|
25
|
+
autoload(:TcpipClientInterface, 'openc3/interfaces/tcpip_client_interface.rb')
|
|
26
|
+
autoload(:TcpipServerInterface, 'openc3/interfaces/tcpip_server_interface.rb')
|
|
27
|
+
autoload(:UdpInterface, 'openc3/interfaces/udp_interface.rb')
|
|
28
|
+
autoload(:LincInterface, 'openc3/interfaces/linc_interface.rb')
|
|
29
|
+
autoload(:LincHandshakeCommand, 'openc3/interfaces/linc_interface.rb')
|
|
30
|
+
autoload(:LincHandshake, 'openc3/interfaces/linc_interface.rb')
|
|
31
|
+
autoload(:DartStatusInterface, 'openc3/interfaces/dart_status_interface.rb')
|
|
32
|
+
|
|
33
|
+
autoload(:Protocol, 'openc3/interfaces/protocols/protocol.rb')
|
|
34
|
+
autoload(:BurstProtocol, 'openc3/interfaces/protocols/burst_protocol.rb')
|
|
35
|
+
autoload(:FixedProtocol, 'openc3/interfaces/protocols/fixed_protocol.rb')
|
|
36
|
+
autoload(:LengthProtocol, 'openc3/interfaces/protocols/length_protocol.rb')
|
|
37
|
+
autoload(:PreidentifiedProtocol, 'openc3/interfaces/protocols/preidentified_protocol.rb')
|
|
38
|
+
autoload(:TemplateProtocol, 'openc3/interfaces/protocols/template_protocol.rb')
|
|
39
|
+
autoload(:TerminatedProtocol, 'openc3/interfaces/protocols/terminated_protocol.rb')
|
|
40
|
+
|
|
41
|
+
autoload(:OverrideProtocol, 'openc3/interfaces/protocols/override_protocol.rb')
|
|
42
|
+
autoload(:CrcProtocol, 'openc3/interfaces/protocols/crc_protocol.rb')
|
|
43
|
+
autoload(:IgnorePacketProtocol, 'openc3/interfaces/protocols/ignore_packet_protocol.rb')
|
|
44
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2022 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU Affero General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
#
|
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
# GNU Affero General Public License for more details.
|
|
15
|
+
|
|
16
|
+
# Modified by OpenC3, Inc.
|
|
17
|
+
# All changes Copyright 2022, OpenC3, Inc.
|
|
18
|
+
# All Rights Reserved
|
|
19
|
+
|
|
20
|
+
if RUBY_ENGINE == 'ruby' and !ENV['OPENC3_NO_EXT']
|
|
21
|
+
require 'openc3/ext/buffered_file'
|
|
22
|
+
else
|
|
23
|
+
module OpenC3
|
|
24
|
+
class BufferedFile < File
|
|
25
|
+
BUFFER_SIZE = 16 * 1024
|
|
26
|
+
|
|
27
|
+
# Initialize the BufferedFile. Takes the same args as File
|
|
28
|
+
def initialize(*args)
|
|
29
|
+
super(*args)
|
|
30
|
+
@buffer = ''
|
|
31
|
+
@buffer_index = 0
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Read using an internal buffer to avoid system calls
|
|
35
|
+
def read(read_length)
|
|
36
|
+
if read_length <= (@buffer.length - @buffer_index)
|
|
37
|
+
# Return part of the buffer without having to go to the OS
|
|
38
|
+
result = @buffer[@buffer_index, read_length]
|
|
39
|
+
@buffer_index += read_length
|
|
40
|
+
return result
|
|
41
|
+
elsif read_length > BUFFER_SIZE
|
|
42
|
+
# Reading more than our buffer
|
|
43
|
+
if @buffer.length > 0
|
|
44
|
+
if @buffer_index > 0
|
|
45
|
+
@buffer.slice!(0..(@buffer_index - 1))
|
|
46
|
+
@buffer_index = 0
|
|
47
|
+
end
|
|
48
|
+
@buffer << super(read_length - @buffer.length).to_s
|
|
49
|
+
return @buffer.slice!(0..-1)
|
|
50
|
+
else
|
|
51
|
+
return super(read_length)
|
|
52
|
+
end
|
|
53
|
+
else
|
|
54
|
+
# Read into the buffer
|
|
55
|
+
if @buffer_index > 0
|
|
56
|
+
@buffer.slice!(0..(@buffer_index - 1))
|
|
57
|
+
@buffer_index = 0
|
|
58
|
+
end
|
|
59
|
+
@buffer << super(BUFFER_SIZE - @buffer.length).to_s
|
|
60
|
+
if @buffer.length <= 0
|
|
61
|
+
return nil
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
if read_length <= @buffer.length
|
|
65
|
+
result = @buffer[@buffer_index, read_length]
|
|
66
|
+
@buffer_index += read_length
|
|
67
|
+
return result
|
|
68
|
+
else
|
|
69
|
+
return @buffer.slice!(0..-1)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Get the current file position
|
|
75
|
+
def pos
|
|
76
|
+
parent_pos = super()
|
|
77
|
+
return parent_pos - (@buffer.length - @buffer_index)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Seek to a given file position
|
|
81
|
+
def seek(*args)
|
|
82
|
+
case args.length
|
|
83
|
+
when 1
|
|
84
|
+
amount = args[0]
|
|
85
|
+
whence = IO::SEEK_SET
|
|
86
|
+
when 2
|
|
87
|
+
amount = args[0]
|
|
88
|
+
whence = args[1]
|
|
89
|
+
else
|
|
90
|
+
# Invalid number of arguments given - let super handle
|
|
91
|
+
return super(*args)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
if whence == IO::SEEK_CUR
|
|
95
|
+
buffer_index = @buffer_index + amount
|
|
96
|
+
if (buffer_index >= 0) && (buffer_index < @buffer.length)
|
|
97
|
+
@buffer_index = buffer_index
|
|
98
|
+
return 0
|
|
99
|
+
end
|
|
100
|
+
super(self.pos, IO::SEEK_SET)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
@buffer.clear
|
|
104
|
+
@buffer_index = 0
|
|
105
|
+
return super(*args)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2022 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU Affero General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
#
|
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
# GNU Affero General Public License for more details.
|
|
15
|
+
|
|
16
|
+
# Modified by OpenC3, Inc.
|
|
17
|
+
# All changes Copyright 2022, OpenC3, Inc.
|
|
18
|
+
# All Rights Reserved
|
|
19
|
+
|
|
20
|
+
module OpenC3
|
|
21
|
+
# Adds IO streams and then defers to the streams when using any of the Ruby
|
|
22
|
+
# output methods such as print, puts, etc.
|
|
23
|
+
class IoMultiplexer
|
|
24
|
+
# Create the empty stream array
|
|
25
|
+
def initialize
|
|
26
|
+
@streams = []
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def write(*args)
|
|
30
|
+
first = true
|
|
31
|
+
result = nil
|
|
32
|
+
@streams.each do |stream|
|
|
33
|
+
if first
|
|
34
|
+
result = stream.write(*args)
|
|
35
|
+
result = self if result == stream
|
|
36
|
+
first = false
|
|
37
|
+
else
|
|
38
|
+
stream.write(*args)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
result
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Forwards IO methods to all streams
|
|
45
|
+
def method_missing(method_name, *args)
|
|
46
|
+
first = true
|
|
47
|
+
result = nil
|
|
48
|
+
@streams.each do |stream|
|
|
49
|
+
if first
|
|
50
|
+
# Fortify Access Specifier Manipulation
|
|
51
|
+
# We're forwarding only public methods to the stream
|
|
52
|
+
result = stream.public_send(method_name, *args)
|
|
53
|
+
result = self if result == stream
|
|
54
|
+
first = false
|
|
55
|
+
else
|
|
56
|
+
# Fortify Access Specifier Manipulation
|
|
57
|
+
# We're forwarding only public methods to the stream
|
|
58
|
+
stream.public_send(method_name, *args)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
result
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Removes STDOUT and STDERR from the array of streams
|
|
65
|
+
def remove_default_io
|
|
66
|
+
@streams.delete(STDOUT)
|
|
67
|
+
@streams.delete(STDERR)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# @param stream [IO] The stream to add
|
|
71
|
+
def add_stream(stream)
|
|
72
|
+
@streams << stream unless @streams.include?(stream)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# @param stream [IO] The stream to remove
|
|
76
|
+
def remove_stream(stream)
|
|
77
|
+
@streams.delete(stream)
|
|
78
|
+
end
|
|
79
|
+
end # class IoMultiplexer
|
|
80
|
+
end
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2022 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU Affero General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
#
|
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
# GNU Affero General Public License for more details.
|
|
15
|
+
|
|
16
|
+
# Modified by OpenC3, Inc.
|
|
17
|
+
# All changes Copyright 2022, OpenC3, Inc.
|
|
18
|
+
# All Rights Reserved
|
|
19
|
+
|
|
20
|
+
require 'openc3'
|
|
21
|
+
require 'openc3/utilities/authentication'
|
|
22
|
+
require 'openc3/io/json_drb'
|
|
23
|
+
|
|
24
|
+
require 'thread'
|
|
25
|
+
require 'socket'
|
|
26
|
+
require 'json'
|
|
27
|
+
# require 'drb/acl'
|
|
28
|
+
require 'drb/drb'
|
|
29
|
+
require 'uri'
|
|
30
|
+
require 'httpclient'
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
module OpenC3
|
|
34
|
+
|
|
35
|
+
class JsonApiError < StandardError; end
|
|
36
|
+
|
|
37
|
+
# Used to forward all method calls to the remote server object. Before using
|
|
38
|
+
# this class ensure the remote service has been started in the server class:
|
|
39
|
+
#
|
|
40
|
+
# json = JsonDrb.new
|
|
41
|
+
# json.start_service('127.0.0.1', 7777, self)
|
|
42
|
+
#
|
|
43
|
+
# Now the JsonApiObject can be used to call server methods directly:
|
|
44
|
+
#
|
|
45
|
+
# server = JsonApiObject('http://openc3-cmd-tlm-api:2901', 1.0)
|
|
46
|
+
# server.cmd(*args)
|
|
47
|
+
#
|
|
48
|
+
class JsonApiObject
|
|
49
|
+
attr_reader :request_data
|
|
50
|
+
attr_reader :response_data
|
|
51
|
+
|
|
52
|
+
USER_AGENT = 'OpenC3 / v5 (ruby/openc3/lib/io/json_api_object)'.freeze
|
|
53
|
+
|
|
54
|
+
# @param url [String] The url of openc3-cmd-tlm-api http://openc3-cmd-tlm-api:2901
|
|
55
|
+
# @param timeout [Float] The time to wait before disconnecting 1.0
|
|
56
|
+
# @param authentication [OpenC3Authentication] The authentication object if nill initialize will generate
|
|
57
|
+
def initialize(url: ENV['OPENC3_API_URL'], timeout: 1.0, authentication: nil)
|
|
58
|
+
@http = nil
|
|
59
|
+
@mutex = Mutex.new
|
|
60
|
+
@request_data = ""
|
|
61
|
+
@response_data = ""
|
|
62
|
+
@url = url
|
|
63
|
+
@log = [nil, nil, nil]
|
|
64
|
+
@authentication = authentication.nil? ? OpenC3Authentication.new() : authentication
|
|
65
|
+
@timeout = timeout
|
|
66
|
+
@shutdown = false
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Forwards all method calls to the remote service.
|
|
70
|
+
#
|
|
71
|
+
# @param method_params [Array] Array of parameters to pass to the method
|
|
72
|
+
# @param keyword_params [Hash<Symbol, Variable>] Hash of keyword parameters
|
|
73
|
+
# @return The result of the method call.
|
|
74
|
+
def request(*method_params, **keyword_params)
|
|
75
|
+
raise JsonApiError, "Shutdown" if @shutdown
|
|
76
|
+
method = method_params[0]
|
|
77
|
+
endpoint = method_params[1]
|
|
78
|
+
@mutex.synchronize do
|
|
79
|
+
kwargs = _generate_kwargs(keyword_params)
|
|
80
|
+
@log = [nil, nil, nil]
|
|
81
|
+
connect() if !@http
|
|
82
|
+
return _send_request(method: method, endpoint: endpoint, kwargs: kwargs)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Disconnects from http server
|
|
87
|
+
def disconnect
|
|
88
|
+
@http.reset_all() if @http
|
|
89
|
+
@http = nil
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Permanently disconnects from the http server
|
|
93
|
+
def shutdown
|
|
94
|
+
@shutdown = true
|
|
95
|
+
disconnect()
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
private
|
|
99
|
+
|
|
100
|
+
def connect
|
|
101
|
+
begin
|
|
102
|
+
@http = HTTPClient.new
|
|
103
|
+
@http.connect_timeout = @timeout
|
|
104
|
+
@http.receive_timeout = nil # Allow long polling
|
|
105
|
+
rescue => e
|
|
106
|
+
raise JsonApiError, e.message
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# NOTE: This is a helper method and should not be called directly
|
|
111
|
+
def _generate_kwargs(keyword_params)
|
|
112
|
+
kwargs = {}
|
|
113
|
+
keyword_params.each do |key, value|
|
|
114
|
+
kwargs[key.intern] = value
|
|
115
|
+
end
|
|
116
|
+
kwargs[:scope] = _generate_scope(kwargs)
|
|
117
|
+
kwargs[:headers] = _generate_headers(kwargs)
|
|
118
|
+
kwargs[:data] = _generate_data(kwargs)
|
|
119
|
+
kwargs[:query] = _generate_query(kwargs)
|
|
120
|
+
return kwargs
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# NOTE: This is a helper method and should not be called directly
|
|
124
|
+
def _generate_scope(kwargs)
|
|
125
|
+
scope = kwargs[:scope]
|
|
126
|
+
if scope.nil?
|
|
127
|
+
raise JsonApiError, "no scope keyword found: #{kwargs}"
|
|
128
|
+
elsif scope.is_a?(String) == false
|
|
129
|
+
raise JsonApiError, "incorrect type for keyword 'scope' MUST be String: #{scope}"
|
|
130
|
+
end
|
|
131
|
+
return scope
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# NOTE: This is a helper method and should not be called directly
|
|
135
|
+
def _generate_headers(kwargs)
|
|
136
|
+
headers = kwargs[:headers]
|
|
137
|
+
if headers.nil?
|
|
138
|
+
headers = kwargs[:headers] = {}
|
|
139
|
+
elsif headers.is_a?(Hash) == false
|
|
140
|
+
raise JsonApiError, "incorrect type for keyword 'headers' MUST be Hash: #{headers}"
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
headers['Content-Type'] = 'application/json' if kwargs[:json]
|
|
144
|
+
return headers.update({
|
|
145
|
+
'User-Agent' => USER_AGENT,
|
|
146
|
+
'Authorization' => @authentication.token(),
|
|
147
|
+
})
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# NOTE: This is a helper method and should not be called directly
|
|
151
|
+
def _generate_data(kwargs)
|
|
152
|
+
data = kwargs[:data]
|
|
153
|
+
if data.nil?
|
|
154
|
+
data = kwargs[:data] = {}
|
|
155
|
+
elsif data.is_a?(Hash) == false and data.is_a?(String) == false
|
|
156
|
+
raise JsonApiError, "incorrect type for keyword 'data' MUST be Hash or String: #{data}"
|
|
157
|
+
end
|
|
158
|
+
return kwargs[:json] ? JSON.generate(kwargs[:data]) : kwargs[:data]
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# NOTE: This is a helper method and should not be called directly
|
|
162
|
+
def _generate_query(kwargs)
|
|
163
|
+
query = kwargs[:query]
|
|
164
|
+
if query.nil?
|
|
165
|
+
query = kwargs[:query] = {}
|
|
166
|
+
elsif query.is_a?(Hash) == false
|
|
167
|
+
raise JsonApiError, "incorrect type for keyword 'query' MUST be Hash: #{query}"
|
|
168
|
+
end
|
|
169
|
+
kwargs[:query].update(:scope => kwargs[:scope]) if kwargs[:scope]
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# NOTE: This is a helper method and should not be called directly
|
|
173
|
+
def _send_request(method:, endpoint:, kwargs:)
|
|
174
|
+
begin
|
|
175
|
+
uri = URI("#{@url}#{endpoint}")
|
|
176
|
+
@log[0] = "#{method} Request: #{uri.to_s} #{kwargs}"
|
|
177
|
+
STDOUT.puts @log[0] if JsonDRb.debug?
|
|
178
|
+
resp = _http_request(method: method, uri: uri, kwargs: kwargs)
|
|
179
|
+
@log[1] = "#{method} Response: #{resp.status} #{resp.headers} #{resp.body}"
|
|
180
|
+
STDOUT.puts @log[1] if JsonDRb.debug?
|
|
181
|
+
@response_data = resp.body
|
|
182
|
+
return resp
|
|
183
|
+
rescue StandardError => e
|
|
184
|
+
@log[2] = "#{method} Exception: #{e.class}, #{e.message}, #{e.backtrace}"
|
|
185
|
+
disconnect()
|
|
186
|
+
error = "Api Exception: #{@log[0]} ::: #{@log[1]} ::: #{@log[2]}"
|
|
187
|
+
raise error
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# NOTE: This is a helper method and should not be called directly
|
|
192
|
+
def _http_request(method:, uri:, kwargs:)
|
|
193
|
+
case method
|
|
194
|
+
when 'get', :get
|
|
195
|
+
return @http.get(uri, :header => kwargs[:headers], :query => kwargs[:query])
|
|
196
|
+
when 'post', :post
|
|
197
|
+
return @http.post(uri, :header => kwargs[:headers], :query => kwargs[:query], :body => kwargs[:data])
|
|
198
|
+
when 'put', :put
|
|
199
|
+
return @http.put(uri, :header => kwargs[:headers], :query => kwargs[:query], :body => kwargs[:data])
|
|
200
|
+
when 'delete', :delete
|
|
201
|
+
return @http.delete(uri, :header => kwargs[:headers], :query => kwargs[:query])
|
|
202
|
+
else
|
|
203
|
+
raise JsonApiError, "no method found: '#{method}'"
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
end # class JsonApiObject
|
|
208
|
+
end
|