openc3 5.0.11 → 5.1.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of openc3 might be problematic. Click here for more details.

Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/Guardfile +3 -0
  3. data/LICENSE.txt +7 -5
  4. data/README.md +11 -9
  5. data/Rakefile +3 -0
  6. data/bin/cstol_converter +3 -0
  7. data/bin/openc3cli +29 -18
  8. data/bin/rubysloc +3 -0
  9. data/data/config/screen.yaml +10 -2
  10. data/data/config/target.yaml +1 -1
  11. data/data/config/widgets.yaml +6 -6
  12. data/ext/mkrf_conf.rb +3 -0
  13. data/ext/openc3/ext/array/array.c +3 -0
  14. data/ext/openc3/ext/buffered_file/buffered_file.c +3 -0
  15. data/ext/openc3/ext/config_parser/config_parser.c +3 -0
  16. data/ext/openc3/ext/crc/crc.c +3 -0
  17. data/ext/openc3/ext/openc3_io/openc3_io.c +3 -0
  18. data/ext/openc3/ext/packet/packet.c +3 -0
  19. data/ext/openc3/ext/platform/platform.c +3 -0
  20. data/ext/openc3/ext/polynomial_conversion/polynomial_conversion.c +3 -0
  21. data/ext/openc3/ext/string/string.c +3 -0
  22. data/ext/openc3/ext/structure/structure.c +3 -0
  23. data/ext/openc3/ext/tabbed_plots_config/tabbed_plots_config.c +3 -0
  24. data/ext/openc3/ext/telemetry/telemetry.c +3 -0
  25. data/lib/cosmos.rb +3 -0
  26. data/lib/cosmosc2.rb +3 -0
  27. data/lib/openc3/accessors/accessor.rb +3 -0
  28. data/lib/openc3/accessors/binary_accessor.rb +3 -0
  29. data/lib/openc3/accessors/cbor_accessor.rb +3 -0
  30. data/lib/openc3/accessors/html_accessor.rb +3 -0
  31. data/lib/openc3/accessors/json_accessor.rb +4 -1
  32. data/lib/openc3/accessors/xml_accessor.rb +3 -0
  33. data/lib/openc3/accessors.rb +3 -0
  34. data/lib/openc3/api/api.rb +3 -0
  35. data/lib/openc3/api/authorized_api.rb +3 -0
  36. data/lib/openc3/api/cmd_api.rb +6 -3
  37. data/lib/openc3/api/config_api.rb +3 -0
  38. data/lib/openc3/api/interface_api.rb +6 -2
  39. data/lib/openc3/api/limits_api.rb +54 -61
  40. data/lib/openc3/api/router_api.rb +6 -3
  41. data/lib/openc3/api/settings_api.rb +3 -0
  42. data/lib/openc3/api/target_api.rb +3 -0
  43. data/lib/openc3/api/tlm_api.rb +27 -32
  44. data/lib/openc3/bridge/bridge.rb +3 -0
  45. data/lib/openc3/bridge/bridge_config.rb +3 -0
  46. data/lib/openc3/bridge/bridge_interface_thread.rb +3 -0
  47. data/lib/openc3/bridge/bridge_router_thread.rb +3 -0
  48. data/lib/openc3/ccsds/ccsds_packet.rb +3 -0
  49. data/lib/openc3/ccsds/ccsds_parser.rb +3 -0
  50. data/lib/openc3/config/config_parser.rb +3 -0
  51. data/lib/openc3/config/meta_config_parser.rb +3 -0
  52. data/lib/openc3/conversions/conversion.rb +3 -0
  53. data/lib/openc3/conversions/generic_conversion.rb +3 -0
  54. data/lib/openc3/conversions/packet_time_formatted_conversion.rb +3 -0
  55. data/lib/openc3/conversions/packet_time_seconds_conversion.rb +3 -0
  56. data/lib/openc3/conversions/polynomial_conversion.rb +3 -0
  57. data/lib/openc3/conversions/processor_conversion.rb +3 -0
  58. data/lib/openc3/conversions/received_count_conversion.rb +3 -0
  59. data/lib/openc3/conversions/received_time_formatted_conversion.rb +3 -0
  60. data/lib/openc3/conversions/received_time_seconds_conversion.rb +3 -0
  61. data/lib/openc3/conversions/segmented_polynomial_conversion.rb +3 -0
  62. data/lib/openc3/conversions/unix_time_conversion.rb +3 -0
  63. data/lib/openc3/conversions/unix_time_formatted_conversion.rb +3 -0
  64. data/lib/openc3/conversions/unix_time_seconds_conversion.rb +3 -0
  65. data/lib/openc3/conversions.rb +3 -0
  66. data/lib/openc3/core_ext/array.rb +3 -0
  67. data/lib/openc3/core_ext/binding.rb +3 -0
  68. data/lib/openc3/core_ext/class.rb +3 -0
  69. data/lib/openc3/core_ext/exception.rb +3 -0
  70. data/lib/openc3/core_ext/file.rb +3 -0
  71. data/lib/openc3/core_ext/hash.rb +3 -0
  72. data/lib/openc3/core_ext/io.rb +3 -0
  73. data/lib/openc3/core_ext/kernel.rb +3 -0
  74. data/lib/openc3/core_ext/math.rb +3 -0
  75. data/lib/openc3/core_ext/matrix.rb +3 -0
  76. data/lib/openc3/core_ext/objectspace.rb +3 -0
  77. data/lib/openc3/core_ext/openc3_io.rb +3 -0
  78. data/lib/openc3/core_ext/range.rb +3 -0
  79. data/lib/openc3/core_ext/socket.rb +3 -0
  80. data/lib/openc3/core_ext/string.rb +3 -0
  81. data/lib/openc3/core_ext/stringio.rb +3 -0
  82. data/lib/openc3/core_ext/tempfile.rb +3 -0
  83. data/lib/openc3/core_ext/time.rb +3 -0
  84. data/lib/openc3/core_ext.rb +3 -0
  85. data/lib/openc3/interfaces/interface.rb +3 -0
  86. data/lib/openc3/interfaces/linc_interface.rb +3 -0
  87. data/lib/openc3/interfaces/protocols/burst_protocol.rb +3 -0
  88. data/lib/openc3/interfaces/protocols/crc_protocol.rb +3 -0
  89. data/lib/openc3/interfaces/protocols/fixed_protocol.rb +3 -0
  90. data/lib/openc3/interfaces/protocols/ignore_packet_protocol.rb +3 -0
  91. data/lib/openc3/interfaces/protocols/length_protocol.rb +3 -0
  92. data/lib/openc3/interfaces/protocols/override_protocol.rb +3 -0
  93. data/lib/openc3/interfaces/protocols/preidentified_protocol.rb +3 -0
  94. data/lib/openc3/interfaces/protocols/protocol.rb +3 -0
  95. data/lib/openc3/interfaces/protocols/template_protocol.rb +3 -0
  96. data/lib/openc3/interfaces/protocols/terminated_protocol.rb +3 -0
  97. data/lib/openc3/interfaces/serial_interface.rb +3 -0
  98. data/lib/openc3/interfaces/simulated_target_interface.rb +3 -0
  99. data/lib/openc3/interfaces/stream_interface.rb +3 -0
  100. data/lib/openc3/interfaces/tcpip_client_interface.rb +3 -0
  101. data/lib/openc3/interfaces/tcpip_server_interface.rb +3 -0
  102. data/lib/openc3/interfaces/udp_interface.rb +3 -0
  103. data/lib/openc3/interfaces.rb +3 -0
  104. data/lib/openc3/io/buffered_file.rb +3 -0
  105. data/lib/openc3/io/io_multiplexer.rb +8 -0
  106. data/lib/openc3/io/json_api_object.rb +5 -2
  107. data/lib/openc3/io/json_drb.rb +3 -0
  108. data/lib/openc3/io/json_drb_object.rb +5 -2
  109. data/lib/openc3/io/json_drb_rack.rb +3 -0
  110. data/lib/openc3/io/json_rpc.rb +8 -3
  111. data/lib/openc3/io/openc3_snmp.rb +3 -0
  112. data/lib/openc3/io/posix_serial_driver.rb +3 -0
  113. data/lib/openc3/io/raw_logger.rb +3 -0
  114. data/lib/openc3/io/raw_logger_pair.rb +3 -0
  115. data/lib/openc3/io/serial_driver.rb +3 -0
  116. data/lib/openc3/io/stderr.rb +3 -0
  117. data/lib/openc3/io/stdout.rb +3 -0
  118. data/lib/openc3/io/udp_sockets.rb +3 -0
  119. data/lib/openc3/io/win32_serial_driver.rb +3 -0
  120. data/lib/openc3/logs/buffered_packet_log_reader.rb +65 -0
  121. data/lib/openc3/logs/buffered_packet_log_writer.rb +120 -0
  122. data/lib/openc3/logs/log_writer.rb +95 -40
  123. data/lib/openc3/logs/packet_log_constants.rb +9 -0
  124. data/lib/openc3/logs/packet_log_reader.rb +34 -3
  125. data/lib/openc3/logs/packet_log_writer.rb +85 -18
  126. data/lib/openc3/logs/text_log_writer.rb +9 -5
  127. data/lib/openc3/logs.rb +8 -2
  128. data/lib/openc3/microservices/cleanup_microservice.rb +18 -18
  129. data/lib/openc3/microservices/decom_microservice.rb +30 -24
  130. data/lib/openc3/microservices/interface_microservice.rb +136 -91
  131. data/lib/openc3/microservices/log_microservice.rb +35 -13
  132. data/lib/openc3/microservices/microservice.rb +16 -14
  133. data/lib/openc3/microservices/plugin_microservice.rb +3 -1
  134. data/lib/openc3/microservices/reaction_microservice.rb +4 -1
  135. data/lib/openc3/microservices/reducer_microservice.rb +332 -149
  136. data/lib/openc3/microservices/router_microservice.rb +3 -0
  137. data/lib/openc3/microservices/text_log_microservice.rb +22 -7
  138. data/lib/openc3/microservices/timeline_microservice.rb +4 -1
  139. data/lib/openc3/microservices/trigger_group_microservice.rb +3 -0
  140. data/lib/openc3/models/activity_model.rb +3 -0
  141. data/lib/openc3/models/auth_model.rb +3 -0
  142. data/lib/openc3/models/cvt_model.rb +14 -5
  143. data/lib/openc3/models/environment_model.rb +3 -0
  144. data/lib/openc3/models/gem_model.rb +30 -51
  145. data/lib/openc3/models/info_model.rb +3 -0
  146. data/lib/openc3/models/interface_model.rb +3 -0
  147. data/lib/openc3/models/interface_status_model.rb +4 -1
  148. data/lib/openc3/models/metadata_model.rb +3 -0
  149. data/lib/openc3/models/metric_model.rb +3 -0
  150. data/lib/openc3/models/microservice_model.rb +9 -6
  151. data/lib/openc3/models/microservice_status_model.rb +4 -1
  152. data/lib/openc3/models/model.rb +3 -0
  153. data/lib/openc3/models/note_model.rb +3 -0
  154. data/lib/openc3/models/notification_model.rb +3 -0
  155. data/lib/openc3/models/ping_model.rb +3 -0
  156. data/lib/openc3/models/plugin_model.rb +20 -14
  157. data/lib/openc3/models/process_status_model.rb +4 -1
  158. data/lib/openc3/models/reaction_model.rb +3 -0
  159. data/lib/openc3/models/reducer_model.rb +31 -24
  160. data/lib/openc3/models/router_model.rb +3 -0
  161. data/lib/openc3/models/router_status_model.rb +3 -0
  162. data/lib/openc3/models/scope_model.rb +3 -4
  163. data/lib/openc3/models/settings_model.rb +3 -0
  164. data/lib/openc3/models/sorted_model.rb +3 -0
  165. data/lib/openc3/models/target_model.rb +61 -94
  166. data/lib/openc3/models/timeline_model.rb +4 -1
  167. data/lib/openc3/models/tool_config_model.rb +3 -0
  168. data/lib/openc3/models/tool_model.rb +11 -9
  169. data/lib/openc3/models/trigger_group_model.rb +3 -0
  170. data/lib/openc3/models/trigger_model.rb +3 -0
  171. data/lib/openc3/models/widget_model.rb +18 -11
  172. data/lib/openc3/operators/microservice_operator.rb +3 -0
  173. data/lib/openc3/operators/operator.rb +105 -34
  174. data/lib/openc3/packets/commands.rb +3 -0
  175. data/lib/openc3/packets/json_packet.rb +87 -14
  176. data/lib/openc3/packets/limits.rb +4 -1
  177. data/lib/openc3/packets/limits_response.rb +3 -0
  178. data/lib/openc3/packets/packet.rb +5 -1
  179. data/lib/openc3/packets/packet_config.rb +3 -0
  180. data/lib/openc3/packets/packet_item.rb +9 -3
  181. data/lib/openc3/packets/packet_item_limits.rb +3 -0
  182. data/lib/openc3/packets/parsers/format_string_parser.rb +3 -0
  183. data/lib/openc3/packets/parsers/limits_parser.rb +3 -0
  184. data/lib/openc3/packets/parsers/limits_response_parser.rb +3 -0
  185. data/lib/openc3/packets/parsers/packet_item_parser.rb +3 -0
  186. data/lib/openc3/packets/parsers/packet_parser.rb +3 -0
  187. data/lib/openc3/packets/parsers/processor_parser.rb +3 -0
  188. data/lib/openc3/packets/parsers/state_parser.rb +3 -0
  189. data/lib/openc3/packets/parsers/xtce_converter.rb +3 -0
  190. data/lib/openc3/packets/parsers/xtce_parser.rb +3 -0
  191. data/lib/openc3/packets/structure.rb +3 -0
  192. data/lib/openc3/packets/structure_item.rb +3 -0
  193. data/lib/openc3/packets/telemetry.rb +3 -0
  194. data/lib/openc3/processors/processor.rb +3 -0
  195. data/lib/openc3/processors/statistics_processor.rb +3 -0
  196. data/lib/openc3/processors/watermark_processor.rb +3 -0
  197. data/lib/openc3/processors.rb +3 -0
  198. data/lib/openc3/script/api_shared.rb +35 -6
  199. data/lib/openc3/script/calendar.rb +3 -0
  200. data/lib/openc3/script/commands.rb +3 -0
  201. data/lib/openc3/script/exceptions.rb +3 -0
  202. data/lib/openc3/script/extract.rb +3 -0
  203. data/lib/openc3/script/limits.rb +3 -24
  204. data/lib/openc3/script/script.rb +11 -7
  205. data/lib/openc3/script/script_runner.rb +3 -0
  206. data/lib/openc3/script/storage.rb +33 -16
  207. data/lib/openc3/script/suite.rb +3 -0
  208. data/lib/openc3/script/suite_results.rb +3 -0
  209. data/lib/openc3/script/suite_runner.rb +3 -0
  210. data/lib/openc3/script/telemetry.rb +43 -0
  211. data/lib/openc3/script.rb +3 -0
  212. data/lib/openc3/streams/serial_stream.rb +3 -0
  213. data/lib/openc3/streams/stream.rb +3 -0
  214. data/lib/openc3/streams/tcpip_client_stream.rb +3 -0
  215. data/lib/openc3/streams/tcpip_socket_stream.rb +3 -0
  216. data/lib/openc3/system/system.rb +23 -10
  217. data/lib/openc3/system/system_config.rb +3 -0
  218. data/lib/openc3/system/target.rb +3 -0
  219. data/lib/openc3/system.rb +3 -0
  220. data/lib/openc3/tools/cmd_tlm_server/api.rb +3 -0
  221. data/lib/openc3/tools/cmd_tlm_server/cmd_tlm_server_config.rb +3 -0
  222. data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +3 -0
  223. data/lib/openc3/tools/table_manager/table.rb +3 -0
  224. data/lib/openc3/tools/table_manager/table_config.rb +3 -0
  225. data/lib/openc3/tools/table_manager/table_item.rb +3 -0
  226. data/lib/openc3/tools/table_manager/table_item_parser.rb +3 -0
  227. data/lib/openc3/tools/table_manager/table_manager_core.rb +3 -0
  228. data/lib/openc3/tools/table_manager/table_parser.rb +3 -0
  229. data/lib/openc3/tools/test_runner/test.rb +3 -0
  230. data/lib/openc3/top_level.rb +3 -0
  231. data/lib/openc3/topics/autonomic_topic.rb +3 -0
  232. data/lib/openc3/topics/calendar_topic.rb +3 -0
  233. data/lib/openc3/topics/command_decom_topic.rb +4 -1
  234. data/lib/openc3/topics/command_topic.rb +6 -1
  235. data/lib/openc3/topics/config_topic.rb +3 -0
  236. data/lib/openc3/topics/interface_topic.rb +9 -2
  237. data/lib/openc3/topics/limits_event_topic.rb +144 -10
  238. data/lib/openc3/topics/notifications_topic.rb +3 -0
  239. data/lib/openc3/topics/router_topic.rb +10 -3
  240. data/lib/openc3/topics/telemetry_decom_topic.rb +26 -20
  241. data/lib/openc3/topics/telemetry_reduced_topics.rb +92 -0
  242. data/lib/openc3/topics/telemetry_topic.rb +5 -2
  243. data/lib/openc3/topics/timeline_topic.rb +3 -0
  244. data/lib/openc3/topics/topic.rb +3 -0
  245. data/lib/openc3/utilities/authentication.rb +3 -0
  246. data/lib/openc3/utilities/authorization.rb +3 -0
  247. data/lib/openc3/utilities/aws_bucket.rb +199 -0
  248. data/lib/openc3/utilities/bucket.rb +82 -0
  249. data/lib/openc3/utilities/bucket_file_cache.rb +264 -0
  250. data/lib/openc3/utilities/bucket_utilities.rb +109 -0
  251. data/lib/openc3/utilities/crc.rb +3 -0
  252. data/lib/openc3/utilities/csv.rb +3 -0
  253. data/lib/openc3/utilities/local_bucket.rb +28 -0
  254. data/lib/openc3/utilities/local_mode.rb +47 -61
  255. data/lib/openc3/utilities/logger.rb +7 -1
  256. data/lib/openc3/utilities/message_log.rb +7 -4
  257. data/lib/openc3/utilities/metric.rb +4 -1
  258. data/lib/openc3/utilities/open_telemetry.rb +96 -0
  259. data/lib/openc3/utilities/process_manager.rb +3 -0
  260. data/lib/openc3/utilities/quaternion.rb +3 -0
  261. data/lib/openc3/utilities/ruby_lex_utils.rb +3 -0
  262. data/lib/openc3/utilities/s3_autoload.rb +3 -3
  263. data/lib/openc3/utilities/simulated_target.rb +3 -0
  264. data/lib/openc3/utilities/sleeper.rb +3 -0
  265. data/lib/openc3/utilities/store.rb +3 -0
  266. data/lib/openc3/utilities/store_autoload.rb +30 -23
  267. data/lib/openc3/utilities/target_file.rb +70 -83
  268. data/lib/openc3/utilities/zip.rb +3 -0
  269. data/lib/openc3/utilities.rb +3 -0
  270. data/lib/openc3/version.rb +6 -6
  271. data/lib/openc3/win32/excel.rb +3 -0
  272. data/lib/openc3/win32/win32.rb +3 -0
  273. data/lib/openc3/win32/win32_main.rb +3 -0
  274. data/lib/openc3.rb +3 -0
  275. data/tasks/gemfile_stats.rake +3 -0
  276. data/tasks/spec.rake +3 -0
  277. data/templates/plugin-template/plugin.gemspec +1 -1
  278. metadata +112 -6
  279. data/lib/openc3/utilities/s3.rb +0 -220
  280. data/lib/openc3/utilities/s3_file_cache.rb +0 -274
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/microservices/microservice'
21
24
  require 'openc3/models/interface_model'
@@ -55,106 +58,112 @@ module OpenC3
55
58
 
56
59
  def run
57
60
  InterfaceTopic.receive_commands(@interface, scope: @scope) do |topic, msg_hash|
58
- # Check for a raw write to the interface
59
- if topic =~ /CMD}INTERFACE/
60
- if msg_hash['shutdown']
61
- Logger.info "#{@interface.name}: Shutdown requested"
62
- return
63
- end
64
- if msg_hash['connect']
65
- Logger.info "#{@interface.name}: Connect requested"
66
- @tlm.attempting()
67
- next 'SUCCESS'
68
- end
69
- if msg_hash['disconnect']
70
- Logger.info "#{@interface.name}: Disconnect requested"
71
- @tlm.disconnect(false)
72
- next 'SUCCESS'
73
- end
74
- if msg_hash['raw']
75
- Logger.info "#{@interface.name}: Write raw"
76
- # A raw interface write results in an UNKNOWN packet
77
- command = System.commands.packet('UNKNOWN', 'UNKNOWN')
78
- command.received_count += 1
79
- command = command.clone
80
- command.buffer = msg_hash['raw']
81
- command.received_time = Time.now
82
- CommandTopic.write_packet(command, scope: @scope)
83
- @interface.write_raw(msg_hash['raw'])
84
- next 'SUCCESS'
85
- end
86
- if msg_hash.key?('log_raw')
87
- if msg_hash['log_raw'] == 'true'
88
- Logger.info "#{@interface.name}: Enable raw logging"
89
- @interface.start_raw_logging
90
- else
91
- Logger.info "#{@interface.name}: Disable raw logging"
92
- @interface.stop_raw_logging
61
+ OpenC3.with_context(msg_hash) do
62
+ # Check for a raw write to the interface
63
+ if topic =~ /CMD}INTERFACE/
64
+ if msg_hash['shutdown']
65
+ Logger.info "#{@interface.name}: Shutdown requested"
66
+ return
67
+ end
68
+ if msg_hash['connect']
69
+ Logger.info "#{@interface.name}: Connect requested"
70
+ params = []
71
+ if msg_hash['params']
72
+ params = JSON.parse(msg_hash['params'], :allow_nan => true, :create_additions => true)
73
+ end
74
+ @interface = @tlm.attempting(*params)
75
+ next 'SUCCESS'
76
+ end
77
+ if msg_hash['disconnect']
78
+ Logger.info "#{@interface.name}: Disconnect requested"
79
+ @tlm.disconnect(false)
80
+ next 'SUCCESS'
81
+ end
82
+ if msg_hash['raw']
83
+ Logger.info "#{@interface.name}: Write raw"
84
+ # A raw interface write results in an UNKNOWN packet
85
+ command = System.commands.packet('UNKNOWN', 'UNKNOWN')
86
+ command.received_count += 1
87
+ command = command.clone
88
+ command.buffer = msg_hash['raw']
89
+ command.received_time = Time.now
90
+ CommandTopic.write_packet(command, scope: @scope)
91
+ @interface.write_raw(msg_hash['raw'])
92
+ next 'SUCCESS'
93
+ end
94
+ if msg_hash.key?('log_raw')
95
+ if msg_hash['log_raw'] == 'true'
96
+ Logger.info "#{@interface.name}: Enable raw logging"
97
+ @interface.start_raw_logging
98
+ else
99
+ Logger.info "#{@interface.name}: Disable raw logging"
100
+ @interface.stop_raw_logging
101
+ end
102
+ next 'SUCCESS'
93
103
  end
94
- next 'SUCCESS'
95
104
  end
96
- end
97
105
 
98
- target_name = msg_hash['target_name']
99
- cmd_name = msg_hash['cmd_name']
100
- cmd_params = nil
101
- cmd_buffer = nil
102
- hazardous_check = nil
103
- if msg_hash['cmd_params']
104
- cmd_params = JSON.parse(msg_hash['cmd_params'], :allow_nan => true, :create_additions => true)
105
- range_check = ConfigParser.handle_true_false(msg_hash['range_check'])
106
- raw = ConfigParser.handle_true_false(msg_hash['raw'])
107
- hazardous_check = ConfigParser.handle_true_false(msg_hash['hazardous_check'])
108
- elsif msg_hash['cmd_buffer']
109
- cmd_buffer = msg_hash['cmd_buffer']
110
- end
106
+ target_name = msg_hash['target_name']
107
+ cmd_name = msg_hash['cmd_name']
108
+ cmd_params = nil
109
+ cmd_buffer = nil
110
+ hazardous_check = nil
111
+ if msg_hash['cmd_params']
112
+ cmd_params = JSON.parse(msg_hash['cmd_params'], :allow_nan => true, :create_additions => true)
113
+ range_check = ConfigParser.handle_true_false(msg_hash['range_check'])
114
+ raw = ConfigParser.handle_true_false(msg_hash['raw'])
115
+ hazardous_check = ConfigParser.handle_true_false(msg_hash['hazardous_check'])
116
+ elsif msg_hash['cmd_buffer']
117
+ cmd_buffer = msg_hash['cmd_buffer']
118
+ end
111
119
 
112
- begin
113
120
  begin
114
- if cmd_params
115
- command = System.commands.build_cmd(target_name, cmd_name, cmd_params, range_check, raw)
116
- elsif cmd_buffer
117
- if target_name
118
- command = System.commands.identify(cmd_buffer, [target_name])
121
+ begin
122
+ if cmd_params
123
+ command = System.commands.build_cmd(target_name, cmd_name, cmd_params, range_check, raw)
124
+ elsif cmd_buffer
125
+ if target_name
126
+ command = System.commands.identify(cmd_buffer, [target_name])
127
+ else
128
+ command = System.commands.identify(cmd_buffer, @target_names)
129
+ end
130
+ unless command
131
+ command = System.commands.packet('UNKNOWN', 'UNKNOWN')
132
+ command.received_count += 1
133
+ command = command.clone
134
+ command.buffer = cmd_buffer
135
+ end
119
136
  else
120
- command = System.commands.identify(cmd_buffer, @target_names)
121
- end
122
- unless command
123
- command = System.commands.packet('UNKNOWN', 'UNKNOWN')
124
- command.received_count += 1
125
- command = command.clone
126
- command.buffer = cmd_buffer
137
+ raise "Invalid command received:\n #{msg_hash}"
127
138
  end
128
- else
129
- raise "Invalid command received:\n #{msg_hash}"
139
+ command.received_time = Time.now
140
+ rescue => e
141
+ Logger.error "#{@interface.name}: #{msg_hash}"
142
+ Logger.error "#{@interface.name}: #{e.formatted}"
143
+ next e.message
130
144
  end
131
- command.received_time = Time.now
132
- rescue => e
133
- Logger.error "#{@interface.name}: #{msg_hash}"
134
- Logger.error "#{@interface.name}: #{e.formatted}"
135
- next e.message
136
- end
137
145
 
138
- if hazardous_check
139
- hazardous, hazardous_description = System.commands.cmd_pkt_hazardous?(command)
140
- # Return back the error, description, and the formatted command
141
- # This allows the error handler to simply re-send the command
142
- next "HazardousError\n#{hazardous_description}\n#{System.commands.format(command)}" if hazardous
143
- end
146
+ if hazardous_check
147
+ hazardous, hazardous_description = System.commands.cmd_pkt_hazardous?(command)
148
+ # Return back the error, description, and the formatted command
149
+ # This allows the error handler to simply re-send the command
150
+ next "HazardousError\n#{hazardous_description}\n#{System.commands.format(command)}" if hazardous
151
+ end
144
152
 
145
- begin
146
- @interface.write(command)
147
- CommandTopic.write_packet(command, scope: @scope)
148
- CommandDecomTopic.write_packet(command, scope: @scope)
149
- InterfaceStatusModel.set(@interface.as_json(:allow_nan => true), scope: @scope)
150
- next 'SUCCESS'
153
+ begin
154
+ @interface.write(command)
155
+ CommandTopic.write_packet(command, scope: @scope)
156
+ CommandDecomTopic.write_packet(command, scope: @scope)
157
+ InterfaceStatusModel.set(@interface.as_json(:allow_nan => true), scope: @scope)
158
+ next 'SUCCESS'
159
+ rescue => e
160
+ Logger.error "#{@interface.name}: #{e.formatted}"
161
+ next e.message
162
+ end
151
163
  rescue => e
152
164
  Logger.error "#{@interface.name}: #{e.formatted}"
153
165
  next e.message
154
166
  end
155
- rescue => e
156
- Logger.error "#{@interface.name}: #{e.formatted}"
157
- next e.message
158
167
  end
159
168
  end
160
169
  end
@@ -194,7 +203,11 @@ module OpenC3
194
203
  end
195
204
  if msg_hash['connect']
196
205
  Logger.info "#{@router.name}: Connect requested"
197
- @tlm.attempting()
206
+ params = []
207
+ if msg_hash['params']
208
+ params = JSON.parse(msg_hash['params'], :allow_nan => true, :create_additions => true)
209
+ end
210
+ @router = @tlm.attempting(*params)
198
211
  end
199
212
  if msg_hash['disconnect']
200
213
  Logger.info "#{@router.name}: Disconnect requested"
@@ -250,9 +263,21 @@ module OpenC3
250
263
  end
251
264
  @interface.name = interface_name
252
265
  # Map the interface to the interface's targets
253
- @interface.target_names do |target_name|
266
+ @interface.target_names.each do |target_name|
254
267
  target = System.targets[target_name]
255
268
  target.interface = @interface
269
+
270
+ # Initialize the target's packet counters based on the Topic stream
271
+ # Prevents packet count resetting to 0 when interface restarts
272
+ System.telemetry.packets(target_name).each do |packet_name, packet|
273
+ topic = "#{@scope}__TELEMETRY__{#{target_name}}__#{packet_name}"
274
+ msg_id, msg_hash = Topic.get_newest_message(topic)
275
+ if msg_id
276
+ packet.received_count = msg_hash['received_count'].to_i
277
+ else
278
+ packet.received_count = 0
279
+ end
280
+ end
256
281
  end
257
282
  if @interface.connect_on_startup
258
283
  @interface.state = 'ATTEMPTING'
@@ -278,15 +303,35 @@ module OpenC3
278
303
  @handler_thread.start
279
304
  end
280
305
 
281
- # External method to be called by the InterfaceCmdHandlerThread to connect
282
- # Thus we just set the state and allow the run method to handle the action
283
- def attempting
306
+ # Called to connect the interface/router. It takes optional parameters to
307
+ # rebuilt the interface/router. Once we set the state to 'ATTEMPTING' the
308
+ # run method handles the actual connection.
309
+ def attempting(*params)
310
+ unless params.empty?
311
+ @interface.disconnect()
312
+ # Build New Interface, this can fail if passed bad parameters
313
+ new_interface = @interface.class.new(*params)
314
+ @interface.copy_to(new_interface)
315
+
316
+ # Replace interface for targets
317
+ @interface.target_names.each do |target_name|
318
+ target = System.targets[target_name]
319
+ target.interface = new_interface
320
+ end
321
+ @interface = new_interface
322
+ end
323
+
284
324
  @interface.state = 'ATTEMPTING'
285
325
  if @interface_or_router == 'INTERFACE'
286
326
  InterfaceStatusModel.set(@interface.as_json(:allow_nan => true), scope: @scope)
287
327
  else
288
328
  RouterStatusModel.set(@interface.as_json(:allow_nan => true), scope: @scope)
289
329
  end
330
+ @interface # Return the interface/router since we may have recreated it
331
+ # Need to rescue Exception so we cover LoadError
332
+ rescue Exception => error
333
+ Logger.error("Attempting connection failed with params #{params} due to #{error.message}")
334
+ @interface # Return the original interface/router in case of error
290
335
  end
291
336
 
292
337
  def run
@@ -16,9 +16,14 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/microservices/microservice'
21
24
  require 'openc3/topics/topic'
25
+ require 'openc3/logs/buffered_packet_log_writer'
26
+ require 'openc3/config/config_parser'
22
27
 
23
28
  module OpenC3
24
29
  class LogMicroservice < Microservice
@@ -34,6 +39,8 @@ module OpenC3
34
39
  @cycle_time = option[1].to_i
35
40
  when 'CYCLE_SIZE' # Maximum size of a log file
36
41
  @cycle_size = option[1].to_i
42
+ when 'BUFFER_DEPTH' # Buffer depth to write in time order
43
+ @buffer_depth = option[1].to_i
37
44
  else
38
45
  Logger.error("Unknown option passed to microservice #{@name}: #{option}")
39
46
  end
@@ -44,41 +51,41 @@ module OpenC3
44
51
  # These settings limit the log file to 10 minutes or 50MB of data, whichever comes first
45
52
  @cycle_time = 600 unless @cycle_time # 10 minutes
46
53
  @cycle_size = 50_000_000 unless @cycle_size # ~50 MB
54
+
55
+ @buffer_depth = 10 unless @buffer_depth
47
56
  end
48
57
 
49
58
  def run
50
- plws = setup_plws
59
+ setup_plws()
51
60
  while true
52
61
  break if @cancel_thread
53
62
 
54
63
  Topic.read_topics(@topics) do |topic, msg_id, msg_hash, redis|
55
64
  break if @cancel_thread
56
-
57
- log_data(plws, topic, msg_id, msg_hash, redis)
65
+ log_data(topic, msg_id, msg_hash, redis)
58
66
  end
59
67
  end
60
68
  end
61
69
 
62
70
  def setup_plws
63
- plws = {}
71
+ @plws = {}
64
72
  @topics.each do |topic|
65
73
  topic_split = topic.gsub(/{|}/, '').split("__") # Remove the redis hashtag curly braces
66
74
  scope = topic_split[0]
67
75
  target_name = topic_split[2]
68
76
  packet_name = topic_split[3]
69
77
  type = @raw_or_decom.to_s.downcase
70
- remote_log_directory = "#{scope}/#{type}_logs/#{@cmd_or_tlm.to_s.downcase}/#{target_name}/#{packet_name}"
71
- rt_label = "#{scope}__#{target_name}__#{packet_name}__rt__#{type}"
72
- stored_label = "#{scope}__#{target_name}__#{packet_name}__stored__#{type}"
73
- plws[topic] = {
74
- :RT => PacketLogWriter.new(remote_log_directory, rt_label, true, @cycle_time, @cycle_size, redis_topic: topic),
75
- :STORED => PacketLogWriter.new(remote_log_directory, stored_label, true, @cycle_time, @cycle_size, redis_topic: topic)
78
+ remote_log_directory = "#{scope}/#{type}_logs/#{@cmd_or_tlm.to_s.downcase}/#{target_name}"
79
+ rt_label = "#{scope}__#{target_name}__ALL__rt__#{type}"
80
+ stored_label = "#{scope}__#{target_name}__ALL__stored__#{type}"
81
+ @plws[target_name] ||= {
82
+ :RT => BufferedPacketLogWriter.new(remote_log_directory, rt_label, true, @cycle_time, @cycle_size, nil, nil, true, @buffer_depth),
83
+ :STORED => BufferedPacketLogWriter.new(remote_log_directory, stored_label, true, @cycle_time, @cycle_size, nil, nil, true, @buffer_depth)
76
84
  }
77
85
  end
78
- return plws
79
86
  end
80
87
 
81
- def log_data(plws, topic, msg_id, msg_hash, redis)
88
+ def log_data(topic, msg_id, msg_hash, redis)
82
89
  start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
83
90
  topic_split = topic.gsub(/{|}/, '').split("__") # Remove the redis hashtag curly braces
84
91
  target_name = topic_split[2]
@@ -93,7 +100,7 @@ module OpenC3
93
100
  packet_type = :JSON_PACKET
94
101
  data_key = "json_data"
95
102
  end
96
- plws[topic][rt_or_stored].write(packet_type, @cmd_or_tlm, target_name, packet_name, msg_hash["time"].to_i, rt_or_stored == :STORED, msg_hash[data_key], nil, msg_id)
103
+ @plws[target_name][rt_or_stored].buffered_write(packet_type, @cmd_or_tlm, target_name, packet_name, msg_hash["time"].to_i, rt_or_stored == :STORED, msg_hash[data_key], nil, topic, msg_id)
97
104
  @count += 1
98
105
  diff = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start # seconds as a float
99
106
  metric_labels = { "packet" => packet_name, "target" => target_name, "raw_or_decom" => @raw_or_decom.to_s, "cmd_or_tlm" => @cmd_or_tlm.to_s }
@@ -102,6 +109,21 @@ module OpenC3
102
109
  @error = err
103
110
  Logger.error("#{@name} error: #{err.formatted}")
104
111
  end
112
+
113
+ def shutdown
114
+ # Make sure all the existing logs are properly closed down
115
+ threads = []
116
+ @plws.each do |target_name, plw_hash|
117
+ plw_hash.each do |type, plw|
118
+ threads.concat(plw.shutdown)
119
+ end
120
+ end
121
+ # Wait for all the logging threads to move files to buckets
122
+ threads.flatten.compact.each do |thread|
123
+ thread.join
124
+ end
125
+ super()
126
+ end
105
127
  end
106
128
  end
107
129
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3'
21
24
  OpenC3.require_file 'json'
@@ -23,8 +26,9 @@ OpenC3.require_file 'redis'
23
26
  OpenC3.require_file 'fileutils'
24
27
  OpenC3.require_file 'openc3/utilities/zip'
25
28
  OpenC3.require_file 'openc3/utilities/store'
26
- OpenC3.require_file 'openc3/utilities/s3'
29
+ OpenC3.require_file 'openc3/utilities/bucket'
27
30
  OpenC3.require_file 'openc3/utilities/sleeper'
31
+ OpenC3.require_file 'openc3/utilities/open_telemetry'
28
32
  OpenC3.require_file 'openc3/models/microservice_model'
29
33
  OpenC3.require_file 'openc3/models/microservice_status_model'
30
34
  OpenC3.require_file 'tmpdir'
@@ -71,6 +75,7 @@ module OpenC3
71
75
  end
72
76
 
73
77
  def initialize(name, is_plugin: false)
78
+ Logger.info("Microservice running from: ruby #{$0} #{ARGV.join(" ")}")
74
79
  raise "Microservice must be named" unless name
75
80
 
76
81
  @name = name
@@ -85,6 +90,8 @@ module OpenC3
85
90
  Logger.microservice_name = @name
86
91
  Logger.tag = @name + "__openc3.log"
87
92
 
93
+ OpenC3.setup_open_telemetry(@name, false)
94
+
88
95
  # Create temp folder for this microservice
89
96
  @temp_dir = Dir.mktmpdir
90
97
 
@@ -100,7 +107,7 @@ module OpenC3
100
107
  Logger.info("Microservice initialized with config:\n#{@config}")
101
108
  @topics ||= []
102
109
 
103
- # Get configuration for any targets from Minio/S3
110
+ # Get configuration for any targets
104
111
  @target_names = @config["target_names"]
105
112
  @target_names ||= []
106
113
  System.setup_targets(@target_names, @temp_dir, scope: @scope) unless is_plugin
@@ -120,24 +127,17 @@ module OpenC3
120
127
  @work_dir = @config["work_dir"]
121
128
  cmd_array = @config["cmd"]
122
129
 
123
- # Get Microservice files from S3
130
+ # Get Microservice files from bucket storage
124
131
  temp_dir = Dir.mktmpdir
125
- rubys3_client = Aws::S3::Client.new
126
- bucket = "config"
127
-
128
- # Ensure config bucket exists
129
- begin
130
- rubys3_client.head_bucket(bucket: bucket)
131
- rescue Aws::S3::Errors::NotFound
132
- rubys3_client.create_bucket(bucket: bucket)
133
- end
132
+ bucket = ENV['OPENC3_CONFIG_BUCKET']
133
+ client = Bucket.getClient()
134
134
 
135
135
  prefix = "#{@scope}/microservices/#{@name}/"
136
136
  file_count = 0
137
- rubys3_client.list_objects(bucket: bucket, prefix: prefix).contents.each do |object|
137
+ client.list_objects(bucket: bucket, prefix: prefix).each do |object|
138
138
  response_target = File.join(temp_dir, object.key.split(prefix)[-1])
139
139
  FileUtils.mkdir_p(File.dirname(response_target))
140
- rubys3_client.get_object(bucket: bucket, key: object.key, response_target: response_target)
140
+ client.get_object(bucket: bucket, key: object.key, path: response_target)
141
141
  file_count += 1
142
142
  end
143
143
 
@@ -194,11 +194,13 @@ module OpenC3
194
194
  end
195
195
 
196
196
  def shutdown
197
+ Logger.info("Shutting down microservice: #{@name}")
197
198
  @cancel_thread = true
198
199
  @microservice_sleeper.cancel if @microservice_sleeper
199
200
  MicroserviceStatusModel.set(as_json(:allow_nan => true), scope: @scope)
200
201
  FileUtils.remove_entry(@temp_dir) if File.exist?(@temp_dir)
201
202
  @metric.destroy
203
+ Logger.info("Shutting down microservice complete: #{@name}")
202
204
  end
203
205
  end
204
206
  end
@@ -16,10 +16,12 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/microservices/microservice'
21
24
  require 'openc3/topics/topic'
22
- require 'openc3/utilities/s3'
23
25
 
24
26
  module OpenC3
25
27
  class PluginMicroservice < Microservice
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/microservices/microservice'
21
24
  require 'openc3/models/reaction_model'
@@ -324,7 +327,7 @@ module OpenC3
324
327
  'reaction' => reaction.name,
325
328
  'id' => Time.now.to_i
326
329
  })
327
- hostname = ENV['OPENC3_SCRIPT_HOSTNAME'] || 'openc3-script-runner-api'
330
+ hostname = ENV['OPENC3_SCRIPT_HOSTNAME'] || 'openc3-cosmos-script-runner-api'
328
331
  response = Net::HTTP.new(hostname, 2902).request(request)
329
332
  raise "failed to call #{hostname}, for script: #{action['value']}, response code: #{response.code}" if response.code != '200'
330
333