etna 0.1.41 → 0.1.42
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 +4 -4
- data/etna.completion +52 -3
- data/lib/commands.rb +19 -0
- data/lib/etna/application.rb +15 -0
- data/lib/etna/censor.rb +36 -0
- data/lib/etna/clients/magma/models.rb +10 -2
- data/lib/etna/clients/metis/client.rb +25 -1
- data/lib/etna/clients/metis/models.rb +86 -2
- data/lib/etna/clients/metis/workflows/metis_upload_workflow.rb +0 -2
- data/lib/etna/controller.rb +32 -1
- data/lib/etna/route.rb +4 -34
- data/lib/etna/synchronize_db.rb +14 -0
- data/lib/etna.rb +1 -0
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0d599cb16d9abc7427f3fbd3760fe293a039f355f4ebd94243757d9d434dbe27
|
|
4
|
+
data.tar.gz: '0834c3692bdd1db0008272b478f854b5da5b31aea19e0f42435e12f1dcee333d'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8a3c1e354ccc5af8de5fee06bbc629d43b170d51bb55eee76d1d3fc3157a4b4e6d1bfab52830d9003d26944cd54cc4a0405c472752b5cd1ea36b8f3216f80e13
|
|
7
|
+
data.tar.gz: 5004d00104765e18193116ee76574a27db03fc40ad5d2ec6fea7731ab5081dd1c7589081fcb98b3cc8be1c8645d2659548df2983e9b6506e6914739351ee26a8
|
data/etna.completion
CHANGED
|
@@ -84,7 +84,7 @@ arg_flag_completion_names="$arg_flag_completion_names "
|
|
|
84
84
|
multi_flags="$multi_flags "
|
|
85
85
|
while [[ "$#" != "0" ]]; do
|
|
86
86
|
if [[ "$#" == "1" ]]; then
|
|
87
|
-
all_completion_names="apply_template attributes copy_template help load_from_redcap"
|
|
87
|
+
all_completion_names="apply_template attributes copy_template help load_from_redcap set_date_shift_root"
|
|
88
88
|
all_completion_names="$all_completion_names $all_flag_completion_names"
|
|
89
89
|
if [[ -z "$(echo $all_completion_names | xargs)" ]]; then
|
|
90
90
|
return
|
|
@@ -568,6 +568,54 @@ return
|
|
|
568
568
|
fi
|
|
569
569
|
done
|
|
570
570
|
return
|
|
571
|
+
elif [[ "$1" == "set_date_shift_root" ]]; then
|
|
572
|
+
shift
|
|
573
|
+
if [[ "$#" == "1" ]]; then
|
|
574
|
+
all_completion_names="__project_name__"
|
|
575
|
+
if [[ -z "$(echo $all_completion_names | xargs)" ]]; then
|
|
576
|
+
return
|
|
577
|
+
fi
|
|
578
|
+
COMPREPLY=($(compgen -W "$all_completion_names" -- "$1"))
|
|
579
|
+
return
|
|
580
|
+
fi
|
|
581
|
+
shift
|
|
582
|
+
all_flag_completion_names="$all_flag_completion_names --date-shift-root --target-model "
|
|
583
|
+
arg_flag_completion_names="$arg_flag_completion_names --target-model "
|
|
584
|
+
multi_flags="$multi_flags "
|
|
585
|
+
declare _completions_for_target_model="__target_model__"
|
|
586
|
+
while [[ "$#" != "0" ]]; do
|
|
587
|
+
if [[ "$#" == "1" ]]; then
|
|
588
|
+
all_completion_names=""
|
|
589
|
+
all_completion_names="$all_completion_names $all_flag_completion_names"
|
|
590
|
+
if [[ -z "$(echo $all_completion_names | xargs)" ]]; then
|
|
591
|
+
return
|
|
592
|
+
fi
|
|
593
|
+
COMPREPLY=($(compgen -W "$all_completion_names" -- "$1"))
|
|
594
|
+
return
|
|
595
|
+
elif [[ -z "$(echo $all_flag_completion_names | xargs)" ]]; then
|
|
596
|
+
return
|
|
597
|
+
elif [[ "$all_flag_completion_names" =~ $1\ ]]; then
|
|
598
|
+
if ! [[ "$multi_flags" =~ $1\ ]]; then
|
|
599
|
+
all_flag_completion_names="${all_flag_completion_names//$1\ /}"
|
|
600
|
+
fi
|
|
601
|
+
a=$1
|
|
602
|
+
shift
|
|
603
|
+
if [[ "$arg_flag_completion_names" =~ $a\ ]]; then
|
|
604
|
+
if [[ "$#" == "1" ]]; then
|
|
605
|
+
a="${a//--/}"
|
|
606
|
+
a="${a//-/_}"
|
|
607
|
+
i="_completions_for_$a"
|
|
608
|
+
all_completion_names="${!i}"
|
|
609
|
+
COMPREPLY=($(compgen -W "$all_completion_names" -- "$1"))
|
|
610
|
+
return
|
|
611
|
+
fi
|
|
612
|
+
shift
|
|
613
|
+
fi
|
|
614
|
+
else
|
|
615
|
+
return
|
|
616
|
+
fi
|
|
617
|
+
done
|
|
618
|
+
return
|
|
571
619
|
elif [[ -z "$(echo $all_flag_completion_names | xargs)" ]]; then
|
|
572
620
|
return
|
|
573
621
|
elif [[ "$all_flag_completion_names" =~ $1\ ]]; then
|
|
@@ -738,10 +786,11 @@ COMPREPLY=($(compgen -W "$all_completion_names" -- "$1"))
|
|
|
738
786
|
return
|
|
739
787
|
elif [[ "$1" == "generate" ]]; then
|
|
740
788
|
shift
|
|
741
|
-
all_flag_completion_names="$all_flag_completion_names --task --project-name "
|
|
742
|
-
arg_flag_completion_names="$arg_flag_completion_names --project-name "
|
|
789
|
+
all_flag_completion_names="$all_flag_completion_names --task --project-name --email "
|
|
790
|
+
arg_flag_completion_names="$arg_flag_completion_names --project-name --email "
|
|
743
791
|
multi_flags="$multi_flags "
|
|
744
792
|
declare _completions_for_project_name="__project_name__"
|
|
793
|
+
declare _completions_for_email="__email__"
|
|
745
794
|
while [[ "$#" != "0" ]]; do
|
|
746
795
|
if [[ "$#" == "1" ]]; then
|
|
747
796
|
all_completion_names=""
|
data/lib/commands.rb
CHANGED
|
@@ -411,6 +411,25 @@ class EtnaApp
|
|
|
411
411
|
end
|
|
412
412
|
end
|
|
413
413
|
end
|
|
414
|
+
|
|
415
|
+
class SetDateShiftRoot < Etna::Command
|
|
416
|
+
include WithEtnaClients
|
|
417
|
+
include WithLogger
|
|
418
|
+
include StrongConfirmation
|
|
419
|
+
|
|
420
|
+
boolean_flags << '--date-shift-root'
|
|
421
|
+
string_flags << '--target-model'
|
|
422
|
+
|
|
423
|
+
def execute(project_name, target_model: 'subject', date_shift_root: false)
|
|
424
|
+
magma_client.update_model(Etna::Clients::Magma::UpdateModelRequest.new(
|
|
425
|
+
actions:[Etna::Clients::Magma::SetDateShiftRootAction.new(
|
|
426
|
+
model_name: target_model,
|
|
427
|
+
date_shift_root: date_shift_root
|
|
428
|
+
)],
|
|
429
|
+
project_name: project_name,
|
|
430
|
+
))
|
|
431
|
+
end
|
|
432
|
+
end
|
|
414
433
|
end
|
|
415
434
|
end
|
|
416
435
|
|
data/lib/etna/application.rb
CHANGED
|
@@ -53,6 +53,21 @@ module Etna::Application
|
|
|
53
53
|
def configure(opts)
|
|
54
54
|
@config = opts
|
|
55
55
|
|
|
56
|
+
# Apply environmental variables of the form "APP__x__y__z"
|
|
57
|
+
prefix = "#{self.class.name.upcase}__"
|
|
58
|
+
ENV.keys.select { |k| k.start_with?(prefix) }.each do |key|
|
|
59
|
+
path = key.split("__", -1)
|
|
60
|
+
path.shift # drop the first, just app name
|
|
61
|
+
|
|
62
|
+
target = @config
|
|
63
|
+
while path.length > 1
|
|
64
|
+
n = path.shift
|
|
65
|
+
target = (target[n.downcase.to_sym] ||= {})
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
target[path.last.downcase.to_sym] ||= ENV[key]
|
|
69
|
+
end
|
|
70
|
+
|
|
56
71
|
if (rollbar_config = config(:rollbar)) && rollbar_config[:access_token]
|
|
57
72
|
Rollbar.configure do |config|
|
|
58
73
|
config.access_token = rollbar_config[:access_token]
|
data/lib/etna/censor.rb
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Etna
|
|
2
|
+
class Censor
|
|
3
|
+
def initialize(log_redact_keys)
|
|
4
|
+
@log_redact_keys = log_redact_keys
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def redact_keys
|
|
8
|
+
@log_redact_keys
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def redact(key, value)
|
|
12
|
+
# Redact any values for the supplied key values, so they
|
|
13
|
+
# don't appear in the logs.
|
|
14
|
+
return compact(value) unless redact_keys
|
|
15
|
+
|
|
16
|
+
if redact_keys.include?(key)
|
|
17
|
+
return "*"
|
|
18
|
+
elsif value.is_a?(Hash)
|
|
19
|
+
redacted_value = value.map do |value_key, value_value|
|
|
20
|
+
[value_key, redact(value_key, value_value)]
|
|
21
|
+
end.to_h
|
|
22
|
+
return redacted_value
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
return compact(value)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def compact(value)
|
|
31
|
+
value = value.to_s
|
|
32
|
+
value = value[0..500] + "..." + value[-100..-1] if value.length > 600
|
|
33
|
+
value
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -58,11 +58,19 @@ module Etna
|
|
|
58
58
|
end
|
|
59
59
|
end
|
|
60
60
|
|
|
61
|
-
class AddModelAction < Struct.new(:action_name, :model_name, :parent_model_name, :parent_link_type, :identifier, keyword_init: true)
|
|
61
|
+
class AddModelAction < Struct.new(:action_name, :model_name, :parent_model_name, :parent_link_type, :identifier, :date_shift_root, keyword_init: true)
|
|
62
62
|
include JsonSerializableStruct
|
|
63
63
|
|
|
64
64
|
def initialize(**args)
|
|
65
|
-
super({action_name: 'add_model'}.update(args))
|
|
65
|
+
super({action_name: 'add_model', date_shift_root: false}.update(args))
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
class SetDateShiftRootAction < Struct.new(:action_name, :model_name, :date_shift_root, keyword_init: true)
|
|
70
|
+
include JsonSerializableStruct
|
|
71
|
+
|
|
72
|
+
def initialize(**args)
|
|
73
|
+
super({action_name: 'set_date_shift_root'}.update(args))
|
|
66
74
|
end
|
|
67
75
|
end
|
|
68
76
|
|
|
@@ -28,6 +28,21 @@ module Etna
|
|
|
28
28
|
@etna_client.folder_list(list_folder_request.to_h))
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
+
def list_folder_by_id(list_folder_by_id_request = ListFolderByIdRequest.new)
|
|
32
|
+
FoldersAndFilesResponse.new(
|
|
33
|
+
@etna_client.folder_list_by_id(list_folder_by_id_request.to_h))
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def touch_folder(touch_folder_request = TouchFolderRequest.new)
|
|
37
|
+
FoldersResponse.new(
|
|
38
|
+
@etna_client.folder_touch(touch_folder_request.to_h))
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def touch_file(touch_file_request = TouchFileRequest.new)
|
|
42
|
+
FilesResponse.new(
|
|
43
|
+
@etna_client.file_touch(touch_file_request.to_h))
|
|
44
|
+
end
|
|
45
|
+
|
|
31
46
|
def ensure_parent_folder_exists(project_name:, bucket_name:, path:)
|
|
32
47
|
create_folder_request = CreateFolderRequest.new(
|
|
33
48
|
project_name: project_name,
|
|
@@ -181,7 +196,16 @@ module Etna
|
|
|
181
196
|
|
|
182
197
|
return if found_folders.length == 0
|
|
183
198
|
|
|
184
|
-
|
|
199
|
+
rename_folders(
|
|
200
|
+
project_name: project_name,
|
|
201
|
+
source_bucket: source_bucket,
|
|
202
|
+
source_folders: found_folders,
|
|
203
|
+
dest_bucket: dest_bucket
|
|
204
|
+
)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def rename_folders(project_name:, source_bucket:, source_folders:, dest_bucket:)
|
|
208
|
+
source_folders.each { |folder|
|
|
185
209
|
# If the destination folder already exists, we need to copy the files
|
|
186
210
|
# over to it and delete the source folder.
|
|
187
211
|
create_folder_request = CreateFolderRequest.new(
|
|
@@ -65,6 +65,51 @@ module Etna
|
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
|
|
68
|
+
class ListFolderByIdRequest < Struct.new(:project_name, :bucket_name, :folder_id, keyword_init: true)
|
|
69
|
+
include JsonSerializableStruct
|
|
70
|
+
|
|
71
|
+
def initialize(**params)
|
|
72
|
+
super({}.update(params))
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def to_h
|
|
76
|
+
# The :project_name comes in from Polyphemus as a symbol value,
|
|
77
|
+
# we need to make sure it's a string because it's going
|
|
78
|
+
# in the URL.
|
|
79
|
+
super().compact.transform_values(&:to_s)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
class TouchFolderRequest < Struct.new(:project_name, :bucket_name, :folder_path, keyword_init: true)
|
|
84
|
+
include JsonSerializableStruct
|
|
85
|
+
|
|
86
|
+
def initialize(**params)
|
|
87
|
+
super({}.update(params))
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def to_h
|
|
91
|
+
# The :project_name comes in from Polyphemus as a symbol value,
|
|
92
|
+
# we need to make sure it's a string because it's going
|
|
93
|
+
# in the URL.
|
|
94
|
+
super().compact.transform_values(&:to_s)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
class TouchFileRequest < Struct.new(:project_name, :bucket_name, :file_path, keyword_init: true)
|
|
99
|
+
include JsonSerializableStruct
|
|
100
|
+
|
|
101
|
+
def initialize(**params)
|
|
102
|
+
super({}.update(params))
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def to_h
|
|
106
|
+
# The :project_name comes in from Polyphemus as a symbol value,
|
|
107
|
+
# we need to make sure it's a string because it's going
|
|
108
|
+
# in the URL.
|
|
109
|
+
super().compact.transform_values(&:to_s)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
68
113
|
class CreateFolderRequest < Struct.new(:project_name, :bucket_name, :folder_path, keyword_init: true)
|
|
69
114
|
include JsonSerializableStruct
|
|
70
115
|
|
|
@@ -110,11 +155,11 @@ module Etna
|
|
|
110
155
|
end
|
|
111
156
|
end
|
|
112
157
|
|
|
113
|
-
class FindRequest < Struct.new(:project_name, :bucket_name, :limit, :offset, :params, keyword_init: true)
|
|
158
|
+
class FindRequest < Struct.new(:project_name, :bucket_name, :limit, :offset, :params, :hide_paths, keyword_init: true)
|
|
114
159
|
include JsonSerializableStruct
|
|
115
160
|
|
|
116
161
|
def initialize(**args)
|
|
117
|
-
super({params: []}.update(args))
|
|
162
|
+
super({params: [], hide_paths: false}.update(args))
|
|
118
163
|
end
|
|
119
164
|
|
|
120
165
|
def add_param(param)
|
|
@@ -126,6 +171,17 @@ module Etna
|
|
|
126
171
|
# easier to do from a JSON string
|
|
127
172
|
JSON.parse(to_json, :symbolize_names => true)
|
|
128
173
|
end
|
|
174
|
+
|
|
175
|
+
def clone
|
|
176
|
+
FindRequest.new(
|
|
177
|
+
project_name: self.project_name,
|
|
178
|
+
bucket_name: self.bucket_name,
|
|
179
|
+
limit: self.limit,
|
|
180
|
+
offset: self.offset,
|
|
181
|
+
params: self.params.dup,
|
|
182
|
+
hide_paths: self.hide_paths
|
|
183
|
+
)
|
|
184
|
+
end
|
|
129
185
|
end
|
|
130
186
|
|
|
131
187
|
class FindParam < Struct.new(:attribute, :predicate, :value, :type, keyword_init: true)
|
|
@@ -225,6 +281,13 @@ module Etna
|
|
|
225
281
|
@raw = raw
|
|
226
282
|
end
|
|
227
283
|
|
|
284
|
+
def with_containing_folder(folder)
|
|
285
|
+
folder_path = folder.is_a?(Folder) ? folder.folder_path : folder
|
|
286
|
+
File.new({}.update(self.raw).update({
|
|
287
|
+
file_path: ::File.join(folder_path, self.file_name)
|
|
288
|
+
}))
|
|
289
|
+
end
|
|
290
|
+
|
|
228
291
|
def file_path
|
|
229
292
|
raw[:file_path]
|
|
230
293
|
end
|
|
@@ -259,6 +322,14 @@ module Etna
|
|
|
259
322
|
def size
|
|
260
323
|
raw[:size]
|
|
261
324
|
end
|
|
325
|
+
|
|
326
|
+
def file_hash
|
|
327
|
+
raw[:file_hash]
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
def folder_id
|
|
331
|
+
raw[:folder_id]
|
|
332
|
+
end
|
|
262
333
|
end
|
|
263
334
|
|
|
264
335
|
class Folder
|
|
@@ -279,6 +350,19 @@ module Etna
|
|
|
279
350
|
def bucket_name
|
|
280
351
|
raw[:bucket_name]
|
|
281
352
|
end
|
|
353
|
+
|
|
354
|
+
def project_name
|
|
355
|
+
raw[:project_name]
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
def updated_at
|
|
359
|
+
time = raw[:updated_at]
|
|
360
|
+
time.nil? ? nil : Time.parse(time)
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def id
|
|
364
|
+
raw[:id]
|
|
365
|
+
end
|
|
282
366
|
end
|
|
283
367
|
|
|
284
368
|
class AuthorizeUploadRequest < Struct.new(:project_name, :bucket_name, :file_path, keyword_init: true)
|
|
@@ -110,8 +110,6 @@ module Etna
|
|
|
110
110
|
|
|
111
111
|
def initialize(source_file: nil, next_blob_size: nil, current_byte_position: nil)
|
|
112
112
|
self.source_file = source_file
|
|
113
|
-
self.next_blob_size = next_blob_size
|
|
114
|
-
self.current_byte_position = current_byte_position
|
|
115
113
|
self.next_blob_size = [file_size, INITIAL_BLOB_SIZE].min
|
|
116
114
|
self.current_byte_position = 0
|
|
117
115
|
end
|
data/lib/etna/controller.rb
CHANGED
|
@@ -42,7 +42,10 @@ module Etna
|
|
|
42
42
|
|
|
43
43
|
[501, {}, ['This controller is not implemented.']]
|
|
44
44
|
rescue Exception => e
|
|
45
|
-
|
|
45
|
+
error = e
|
|
46
|
+
ensure
|
|
47
|
+
log_request
|
|
48
|
+
return handle_error(error) if error
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
def require_params(*params)
|
|
@@ -82,8 +85,36 @@ module Etna
|
|
|
82
85
|
@response.finish
|
|
83
86
|
end
|
|
84
87
|
|
|
88
|
+
def config_hosts
|
|
89
|
+
[:janus, :magma, :timur, :metis, :vulcan, :polyphemus].map do |host|
|
|
90
|
+
[ :"#{host}_host", @server.send(:application).config(host)&.dig(:host) ]
|
|
91
|
+
end.to_h.compact
|
|
92
|
+
end
|
|
93
|
+
|
|
85
94
|
private
|
|
86
95
|
|
|
96
|
+
def redact_keys
|
|
97
|
+
@request.env['etna.redact_keys']
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def add_redact_keys(new_redact_keys=[])
|
|
101
|
+
@request.env['etna.redact_keys'] = (@request.env['etna.redact_keys'] || []).concat(new_redact_keys)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def log_request
|
|
105
|
+
censor = Etna::Censor.new(redact_keys)
|
|
106
|
+
|
|
107
|
+
redacted_params = @params.map do |key,value|
|
|
108
|
+
[ key, censor.redact(key, value) ]
|
|
109
|
+
end.to_h
|
|
110
|
+
|
|
111
|
+
log("User #{@user ? @user.email : :unknown} calling #{controller_name}##{@action} with params #{redacted_params}")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def controller_name
|
|
115
|
+
self.class.name.sub("Kernel::", "").sub("Controller", "").downcase
|
|
116
|
+
end
|
|
117
|
+
|
|
87
118
|
def success(msg, content_type='text/plain')
|
|
88
119
|
@response['Content-Type'] = content_type
|
|
89
120
|
@response.write(msg)
|
data/lib/etna/route.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require 'digest'
|
|
2
2
|
require 'date'
|
|
3
|
+
require_relative "./censor"
|
|
3
4
|
|
|
4
5
|
module Etna
|
|
5
6
|
class Route
|
|
@@ -13,6 +14,7 @@ module Etna
|
|
|
13
14
|
@route = route.gsub(/\A(?=[^\/])/, '/')
|
|
14
15
|
@block = block
|
|
15
16
|
@match_ext = options[:match_ext]
|
|
17
|
+
@log_redact_keys = options[:log_redact_keys]
|
|
16
18
|
end
|
|
17
19
|
|
|
18
20
|
def to_hash
|
|
@@ -124,6 +126,8 @@ module Etna
|
|
|
124
126
|
return [ 403, { 'Content-Type' => 'application/json' }, [ { error: 'You are forbidden from performing this action.' }.to_json ] ]
|
|
125
127
|
end
|
|
126
128
|
|
|
129
|
+
request.env['etna.redact_keys'] = @log_redact_keys
|
|
130
|
+
|
|
127
131
|
if @action
|
|
128
132
|
controller, action = @action.split('#')
|
|
129
133
|
controller_class = Kernel.const_get(
|
|
@@ -132,11 +136,6 @@ module Etna
|
|
|
132
136
|
logger = request.env['etna.logger']
|
|
133
137
|
user = request.env['etna.user']
|
|
134
138
|
|
|
135
|
-
params = request.env['rack.request.params'].map do |key,value|
|
|
136
|
-
[ key, redact(key, value) ]
|
|
137
|
-
end.to_h
|
|
138
|
-
|
|
139
|
-
logger.warn("User #{user ? user.email : :unknown} calling #{controller}##{action} with params #{params}")
|
|
140
139
|
return controller_class.new(request, action).response
|
|
141
140
|
elsif @block
|
|
142
141
|
application = Etna::Application.find(app.class).class
|
|
@@ -161,35 +160,6 @@ module Etna
|
|
|
161
160
|
@application ||= Etna::Application.instance
|
|
162
161
|
end
|
|
163
162
|
|
|
164
|
-
def compact(value)
|
|
165
|
-
value = value.to_s
|
|
166
|
-
value = value[0..500] + "..." + value[-100..-1] if value.length > 600
|
|
167
|
-
value
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
def redact_keys
|
|
171
|
-
@redact_keys ||= application.config(:log_redact_keys).split(",").map do |key|
|
|
172
|
-
key.to_sym
|
|
173
|
-
end
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
def redact(key, value)
|
|
177
|
-
# From configuration, redact any values for the supplied key values, so they
|
|
178
|
-
# don't appear in the logs.
|
|
179
|
-
return compact(value) unless application.config(:log_redact_keys)
|
|
180
|
-
|
|
181
|
-
if value.is_a?(Hash)
|
|
182
|
-
redacted_value = value.map do |value_key, value_value|
|
|
183
|
-
[ value_key, redact(value_key, value_value) ]
|
|
184
|
-
end.to_h
|
|
185
|
-
return redacted_value
|
|
186
|
-
elsif redact_keys.include?(key)
|
|
187
|
-
return "*"
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
return compact(value)
|
|
191
|
-
end
|
|
192
|
-
|
|
193
163
|
def authorized?(request)
|
|
194
164
|
# If there is no @auth requirement, they are ok - this doesn't preclude
|
|
195
165
|
# them being rejected in the controller response
|
data/lib/etna.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: etna
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.42
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Saurabh Asthana
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-10-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rack
|
|
@@ -138,6 +138,7 @@ files:
|
|
|
138
138
|
- lib/etna.rb
|
|
139
139
|
- lib/etna/application.rb
|
|
140
140
|
- lib/etna/auth.rb
|
|
141
|
+
- lib/etna/censor.rb
|
|
141
142
|
- lib/etna/client.rb
|
|
142
143
|
- lib/etna/clients.rb
|
|
143
144
|
- lib/etna/clients/base_client.rb
|
|
@@ -208,6 +209,7 @@ files:
|
|
|
208
209
|
- lib/etna/spec/auth.rb
|
|
209
210
|
- lib/etna/spec/vcr.rb
|
|
210
211
|
- lib/etna/symbolize_params.rb
|
|
212
|
+
- lib/etna/synchronize_db.rb
|
|
211
213
|
- lib/etna/templates/attribute_actions_template.json
|
|
212
214
|
- lib/etna/test_auth.rb
|
|
213
215
|
- lib/etna/user.rb
|