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,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
|