openc3 5.2.0 → 5.4.0

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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/bin/openc3cli +108 -105
  3. data/data/config/interface_modifiers.yaml +22 -4
  4. data/data/config/item_modifiers.yaml +4 -2
  5. data/data/config/microservice.yaml +18 -0
  6. data/data/config/table_manager.yaml +2 -2
  7. data/data/config/tool.yaml +1 -1
  8. data/ext/openc3/ext/config_parser/config_parser.c +17 -2
  9. data/lib/openc3/api/api.rb +1 -0
  10. data/lib/openc3/api/interface_api.rb +12 -0
  11. data/lib/openc3/api/metrics_api.rb +97 -0
  12. data/lib/openc3/api/router_api.rb +14 -2
  13. data/lib/openc3/api/target_api.rb +24 -3
  14. data/lib/openc3/api/tlm_api.rb +5 -4
  15. data/lib/openc3/config/config_parser.rb +29 -4
  16. data/lib/openc3/core_ext/time.rb +6 -1
  17. data/lib/openc3/interfaces/interface.rb +27 -26
  18. data/lib/openc3/interfaces/mqtt_interface.rb +240 -0
  19. data/lib/openc3/interfaces/protocols/override_protocol.rb +2 -61
  20. data/lib/openc3/interfaces/protocols/protocol.rb +6 -1
  21. data/lib/openc3/interfaces/simulated_target_interface.rb +1 -3
  22. data/lib/openc3/interfaces/tcpip_server_interface.rb +0 -11
  23. data/lib/openc3/interfaces.rb +2 -3
  24. data/lib/openc3/logs/buffered_packet_log_reader.rb +2 -2
  25. data/lib/openc3/microservices/cleanup_microservice.rb +17 -1
  26. data/lib/openc3/microservices/decom_microservice.rb +12 -9
  27. data/lib/openc3/microservices/interface_microservice.rb +93 -9
  28. data/lib/openc3/microservices/log_microservice.rb +11 -5
  29. data/lib/openc3/microservices/microservice.rb +10 -9
  30. data/lib/openc3/microservices/periodic_microservice.rb +7 -0
  31. data/lib/openc3/microservices/reaction_microservice.rb +0 -33
  32. data/lib/openc3/microservices/reducer_microservice.rb +14 -10
  33. data/lib/openc3/microservices/text_log_microservice.rb +12 -3
  34. data/lib/openc3/microservices/timeline_microservice.rb +0 -6
  35. data/lib/openc3/microservices/trigger_group_microservice.rb +0 -20
  36. data/lib/openc3/models/cvt_model.rb +103 -47
  37. data/lib/openc3/models/interface_model.rb +23 -0
  38. data/lib/openc3/models/metric_model.rb +53 -6
  39. data/lib/openc3/models/microservice_model.rb +15 -1
  40. data/lib/openc3/models/model.rb +1 -1
  41. data/lib/openc3/models/plugin_model.rb +6 -1
  42. data/lib/openc3/models/secret_model.rb +53 -0
  43. data/lib/openc3/models/target_model.rb +2 -2
  44. data/lib/openc3/models/tool_model.rb +17 -8
  45. data/lib/openc3/operators/microservice_operator.rb +25 -0
  46. data/lib/openc3/operators/operator.rb +5 -1
  47. data/lib/openc3/packets/packet.rb +21 -7
  48. data/lib/openc3/packets/packet_item.rb +3 -2
  49. data/lib/openc3/script/api_shared.rb +18 -2
  50. data/lib/openc3/script/script.rb +8 -0
  51. data/lib/openc3/script/script_runner.rb +1 -2
  52. data/lib/openc3/script/storage.rb +2 -1
  53. data/lib/openc3/script/suite.rb +15 -11
  54. data/lib/openc3/system/system.rb +6 -3
  55. data/lib/openc3/topics/interface_topic.rb +17 -1
  56. data/lib/openc3/topics/router_topic.rb +17 -1
  57. data/lib/openc3/utilities/aws_bucket.rb +20 -3
  58. data/lib/openc3/utilities/bucket.rb +1 -1
  59. data/lib/openc3/utilities/bucket_file_cache.rb +1 -1
  60. data/lib/openc3/utilities/bucket_utilities.rb +1 -1
  61. data/lib/openc3/utilities/local_mode.rb +1 -0
  62. data/lib/openc3/utilities/metric.rb +77 -101
  63. data/lib/openc3/utilities/redis_secrets.rb +46 -0
  64. data/lib/openc3/utilities/s3_autoload.rb +19 -9
  65. data/lib/openc3/utilities/secrets.rb +63 -0
  66. data/lib/openc3/utilities/target_file.rb +3 -1
  67. data/lib/openc3/version.rb +5 -5
  68. data/templates/plugin-template/LICENSE.txt +7 -0
  69. data/templates/plugin-template/README.md +4 -3
  70. data/templates/plugin-template/plugin.gemspec +4 -4
  71. metadata +22 -3
  72. data/data/config/_interfaces.yaml.err +0 -1017
@@ -1,6 +1,6 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2022 Ball Aerospace & Technologies Corp.
3
+ # Copyright 2022 OpenC3, Inc.
4
4
  # All Rights Reserved.
5
5
  #
6
6
  # This program is free software; you can modify and/or redistribute it
@@ -12,133 +12,109 @@
12
12
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
13
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
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
15
  #
20
- # This file may also be used under the terms of a commercial license
16
+ # This file may also be used under the terms of a commercial license
21
17
  # if purchased from OpenC3, Inc.
18
+ #
19
+ # Note: This file has been completely reimplemented post version 5.3.0
22
20
 
23
21
  require 'openc3/models/metric_model'
24
22
  require 'thread'
25
23
 
26
24
  module OpenC3
27
25
  class Metric
28
- # This class is designed to output metrics to the openc3-cosmos-cmd-tlm-api
29
- # InternalMetricsController. Output format can be read about here
30
- # https://prometheus.io/docs/concepts/data_model/
31
- #
32
- # Warning contains some sorcery.
33
- #
34
- # examples:
35
- # TYPE foobar histogram
36
- # HELP foobar internal metric generated from openc3/utilities/metric.rb
37
- # foobar{code="200",method="get",path="/metrics"} 5.0
38
- #
39
- # items = {"name|labels" => [value_array], ...}
40
-
41
- attr_reader :items
42
- attr_accessor :size
43
- attr_reader :scope
26
+ # The update interval. How often in seconds metrics are updated by this process
27
+ UPDATE_INTERVAL = 5
28
+
29
+ # Mutex protecting class variables
30
+ @@mutex = Mutex.new
31
+
32
+ # Array of instances used to keep track of metrics
33
+ @@instances = []
34
+
35
+ # Thread used to post metrics across all classes
36
+ @@update_thread = nil
37
+
38
+ # Sleeper used to delay update thread
39
+ @@update_sleeper = nil
40
+
44
41
  attr_reader :microservice
42
+ attr_reader :scope
43
+ attr_reader :data
44
+ attr_reader :mutex
45
45
 
46
46
  def initialize(microservice:, scope:)
47
- if microservice.include? '|' or scope.include? '|'
48
- raise ArgumentError.new('invalid input must not contain: |')
49
- end
50
-
51
- @items = {}
52
47
  @scope = scope
53
48
  @microservice = microservice
54
- @size = 5000
49
+ @data = {}
55
50
  @mutex = Mutex.new
56
- end
57
51
 
58
- def add_sample(name:, value:, labels:)
59
- # add a value to the metric to report out later or a seperate thread
60
- # name is a string often function_name_duration_seconds
61
- # name: debug_duration_seconds
62
- # value is a numerical value to add to a round robin array.
63
- # value: 0.1211
64
- # labels is a hash of values that could have an effect on the value.
65
- # labels: {"code"=>200,"method"=>"get","path"=>"/metrics"}
66
- # internal:
67
- # the internal items hash is used as a lookup table to store unique
68
- # varients of a similar metric. these varients are values that could
69
- # cause a difference in run time to add context to the metric. the
70
- # microservice and scope are added to the labels the labels are
71
- # converted to a string and joined with the name to create a unique
72
- # metric item. this is looked up in the items hash and if not found
73
- # the key is created and an array of size @size is allocated. then
74
- # the value is added to @items and the count of the value is increased
75
- # if the count of the values exceed the size of the array it sets the
76
- # count back to zero and the array will over write older data.
77
- @mutex.synchronize do
78
- key = "#{name}|" + labels.map { |k, v| "#{k}=#{v}" }.join(',')
79
- if not @items.has_key?(key)
80
- Logger.debug("new data for #{@scope}, #{key}")
81
- @items[key] = { 'values' => Array.new(@size), 'count' => 0 }
52
+ # Always make sure there is a update thread
53
+ @@mutex.synchronize do
54
+ @@instances << self
55
+
56
+ unless @@update_thread
57
+ @@update_thread = OpenC3.safe_thread("Metrics") do
58
+ update_thread_body()
59
+ end
82
60
  end
83
- count = @items[key]['count']
84
- # Logger.info("adding data for #{@scope}, #{count} #{key}, #{value}")
85
- @items[key]['values'][count] = value
86
- @items[key]['count'] = count + 1 >= @size ? 0 : count + 1
87
61
  end
88
62
  end
89
63
 
90
- def percentile(sorted_values, percentile)
91
- # get the percentile out of an ordered array
92
- len = sorted_values.length
93
- return sorted_values.first if len == 1
64
+ def set(name:, value:, type: nil, unit: nil, help: nil, labels: nil, time_ms: nil)
65
+ @mutex.synchronize do
66
+ @data[name] ||= {}
67
+ @data[name]['value'] = value
68
+ @data[name]['type'] = type if type
69
+ @data[name]['unit'] = unit if unit
70
+ @data[name]['help'] = help if help
71
+ @data[name]['labels'] = labels if labels
72
+ @data[name]['time_ms'] = time_ms if time_ms
73
+ end
74
+ end
94
75
 
95
- k = ((percentile / 100.0) * (len - 1) + 1).floor - 1
96
- f = ((percentile / 100.0) * (len - 1) + 1).modulo(1)
97
- return sorted_values[k] + (f * (sorted_values[k + 1] - sorted_values[k]))
76
+ def set_multiple(data)
77
+ @mutex.synchonize do
78
+ @data.merge!(data)
79
+ end
98
80
  end
99
81
 
100
- def output
101
- # Output percentile based metrics to Redis under the key of the
102
- # #{@scope}__openc3__metric we will use hset with a subkey.
103
- # internal:
104
- # loop over the key value pairs within the @items hash, remove nil
105
- # and sort the values added via the add_sample method. calculate the
106
- # different percentiles. the labels are still only contained in the
107
- # key of the @items hash to extract these you split the key on | the
108
- # name|labels then to make the labels back into a hash we split the ,
109
- # into an array ["foo=bar", ...] and split again this time on the =
110
- # into [["foo","bar"], ...] to map the internal array into a hash
111
- # [{"foo"=>"bar"}, ...] finally reducing the array into a single hash
112
- # to add the percentile and percentile value. this hash is added to an
113
- # array. to store the array as the value with the metric name again joined
114
- # with the @microservice and @scope.
115
- Logger.debug("#{@microservice} #{@scope} sending metrics to redis, #{@items.length}") if @items.length > 0
116
- @mutex.synchronize do
117
- @items.each do |key, values|
118
- label_list = []
119
- name, labels = key.split('|')
120
- metric_labels = labels.nil? ? {} : labels.split(',').map { |x| x.split('=') }.map { |k, v| { k => v } }.reduce({}, :merge)
121
- sorted_values = values['values'].compact.sort
122
- for percentile_value in [10, 50, 90, 95, 99]
123
- percentile_result = percentile(sorted_values, percentile_value)
124
- labels = metric_labels.clone.merge({ 'scope' => @scope, 'microservice' => @microservice })
125
- labels['percentile'] = percentile_value
126
- labels['metric__value'] = percentile_result
127
- label_list.append(labels)
128
- end
129
- begin
130
- Logger.debug("sending metrics summary to redis key: #{@microservice}")
131
- metric = MetricModel.new(name: @microservice, scope: @scope, metric_name: name, label_list: label_list)
132
- metric.create(force: true)
133
- rescue RuntimeError
134
- Logger.error("failed attempt to update metric, #{key}, #{name} #{@scope}")
82
+ def update_thread_body
83
+ @@update_sleeper = Sleeper.new
84
+ while true
85
+ start_time = Time.now
86
+ @@mutex.synchronize do
87
+ @@instances.each do |instance|
88
+ instance.mutex.synchronize do
89
+ json = {}
90
+ json['name'] = instance.microservice
91
+ values = instance.data
92
+ json['values'] = values
93
+ MetricModel.set(json, scope: instance.scope) if values.length > 0
94
+ end
135
95
  end
136
96
  end
97
+
98
+ # Only check whether to update at a set interval
99
+ run_time = Time.now - start_time
100
+ sleep_time = UPDATE_INTERVAL - run_time
101
+ sleep_time = 0 if sleep_time < 0
102
+ break if @@update_sleeper.sleep(sleep_time)
103
+ end
104
+ end
105
+
106
+ def shutdown
107
+ @@mutex.synchronize do
108
+ @@instances.delete(self)
109
+ if @@instances.length <= 0
110
+ @@update_sleeper.cancel if @@update_sleeper
111
+ OpenC3.kill_thread(self, @@update_thread) if @@update_thread
112
+ @@update_thread = nil
113
+ end
137
114
  end
138
115
  end
139
116
 
140
- def destroy
141
- MetricModel.destroy(scope: @scope, name: @microservice)
117
+ def graceful_kill
142
118
  end
143
119
  end
144
120
  end
@@ -0,0 +1,46 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2022 OpenC3, Inc.
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
+ # This file may also be used under the terms of a commercial license
17
+ # if purchased from OpenC3, Inc.
18
+
19
+ require 'openc3/models/secret_model'
20
+ require 'openc3/utilities/secrets'
21
+
22
+ module OpenC3
23
+ class RedisSecrets < Secrets
24
+ def keys(scope:)
25
+ SecretModel.names(scope: scope)
26
+ end
27
+
28
+ def get(key, scope:)
29
+ data = SecretModel.get(name: key, scope: scope)
30
+ if data
31
+ return data['value']
32
+ else
33
+ return nil
34
+ end
35
+ end
36
+
37
+ def set(key, value, scope:)
38
+ SecretModel.set( {name: key, value: value.to_s }, scope: scope)
39
+ end
40
+
41
+ def delete(key, scope:)
42
+ model = SecretModel.get_model(name: key, scope: scope)
43
+ model.destroy if model
44
+ end
45
+ end
46
+ end
@@ -1,11 +1,21 @@
1
1
  require 'aws-sdk-s3'
2
2
 
3
- Aws.config.update(
4
- s3: {
5
- endpoint: ENV['OPENC3_BUCKET_URL'] || (ENV['OPENC3_DEVEL'] ? 'http://127.0.0.1:9000' : 'http://openc3-minio:9000'),
6
- access_key_id: ENV['OPENC3_BUCKET_USERNAME'],
7
- secret_access_key: ENV['OPENC3_BUCKET_PASSWORD'],
8
- force_path_style: true,
9
- region: 'us-east-1'
10
- }
11
- )
3
+ if ENV['OPENC3_CLOUD'] == 'local'
4
+ Aws.config.update(
5
+ s3: {
6
+ endpoint: ENV['OPENC3_BUCKET_URL'] || (ENV['OPENC3_DEVEL'] ? 'http://127.0.0.1:9000' : 'http://openc3-minio:9000'),
7
+ access_key_id: ENV['OPENC3_BUCKET_USERNAME'],
8
+ secret_access_key: ENV['OPENC3_BUCKET_PASSWORD'],
9
+ force_path_style: true,
10
+ region: 'us-east-1'
11
+ }
12
+ )
13
+ else # AWS
14
+ Aws.config.update(
15
+ s3: {
16
+ endpoint: "https://s3.#{ENV['AWS_REGION']}.amazonaws.com",
17
+ force_path_style: true,
18
+ region: ENV['AWS_REGION']
19
+ }
20
+ )
21
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2022 OpenC3, Inc.
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
+ # This file may also be used under the terms of a commercial license
17
+ # if purchased from OpenC3, Inc.
18
+
19
+ ENV['OPENC3_SECRET_BACKEND'] ||= 'redis'
20
+
21
+ module OpenC3
22
+ class Secrets
23
+ def initialize
24
+ @local_secrets = {}
25
+ end
26
+
27
+ def self.getClient
28
+ raise 'OPENC3_SECRET_BACKEND environment variable is required' unless ENV['OPENC3_SECRET_BACKEND']
29
+ secrets_class = ENV['OPENC3_SECRET_BACKEND'].capitalize + 'Secrets'
30
+ klass = OpenC3.require_class('openc3/utilities/' + secrets_class.class_name_to_filename)
31
+ klass.new
32
+ end
33
+
34
+ def keys(scope:)
35
+ raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
36
+ end
37
+
38
+ def get(key, scope:)
39
+ return @local_secrets[key]
40
+ end
41
+
42
+ def set(key, value, scope:)
43
+ raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
44
+ end
45
+
46
+ def delete(key, scope:)
47
+ raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
48
+ end
49
+
50
+ def setup(secrets)
51
+ secrets.each do |type, key, data|
52
+ case type
53
+ when 'ENV'
54
+ @local_secrets[key] = ENV[data]
55
+ when 'FILE'
56
+ @local_secrets[key] = File.read(data)
57
+ else
58
+ raise "Unknown secret type: #{type}"
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -97,7 +97,9 @@ module OpenC3
97
97
  bucket: ENV['OPENC3_CONFIG_BUCKET'],
98
98
  prefix: "#{scope}/targets_modified/#{TEMP_FOLDER}",
99
99
  )
100
+ files = []
100
101
  resp.each do |object|
102
+ files << object.key
101
103
  bucket.delete_object(
102
104
  bucket: ENV['OPENC3_CONFIG_BUCKET'],
103
105
  key: object.key,
@@ -106,7 +108,7 @@ module OpenC3
106
108
  OpenC3::LocalMode.delete_local(object.key)
107
109
  end
108
110
  end
109
- true
111
+ files
110
112
  end
111
113
 
112
114
  def self.body(scope, name)
@@ -1,14 +1,14 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- OPENC3_VERSION = '5.2.0'
3
+ OPENC3_VERSION = '5.4.0'
4
4
  module OpenC3
5
5
  module Version
6
6
  MAJOR = '5'
7
- MINOR = '2'
7
+ MINOR = '4'
8
8
  PATCH = '0'
9
9
  OTHER = ''
10
- BUILD = '49c62512b75f45a8cbfc20a6fb5ed114bab35e23'
10
+ BUILD = 'f10d7e7ecbe3c6917e4f87eeac1f5eb0ddcf3d67'
11
11
  end
12
- VERSION = '5.2.0'
13
- GEM_VERSION = '5.2.0'
12
+ VERSION = '5.4.0'
13
+ GEM_VERSION = '5.4.0'
14
14
  end
@@ -0,0 +1,7 @@
1
+ Copyright 2023 <COPYRIGHT HOLDER>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,10 +1,10 @@
1
- # OpenC3 Configuration
1
+ # OpenC3 COSMOS Plugin
2
2
 
3
3
  See the [OpenC3](https://openc3.com) documentation for all things OpenC3.
4
4
 
5
5
  ## Building the plugin
6
6
 
7
- 1. <Path to OpenC3 installation>\openc3.bat openc3 rake VERSION=X.Y.Z
7
+ 1. <Path to COSMOS installation>\openc3.bat cli rake build VERSION=X.Y.Z
8
8
  - VERSION is required
9
9
  - gem file will be built locally
10
10
 
@@ -12,4 +12,5 @@ See the [OpenC3](https://openc3.com) documentation for all things OpenC3.
12
12
 
13
13
  1. Go to localhost:2900/tools/admin
14
14
  1. Click the paperclip icon and choose your plugin.gem file
15
- 1. Click Upload
15
+ 1. Fill out plugin parameters
16
+ 1. Click Install
@@ -7,17 +7,17 @@ spec = Gem::Specification.new do |s|
7
7
  s.description = <<-EOF
8
8
  <%= plugin_name %> plugin for deployment to OpenC3
9
9
  EOF
10
- s.license = 'AGPL-3.0-only'
10
+ s.license = 'MIT'
11
11
  s.authors = ['Anonymous']
12
12
  s.email = ['name@domain.com']
13
13
  s.homepage = 'https://github.com/OpenC3/openc3'
14
14
  s.platform = Gem::Platform::RUBY
15
15
 
16
- time = Time.now.strftime("%Y%m%d%H%M%S")
17
16
  if ENV['VERSION']
18
- s.version = ENV['VERSION'].dup + ".#{time}"
17
+ s.version = ENV['VERSION'].dup
19
18
  else
19
+ time = Time.now.strftime("%Y%m%d%H%M%S")
20
20
  s.version = '0.0.0' + ".#{time}"
21
21
  end
22
- s.files = Dir.glob("{targets,lib,tools,microservices}/**/*") + %w(Rakefile README.md plugin.txt)
22
+ s.files = Dir.glob("{targets,lib,tools,microservices}/**/*") + %w(Rakefile README.md LICENSE.txt plugin.txt)
23
23
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openc3
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.0
4
+ version: 5.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Melton
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-12-13 00:00:00.000000000 Z
12
+ date: 2023-02-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -333,6 +333,20 @@ dependencies:
333
333
  - - "~>"
334
334
  - !ruby/object:Gem::Version
335
335
  version: '1.1'
336
+ - !ruby/object:Gem::Dependency
337
+ name: mqtt
338
+ requirement: !ruby/object:Gem::Requirement
339
+ requirements:
340
+ - - "~>"
341
+ - !ruby/object:Gem::Version
342
+ version: '0.5'
343
+ type: :runtime
344
+ prerelease: false
345
+ version_requirements: !ruby/object:Gem::Requirement
346
+ requirements:
347
+ - - "~>"
348
+ - !ruby/object:Gem::Version
349
+ version: '0.5'
336
350
  - !ruby/object:Gem::Dependency
337
351
  name: opentelemetry-sdk
338
352
  requirement: !ruby/object:Gem::Requirement
@@ -653,7 +667,6 @@ files:
653
667
  - data/config/_id_items.yaml
654
668
  - data/config/_id_params.yaml
655
669
  - data/config/_interfaces.yaml
656
- - data/config/_interfaces.yaml.err
657
670
  - data/config/_items.yaml
658
671
  - data/config/_params.yaml
659
672
  - data/config/cmd_tlm_server.yaml
@@ -718,6 +731,7 @@ files:
718
731
  - lib/openc3/api/config_api.rb
719
732
  - lib/openc3/api/interface_api.rb
720
733
  - lib/openc3/api/limits_api.rb
734
+ - lib/openc3/api/metrics_api.rb
721
735
  - lib/openc3/api/offline_access_api.rb
722
736
  - lib/openc3/api/router_api.rb
723
737
  - lib/openc3/api/settings_api.rb
@@ -768,6 +782,7 @@ files:
768
782
  - lib/openc3/interfaces.rb
769
783
  - lib/openc3/interfaces/interface.rb
770
784
  - lib/openc3/interfaces/linc_interface.rb
785
+ - lib/openc3/interfaces/mqtt_interface.rb
771
786
  - lib/openc3/interfaces/protocols/burst_protocol.rb
772
787
  - lib/openc3/interfaces/protocols/crc_protocol.rb
773
788
  - lib/openc3/interfaces/protocols/fixed_protocol.rb
@@ -849,6 +864,7 @@ files:
849
864
  - lib/openc3/models/router_model.rb
850
865
  - lib/openc3/models/router_status_model.rb
851
866
  - lib/openc3/models/scope_model.rb
867
+ - lib/openc3/models/secret_model.rb
852
868
  - lib/openc3/models/settings_model.rb
853
869
  - lib/openc3/models/sorted_model.rb
854
870
  - lib/openc3/models/stash_model.rb
@@ -951,8 +967,10 @@ files:
951
967
  - lib/openc3/utilities/open_telemetry.rb
952
968
  - lib/openc3/utilities/process_manager.rb
953
969
  - lib/openc3/utilities/quaternion.rb
970
+ - lib/openc3/utilities/redis_secrets.rb
954
971
  - lib/openc3/utilities/ruby_lex_utils.rb
955
972
  - lib/openc3/utilities/s3_autoload.rb
973
+ - lib/openc3/utilities/secrets.rb
956
974
  - lib/openc3/utilities/simulated_target.rb
957
975
  - lib/openc3/utilities/sleeper.rb
958
976
  - lib/openc3/utilities/store.rb
@@ -965,6 +983,7 @@ files:
965
983
  - lib/openc3/win32/win32_main.rb
966
984
  - tasks/gemfile_stats.rake
967
985
  - tasks/spec.rake
986
+ - templates/plugin-template/LICENSE.txt
968
987
  - templates/plugin-template/README.md
969
988
  - templates/plugin-template/Rakefile
970
989
  - templates/plugin-template/plugin.gemspec