openc3 5.10.1 → 5.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +3 -2
- data/data/config/target.yaml +9 -0
- data/ext/openc3/ext/packet/packet.c +3 -0
- data/ext/openc3/ext/reducer_microservice/extconf.rb +13 -0
- data/ext/openc3/ext/reducer_microservice/reducer_microservice.c +165 -0
- data/ext/openc3/ext/structure/structure.c +7 -9
- data/lib/openc3/accessors/accessor.rb +53 -3
- data/lib/openc3/accessors/binary_accessor.rb +16 -0
- data/lib/openc3/accessors/cbor_accessor.rb +3 -3
- data/lib/openc3/accessors/form_accessor.rb +78 -0
- data/lib/openc3/accessors/http_accessor.rb +145 -0
- data/lib/openc3/accessors/json_accessor.rb +19 -3
- data/lib/openc3/accessors/xml_accessor.rb +18 -1
- data/lib/openc3/accessors.rb +3 -1
- data/lib/openc3/config/config_parser.rb +7 -5
- data/lib/openc3/config/meta_config_parser.rb +1 -1
- data/lib/openc3/core_ext/string.rb +16 -1
- data/lib/openc3/interfaces/http_client_interface.rb +202 -0
- data/lib/openc3/interfaces/http_server_interface.rb +183 -0
- data/lib/openc3/interfaces/interface.rb +86 -16
- data/lib/openc3/interfaces/mqtt_interface.rb +6 -5
- data/lib/openc3/interfaces/protocols/burst_protocol.rb +11 -11
- data/lib/openc3/interfaces/protocols/cobs_protocol.rb +7 -7
- data/lib/openc3/interfaces/protocols/crc_protocol.rb +7 -7
- data/lib/openc3/interfaces/protocols/length_protocol.rb +6 -6
- data/lib/openc3/interfaces/protocols/preidentified_protocol.rb +9 -5
- data/lib/openc3/interfaces/protocols/protocol.rb +8 -6
- data/lib/openc3/interfaces/protocols/slip_protocol.rb +8 -8
- data/lib/openc3/interfaces/protocols/template_protocol.rb +6 -7
- data/lib/openc3/interfaces/protocols/terminated_protocol.rb +4 -4
- data/lib/openc3/interfaces/simulated_target_interface.rb +2 -0
- data/lib/openc3/interfaces/stream_interface.rb +6 -4
- data/lib/openc3/interfaces/tcpip_server_interface.rb +2 -0
- data/lib/openc3/interfaces/udp_interface.rb +8 -5
- data/lib/openc3/interfaces.rb +2 -0
- data/lib/openc3/logs/buffered_packet_log_writer.rb +6 -7
- data/lib/openc3/logs/log_writer.rb +2 -10
- data/lib/openc3/logs/packet_log_constants.rb +13 -3
- data/lib/openc3/logs/packet_log_reader.rb +35 -98
- data/lib/openc3/logs/packet_log_writer.rb +24 -62
- data/lib/openc3/logs/text_log_writer.rb +32 -6
- data/lib/openc3/microservices/cleanup_microservice.rb +23 -16
- data/lib/openc3/microservices/decom_microservice.rb +8 -20
- data/lib/openc3/microservices/log_microservice.rb +3 -1
- data/lib/openc3/microservices/reaction_microservice.rb +22 -11
- data/lib/openc3/microservices/reducer_microservice.rb +174 -130
- data/lib/openc3/{models/notification_model.rb → microservices/scope_cleanup_microservice.rb} +20 -21
- data/lib/openc3/microservices/text_log_microservice.rb +2 -5
- data/lib/openc3/microservices/timeline_microservice.rb +0 -1
- data/lib/openc3/microservices/trigger_group_microservice.rb +0 -1
- data/lib/openc3/migrations/20230915000002_no_scope_log_messages.rb +44 -0
- data/lib/openc3/models/microservice_model.rb +1 -1
- data/lib/openc3/models/scope_model.rb +65 -34
- data/lib/openc3/models/target_model.rb +25 -5
- data/lib/openc3/models/tool_model.rb +14 -2
- data/lib/openc3/models/widget_model.rb +1 -1
- data/lib/openc3/packets/json_packet.rb +10 -2
- data/lib/openc3/packets/packet.rb +30 -9
- data/lib/openc3/packets/packet_config.rb +6 -2
- data/lib/openc3/packets/parsers/packet_item_parser.rb +11 -6
- data/lib/openc3/packets/structure.rb +19 -12
- data/lib/openc3/script/storage.rb +1 -1
- data/lib/openc3/script/web_socket_api.rb +17 -14
- data/lib/openc3/topics/telemetry_topic.rb +2 -1
- data/lib/openc3/utilities/bucket_utilities.rb +2 -0
- data/lib/openc3/utilities/cli_generator.rb +1 -1
- data/lib/openc3/utilities/logger.rb +62 -47
- data/lib/openc3/utilities/metric.rb +19 -1
- data/lib/openc3/utilities/sleeper.rb +3 -1
- data/lib/openc3/utilities/throttle.rb +76 -0
- data/lib/openc3/version.rb +6 -6
- data/templates/tool_angular/package.json +20 -20
- data/templates/tool_angular/yarn.lock +112 -106
- data/templates/tool_react/package.json +16 -18
- data/templates/tool_react/yarn.lock +977 -664
- data/templates/tool_svelte/.prettierrc.js +5 -0
- data/templates/tool_svelte/package.json +18 -18
- data/templates/tool_svelte/src/services/cable.js +1 -1
- data/templates/tool_svelte/src/services/openc3-api.js +173 -173
- data/templates/tool_svelte/yarn.lock +767 -665
- data/templates/tool_vue/package.json +10 -10
- data/templates/tool_vue/yarn.lock +225 -43
- data/templates/widget/package.json +10 -10
- data/templates/widget/yarn.lock +223 -46
- metadata +41 -4
- data/lib/openc3/topics/notifications_topic.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: beada8d3ae31acc7a45fff23d454f4667b552a5de293f6c17f6da72626dd8490
|
4
|
+
data.tar.gz: 950b07bf2f6a3173284d41a77ae7abf4cf6f9582a885dbedc585d50001fadcd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b0e9f874d5a88c167ba9bd78c3718d1b646ab80560106e01fb109189c27d6b399a3f51531b23815129ea24f4b9194770c9448d8e4be832c0926a6f5b8c3f9ad
|
7
|
+
data.tar.gz: e5c20e0648e27b311de33c0d06eb27bb229110eac0fcf197619dac6a3232b239334cbda07bf3f79e88ddb7425b773191c04f9929883a6042b36633c99924285a
|
data/Rakefile
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
# All changes Copyright 2022, OpenC3, Inc.
|
18
18
|
# All Rights Reserved
|
19
19
|
#
|
20
|
-
# This file may also be used under the terms of a commercial license
|
20
|
+
# This file may also be used under the terms of a commercial license
|
21
21
|
# if purchased from OpenC3, Inc.
|
22
22
|
|
23
23
|
require 'open3'
|
@@ -63,7 +63,8 @@ task :build => [:devkit] do
|
|
63
63
|
'telemetry',
|
64
64
|
'packet',
|
65
65
|
'platform',
|
66
|
-
'buffered_file'
|
66
|
+
'buffered_file',
|
67
|
+
'reducer_microservice'
|
67
68
|
]
|
68
69
|
|
69
70
|
extensions.each do |extension_name|
|
data/data/config/target.yaml
CHANGED
@@ -156,6 +156,15 @@ TARGET:
|
|
156
156
|
required: true
|
157
157
|
description: Number of seconds between runs of the cleanup process (default = 900 = 15 minutes)
|
158
158
|
values: \d+
|
159
|
+
REDUCER_DISABLE:
|
160
|
+
summary: Disables the data reduction microservice for the target
|
161
|
+
REDUCER_MAX_CPU_UTILIZATION:
|
162
|
+
summary: Maximum amount of CPU utilization to apply to data reduction
|
163
|
+
parameters:
|
164
|
+
- name: Percentage
|
165
|
+
required: true
|
166
|
+
description: 0 to 100 percent (default = 30)
|
167
|
+
values: \d+
|
159
168
|
TARGET_MICROSERVICE:
|
160
169
|
summary: Breaks a target microservice out into its own process.
|
161
170
|
description:
|
@@ -60,6 +60,7 @@ static ID id_ivar_description = 0;
|
|
60
60
|
static ID id_ivar_stored = 0;
|
61
61
|
static ID id_ivar_extra = 0;
|
62
62
|
static ID id_ivar_template = 0;
|
63
|
+
static ID id_ivar_packet_time = 0;
|
63
64
|
|
64
65
|
/* Sets the target name this packet is associated with. Unidentified packets
|
65
66
|
* will have target name set to nil.
|
@@ -283,6 +284,7 @@ static VALUE packet_initialize(int argc, VALUE *argv, VALUE self)
|
|
283
284
|
rb_ivar_set(self, id_ivar_stored, Qfalse);
|
284
285
|
rb_ivar_set(self, id_ivar_extra, Qnil);
|
285
286
|
rb_ivar_set(self, id_ivar_template, Qnil);
|
287
|
+
rb_ivar_set(self, id_ivar_packet_time, Qnil);
|
286
288
|
return self;
|
287
289
|
}
|
288
290
|
|
@@ -323,6 +325,7 @@ void Init_packet(void)
|
|
323
325
|
id_ivar_stored = rb_intern("@stored");
|
324
326
|
id_ivar_extra = rb_intern("@extra");
|
325
327
|
id_ivar_template = rb_intern("@template");
|
328
|
+
id_ivar_packet_time = rb_intern("@packet_time");
|
326
329
|
|
327
330
|
cPacket = rb_define_class_under(mOpenC3, "Packet", cStructure);
|
328
331
|
rb_define_method(cPacket, "initialize", packet_initialize, -1);
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O3')
|
4
|
+
$CFLAGS << ' -O3'
|
5
|
+
end
|
6
|
+
if /gcc/.match?(CONFIG['CC'])
|
7
|
+
$CFLAGS << ' -Wall'
|
8
|
+
if $DEBUG && !$CFLAGS.gsub!(/ -O[\dsz]?/, ' -O0 -ggdb')
|
9
|
+
$CFLAGS << ' -O0 -ggdb'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
create_makefile 'openc3/ext/reducer_microservice'
|
@@ -0,0 +1,165 @@
|
|
1
|
+
/*
|
2
|
+
# Copyright 2022 Ball Aerospace & Technologies Corp.
|
3
|
+
# All Rights Reserved.
|
4
|
+
#
|
5
|
+
# This program is free software; you can modify and/or redistribute it
|
6
|
+
# under the terms of the GNU Affero General Public License
|
7
|
+
# as published by the Free Software Foundation; version 3 with
|
8
|
+
# attribution addendums as found in the LICENSE.txt
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
*/
|
15
|
+
|
16
|
+
/*
|
17
|
+
# Modified by OpenC3, Inc.
|
18
|
+
# All changes Copyright 2022, OpenC3, Inc.
|
19
|
+
# All Rights Reserved
|
20
|
+
#
|
21
|
+
# This file may also be used under the terms of a commercial license
|
22
|
+
# if purchased from OpenC3, Inc.
|
23
|
+
*/
|
24
|
+
|
25
|
+
#include "ruby.h"
|
26
|
+
#include "stdio.h"
|
27
|
+
#include "math.h"
|
28
|
+
|
29
|
+
VALUE mOpenC3;
|
30
|
+
VALUE cMicroservice;
|
31
|
+
VALUE cReducerMicroservice;
|
32
|
+
|
33
|
+
static ID id_method_raw_values = 0;
|
34
|
+
static ID id_method_converted_values = 0;
|
35
|
+
static ID id_method_less_than = 0;
|
36
|
+
static ID id_method_greater_than = 0;
|
37
|
+
|
38
|
+
static int reducer_microservice_update_min_stats_raw_value(VALUE key, VALUE value, VALUE reduced)
|
39
|
+
{
|
40
|
+
volatile VALUE vals_key = Qnil;
|
41
|
+
volatile VALUE n_key = Qnil;
|
42
|
+
volatile VALUE x_key = Qnil;
|
43
|
+
volatile VALUE reduced_entry = Qnil;
|
44
|
+
|
45
|
+
if (RTEST(value))
|
46
|
+
{
|
47
|
+
vals_key = rb_str_new(RSTRING_PTR(key), RSTRING_LEN(key));
|
48
|
+
rb_str_append(vals_key, rb_str_new2("__VALS"));
|
49
|
+
reduced_entry = rb_hash_aref(reduced, vals_key);
|
50
|
+
if (!(RTEST(reduced_entry)))
|
51
|
+
{
|
52
|
+
reduced_entry = rb_ary_new();
|
53
|
+
rb_hash_aset(reduced, vals_key, reduced_entry);
|
54
|
+
}
|
55
|
+
rb_ary_push(reduced_entry, value);
|
56
|
+
|
57
|
+
n_key = rb_str_new(RSTRING_PTR(key), RSTRING_LEN(key));
|
58
|
+
rb_str_append(n_key, rb_str_new2("__N"));
|
59
|
+
reduced_entry = rb_hash_aref(reduced, n_key);
|
60
|
+
if (!(RTEST(reduced_entry)))
|
61
|
+
{
|
62
|
+
reduced_entry = value;
|
63
|
+
rb_hash_aset(reduced, n_key, value);
|
64
|
+
}
|
65
|
+
if (RTEST(rb_funcall(value, id_method_less_than, 1, reduced_entry)))
|
66
|
+
{
|
67
|
+
rb_hash_aset(reduced, n_key, value);
|
68
|
+
}
|
69
|
+
|
70
|
+
x_key = rb_str_new(RSTRING_PTR(key), RSTRING_LEN(key));
|
71
|
+
rb_str_append(x_key, rb_str_new2("__X"));
|
72
|
+
reduced_entry = rb_hash_aref(reduced, x_key);
|
73
|
+
if (!(RTEST(reduced_entry)))
|
74
|
+
{
|
75
|
+
reduced_entry = value;
|
76
|
+
rb_hash_aset(reduced, x_key, value);
|
77
|
+
}
|
78
|
+
if (RTEST(rb_funcall(value, id_method_greater_than, 1, reduced_entry)))
|
79
|
+
{
|
80
|
+
rb_hash_aset(reduced, x_key, value);
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
return ST_CONTINUE;
|
85
|
+
}
|
86
|
+
|
87
|
+
static int reducer_microservice_update_min_stats_converted_value(VALUE key, VALUE value, VALUE reduced)
|
88
|
+
{
|
89
|
+
volatile VALUE cvals_key = Qnil;
|
90
|
+
volatile VALUE cn_key = Qnil;
|
91
|
+
volatile VALUE cx_key = Qnil;
|
92
|
+
volatile VALUE reduced_entry = Qnil;
|
93
|
+
|
94
|
+
if (RTEST(value))
|
95
|
+
{
|
96
|
+
cvals_key = rb_str_new(RSTRING_PTR(key), RSTRING_LEN(key));
|
97
|
+
rb_str_append(cvals_key, rb_str_new2("__CVALS"));
|
98
|
+
reduced_entry = rb_hash_aref(reduced, cvals_key);
|
99
|
+
if (!(RTEST(reduced_entry)))
|
100
|
+
{
|
101
|
+
reduced_entry = rb_ary_new();
|
102
|
+
rb_hash_aset(reduced, cvals_key, reduced_entry);
|
103
|
+
}
|
104
|
+
rb_ary_push(reduced_entry, value);
|
105
|
+
|
106
|
+
cn_key = rb_str_new(RSTRING_PTR(key), RSTRING_LEN(key));
|
107
|
+
rb_str_append(cn_key, rb_str_new2("__CN"));
|
108
|
+
reduced_entry = rb_hash_aref(reduced, cn_key);
|
109
|
+
if (!(RTEST(reduced_entry)))
|
110
|
+
{
|
111
|
+
reduced_entry = value;
|
112
|
+
rb_hash_aset(reduced, cn_key, value);
|
113
|
+
}
|
114
|
+
if (RTEST(rb_funcall(value, id_method_less_than, 1, reduced_entry)))
|
115
|
+
{
|
116
|
+
rb_hash_aset(reduced, cn_key, value);
|
117
|
+
}
|
118
|
+
|
119
|
+
cx_key = rb_str_new(RSTRING_PTR(key), RSTRING_LEN(key));
|
120
|
+
rb_str_append(cx_key, rb_str_new2("__CX"));
|
121
|
+
reduced_entry = rb_hash_aref(reduced, cx_key);
|
122
|
+
if (!(RTEST(reduced_entry)))
|
123
|
+
{
|
124
|
+
reduced_entry = value;
|
125
|
+
rb_hash_aset(reduced, cx_key, value);
|
126
|
+
}
|
127
|
+
if (RTEST(rb_funcall(value, id_method_greater_than, 1, reduced_entry)))
|
128
|
+
{
|
129
|
+
rb_hash_aset(reduced, cx_key, value);
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
return ST_CONTINUE;
|
134
|
+
}
|
135
|
+
|
136
|
+
static VALUE reducer_microservice_update_min_stats(VALUE self, VALUE reduced, VALUE state)
|
137
|
+
{
|
138
|
+
volatile VALUE raw_values = rb_funcall(state, id_method_raw_values, 0);
|
139
|
+
volatile VALUE converted_values = rb_funcall(state, id_method_converted_values, 0);
|
140
|
+
|
141
|
+
/* Update statistics for this packet's raw values */
|
142
|
+
rb_hash_foreach(raw_values, reducer_microservice_update_min_stats_raw_value, reduced);
|
143
|
+
|
144
|
+
/* Update statistics for this packet's converted values */
|
145
|
+
rb_hash_foreach(converted_values, reducer_microservice_update_min_stats_converted_value, reduced);
|
146
|
+
|
147
|
+
return Qnil;
|
148
|
+
}
|
149
|
+
|
150
|
+
/*
|
151
|
+
* Initialize methods for ReducerMicroservice
|
152
|
+
*/
|
153
|
+
void Init_reducer_microservice(void)
|
154
|
+
{
|
155
|
+
id_method_raw_values = rb_intern("raw_values");
|
156
|
+
id_method_converted_values = rb_intern("converted_values");
|
157
|
+
id_method_less_than = rb_intern("<");
|
158
|
+
id_method_greater_than = rb_intern(">");
|
159
|
+
|
160
|
+
mOpenC3 = rb_define_module("OpenC3");
|
161
|
+
rb_require("openc3/conversions/conversion");
|
162
|
+
cMicroservice = rb_const_get(mOpenC3, rb_intern("Microservice"));
|
163
|
+
cReducerMicroservice = rb_define_class_under(mOpenC3, "ReducerMicroservice", cMicroservice);
|
164
|
+
rb_define_method(cReducerMicroservice, "update_min_stats", reducer_microservice_update_min_stats, 2);
|
165
|
+
}
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# All changes Copyright 2022, OpenC3, Inc.
|
19
19
|
# All Rights Reserved
|
20
20
|
#
|
21
|
-
# This file may also be used under the terms of a commercial license
|
21
|
+
# This file may also be used under the terms of a commercial license
|
22
22
|
# if purchased from OpenC3, Inc.
|
23
23
|
*/
|
24
24
|
|
@@ -64,6 +64,8 @@ static ID id_method_Integer = 0;
|
|
64
64
|
static ID id_method_Float = 0;
|
65
65
|
static ID id_method_kind_of = 0;
|
66
66
|
static ID id_method_allocate_buffer_if_needed = 0;
|
67
|
+
static ID id_method_new = 0;
|
68
|
+
static ID id_method_class2 = 0;
|
67
69
|
|
68
70
|
static ID id_ivar_buffer = 0;
|
69
71
|
static ID id_ivar_bit_offset = 0;
|
@@ -1304,21 +1306,15 @@ static VALUE structure_length(VALUE self)
|
|
1304
1306
|
|
1305
1307
|
static VALUE read_item_internal(VALUE self, VALUE item, VALUE buffer)
|
1306
1308
|
{
|
1307
|
-
volatile VALUE data_type = Qnil;
|
1308
1309
|
volatile VALUE accessor = Qnil;
|
1309
1310
|
|
1310
|
-
|
1311
|
-
if (data_type == symbol_DERIVED)
|
1312
|
-
{
|
1313
|
-
return Qnil;
|
1314
|
-
}
|
1311
|
+
accessor = rb_ivar_get(self, id_ivar_accessor);
|
1315
1312
|
|
1316
1313
|
if (!(RTEST(buffer)))
|
1317
1314
|
{
|
1318
1315
|
buffer = rb_funcall(self, id_method_allocate_buffer_if_needed, 0);
|
1319
1316
|
}
|
1320
1317
|
|
1321
|
-
accessor = rb_ivar_get(self, id_ivar_accessor);
|
1322
1318
|
return rb_funcall(accessor, id_method_read_item, 2, item, buffer);
|
1323
1319
|
}
|
1324
1320
|
|
@@ -1556,7 +1552,7 @@ static VALUE structure_initialize(int argc, VALUE *argv, VALUE self)
|
|
1556
1552
|
rb_ivar_set(self, id_ivar_fixed_size, Qtrue);
|
1557
1553
|
rb_ivar_set(self, id_ivar_short_buffer_allowed, Qfalse);
|
1558
1554
|
rb_ivar_set(self, id_ivar_mutex, Qnil);
|
1559
|
-
rb_ivar_set(self, id_ivar_accessor, cBinaryAccessor);
|
1555
|
+
rb_ivar_set(self, id_ivar_accessor, rb_funcall(cBinaryAccessor, id_method_new, 1, self));
|
1560
1556
|
}
|
1561
1557
|
else
|
1562
1558
|
{
|
@@ -1605,6 +1601,7 @@ void Init_structure(void)
|
|
1605
1601
|
cAccessor = rb_define_class_under(mOpenC3, "Accessor", rb_cObject);
|
1606
1602
|
cBinaryAccessor = rb_define_class_under(mOpenC3, "BinaryAccessor", cAccessor);
|
1607
1603
|
|
1604
|
+
id_method_class2 = rb_intern("class");
|
1608
1605
|
id_method_to_s = rb_intern("to_s");
|
1609
1606
|
id_method_raise_buffer_error = rb_intern("raise_buffer_error");
|
1610
1607
|
id_method_read_array = rb_intern("read_array");
|
@@ -1617,6 +1614,7 @@ void Init_structure(void)
|
|
1617
1614
|
id_method_Float = rb_intern("Float");
|
1618
1615
|
id_method_kind_of = rb_intern("kind_of?");
|
1619
1616
|
id_method_allocate_buffer_if_needed = rb_intern("allocate_buffer_if_needed");
|
1617
|
+
id_method_new = rb_intern("new");
|
1620
1618
|
|
1621
1619
|
MIN_INT8 = INT2NUM(-128);
|
1622
1620
|
MAX_INT8 = INT2NUM(127);
|
@@ -13,16 +13,66 @@
|
|
13
13
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
14
|
# GNU Affero General Public License for more details.
|
15
15
|
#
|
16
|
-
# 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
|
17
17
|
# if purchased from OpenC3, Inc.
|
18
18
|
|
19
19
|
module OpenC3
|
20
20
|
class Accessor
|
21
|
+
attr_accessor :packet
|
22
|
+
|
23
|
+
def initialize(packet = nil)
|
24
|
+
@packet = packet
|
25
|
+
@args = []
|
26
|
+
end
|
27
|
+
|
21
28
|
def read_item(item, buffer)
|
22
|
-
|
29
|
+
self.class.read_item(item, buffer)
|
23
30
|
end
|
24
31
|
|
25
32
|
def write_item(item, value, buffer)
|
33
|
+
self.class.write_item(item, value, buffer)
|
34
|
+
end
|
35
|
+
|
36
|
+
def read_items(items, buffer)
|
37
|
+
result = {}
|
38
|
+
items.each do |item|
|
39
|
+
result[item.name] = read_item(item, buffer)
|
40
|
+
end
|
41
|
+
return result
|
42
|
+
end
|
43
|
+
|
44
|
+
def write_items(items, values, buffer)
|
45
|
+
items.each_with_index do |item, index|
|
46
|
+
write_item(item, values[index], buffer)
|
47
|
+
end
|
48
|
+
return values
|
49
|
+
end
|
50
|
+
|
51
|
+
def args
|
52
|
+
return @args
|
53
|
+
end
|
54
|
+
|
55
|
+
def enforce_encoding
|
56
|
+
return 'ASCII-8BIT'.freeze
|
57
|
+
end
|
58
|
+
|
59
|
+
def enforce_length
|
60
|
+
return true
|
61
|
+
end
|
62
|
+
|
63
|
+
def enforce_short_buffer_allowed
|
64
|
+
return false
|
65
|
+
end
|
66
|
+
|
67
|
+
def enforce_derived_write_conversion(item)
|
68
|
+
return true
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.read_item(item, buffer)
|
72
|
+
raise "Must be defined by subclass"
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.write_item(item, value, buffer)
|
26
76
|
raise "Must be defined by subclass"
|
27
77
|
end
|
28
78
|
|
@@ -38,7 +88,7 @@ module OpenC3
|
|
38
88
|
items.each_with_index do |item, index|
|
39
89
|
write_item(item, values[index], buffer)
|
40
90
|
end
|
41
|
-
return
|
91
|
+
return values
|
42
92
|
end
|
43
93
|
|
44
94
|
def self.convert_to_type(value, item)
|
@@ -1228,5 +1228,21 @@ module OpenC3
|
|
1228
1228
|
end
|
1229
1229
|
values
|
1230
1230
|
end
|
1231
|
+
|
1232
|
+
def enforce_encoding
|
1233
|
+
return 'ASCII-8BIT'.freeze
|
1234
|
+
end
|
1235
|
+
|
1236
|
+
def enforce_length
|
1237
|
+
return true
|
1238
|
+
end
|
1239
|
+
|
1240
|
+
def enforce_short_buffer_allowed
|
1241
|
+
return false
|
1242
|
+
end
|
1243
|
+
|
1244
|
+
def enforce_derived_write_conversion(item)
|
1245
|
+
return true
|
1246
|
+
end
|
1231
1247
|
end # class BinaryAccessor
|
1232
1248
|
end
|
@@ -13,7 +13,7 @@
|
|
13
13
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
14
|
# GNU Affero General Public License for more details.
|
15
15
|
#
|
16
|
-
# 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
|
17
17
|
# if purchased from OpenC3, Inc.
|
18
18
|
|
19
19
|
require 'cbor'
|
@@ -49,7 +49,7 @@ module OpenC3
|
|
49
49
|
buffer.replace(decoded.to_cbor)
|
50
50
|
end
|
51
51
|
|
52
|
-
return
|
52
|
+
return value
|
53
53
|
end
|
54
54
|
|
55
55
|
def self.read_items(items, buffer)
|
@@ -79,7 +79,7 @@ module OpenC3
|
|
79
79
|
buffer.replace(decoded.to_cbor)
|
80
80
|
end
|
81
81
|
|
82
|
-
return
|
82
|
+
return values
|
83
83
|
end
|
84
84
|
|
85
85
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# encoding: ascii-8bit
|
2
|
+
|
3
|
+
# Copyright 2023 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/accessors/accessor'
|
20
|
+
require 'uri'
|
21
|
+
|
22
|
+
module OpenC3
|
23
|
+
class FormAccessor < Accessor
|
24
|
+
def self.read_item(item, buffer)
|
25
|
+
ary = URI.decode_www_form(buffer)
|
26
|
+
value = nil
|
27
|
+
ary.each do |key, ary_value|
|
28
|
+
if key == item.key
|
29
|
+
if value
|
30
|
+
if not Array === value
|
31
|
+
value_temp = []
|
32
|
+
value_temp << value
|
33
|
+
value = value_temp
|
34
|
+
end
|
35
|
+
value << ary_value
|
36
|
+
else
|
37
|
+
value = ary_value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
return value
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.write_item(item, value, buffer)
|
45
|
+
ary = URI.decode_www_form(buffer)
|
46
|
+
|
47
|
+
# Remove existing item and bad keys from array
|
48
|
+
ary.reject! {|key, ary_value| (key == item.key) or (key.to_s[0] == "\u0000")}
|
49
|
+
|
50
|
+
if Array === value
|
51
|
+
value.each do |value_value|
|
52
|
+
ary << [item.key, value_value]
|
53
|
+
end
|
54
|
+
else
|
55
|
+
ary << [item.key, value]
|
56
|
+
end
|
57
|
+
|
58
|
+
buffer.replace(URI.encode_www_form(ary))
|
59
|
+
return value
|
60
|
+
end
|
61
|
+
|
62
|
+
def enforce_encoding
|
63
|
+
return nil
|
64
|
+
end
|
65
|
+
|
66
|
+
def enforce_length
|
67
|
+
return false
|
68
|
+
end
|
69
|
+
|
70
|
+
def enforce_short_buffer_allowed
|
71
|
+
return true
|
72
|
+
end
|
73
|
+
|
74
|
+
def enforce_derived_write_conversion(item)
|
75
|
+
return true
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# encoding: ascii-8bit
|
2
|
+
|
3
|
+
# Copyright 2023 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/accessors/accessor'
|
20
|
+
|
21
|
+
module OpenC3
|
22
|
+
class HttpAccessor < Accessor
|
23
|
+
def initialize(packet, body_accessor = 'FormAccessor', *body_accessor_args)
|
24
|
+
super(packet)
|
25
|
+
@args << body_accessor
|
26
|
+
body_accessor_args.each do |arg|
|
27
|
+
@args << arg
|
28
|
+
end
|
29
|
+
klass = OpenC3.require_class(body_accessor)
|
30
|
+
@body_accessor = klass.new(packet, *body_accessor_args)
|
31
|
+
end
|
32
|
+
|
33
|
+
def read_item(item, buffer)
|
34
|
+
item_name = item.name
|
35
|
+
case item_name
|
36
|
+
when 'HTTP_STATUS'
|
37
|
+
return nil unless @packet.extra
|
38
|
+
return @packet.extra['HTTP_STATUS']
|
39
|
+
when 'HTTP_PATH'
|
40
|
+
return nil unless @packet.extra
|
41
|
+
return @packet.extra['HTTP_PATH']
|
42
|
+
when 'HTTP_METHOD'
|
43
|
+
return nil unless @packet.extra
|
44
|
+
return @packet.extra['HTTP_METHOD']
|
45
|
+
when 'HTTP_PACKET'
|
46
|
+
return nil unless @packet.extra
|
47
|
+
return @packet.extra['HTTP_PACKET']
|
48
|
+
when 'HTTP_ERROR_PACKET'
|
49
|
+
return nil unless @packet.extra
|
50
|
+
return @packet.extra['HTTP_ERROR_PACKET']
|
51
|
+
when /^HTTP_QUERY_/
|
52
|
+
return nil unless @packet.extra
|
53
|
+
if item.key
|
54
|
+
query_name = item.key
|
55
|
+
else
|
56
|
+
query_name = item_name[11..-1]
|
57
|
+
end
|
58
|
+
queries = @packet.extra['HTTP_QUERIES']
|
59
|
+
if queries
|
60
|
+
return queries[query_name]
|
61
|
+
else
|
62
|
+
return nil
|
63
|
+
end
|
64
|
+
when /^HTTP_HEADER_/
|
65
|
+
return nil unless @packet.extra
|
66
|
+
if item.key
|
67
|
+
header_name = item.key
|
68
|
+
else
|
69
|
+
header_name = item_name[12..-1]
|
70
|
+
end
|
71
|
+
headers = @packet.extra['HTTP_HEADERS']
|
72
|
+
if headers
|
73
|
+
return headers[header_name]
|
74
|
+
else
|
75
|
+
return nil
|
76
|
+
end
|
77
|
+
else
|
78
|
+
return @body_accessor.read_item(item, buffer)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def write_item(item, value, buffer)
|
83
|
+
item_name = item.name
|
84
|
+
case item_name
|
85
|
+
when 'HTTP_STATUS'
|
86
|
+
@packet.extra ||= {}
|
87
|
+
@packet.extra['HTTP_STATUS'] = value.to_i
|
88
|
+
when 'HTTP_PATH'
|
89
|
+
@packet.extra ||= {}
|
90
|
+
@packet.extra['HTTP_PATH'] = value.to_s
|
91
|
+
when 'HTTP_METHOD'
|
92
|
+
@packet.extra ||= {}
|
93
|
+
@packet.extra['HTTP_METHOD'] = value.to_s.downcase
|
94
|
+
when 'HTTP_PACKET'
|
95
|
+
@packet.extra ||= {}
|
96
|
+
@packet.extra['HTTP_PACKET'] = value.to_s.upcase
|
97
|
+
when 'HTTP_ERROR_PACKET'
|
98
|
+
@packet.extra ||= {}
|
99
|
+
@packet.extra['HTTP_ERROR_PACKET'] = value.to_s.upcase
|
100
|
+
when /^HTTP_QUERY_/
|
101
|
+
@packet.extra ||= {}
|
102
|
+
if item.key
|
103
|
+
query_name = item.key
|
104
|
+
else
|
105
|
+
query_name = item_name[11..-1]
|
106
|
+
end
|
107
|
+
queries = @packet.extra['HTTP_QUERIES'] ||= {}
|
108
|
+
queries[query_name] = value.to_s
|
109
|
+
when /^HTTP_HEADER_/
|
110
|
+
@packet.extra ||= {}
|
111
|
+
if item.key
|
112
|
+
header_name = item.key
|
113
|
+
else
|
114
|
+
header_name = item_name[12..-1]
|
115
|
+
end
|
116
|
+
headers = @packet.extra['HTTP_HEADERS'] ||= {}
|
117
|
+
headers[header_name] = value.to_s
|
118
|
+
else
|
119
|
+
@body_accessor.write_item(item, value, buffer)
|
120
|
+
end
|
121
|
+
return value
|
122
|
+
end
|
123
|
+
|
124
|
+
def enforce_encoding
|
125
|
+
return @body_accessor.enforce_encoding
|
126
|
+
end
|
127
|
+
|
128
|
+
def enforce_length
|
129
|
+
return @body_accessor.enforce_length
|
130
|
+
end
|
131
|
+
|
132
|
+
def enforce_short_buffer_allowed
|
133
|
+
return @body_accessor.enforce_short_buffer_allowed
|
134
|
+
end
|
135
|
+
|
136
|
+
def enforce_derived_write_conversion(item)
|
137
|
+
case item.name
|
138
|
+
when 'HTTP_STATUS', 'HTTP_PATH', 'HTTP_METHOD', 'HTTP_PACKET', 'HTTP_ERROR_PACKET', /^HTTP_QUERY_/, /^HTTP_HEADER_/
|
139
|
+
return false
|
140
|
+
else
|
141
|
+
return @body_accessor.enforce_derived_write_conversion
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|