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.
Files changed (307) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +18 -0
  3. data/Guardfile +35 -0
  4. data/LICENSE.txt +727 -0
  5. data/README.md +37 -0
  6. data/Rakefile +131 -0
  7. data/bin/cstol_converter +1178 -0
  8. data/bin/openc3cli +531 -0
  9. data/bin/rubysloc +139 -0
  10. data/data/config/_array_params.yaml +23 -0
  11. data/data/config/_id_items.yaml +24 -0
  12. data/data/config/_id_params.yaml +58 -0
  13. data/data/config/_interfaces.yaml +214 -0
  14. data/data/config/_interfaces.yaml.err +1017 -0
  15. data/data/config/_items.yaml +20 -0
  16. data/data/config/_params.yaml +60 -0
  17. data/data/config/cmd_tlm_server.yaml +136 -0
  18. data/data/config/command.yaml +44 -0
  19. data/data/config/command_modifiers.yaml +160 -0
  20. data/data/config/command_telemetry.yaml +3 -0
  21. data/data/config/interface_modifiers.yaml +104 -0
  22. data/data/config/item_modifiers.yaml +221 -0
  23. data/data/config/microservice.yaml +78 -0
  24. data/data/config/param_item_modifiers.yaml +52 -0
  25. data/data/config/parameter_modifiers.yaml +200 -0
  26. data/data/config/plugins.yaml +80 -0
  27. data/data/config/protocols.yaml +290 -0
  28. data/data/config/screen.yaml +147 -0
  29. data/data/config/table_manager.yaml +89 -0
  30. data/data/config/table_parameter_modifiers.yaml +9 -0
  31. data/data/config/target.yaml +142 -0
  32. data/data/config/target_config.yaml +94 -0
  33. data/data/config/telemetry.yaml +87 -0
  34. data/data/config/telemetry_modifiers.yaml +159 -0
  35. data/data/config/tool.yaml +63 -0
  36. data/data/config/unknown.yaml +3 -0
  37. data/data/config/widgets.yaml +1505 -0
  38. data/ext/mkrf_conf.rb +49 -0
  39. data/ext/openc3/ext/array/array.c +122 -0
  40. data/ext/openc3/ext/array/extconf.rb +13 -0
  41. data/ext/openc3/ext/buffered_file/buffered_file.c +198 -0
  42. data/ext/openc3/ext/buffered_file/extconf.rb +13 -0
  43. data/ext/openc3/ext/config_parser/config_parser.c +280 -0
  44. data/ext/openc3/ext/config_parser/extconf.rb +13 -0
  45. data/ext/openc3/ext/crc/crc.c +351 -0
  46. data/ext/openc3/ext/crc/extconf.rb +13 -0
  47. data/ext/openc3/ext/openc3_io/extconf.rb +13 -0
  48. data/ext/openc3/ext/openc3_io/openc3_io.c +158 -0
  49. data/ext/openc3/ext/packet/extconf.rb +13 -0
  50. data/ext/openc3/ext/packet/packet.c +318 -0
  51. data/ext/openc3/ext/platform/extconf.rb +13 -0
  52. data/ext/openc3/ext/platform/platform.c +134 -0
  53. data/ext/openc3/ext/polynomial_conversion/extconf.rb +13 -0
  54. data/ext/openc3/ext/polynomial_conversion/polynomial_conversion.c +79 -0
  55. data/ext/openc3/ext/string/extconf.rb +13 -0
  56. data/ext/openc3/ext/string/string.c +63 -0
  57. data/ext/openc3/ext/structure/structure.c +1719 -0
  58. data/ext/openc3/ext/tabbed_plots_config/extconf.rb +13 -0
  59. data/ext/openc3/ext/tabbed_plots_config/tabbed_plots_config.c +62 -0
  60. data/ext/openc3/ext/telemetry/extconf.rb +13 -0
  61. data/ext/openc3/ext/telemetry/telemetry.c +336 -0
  62. data/lib/cosmos.rb +20 -0
  63. data/lib/cosmosc2.rb +20 -0
  64. data/lib/openc3/api/api.rb +39 -0
  65. data/lib/openc3/api/authorized_api.rb +30 -0
  66. data/lib/openc3/api/cmd_api.rb +451 -0
  67. data/lib/openc3/api/config_api.rb +58 -0
  68. data/lib/openc3/api/interface_api.rb +117 -0
  69. data/lib/openc3/api/limits_api.rb +375 -0
  70. data/lib/openc3/api/router_api.rb +117 -0
  71. data/lib/openc3/api/settings_api.rb +70 -0
  72. data/lib/openc3/api/target_api.rb +78 -0
  73. data/lib/openc3/api/tlm_api.rb +455 -0
  74. data/lib/openc3/bridge/bridge.rb +54 -0
  75. data/lib/openc3/bridge/bridge_config.rb +167 -0
  76. data/lib/openc3/bridge/bridge_interface_thread.rb +42 -0
  77. data/lib/openc3/bridge/bridge_router_thread.rb +42 -0
  78. data/lib/openc3/ccsds/ccsds_packet.rb +68 -0
  79. data/lib/openc3/ccsds/ccsds_parser.rb +148 -0
  80. data/lib/openc3/config/config_parser.rb +549 -0
  81. data/lib/openc3/config/meta_config_parser.rb +74 -0
  82. data/lib/openc3/conversions/conversion.rb +70 -0
  83. data/lib/openc3/conversions/generic_conversion.rb +83 -0
  84. data/lib/openc3/conversions/packet_time_formatted_conversion.rb +43 -0
  85. data/lib/openc3/conversions/packet_time_seconds_conversion.rb +43 -0
  86. data/lib/openc3/conversions/polynomial_conversion.rb +87 -0
  87. data/lib/openc3/conversions/processor_conversion.rb +70 -0
  88. data/lib/openc3/conversions/received_count_conversion.rb +38 -0
  89. data/lib/openc3/conversions/received_time_formatted_conversion.rb +42 -0
  90. data/lib/openc3/conversions/received_time_seconds_conversion.rb +42 -0
  91. data/lib/openc3/conversions/segmented_polynomial_conversion.rb +171 -0
  92. data/lib/openc3/conversions/unix_time_conversion.rb +68 -0
  93. data/lib/openc3/conversions/unix_time_formatted_conversion.rb +49 -0
  94. data/lib/openc3/conversions/unix_time_seconds_conversion.rb +49 -0
  95. data/lib/openc3/conversions.rb +34 -0
  96. data/lib/openc3/core_ext/array.rb +416 -0
  97. data/lib/openc3/core_ext/binding.rb +29 -0
  98. data/lib/openc3/core_ext/class.rb +72 -0
  99. data/lib/openc3/core_ext/exception.rb +61 -0
  100. data/lib/openc3/core_ext/file.rb +83 -0
  101. data/lib/openc3/core_ext/hash.rb +37 -0
  102. data/lib/openc3/core_ext/io.rb +134 -0
  103. data/lib/openc3/core_ext/kernel.rb +42 -0
  104. data/lib/openc3/core_ext/math.rb +128 -0
  105. data/lib/openc3/core_ext/matrix.rb +156 -0
  106. data/lib/openc3/core_ext/objectspace.rb +36 -0
  107. data/lib/openc3/core_ext/openc3_io.rb +57 -0
  108. data/lib/openc3/core_ext/range.rb +27 -0
  109. data/lib/openc3/core_ext/socket.rb +38 -0
  110. data/lib/openc3/core_ext/string.rb +389 -0
  111. data/lib/openc3/core_ext/stringio.rb +33 -0
  112. data/lib/openc3/core_ext/time.rb +508 -0
  113. data/lib/openc3/core_ext.rb +36 -0
  114. data/lib/openc3/interfaces/interface.rb +498 -0
  115. data/lib/openc3/interfaces/linc_interface.rb +475 -0
  116. data/lib/openc3/interfaces/protocols/burst_protocol.rb +192 -0
  117. data/lib/openc3/interfaces/protocols/crc_protocol.rb +193 -0
  118. data/lib/openc3/interfaces/protocols/fixed_protocol.rb +155 -0
  119. data/lib/openc3/interfaces/protocols/ignore_packet_protocol.rb +56 -0
  120. data/lib/openc3/interfaces/protocols/length_protocol.rb +165 -0
  121. data/lib/openc3/interfaces/protocols/override_protocol.rb +60 -0
  122. data/lib/openc3/interfaces/protocols/preidentified_protocol.rb +206 -0
  123. data/lib/openc3/interfaces/protocols/protocol.rb +82 -0
  124. data/lib/openc3/interfaces/protocols/template_protocol.rb +261 -0
  125. data/lib/openc3/interfaces/protocols/terminated_protocol.rb +93 -0
  126. data/lib/openc3/interfaces/serial_interface.rb +94 -0
  127. data/lib/openc3/interfaces/simulated_target_interface.rb +168 -0
  128. data/lib/openc3/interfaces/stream_interface.rb +81 -0
  129. data/lib/openc3/interfaces/tcpip_client_interface.rb +69 -0
  130. data/lib/openc3/interfaces/tcpip_server_interface.rb +629 -0
  131. data/lib/openc3/interfaces/udp_interface.rb +169 -0
  132. data/lib/openc3/interfaces.rb +44 -0
  133. data/lib/openc3/io/buffered_file.rb +109 -0
  134. data/lib/openc3/io/io_multiplexer.rb +80 -0
  135. data/lib/openc3/io/json_api_object.rb +208 -0
  136. data/lib/openc3/io/json_drb.rb +335 -0
  137. data/lib/openc3/io/json_drb_object.rb +114 -0
  138. data/lib/openc3/io/json_drb_rack.rb +84 -0
  139. data/lib/openc3/io/json_rpc.rb +420 -0
  140. data/lib/openc3/io/openc3_snmp.rb +58 -0
  141. data/lib/openc3/io/posix_serial_driver.rb +156 -0
  142. data/lib/openc3/io/raw_logger.rb +167 -0
  143. data/lib/openc3/io/raw_logger_pair.rb +77 -0
  144. data/lib/openc3/io/serial_driver.rb +105 -0
  145. data/lib/openc3/io/stderr.rb +43 -0
  146. data/lib/openc3/io/stdout.rb +43 -0
  147. data/lib/openc3/io/udp_sockets.rb +194 -0
  148. data/lib/openc3/io/win32_serial_driver.rb +196 -0
  149. data/lib/openc3/logs/log_writer.rb +302 -0
  150. data/lib/openc3/logs/packet_log_constants.rb +62 -0
  151. data/lib/openc3/logs/packet_log_reader.rb +345 -0
  152. data/lib/openc3/logs/packet_log_writer.rb +299 -0
  153. data/lib/openc3/logs/text_log_writer.rb +68 -0
  154. data/lib/openc3/logs.rb +25 -0
  155. data/lib/openc3/microservices/cleanup_microservice.rb +68 -0
  156. data/lib/openc3/microservices/decom_microservice.rb +136 -0
  157. data/lib/openc3/microservices/interface_microservice.rb +532 -0
  158. data/lib/openc3/microservices/log_microservice.rb +108 -0
  159. data/lib/openc3/microservices/microservice.rb +204 -0
  160. data/lib/openc3/microservices/plugin_microservice.rb +43 -0
  161. data/lib/openc3/microservices/reaction_microservice.rb +541 -0
  162. data/lib/openc3/microservices/reducer_microservice.rb +313 -0
  163. data/lib/openc3/microservices/router_microservice.rb +44 -0
  164. data/lib/openc3/microservices/text_log_microservice.rb +84 -0
  165. data/lib/openc3/microservices/timeline_microservice.rb +363 -0
  166. data/lib/openc3/microservices/trigger_group_microservice.rb +638 -0
  167. data/lib/openc3/models/activity_model.rb +319 -0
  168. data/lib/openc3/models/auth_model.rb +65 -0
  169. data/lib/openc3/models/cvt_model.rb +185 -0
  170. data/lib/openc3/models/environment_model.rb +58 -0
  171. data/lib/openc3/models/gem_model.rb +137 -0
  172. data/lib/openc3/models/info_model.rb +31 -0
  173. data/lib/openc3/models/interface_model.rb +281 -0
  174. data/lib/openc3/models/interface_status_model.rb +117 -0
  175. data/lib/openc3/models/metadata_model.rb +139 -0
  176. data/lib/openc3/models/metric_model.rb +59 -0
  177. data/lib/openc3/models/microservice_model.rb +206 -0
  178. data/lib/openc3/models/microservice_status_model.rb +74 -0
  179. data/lib/openc3/models/model.rb +204 -0
  180. data/lib/openc3/models/note_model.rb +122 -0
  181. data/lib/openc3/models/notification_model.rb +40 -0
  182. data/lib/openc3/models/ping_model.rb +35 -0
  183. data/lib/openc3/models/plugin_model.rb +292 -0
  184. data/lib/openc3/models/process_status_model.rb +76 -0
  185. data/lib/openc3/models/reaction_model.rb +322 -0
  186. data/lib/openc3/models/reducer_model.rb +65 -0
  187. data/lib/openc3/models/router_model.rb +35 -0
  188. data/lib/openc3/models/router_status_model.rb +27 -0
  189. data/lib/openc3/models/scope_model.rb +153 -0
  190. data/lib/openc3/models/settings_model.rb +55 -0
  191. data/lib/openc3/models/sorted_model.rb +167 -0
  192. data/lib/openc3/models/target_model.rb +759 -0
  193. data/lib/openc3/models/timeline_model.rb +154 -0
  194. data/lib/openc3/models/tool_config_model.rb +38 -0
  195. data/lib/openc3/models/tool_model.rb +262 -0
  196. data/lib/openc3/models/trigger_group_model.rb +186 -0
  197. data/lib/openc3/models/trigger_model.rb +330 -0
  198. data/lib/openc3/models/widget_model.rb +138 -0
  199. data/lib/openc3/operators/microservice_operator.rb +128 -0
  200. data/lib/openc3/operators/operator.rb +277 -0
  201. data/lib/openc3/packets/binary_accessor.rb +1207 -0
  202. data/lib/openc3/packets/commands.rb +373 -0
  203. data/lib/openc3/packets/json_packet.rb +134 -0
  204. data/lib/openc3/packets/limits.rb +271 -0
  205. data/lib/openc3/packets/limits_response.rb +53 -0
  206. data/lib/openc3/packets/packet.rb +1168 -0
  207. data/lib/openc3/packets/packet_config.rb +625 -0
  208. data/lib/openc3/packets/packet_item.rb +586 -0
  209. data/lib/openc3/packets/packet_item_limits.rb +162 -0
  210. data/lib/openc3/packets/parsers/format_string_parser.rb +65 -0
  211. data/lib/openc3/packets/parsers/limits_parser.rb +159 -0
  212. data/lib/openc3/packets/parsers/limits_response_parser.rb +61 -0
  213. data/lib/openc3/packets/parsers/packet_item_parser.rb +272 -0
  214. data/lib/openc3/packets/parsers/packet_parser.rb +134 -0
  215. data/lib/openc3/packets/parsers/processor_parser.rb +73 -0
  216. data/lib/openc3/packets/parsers/state_parser.rb +127 -0
  217. data/lib/openc3/packets/parsers/xtce_converter.rb +442 -0
  218. data/lib/openc3/packets/parsers/xtce_parser.rb +722 -0
  219. data/lib/openc3/packets/structure.rb +553 -0
  220. data/lib/openc3/packets/structure_item.rb +365 -0
  221. data/lib/openc3/packets/telemetry.rb +487 -0
  222. data/lib/openc3/processors/processor.rb +86 -0
  223. data/lib/openc3/processors/statistics_processor.rb +82 -0
  224. data/lib/openc3/processors/watermark_processor.rb +58 -0
  225. data/lib/openc3/processors.rb +24 -0
  226. data/lib/openc3/script/api_shared.rb +828 -0
  227. data/lib/openc3/script/calendar.rb +89 -0
  228. data/lib/openc3/script/commands.rb +227 -0
  229. data/lib/openc3/script/exceptions.rb +29 -0
  230. data/lib/openc3/script/extract.rb +161 -0
  231. data/lib/openc3/script/limits.rb +60 -0
  232. data/lib/openc3/script/script.rb +299 -0
  233. data/lib/openc3/script/script_runner.rb +238 -0
  234. data/lib/openc3/script/storage.rb +146 -0
  235. data/lib/openc3/script/suite.rb +542 -0
  236. data/lib/openc3/script/suite_results.rb +196 -0
  237. data/lib/openc3/script/suite_runner.rb +217 -0
  238. data/lib/openc3/script.rb +21 -0
  239. data/lib/openc3/streams/serial_stream.rb +167 -0
  240. data/lib/openc3/streams/stream.rb +63 -0
  241. data/lib/openc3/streams/tcpip_client_stream.rb +116 -0
  242. data/lib/openc3/streams/tcpip_socket_stream.rb +195 -0
  243. data/lib/openc3/system/system.rb +127 -0
  244. data/lib/openc3/system/system_config.rb +411 -0
  245. data/lib/openc3/system/target.rb +269 -0
  246. data/lib/openc3/system.rb +24 -0
  247. data/lib/openc3/tools/cmd_tlm_server/api.rb +20 -0
  248. data/lib/openc3/tools/cmd_tlm_server/cmd_tlm_server_config.rb +320 -0
  249. data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +294 -0
  250. data/lib/openc3/tools/table_manager/table.rb +77 -0
  251. data/lib/openc3/tools/table_manager/table_config.rb +273 -0
  252. data/lib/openc3/tools/table_manager/table_item.rb +90 -0
  253. data/lib/openc3/tools/table_manager/table_item_parser.rb +66 -0
  254. data/lib/openc3/tools/table_manager/table_manager_core.rb +333 -0
  255. data/lib/openc3/tools/table_manager/table_parser.rb +93 -0
  256. data/lib/openc3/tools/test_runner/test.rb +67 -0
  257. data/lib/openc3/top_level.rb +595 -0
  258. data/lib/openc3/topics/autonomic_topic.rb +52 -0
  259. data/lib/openc3/topics/calendar_topic.rb +44 -0
  260. data/lib/openc3/topics/command_decom_topic.rb +76 -0
  261. data/lib/openc3/topics/command_topic.rb +83 -0
  262. data/lib/openc3/topics/config_topic.rb +68 -0
  263. data/lib/openc3/topics/interface_topic.rb +73 -0
  264. data/lib/openc3/topics/limits_event_topic.rb +109 -0
  265. data/lib/openc3/topics/notifications_topic.rb +28 -0
  266. data/lib/openc3/topics/router_topic.rb +85 -0
  267. data/lib/openc3/topics/telemetry_decom_topic.rb +54 -0
  268. data/lib/openc3/topics/telemetry_topic.rb +36 -0
  269. data/lib/openc3/topics/timeline_topic.rb +45 -0
  270. data/lib/openc3/topics/topic.rb +53 -0
  271. data/lib/openc3/utilities/authentication.rb +141 -0
  272. data/lib/openc3/utilities/authorization.rb +51 -0
  273. data/lib/openc3/utilities/crc.rb +278 -0
  274. data/lib/openc3/utilities/csv.rb +153 -0
  275. data/lib/openc3/utilities/logger.rb +187 -0
  276. data/lib/openc3/utilities/message_log.rb +91 -0
  277. data/lib/openc3/utilities/metric.rb +141 -0
  278. data/lib/openc3/utilities/process_manager.rb +139 -0
  279. data/lib/openc3/utilities/quaternion.rb +257 -0
  280. data/lib/openc3/utilities/ruby_lex_utils.rb +568 -0
  281. data/lib/openc3/utilities/s3.rb +202 -0
  282. data/lib/openc3/utilities/s3_autoload.rb +9 -0
  283. data/lib/openc3/utilities/s3_file_cache.rb +274 -0
  284. data/lib/openc3/utilities/simulated_target.rb +117 -0
  285. data/lib/openc3/utilities/sleeper.rb +51 -0
  286. data/lib/openc3/utilities/store.rb +23 -0
  287. data/lib/openc3/utilities/store_autoload.rb +237 -0
  288. data/lib/openc3/utilities/zip.rb +21 -0
  289. data/lib/openc3/utilities.rb +35 -0
  290. data/lib/openc3/version.rb +14 -0
  291. data/lib/openc3/win32/excel.rb +132 -0
  292. data/lib/openc3/win32/win32.rb +402 -0
  293. data/lib/openc3/win32/win32_main.rb +333 -0
  294. data/lib/openc3.rb +49 -0
  295. data/tasks/gemfile_stats.rake +113 -0
  296. data/tasks/spec.rake +30 -0
  297. data/templates/plugin-template/README.md +15 -0
  298. data/templates/plugin-template/Rakefile +12 -0
  299. data/templates/plugin-template/plugin.gemspec +23 -0
  300. data/templates/plugin-template/plugin.txt +9 -0
  301. data/templates/plugin-template/targets/TARGET/cmd_tlm/cmd.txt +8 -0
  302. data/templates/plugin-template/targets/TARGET/cmd_tlm/tlm.txt +8 -0
  303. data/templates/plugin-template/targets/TARGET/lib/target.rb +10 -0
  304. data/templates/plugin-template/targets/TARGET/procedures/procedure.rb +3 -0
  305. data/templates/plugin-template/targets/TARGET/screens/status.txt +9 -0
  306. data/templates/plugin-template/targets/TARGET/target.txt +5 -0
  307. metadata +849 -0
@@ -0,0 +1,35 @@
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/utilities/store'
21
+
22
+ module OpenC3
23
+ class PingModel
24
+ # @return String ['UP' or 'DOWN']
25
+ def self.get()
26
+ response = Store.ping()
27
+ response2 = EphemeralStore.ping()
28
+ if response and response2
29
+ return 'UP'
30
+ else
31
+ return 'DOWN'
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,292 @@
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 'rubygems'
21
+ require 'rubygems/package'
22
+ require 'openc3'
23
+ require 'openc3/utilities/s3'
24
+ require 'openc3/utilities/store'
25
+ require 'openc3/config/config_parser'
26
+ require 'openc3/models/model'
27
+ require 'openc3/models/gem_model'
28
+ require 'openc3/models/target_model'
29
+ require 'openc3/models/interface_model'
30
+ require 'openc3/models/router_model'
31
+ require 'openc3/models/tool_model'
32
+ require 'openc3/models/widget_model'
33
+ require 'openc3/models/microservice_model'
34
+ require 'tmpdir'
35
+ require 'tempfile'
36
+
37
+ module OpenC3
38
+ # Represents a OpenC3 plugin that can consist of targets, interfaces, routers
39
+ # microservices and tools. The PluginModel installs all these pieces as well
40
+ # as destroys them all when the plugin is removed.
41
+ class PluginModel < Model
42
+ PRIMARY_KEY = 'openc3_plugins'
43
+
44
+ attr_accessor :variables
45
+ attr_accessor :plugin_txt_lines
46
+ attr_accessor :needs_dependencies
47
+
48
+
49
+ # NOTE: The following three class methods are used by the ModelController
50
+ # and are reimplemented to enable various Model class methods to work
51
+ def self.get(name:, scope: nil)
52
+ super("#{scope}__#{PRIMARY_KEY}", name: name)
53
+ end
54
+
55
+ def self.names(scope: nil)
56
+ super("#{scope}__#{PRIMARY_KEY}")
57
+ end
58
+
59
+ def self.all(scope: nil)
60
+ super("#{scope}__#{PRIMARY_KEY}")
61
+ end
62
+
63
+ # Called by the PluginsController to parse the plugin variables
64
+ # Doesn't actaully create the plugin during the phase
65
+ def self.install_phase1(gem_file_path, existing_variables: nil, existing_plugin_txt_lines: nil, process_existing: false, scope:, validate_only: false)
66
+ gem_name = File.basename(gem_file_path).split("__")[0]
67
+
68
+ temp_dir = Dir.mktmpdir
69
+ tf = nil
70
+ begin
71
+ if File.exists?(gem_file_path)
72
+ # Load gem to internal gem server
73
+ OpenC3::GemModel.put(gem_file_path, gem_install: false, scope: scope) unless validate_only
74
+ else
75
+ gem_file_path = OpenC3::GemModel.get(temp_dir, gem_name)
76
+ end
77
+
78
+ # Extract gem and process plugin.txt to determine what VARIABLEs need to be filled in
79
+ pkg = Gem::Package.new(gem_file_path)
80
+
81
+ if existing_plugin_txt_lines and process_existing
82
+ # This is only used in openc3cli load when everything is known
83
+ plugin_txt_lines = existing_plugin_txt_lines
84
+ file_data = existing_plugin_txt_lines.join("\n")
85
+ tf = Tempfile.new("plugin.txt")
86
+ tf.write(file_data)
87
+ tf.close
88
+ plugin_txt_path = tf.path
89
+ else
90
+ # Otherwise we always process the new and return both
91
+ pkg.extract_files(temp_dir)
92
+ plugin_txt_path = File.join(temp_dir, 'plugin.txt')
93
+ plugin_text = File.read(plugin_txt_path)
94
+ plugin_txt_lines = []
95
+ plugin_text.each_line do |line|
96
+ plugin_txt_lines << line.chomp
97
+ end
98
+ end
99
+
100
+ parser = OpenC3::ConfigParser.new("https://openc3.com")
101
+
102
+ # Phase 1 Gather Variables
103
+ variables = {}
104
+ parser.parse_file(plugin_txt_path,
105
+ false,
106
+ true,
107
+ false) do |keyword, params|
108
+ case keyword
109
+ when 'VARIABLE'
110
+ usage = "#{keyword} <Variable Name> <Default Value>"
111
+ parser.verify_num_parameters(2, nil, usage)
112
+ variable_name = params[0]
113
+ value = params[1..-1].join(" ")
114
+ variables[variable_name] = value
115
+ if existing_variables && existing_variables.key?(variable_name)
116
+ variables[variable_name] = existing_variables[variable_name]
117
+ end
118
+ # Ignore everything else during phase 1
119
+ end
120
+ end
121
+
122
+ model = PluginModel.new(name: gem_name, variables: variables, plugin_txt_lines: plugin_txt_lines, scope: scope)
123
+ result = model.as_json(:allow_nan => true)
124
+ result['existing_plugin_txt_lines'] = existing_plugin_txt_lines if existing_plugin_txt_lines and not process_existing and existing_plugin_txt_lines != result['plugin_txt_lines']
125
+ return result
126
+ ensure
127
+ FileUtils.remove_entry(temp_dir) if temp_dir and File.exist?(temp_dir)
128
+ tf.unlink if tf
129
+ end
130
+ end
131
+
132
+ # Called by the PluginsController to create the plugin
133
+ # Because this uses ERB it must be run in a seperate process from the API to
134
+ # prevent corruption and single require problems in the current proces
135
+ def self.install_phase2(plugin_hash, scope:, gem_file_path: nil, validate_only: false)
136
+ # Ensure config bucket exists
137
+ unless validate_only
138
+ rubys3_client = Aws::S3::Client.new
139
+ begin
140
+ rubys3_client.head_bucket(bucket: 'config')
141
+ rescue Aws::S3::Errors::NotFound
142
+ rubys3_client.create_bucket(bucket: 'config')
143
+ end
144
+ end
145
+
146
+ # Register plugin to aid in uninstall if install fails
147
+ plugin_hash.delete("existing_plugin_txt_lines")
148
+ plugin_model = PluginModel.new(**(plugin_hash.transform_keys(&:to_sym)), scope: scope)
149
+ plugin_model.create unless validate_only
150
+
151
+ temp_dir = Dir.mktmpdir
152
+ begin
153
+ tf = nil
154
+
155
+ # Get the gem from local gem server if it hasn't been passed
156
+ unless gem_file_path
157
+ gem_name = plugin_hash['name'].split("__")[0]
158
+ gem_file_path = OpenC3::GemModel.get(temp_dir, gem_name)
159
+ end
160
+
161
+ # Actually install the gem now (slow)
162
+ OpenC3::GemModel.install(gem_file_path, scope: scope)
163
+
164
+ # Extract gem contents
165
+ gem_path = File.join(temp_dir, "gem")
166
+ FileUtils.mkdir_p(gem_path)
167
+ pkg = Gem::Package.new(gem_file_path)
168
+ needs_dependencies = pkg.spec.runtime_dependencies.length > 0
169
+ pkg.extract_files(gem_path)
170
+ needs_dependencies = true if Dir.exist?(File.join(gem_path, 'lib'))
171
+ if needs_dependencies
172
+ plugin_model.needs_dependencies = true
173
+ plugin_model.update
174
+ end
175
+
176
+ # Temporarily add all lib folders from the gem to the end of the load path
177
+ load_dirs = []
178
+ begin
179
+ Dir.glob("#{gem_path}/**/*").each do |load_dir|
180
+ if File.directory?(load_dir) and File.basename(load_dir) == 'lib'
181
+ load_dirs << load_dir
182
+ $LOAD_PATH << load_dir
183
+ end
184
+ end
185
+
186
+ # Process plugin.txt file
187
+ file_data = plugin_hash['plugin_txt_lines'].join("\n")
188
+ tf = Tempfile.new("plugin.txt")
189
+ tf.write(file_data)
190
+ tf.close
191
+ plugin_txt_path = tf.path
192
+ variables = plugin_hash['variables']
193
+ if File.exist?(plugin_txt_path)
194
+ parser = OpenC3::ConfigParser.new("https://openc3.com")
195
+
196
+ current_model = nil
197
+ parser.parse_file(plugin_txt_path, false, true, true, variables) do |keyword, params|
198
+ case keyword
199
+ when 'VARIABLE'
200
+ # Ignore during phase 2
201
+ when 'TARGET', 'INTERFACE', 'ROUTER', 'MICROSERVICE', 'TOOL', 'WIDGET'
202
+ if current_model
203
+ current_model.create unless validate_only
204
+ current_model.deploy(gem_path, variables, validate_only: validate_only)
205
+ current_model = nil
206
+ end
207
+ current_model = OpenC3.const_get((keyword.capitalize + 'Model').intern).handle_config(parser, keyword, params, plugin: plugin_model.name, needs_dependencies: needs_dependencies, scope: scope)
208
+ else
209
+ if current_model
210
+ current_model.handle_config(parser, keyword, params)
211
+ else
212
+ raise "Invalid keyword #{keyword} in plugin.txt"
213
+ end
214
+ end
215
+ end
216
+ if current_model
217
+ current_model.create unless validate_only
218
+ current_model.deploy(gem_path, variables, validate_only: validate_only)
219
+ current_model = nil
220
+ end
221
+ end
222
+ ensure
223
+ load_dirs.each do |load_dir|
224
+ $LOAD_PATH.delete(load_dir)
225
+ end
226
+ end
227
+ rescue => err
228
+ # Install failed - need to cleanup
229
+ plugin_model.destroy unless validate_only
230
+ raise err
231
+ ensure
232
+ FileUtils.remove_entry(temp_dir) if temp_dir and File.exist?(temp_dir)
233
+ tf.unlink if tf
234
+ end
235
+
236
+ return plugin_model.as_json(:allow_nan => true)
237
+ end
238
+
239
+ def initialize(
240
+ name:,
241
+ variables: {},
242
+ plugin_txt_lines: [],
243
+ needs_dependencies: false,
244
+ updated_at: nil,
245
+ scope:
246
+ )
247
+ super("#{scope}__#{PRIMARY_KEY}", name: name, updated_at: updated_at, scope: scope)
248
+ @variables = variables
249
+ @plugin_txt_lines = plugin_txt_lines
250
+ @needs_dependencies = ConfigParser.handle_true_false(needs_dependencies)
251
+ end
252
+
253
+ def create(update: false, force: false)
254
+ @name = @name + "__#{Time.now.utc.strftime("%Y%m%d%H%M%S")}" unless update
255
+ super(update: update, force: force)
256
+ end
257
+
258
+ def as_json(*a)
259
+ {
260
+ 'name' => @name,
261
+ 'variables' => @variables,
262
+ 'plugin_txt_lines' => @plugin_txt_lines,
263
+ 'needs_dependencies' => @needs_dependencies,
264
+ 'updated_at' => @updated_at
265
+ }
266
+ end
267
+
268
+ # Undeploy all models associated with this plugin
269
+ def undeploy
270
+ MicroserviceModel.find_all_by_plugin(plugin: @name, scope: @scope).each do |name, model_instance|
271
+ model_instance.destroy
272
+ end
273
+ # Wait for the operator to wake up and remove the microservice processes
274
+ sleep 12 # Cycle time 5s times 2 plus 2s wait for soft stop and then hard stop
275
+ # Remove all the other models now that the processes have stopped
276
+ # Save TargetModel for last as it has the most to cleanup
277
+ [InterfaceModel, RouterModel, ToolModel, WidgetModel, TargetModel].each do |model|
278
+ model.find_all_by_plugin(plugin: @name, scope: @scope).each do |name, model_instance|
279
+ model_instance.destroy
280
+ end
281
+ end
282
+ end
283
+
284
+ # Reinstall
285
+ def restore
286
+ plugin_hash = self.as_json(:allow_nan => true)
287
+ plugin_hash['name'] = plugin_hash['name'].split("__")[0]
288
+ OpenC3::PluginModel.install_phase2(plugin_hash, scope: @scope)
289
+ @destroyed = false
290
+ end
291
+ end
292
+ end
@@ -0,0 +1,76 @@
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/models/model'
21
+
22
+ module OpenC3
23
+ # Stores the status about an process.
24
+ class ProcessStatusModel < EphemeralModel
25
+ PRIMARY_KEY = 'openc3_process_status'
26
+
27
+ attr_accessor :state
28
+ attr_accessor :process_type
29
+ attr_accessor :detail
30
+ attr_accessor :output
31
+
32
+ # NOTE: The following three class methods are used by the ModelController
33
+ # and are reimplemented to enable various Model class methods to work
34
+ def self.get(name:, scope:)
35
+ super("#{scope}__#{PRIMARY_KEY}", name: name)
36
+ end
37
+
38
+ def self.names(scope:)
39
+ super("#{scope}__#{PRIMARY_KEY}")
40
+ end
41
+
42
+ def self.all(scope:)
43
+ super("#{scope}__#{PRIMARY_KEY}")
44
+ end
45
+ # END NOTE
46
+
47
+ def initialize(
48
+ name:,
49
+ state: nil,
50
+ process_type: nil,
51
+ detail: nil,
52
+ output: nil,
53
+ updated_at: nil,
54
+ plugin: nil,
55
+ scope:
56
+ )
57
+ super("#{scope}__#{PRIMARY_KEY}", name: name, updated_at: updated_at, plugin: plugin, scope: scope)
58
+ @state = state
59
+ @process_type = process_type
60
+ @detail = detail
61
+ @output = output
62
+ end
63
+
64
+ def as_json(*a)
65
+ {
66
+ 'name' => @name,
67
+ 'state' => @state,
68
+ 'process_type' => @process_type,
69
+ 'detail' => @detail,
70
+ 'output' => @output,
71
+ 'plugin' => @plugin,
72
+ 'updated_at' => @updated_at
73
+ }
74
+ end
75
+ end
76
+ end