deepsecurity 0.0.19 → 0.0.20
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +15 -0
- data/Gemfile +5 -0
- data/bin/dsc +4 -61
- data/deepsecurity.gemspec +7 -2
- data/dsc.md +20 -18
- data/lib/deepsecurity.rb +11 -12
- data/lib/deepsecurity/manager.rb +55 -122
- data/lib/deepsecurity/soap_interface.rb +57 -0
- data/lib/deepsecurity/transport_object.rb +5 -1
- data/lib/deepsecurity/transport_objects/anti_malware_event.rb +26 -17
- data/lib/deepsecurity/transport_objects/host.rb +45 -36
- data/lib/deepsecurity/transport_objects/host_detail.rb +17 -45
- data/lib/deepsecurity/transport_objects/host_filter.rb +4 -4
- data/lib/deepsecurity/transport_objects/host_group.rb +38 -29
- data/lib/deepsecurity/transport_objects/id_filter.rb +3 -3
- data/lib/deepsecurity/transport_objects/system_event.rb +1 -1
- data/lib/deepsecurity/transport_objects/time_filter.rb +2 -2
- data/lib/deepsecurity/version.rb +1 -1
- data/lib/dsc/anti_malware_event_command.rb +54 -11
- data/lib/dsc/command.rb +388 -72
- data/lib/dsc/host_detail_command.rb +56 -6
- data/lib/savon_helper.rb +30 -1
- data/lib/savon_helper/caching_object.rb +50 -13
- data/lib/savon_helper/dsl.rb +286 -0
- data/lib/savon_helper/mapping_object.rb +89 -339
- data/lib/savon_helper/soap_interface.rb +77 -0
- data/lib/savon_helper/type_mappings.rb +270 -143
- metadata +8 -6
- data/lib/deepsecurity/ds_object.rb +0 -37
@@ -17,7 +17,7 @@ module DeepSecurity
|
|
17
17
|
# @!group High-Level SOAP Wrapper
|
18
18
|
|
19
19
|
# Return a new instance for events with the given event id.
|
20
|
-
# @param [Integer]
|
20
|
+
# @param id [Integer]
|
21
21
|
# @return [IDFilter]
|
22
22
|
def self.equals(id)
|
23
23
|
instance = self.new()
|
@@ -27,7 +27,7 @@ module DeepSecurity
|
|
27
27
|
end
|
28
28
|
|
29
29
|
# Return a new instance for events with event ids less than the given event id.
|
30
|
-
# @param [Integer]
|
30
|
+
# @param id [Integer]
|
31
31
|
# @return [IDFilter]
|
32
32
|
def self.less_than(id)
|
33
33
|
instance = self.new()
|
@@ -37,7 +37,7 @@ module DeepSecurity
|
|
37
37
|
end
|
38
38
|
|
39
39
|
# Return a new instance for events with event ids greater than the given event id.
|
40
|
-
# @param [Integer]
|
40
|
+
# @param id [Integer]
|
41
41
|
# @return [IDFilter]
|
42
42
|
def self.greater_than(id)
|
43
43
|
instance = self.new()
|
@@ -45,7 +45,7 @@ module DeepSecurity
|
|
45
45
|
end
|
46
46
|
|
47
47
|
# Return a new instance for the given datetime range.
|
48
|
-
# @param [Range]
|
48
|
+
# @param datetime_range [Range] A range of two datetimes
|
49
49
|
# @return [TimeFilter]
|
50
50
|
def self.custom_range(datetime_range)
|
51
51
|
instance = self.new()
|
@@ -56,7 +56,7 @@ module DeepSecurity
|
|
56
56
|
end
|
57
57
|
|
58
58
|
# Return a new instance for the given datetime.
|
59
|
-
# @param [DateTime]
|
59
|
+
# @param datetime [DateTime]
|
60
60
|
# @return [TimeFilter]
|
61
61
|
def self.specificTime(datetime)
|
62
62
|
instance = self.new()
|
data/lib/deepsecurity/version.rb
CHANGED
@@ -1,12 +1,20 @@
|
|
1
|
+
# @author Udo Schneider <Udo.Schneider@homeaddress.de>
|
2
|
+
|
1
3
|
module Dsc
|
2
4
|
|
5
|
+
# This class defines the arguments, options and implementation for the `anti_malware_event` command/subcommand.
|
3
6
|
class AntiMalwareEventCommand < Command
|
4
7
|
|
5
|
-
|
8
|
+
# DeepSecurity object covered by this class.
|
9
|
+
# @return [DeepSecurity::AntiMalwareEvent]
|
6
10
|
def self.transport_class
|
7
11
|
DeepSecurity::AntiMalwareEvent
|
8
12
|
end
|
9
13
|
|
14
|
+
# @!group Fields flag
|
15
|
+
|
16
|
+
# Default fields if no argument is given
|
17
|
+
# @return [Array<String>] Default fields if no argument is given
|
10
18
|
def self.default_fields
|
11
19
|
[
|
12
20
|
# DNS name of system
|
@@ -52,17 +60,56 @@ module Dsc
|
|
52
60
|
]
|
53
61
|
end
|
54
62
|
|
55
|
-
|
63
|
+
# @!endgroup
|
64
|
+
|
65
|
+
# @!group Command definitions
|
66
|
+
|
67
|
+
# Define all commands for this available for this (sub) command_context
|
68
|
+
# @param command_context [CLI::App] The current context of the command.
|
69
|
+
# @return [void]
|
70
|
+
def self.define_commands(command_context)
|
71
|
+
command_context.desc "Access #{transport_class_string}s"
|
72
|
+
command_context.command command_symbol do |anti_malware_event_command|
|
73
|
+
define_list_command(anti_malware_event_command)
|
74
|
+
define_schema_command(anti_malware_event_command)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Define `list` command_context
|
79
|
+
# @param command_context [CLI::App] The current context of the command.
|
80
|
+
# @yieldparam list_command [GLI::Command] The just defined list command_context
|
81
|
+
# @yield [list_command] Gives the list command_context to the block
|
82
|
+
# @return [void]
|
83
|
+
def self.define_list_command(command_context)
|
84
|
+
super(command_context) do |list|
|
85
|
+
define_time_filter_flag(list)
|
86
|
+
define_time_format_flag(list)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# @!endgroup
|
91
|
+
|
92
|
+
# @!group Command Implementations
|
93
|
+
|
94
|
+
# `list` Implementation.
|
95
|
+
# List all entries of the `transport_class` type according to given filter parameters.
|
96
|
+
# @param options [Hash<Symbol => Object>] Merged global/local options from GLI
|
97
|
+
# @option options [String] :fields The fields to display.
|
98
|
+
# @option options [String] :time_filter Timeframe to request.
|
99
|
+
# @param args [Array<String>] Arguments from GLI
|
100
|
+
# @return [void]
|
101
|
+
def list_command(options, args)
|
56
102
|
fields = parse_fields(options[:fields])
|
57
103
|
time_filter = parse_time_filter(options[:time_filter])
|
104
|
+
parse_time_format(options[:time_format])
|
58
105
|
output do |output|
|
59
|
-
authenticate do |
|
106
|
+
authenticate do |manager|
|
60
107
|
progressBar = ProgressBar.new("anti_malware_event", 100) if @show_progress_bar
|
61
|
-
|
108
|
+
manager.hosts() # Make sure that hosts are cached
|
62
109
|
progressBar.set(10) if @show_progress_bar
|
63
110
|
hostFilter = DeepSecurity::HostFilter.all_hosts
|
64
111
|
eventIdFilter = DeepSecurity::IDFilter.greater_than(0)
|
65
|
-
anti_malware_events =
|
112
|
+
anti_malware_events = manager.anti_malware_events_by_time_host_event(time_filter, hostFilter, eventIdFilter)
|
66
113
|
progressBar.set(25) if @show_progress_bar
|
67
114
|
csv = CSV.new(output)
|
68
115
|
csv << fields
|
@@ -70,7 +117,7 @@ module Dsc
|
|
70
117
|
progressBar.inc(75/anti_malware_events.size) if @show_progress_bar
|
71
118
|
csv << fields.map do |attribute|
|
72
119
|
begin
|
73
|
-
anti_malware_event.instance_eval(attribute)
|
120
|
+
to_display_string(anti_malware_event.instance_eval(attribute))
|
74
121
|
rescue => e
|
75
122
|
"ERROR (#{e.message}"
|
76
123
|
end
|
@@ -81,11 +128,7 @@ module Dsc
|
|
81
128
|
end
|
82
129
|
end
|
83
130
|
|
84
|
-
|
85
|
-
super(c) do |list|
|
86
|
-
define_time_filter_argument(list)
|
87
|
-
end
|
88
|
-
end
|
131
|
+
# @!endgroup
|
89
132
|
|
90
133
|
end
|
91
134
|
|
data/lib/dsc/command.rb
CHANGED
@@ -1,72 +1,298 @@
|
|
1
|
+
# @author Udo Schneider <Udo.Schneider@homeaddress.de>
|
1
2
|
require "progressbar"
|
2
3
|
require "csv"
|
3
4
|
|
4
5
|
module Dsc
|
5
6
|
|
7
|
+
# This class defines an superclass for all `dsc` commands. It defines several helper methods which either define
|
8
|
+
# flags, options and commands or helpers to define them.
|
9
|
+
# @abstract
|
6
10
|
class Command
|
7
11
|
|
12
|
+
# @abstract DeepSecurity object covered by this class.
|
13
|
+
# @return [DeepSecurity::TransportObject]
|
8
14
|
def self.transport_class
|
9
15
|
nil
|
10
16
|
end
|
11
17
|
|
18
|
+
# @!group Helper methods
|
19
|
+
|
20
|
+
# Transport class name without namespace
|
21
|
+
# @return [String] Transport class name without namespace
|
12
22
|
def self.transport_class_name
|
13
|
-
|
23
|
+
transport_class.name_without_namespace
|
14
24
|
end
|
15
25
|
|
26
|
+
# Human readable transport class name without namespace
|
27
|
+
# @return [String] Human readable transport class name without namespace
|
16
28
|
def self.transport_class_string
|
17
29
|
transport_class_name.split(/(?=[A-Z])/).join(" ")
|
18
30
|
end
|
19
31
|
|
32
|
+
# Class name without namespace as command_context symbol
|
33
|
+
# @return [Symbol] Class name without namespace as command_context symbol
|
20
34
|
def self.command_symbol
|
21
35
|
transport_class_name.split(/(?=[A-Z])/).join("_").downcase.to_sym
|
22
36
|
end
|
23
37
|
|
38
|
+
# The schema of the transport class
|
39
|
+
# @return [Hash<Symbol => SavonHelper::TypeMapping]
|
24
40
|
def self.schema
|
25
|
-
transport_class.
|
41
|
+
transport_class.all_type_mappings
|
26
42
|
end
|
27
43
|
|
44
|
+
# @!endgroup
|
45
|
+
|
46
|
+
# @param global_options [Hash] Global options passed to the `dsc` command_context.
|
47
|
+
# @option global_options [String] :manager The hostname of the DeepSecurity Manager.
|
48
|
+
# @option global_options [String] :port The TCP port to use.
|
49
|
+
# @option global_options [String, nil] :tenant The tenant name or nil.
|
50
|
+
# @option global_options [String] :username The username.
|
51
|
+
# @option global_options [String] :password The password.
|
52
|
+
# @option global_options [Boolean] :P Show progessbar?
|
53
|
+
# @option global_options [String, nil] :debug The debug level.
|
54
|
+
# @option global_options [String] :outfile The outfile.
|
28
55
|
def initialize(global_options)
|
29
|
-
@hostname = global_options[:
|
56
|
+
@hostname = global_options[:manager]
|
30
57
|
@port = global_options[:port].to_i
|
31
|
-
@tenant = global_options[:
|
32
|
-
@username =global_options[:
|
33
|
-
@password = global_options[:
|
58
|
+
@tenant = global_options[:tenant]
|
59
|
+
@username = global_options[:username]
|
60
|
+
@password = global_options[:password]
|
34
61
|
@show_progress_bar = global_options[:P]
|
35
|
-
@debug_level =
|
36
|
-
@output = global_options[:
|
62
|
+
@debug_level = parse_debug_level(global_options[:debug])
|
63
|
+
@output = global_options[:outfile]
|
64
|
+
end
|
65
|
+
|
66
|
+
# @!group Helper methods
|
67
|
+
|
68
|
+
# Provide an open output while executing the block.
|
69
|
+
# @yieldparam output [IO] Opened IO
|
70
|
+
# @yield [output] Gives the output to the block
|
71
|
+
# @return [void]
|
72
|
+
def output
|
73
|
+
unless @output == '--'
|
74
|
+
output = File.open(option, 'w')
|
75
|
+
else
|
76
|
+
output = STDOUT
|
77
|
+
end
|
78
|
+
yield output
|
79
|
+
output.close() unless @output == '--'
|
80
|
+
end
|
81
|
+
|
82
|
+
# Provides a connection to the DeepSecurity Manager while executing the block.
|
83
|
+
# @yieldparam manager [DeepSecurity::Manager] DeepSecurity Manager
|
84
|
+
# @yield [manager] Gives the manager to the block
|
85
|
+
# @return [void]
|
86
|
+
def connect
|
87
|
+
manager = DeepSecurity::Manager.server(@hostname, @port, @debug_level)
|
88
|
+
yield manager
|
89
|
+
end
|
90
|
+
|
91
|
+
# Provides an authenticated connection to the DeepSecurity Manager while executing the block.
|
92
|
+
# @yieldparam manager [DeepSecurity::Manager] DeepSecurity Manager
|
93
|
+
# @yield [manager] Gives the manager to the block
|
94
|
+
# @return [void]
|
95
|
+
def authenticate
|
96
|
+
connect do |manager|
|
97
|
+
begin
|
98
|
+
manager.connect(@tenant, @username, @password)
|
99
|
+
yield manager
|
100
|
+
rescue DeepSecurity::AuthenticationFailedException => e
|
101
|
+
puts "Authentication failed! #{e.message}"
|
102
|
+
ensure
|
103
|
+
manager.disconnect()
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def to_display_string(value)
|
109
|
+
return "" if value.blank?
|
110
|
+
return value.strftime($time_format) if (value.is_a?(DateTime) && !$time_format.nil?)
|
111
|
+
value.to_s
|
112
|
+
end
|
113
|
+
|
114
|
+
# @!endgroup
|
115
|
+
|
116
|
+
# @!group Misc global flags/options definitions
|
117
|
+
|
118
|
+
# Define flags
|
119
|
+
# @return [void]
|
120
|
+
def self.define_global_flags(command_context)
|
121
|
+
define_debug_flag(command_context)
|
122
|
+
define_manager_flag(command_context)
|
123
|
+
define_port_flag(command_context)
|
124
|
+
define_tenant_flag(command_context)
|
125
|
+
define_username_flag(command_context)
|
126
|
+
define_password_flag(command_context)
|
127
|
+
define_outfile_flag(command_context)
|
128
|
+
define_progress_bar_option(command_context)
|
37
129
|
end
|
38
130
|
|
131
|
+
# Define manager hostname flag
|
132
|
+
# @param command_context [CLI::App] The current context of the command.
|
133
|
+
# @return [void]
|
134
|
+
def self.define_manager_flag(command_context)
|
135
|
+
command_context.flag [:m, :manager],
|
136
|
+
:desc => 'Deep Security Manager Host',
|
137
|
+
:arg_name => 'hostname'
|
138
|
+
end
|
139
|
+
|
140
|
+
# Define manager TCP Port flag
|
141
|
+
# @param command_context [CLI::App] The current context of the command.
|
142
|
+
# @return [void]
|
143
|
+
def self.define_port_flag(command_context)
|
144
|
+
command_context.flag [:port],
|
145
|
+
:desc => 'Webservice Port',
|
146
|
+
:arg_name => 'port',
|
147
|
+
:default_value => '4119'
|
148
|
+
end
|
149
|
+
|
150
|
+
# Define tenant flag
|
151
|
+
# @param command_context [CLI::App] The current context of the command.
|
152
|
+
# @return [void]
|
153
|
+
def self.define_tenant_flag(command_context)
|
154
|
+
command_context.flag [:t, :tenant],
|
155
|
+
:desc => 'Tenat Name',
|
156
|
+
:arg_name => 'tenat',
|
157
|
+
:default_value => ''
|
158
|
+
end
|
159
|
+
|
160
|
+
# Define username flag
|
161
|
+
# @param command_context [CLI::App] The current context of the command.
|
162
|
+
# @return [void]
|
163
|
+
def self.define_username_flag(command_context)
|
164
|
+
command_context.flag [:u, :username],
|
165
|
+
:desc => 'Username',
|
166
|
+
:arg_name => 'username',
|
167
|
+
:default_value => 'MasterAdmin'
|
168
|
+
end
|
169
|
+
|
170
|
+
# Define password flag
|
171
|
+
# @param command_context [CLI::App] The current context of the command.
|
172
|
+
# @return [void]
|
173
|
+
def self.define_password_flag(command_context)
|
174
|
+
command_context.flag [:p, :password],
|
175
|
+
:desc => 'Password',
|
176
|
+
:arg_name => 'password'
|
177
|
+
end
|
178
|
+
|
179
|
+
# Define outfile flag
|
180
|
+
# @param command_context [CLI::App] The current context of the command.
|
181
|
+
# @return [void]
|
182
|
+
def self.define_outfile_flag(command_context)
|
183
|
+
command_context.flag [:o, :outfile],
|
184
|
+
:desc => 'Output filename',
|
185
|
+
:default_value => '--'
|
186
|
+
end
|
187
|
+
|
188
|
+
# Define outfile flag
|
189
|
+
# @param command_context [CLI::App] The current context of the command.
|
190
|
+
# @return [void]
|
191
|
+
def self.define_outfile_flag(command_context)
|
192
|
+
command_context.flag [:o, :outfile],
|
193
|
+
:desc => 'Output filename',
|
194
|
+
:default_value => '--'
|
195
|
+
end
|
196
|
+
|
197
|
+
# Define progress_bar option
|
198
|
+
# @param command_context [CLI::App] The current context of the command.
|
199
|
+
# @return [void]
|
200
|
+
def self.define_progress_bar_option(command_context)
|
201
|
+
command_context.switch [:P, :'progress_bar'],
|
202
|
+
:desc => 'Show progressbar',
|
203
|
+
:default_value => false
|
204
|
+
end
|
205
|
+
|
206
|
+
# @!endgroup
|
207
|
+
|
208
|
+
# @!group Debug Level flag
|
209
|
+
|
210
|
+
# Valid debug levels
|
211
|
+
# @return [Array<String>] Valid debug levels
|
39
212
|
def self.valid_debug_levels
|
40
213
|
DeepSecurity::LOG_MAPPING.keys
|
41
214
|
end
|
42
215
|
|
216
|
+
# String of debug levels for help string
|
217
|
+
# @return [String] String of debug levels for help string
|
43
218
|
def self.valid_debug_levels_string
|
44
219
|
valid_debug_levels.join(", ")
|
45
220
|
end
|
46
221
|
|
222
|
+
# Parse debug level argument
|
223
|
+
# @return [nil, DeepSecurity::LOG_MAPPING] Return parsed debug level
|
224
|
+
def parse_debug_level(argument)
|
225
|
+
return nil if argument.blank?
|
226
|
+
return argument.to_sym if (DeepSecurity::LOG_MAPPING.keys.include?(argument.to_sym))
|
227
|
+
:debug
|
228
|
+
end
|
229
|
+
|
230
|
+
# Define debug level flag
|
231
|
+
# @return [void]
|
232
|
+
def self.define_debug_flag(command_context)
|
233
|
+
command_context.flag [:d, :debug],
|
234
|
+
:desc => "Enable client debug output. (One of #{Dsc::Command.valid_debug_levels_string})",
|
235
|
+
:arg_name => 'debug_level'
|
236
|
+
end
|
237
|
+
|
238
|
+
# @!endgroup
|
239
|
+
|
240
|
+
# @!group Fields flag
|
241
|
+
|
242
|
+
# Default fields if no argument is given
|
243
|
+
# @note Needs to be overridden by subclass
|
244
|
+
# @return [Array<String>] Default fields if no argument is given
|
47
245
|
def self.default_fields
|
48
246
|
[]
|
49
247
|
end
|
50
248
|
|
249
|
+
# String of default fields for help string
|
250
|
+
# @return [String] String of default fields for help string
|
51
251
|
def self.default_fields_string
|
52
252
|
default_fields.join(",")
|
53
253
|
end
|
54
254
|
|
255
|
+
# Sorted list of available fields
|
256
|
+
# @return [Array<String>] Sorted list of available fields
|
55
257
|
def self.valid_fields
|
56
258
|
transport_class.defined_attributes.sort
|
57
259
|
end
|
58
260
|
|
261
|
+
# String of available fields for help string
|
262
|
+
# @return [String] String of available fields for help string
|
59
263
|
def self.valid_fields_string
|
60
264
|
valid_fields.join(", ")
|
61
265
|
end
|
62
266
|
|
63
|
-
|
64
|
-
|
267
|
+
# Parse fields argument. Either split the string or read from file
|
268
|
+
# @return [Array<String>] parse fields
|
269
|
+
def parse_fields(fields_string_or_filename_argument)
|
270
|
+
filename = File.absolute_path(fields_string_or_filename_argument)
|
271
|
+
if File.exists?(filename)
|
272
|
+
fields_string = File.read(filename)
|
273
|
+
else
|
274
|
+
fields_string = fields_string_or_filename_argument
|
275
|
+
end
|
276
|
+
fields = fields_string.split(",").map(&:strip)
|
65
277
|
unknown_fields = fields.reject { |each| self.class.transport_class.has_attribute_chain(each) }
|
66
|
-
raise "Unknown field found (#{unknown_fields.join(', ')}) - known fields are: #{self.class.valid_fields.join(', ')}" unless unknown_fields.empty?
|
278
|
+
raise "Unknown filename or field found (#{unknown_fields.join(', ')}) - known fields are: #{self.class.valid_fields.join(', ')}" unless unknown_fields.empty?
|
67
279
|
fields
|
68
280
|
end
|
69
281
|
|
282
|
+
# Define fields flag
|
283
|
+
# @return [void]
|
284
|
+
def self.define_fields_flag(command_context)
|
285
|
+
command_context.flag [:fields],
|
286
|
+
:desc => "A comma separated list of fields to display or a file containing those fields. (Available fields: #{self.valid_fields_string})",
|
287
|
+
:default_value => self.default_fields_string
|
288
|
+
end
|
289
|
+
|
290
|
+
# @!endgroup
|
291
|
+
|
292
|
+
# @!group Time filter flag
|
293
|
+
|
294
|
+
# Valid timefilter mapping (symbol to instance)
|
295
|
+
# @return [Hash<Symbol => DeepSecurity::TimeFilter>] Valid timefilter mapping
|
70
296
|
def self.valid_time_filters
|
71
297
|
{
|
72
298
|
:last_hour => DeepSecurity::TimeFilter.last_hour,
|
@@ -76,109 +302,199 @@ module Dsc
|
|
76
302
|
}
|
77
303
|
end
|
78
304
|
|
305
|
+
# Valid time filter string for help string
|
306
|
+
# @return[String] Valid time filters
|
79
307
|
def self.valid_time_filters_string
|
80
308
|
valid_time_filters.keys.join(', ')
|
81
309
|
end
|
82
310
|
|
83
|
-
|
84
|
-
|
311
|
+
# Parse time_filter argument
|
312
|
+
# @return [DeepSecurity::TimeFilter] Time filter
|
313
|
+
def parse_time_filter(argument)
|
314
|
+
filter = self.class.valid_time_filters[argument.to_sym]
|
85
315
|
raise "Unknown time filter" if filter.nil?
|
86
316
|
filter
|
87
317
|
end
|
88
318
|
|
319
|
+
# Define time_filter flag
|
320
|
+
# @return [void]
|
321
|
+
def self.define_time_filter_flag(command_context)
|
322
|
+
command_context.flag [:time_filter],
|
323
|
+
:desc => "A filter specifying the time interval to query (One of #{self.valid_time_filters_string})",
|
324
|
+
:default_value => "last_day"
|
325
|
+
end
|
89
326
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
327
|
+
# @!endgroup
|
328
|
+
|
329
|
+
# @!group Detail level flag
|
330
|
+
|
331
|
+
# Valid detail levels
|
332
|
+
# @return [Array<String>] Valid detail levels
|
333
|
+
def self.valid_detail_levels
|
334
|
+
DeepSecurity::EnumHostDetailLevel.keys()
|
94
335
|
end
|
95
336
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
output = STDOUT
|
101
|
-
end
|
102
|
-
yield output
|
103
|
-
output.close() unless @output == '--'
|
337
|
+
# Valid detail levels for help string
|
338
|
+
# @return [String] Valid detail levels for help string
|
339
|
+
def self.valid_detail_levels_string
|
340
|
+
valid_detail_levels.map(&:downcase).join(", ")
|
104
341
|
end
|
105
342
|
|
106
|
-
|
107
|
-
|
343
|
+
# Parse detail_level argument
|
344
|
+
# @return [EnumHostDetailLevel] Detail level
|
345
|
+
def parse_detail_level(argument)
|
346
|
+
detail_level = DeepSecurity::EnumHostDetailLevel[argument.upcase.strip]
|
347
|
+
raise "Unknown detail level filter" if detail_level.nil?
|
348
|
+
detail_level
|
108
349
|
end
|
109
350
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
puts "Authentication failed! #{e.message}"
|
117
|
-
ensure
|
118
|
-
dsm.disconnect()
|
119
|
-
end
|
120
|
-
end
|
351
|
+
# Define detail_level flag
|
352
|
+
# @return [void]
|
353
|
+
def self.define_detail_level_flag(command_context)
|
354
|
+
command_context.flag [:detail_level],
|
355
|
+
:desc => "A detail level specifiying the extent of data returned. (Available values: #{self.valid_detail_levels_string})",
|
356
|
+
:default_value => "low"
|
121
357
|
end
|
122
358
|
|
359
|
+
# @!endgroup
|
123
360
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
361
|
+
# @!group Time format flag
|
362
|
+
|
363
|
+
# Parse detail_level argument
|
364
|
+
# @return [EnumHostDetailLevel] Detail level
|
365
|
+
def parse_time_format(argument)
|
366
|
+
$time_format = argument.nil? ? "" : argument
|
367
|
+
end
|
368
|
+
|
369
|
+
# Define detail_level flag
|
370
|
+
# @return [void]
|
371
|
+
def self.define_time_format_flag(command_context)
|
372
|
+
command_context.flag [:time_format],
|
373
|
+
:desc => "An strftime() compatible string to use for outputting date/time."
|
374
|
+
end
|
375
|
+
|
376
|
+
# @!endgroup
|
377
|
+
|
378
|
+
# @!group Command definitions
|
379
|
+
|
380
|
+
# @abstract Define all commands for this available for this (sub) command_context
|
381
|
+
# @param command_context [CLI::App] The current context of the command.
|
382
|
+
# @return [void]
|
383
|
+
def self.define_commands(command_context)
|
384
|
+
end
|
385
|
+
|
386
|
+
# Define some simple commands.
|
387
|
+
# @param command_context [CLI::App] The current context of the command.
|
388
|
+
# @return [void]
|
389
|
+
def self.define_misc_commands(command_context)
|
390
|
+
self.define_api_version_command(command_context)
|
391
|
+
self.define_manager_time_command(command_context)
|
392
|
+
end
|
393
|
+
|
394
|
+
# Define `api_version` command_context
|
395
|
+
# @param command_context [CLI::App] The current context of the command.
|
396
|
+
# @return [void]
|
397
|
+
def self.define_api_version_command(command_context)
|
398
|
+
command_context.desc 'Display API Version'
|
399
|
+
command_context.command :api_version do |api_version_command|
|
400
|
+
api_version_command.action do |global_options, options, args|
|
401
|
+
self.new(global_options).api_version_command(options, args)
|
128
402
|
end
|
129
403
|
end
|
130
404
|
end
|
131
405
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
406
|
+
# Define `manager_time` command_context
|
407
|
+
# @param command_context [CLI::App] The current context of the command.
|
408
|
+
# @return [void]
|
409
|
+
def self.define_manager_time_command(command_context)
|
410
|
+
command_context.desc 'Display Manager time'
|
411
|
+
command_context.command :manager_time do |manager_time_command|
|
412
|
+
manager_time_command.action do |global_options, options, args|
|
413
|
+
self.new(global_options).manager_time_command(options, args)
|
136
414
|
end
|
137
415
|
end
|
138
416
|
end
|
139
417
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
418
|
+
# Define `list` command_context
|
419
|
+
# @param command_context [CLI::App] The current context of the command.
|
420
|
+
# @yieldparam list_command [GLI::Command] The just defined list command_context
|
421
|
+
# @yield [list_command] Gives the list command_context to the block
|
422
|
+
# @return [void]
|
423
|
+
def self.define_list_command(command_context)
|
424
|
+
command_context.desc "List #{self.transport_class_string}s"
|
425
|
+
command_context.command :list do |list_command|
|
426
|
+
define_fields_flag(list_command)
|
427
|
+
yield list_command if block_given?
|
428
|
+
list_command.action do |global_options, options, args|
|
429
|
+
self.new(global_options).list_command(options, args)
|
145
430
|
end
|
146
431
|
end
|
147
432
|
end
|
148
433
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
434
|
+
# Define `schema` command_context
|
435
|
+
# @param command_context [CLI::App] The current context of the command.
|
436
|
+
# @yieldparam schema_command [GLI::Command] The just defined schema command_context
|
437
|
+
# @yield [schema_command] Gives the schema command_context to the block
|
438
|
+
# @return [void]
|
439
|
+
def self.define_schema_command(command_context)
|
440
|
+
command_context.desc "Show #{self.transport_class_string} schema"
|
441
|
+
command_context.command :schema do |schema_command|
|
442
|
+
yield schema_command if block_given?
|
443
|
+
schema_command.action do |global_options, options, args|
|
444
|
+
self.new(global_options).schema_command(options, args)
|
156
445
|
end
|
157
446
|
end
|
158
447
|
end
|
159
448
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
449
|
+
# @!endgroup
|
450
|
+
|
451
|
+
# @!group Command Implementations
|
452
|
+
|
453
|
+
# `api_version` Implementation.
|
454
|
+
# Display the API version in use by the DeepSecurity Manager.
|
455
|
+
# @note Does not require authentication
|
456
|
+
# @param options [Hash<Symbol => Object>] Merged global/local options from GLI
|
457
|
+
# @param args [Array<String>] Arguments from GLI
|
458
|
+
# @return [void]
|
459
|
+
def api_version_command(options, args)
|
460
|
+
output do |output|
|
461
|
+
connect do |manager|
|
462
|
+
output.puts manager.api_version()
|
166
463
|
end
|
167
464
|
end
|
168
465
|
end
|
169
466
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
467
|
+
# `manager_time` Implementation.
|
468
|
+
# Display the local time of the DeepSecurity Manager.
|
469
|
+
# @note Does not require authentication
|
470
|
+
# @param options [Hash<Symbol => Object>] Merged global/local options from GLI
|
471
|
+
# @param args [Array<String>] Arguments from GLI
|
472
|
+
# @return [void]
|
473
|
+
def manager_time_command(options, args)
|
474
|
+
output do |output|
|
475
|
+
connect do |manager|
|
476
|
+
output.puts manager.manager_time()
|
477
|
+
end
|
478
|
+
end
|
174
479
|
end
|
175
480
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
481
|
+
# `schema` Implementation.
|
482
|
+
# Display schema of the current datatype (defined by `transport_class`).
|
483
|
+
# @note Does not require authentication
|
484
|
+
# @param options [Hash<Symbol => Object>] Merged global/local options from GLI
|
485
|
+
# @param args [Array<String>] Arguments from GLI
|
486
|
+
# @return [void]
|
487
|
+
def schema_command(options, args)
|
488
|
+
output do |output|
|
489
|
+
schema = self.class.schema()
|
490
|
+
schema.keys.sort.each do |key|
|
491
|
+
output.puts "#{key} (#{schema[key].type_string}): #{schema[key].description}"
|
492
|
+
end
|
493
|
+
end
|
180
494
|
end
|
181
495
|
|
496
|
+
# @!endgroup
|
497
|
+
|
182
498
|
end
|
183
499
|
|
184
500
|
end
|