prometheus-splash 0.8.0 → 0.8.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +47 -3
- data/README.md +400 -178
- data/config/splash.yml +28 -14
- data/lib/splash/backends.rb +7 -1
- data/lib/splash/backends/file.rb +1 -1
- data/lib/splash/cli/commands.rb +122 -37
- data/lib/splash/cli/config.rb +12 -1
- data/lib/splash/cli/daemon.rb +1 -1
- data/lib/splash/cli/logs.rb +144 -48
- data/lib/splash/cli/process.rb +145 -52
- data/lib/splash/cli/transfers.rb +10 -3
- data/lib/splash/commands.rb +115 -40
- data/lib/splash/config.rb +112 -29
- data/lib/splash/config/flush.rb +2 -2
- data/lib/splash/constants.rb +3 -4
- data/lib/splash/daemon/orchestrator.rb +6 -7
- data/lib/splash/daemon/orchestrator/grammar.rb +1 -1
- data/lib/splash/dependencies.rb +1 -0
- data/lib/splash/exiter.rb +1 -1
- data/lib/splash/helpers.rb +1 -1
- data/lib/splash/logs.rb +94 -16
- data/lib/splash/monkeys.rb +5 -0
- data/lib/splash/processes.rb +91 -16
- data/lib/splash/sequences.rb +6 -1
- data/lib/splash/transfers.rb +13 -8
- data/lib/splash/webadmin/api/routes/commands.rb +15 -3
- data/lib/splash/webadmin/api/routes/config.rb +140 -2
- data/lib/splash/webadmin/api/routes/logs.rb +32 -17
- data/lib/splash/webadmin/api/routes/process.rb +21 -9
- data/lib/splash/webadmin/api/routes/sequences.rb +2 -2
- data/lib/splash/webadmin/main.rb +15 -1
- data/lib/splash/webadmin/portal/controllers/commands.rb +101 -1
- data/lib/splash/webadmin/portal/controllers/documentation.rb +2 -0
- data/lib/splash/webadmin/portal/controllers/home.rb +6 -1
- data/lib/splash/webadmin/portal/controllers/logs.rb +71 -1
- data/lib/splash/webadmin/portal/controllers/processes.rb +75 -3
- data/lib/splash/webadmin/portal/controllers/proxy.rb +2 -1
- data/lib/splash/webadmin/portal/controllers/restclient.rb +6 -1
- data/lib/splash/webadmin/portal/controllers/sequences.rb +2 -0
- data/lib/splash/webadmin/portal/public/css/ultragreen.css +6 -0
- data/lib/splash/webadmin/portal/public/favicon.ico +0 -0
- data/lib/splash/webadmin/portal/views/command_form.slim +45 -0
- data/lib/splash/webadmin/portal/views/command_history.slim +27 -0
- data/lib/splash/webadmin/portal/views/commands.slim +70 -20
- data/lib/splash/webadmin/portal/views/documentation.slim +1 -1
- data/lib/splash/webadmin/portal/views/home.slim +19 -20
- data/lib/splash/webadmin/portal/views/layout.slim +2 -2
- data/lib/splash/webadmin/portal/views/log_form.slim +27 -0
- data/lib/splash/webadmin/portal/views/log_history.slim +24 -0
- data/lib/splash/webadmin/portal/views/logs.slim +95 -21
- data/lib/splash/webadmin/portal/views/nav.slim +1 -1
- data/lib/splash/webadmin/portal/views/not_found.slim +1 -1
- data/lib/splash/webadmin/portal/views/process_form.slim +24 -0
- data/lib/splash/webadmin/portal/views/process_history.slim +24 -0
- data/lib/splash/webadmin/portal/views/processes.slim +80 -7
- data/lib/splash/webadmin/portal/views/proxy.slim +2 -2
- data/lib/splash/webadmin/portal/views/restclient.slim +7 -4
- data/lib/splash/webadmin/portal/views/restclient_result.slim +24 -20
- data/lib/splash/webadmin/portal/views/sequences.slim +1 -1
- data/prometheus-splash.gemspec +4 -4
- data/ultragreen_roodi_coding_convention.yml +4 -4
- metadata +18 -10
data/config/splash.yml
CHANGED
@@ -26,9 +26,15 @@
|
|
26
26
|
# :port: 6379
|
27
27
|
# #:auth: "mykey"
|
28
28
|
# :base: 1
|
29
|
-
:
|
29
|
+
:transfers_trace:
|
30
30
|
:type: :file
|
31
|
-
:path: /var/run/splash/
|
31
|
+
:path: /var/run/splash/transfers
|
32
|
+
:logs_trace:
|
33
|
+
:type: :file
|
34
|
+
:path: /var/run/splash/logs
|
35
|
+
:process_trace:
|
36
|
+
:type: :file
|
37
|
+
:path: /var/run/splash/process
|
32
38
|
|
33
39
|
:transports:
|
34
40
|
:active: :rabbitmq
|
@@ -67,49 +73,51 @@
|
|
67
73
|
|
68
74
|
### Sample configuration of commands and scheduling
|
69
75
|
:commands:
|
70
|
-
:id_root
|
76
|
+
- :name: :id_root
|
71
77
|
:desc: run id command on root
|
72
78
|
:command: id root
|
73
|
-
:true_test
|
79
|
+
- :name: :true_test
|
74
80
|
:desc: "test command returning true : 0"
|
75
81
|
:command: "true"
|
76
82
|
:schedule:
|
77
83
|
:every: "1h"
|
78
84
|
:on_failure: :ls_slash_tmp
|
79
85
|
:on_success: :pwd
|
80
|
-
:false_test
|
86
|
+
- :name: :false_test
|
81
87
|
:desc: "test command returning false > 0"
|
82
88
|
:command: "false"
|
83
89
|
:schedule:
|
84
90
|
:every: "1h"
|
85
91
|
:on_failure: :ls_slash_tmp
|
86
92
|
:on_success: :pwd
|
87
|
-
:ls_slash_tmp
|
93
|
+
- :name: :ls_slash_tmp
|
88
94
|
:desc: list file in /tmp
|
89
95
|
:command: ls -al /tmp
|
90
96
|
:user: daemon
|
91
97
|
:on_success: :echo1
|
92
|
-
:pwd
|
98
|
+
- :name: :pwd
|
93
99
|
:desc: run pwd
|
94
100
|
:command: pwd
|
95
101
|
:on_success: :echo1
|
96
102
|
:on_failure: :echo2
|
97
|
-
:echo1
|
103
|
+
- :name: :echo1
|
98
104
|
:desc: echo 'foo'
|
99
105
|
:command: echo foo
|
100
106
|
:on_failure: :echo3
|
101
|
-
:echo2
|
107
|
+
- :name: :echo2
|
102
108
|
:desc: echo 'bar'
|
103
109
|
:command: echo bar
|
104
|
-
:echo3
|
110
|
+
- :name: :echo3
|
105
111
|
:desc: echo 'been'
|
106
112
|
:command: echo been
|
107
|
-
:rand_sleep_5
|
113
|
+
- :name: :rand_sleep_5
|
108
114
|
:desc: sleep on a rand 5
|
109
115
|
:command: ruby -e 'sleep rand(5)'
|
110
116
|
:schedule:
|
111
|
-
:every: "
|
112
|
-
|
117
|
+
:every: "30s"
|
118
|
+
:retention:
|
119
|
+
:hours: 1
|
120
|
+
- :name: :test_remote_call
|
113
121
|
:desc: remote call test
|
114
122
|
:delegate_to:
|
115
123
|
:host: omicron
|
@@ -122,15 +130,21 @@
|
|
122
130
|
- :label: :log_app_1
|
123
131
|
:log: /tmp/test
|
124
132
|
:pattern: ERROR
|
133
|
+
:retention:
|
134
|
+
:hours: 5
|
125
135
|
- :label: :log_app_2
|
126
136
|
:log: /tmp/test2
|
127
137
|
:pattern: ERROR
|
138
|
+
:retention:
|
139
|
+
:hours: 5
|
128
140
|
|
129
141
|
### configuration of monitored processes
|
130
142
|
:processes:
|
131
|
-
- :process: cron
|
143
|
+
- :process: :cron
|
132
144
|
:patterns:
|
133
145
|
- cron
|
146
|
+
:retention:
|
147
|
+
:hours: 5
|
134
148
|
|
135
149
|
|
136
150
|
###
|
data/lib/splash/backends.rb
CHANGED
@@ -11,7 +11,7 @@ module Splash
|
|
11
11
|
|
12
12
|
# factory for backend
|
13
13
|
# @param [Symbol] store the name of the store actually in [:execution_trace]
|
14
|
-
# @return [Splash::Backends::<Type>|Hash] with type in [:redis,:file] or Exiter case :configuration_error
|
14
|
+
# @return [Splash::Backends::<Type>|Hash] with type in [:redis,:file] or Exiter case :configuration_error
|
15
15
|
def get_backend(store)
|
16
16
|
splash_exit case: :configuration_error, more: "backend definition failure" if get_config[:backends][:stores][store].nil?
|
17
17
|
backend = get_config[:backends][:stores][store][:type].to_s
|
@@ -23,5 +23,11 @@ module Splash
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
# return list of configured backand
|
27
|
+
# @return [Hash] the backends hash list/structure
|
28
|
+
def list_backends
|
29
|
+
return get_config[:backends][:stores]
|
30
|
+
end
|
31
|
+
|
26
32
|
end
|
27
33
|
end
|
data/lib/splash/backends/file.rb
CHANGED
@@ -54,7 +54,7 @@ module Splash
|
|
54
54
|
# @option options [Symbol] :key the name of the record
|
55
55
|
# @return [Boolean] status of the operation
|
56
56
|
def del(options)
|
57
|
-
::File.unlink("#{@path}/#{suffix_trace(options[:key])}") if File.exist?("#{@path}/#{suffix_trace(options[:key])}")
|
57
|
+
::File.unlink("#{@path}/#{suffix_trace(options[:key])}") if ::File.exist?("#{@path}/#{suffix_trace(options[:key])}")
|
58
58
|
end
|
59
59
|
|
60
60
|
# verifiy a specific record existance
|
data/lib/splash/cli/commands.rb
CHANGED
@@ -15,7 +15,7 @@ module CLISplash
|
|
15
15
|
|
16
16
|
|
17
17
|
# Thor method : execution of command
|
18
|
-
desc "execute
|
18
|
+
desc "execute COMMAND", "run for command/sequence or ack result"
|
19
19
|
long_desc <<-LONGDESC
|
20
20
|
execute command or sequence or ack result\n
|
21
21
|
with --no-trace prevent storing execution trace in configured backend (see config file)\n
|
@@ -79,7 +79,7 @@ module CLISplash
|
|
79
79
|
|
80
80
|
|
81
81
|
# Thor method : scheduling commands
|
82
|
-
desc "schedule
|
82
|
+
desc "schedule COMMAND", "Schedule excution of command on Splash daemon"
|
83
83
|
long_desc <<-LONGDESC
|
84
84
|
Schedule excution of command on Splash daemon\n
|
85
85
|
with --hostname, Schedule on an other Splash daemon via transport\n
|
@@ -93,6 +93,9 @@ module CLISplash
|
|
93
93
|
option :at, :type => :string
|
94
94
|
option :in, :type => :string
|
95
95
|
def schedule(name)
|
96
|
+
unless is_root? then
|
97
|
+
splash_exit case: :not_root, :more => "Command scheduling"
|
98
|
+
end
|
96
99
|
log = get_logger
|
97
100
|
log.level = :fatal if options[:quiet]
|
98
101
|
hostname = (options[:hostname])? options[:hostname] : Socket.gethostname
|
@@ -122,13 +125,16 @@ module CLISplash
|
|
122
125
|
end
|
123
126
|
|
124
127
|
# Thor method : getting a treeview of sequence of commands
|
125
|
-
desc "treeview", "Show commands sequence tree"
|
128
|
+
desc "treeview COMMAND", "Show commands sequence tree"
|
126
129
|
long_desc <<-LONGDESC
|
127
130
|
Show commands sequence tree\n
|
128
131
|
with --hostname, ask other Splash daemon via transport\n
|
129
132
|
LONGDESC
|
130
133
|
option :hostname, :type => :string, :aliases => "-H"
|
131
134
|
def treeview(command)
|
135
|
+
unless is_root? then
|
136
|
+
splash_exit case: :not_root, :more => "Command treeview"
|
137
|
+
end
|
132
138
|
depht = 0
|
133
139
|
log = get_logger
|
134
140
|
if options[:hostname] then
|
@@ -153,7 +159,7 @@ module CLISplash
|
|
153
159
|
end
|
154
160
|
log.info "Command : #{command.to_s}" if depht == 0
|
155
161
|
aproc = Proc::new do |command,depht|
|
156
|
-
cmd = commands[command.to_sym
|
162
|
+
cmd = commands.select{|item| item[:name] == command.to_sym}.first
|
157
163
|
if cmd[:on_failure] then
|
158
164
|
spacer= " " * depht + " "
|
159
165
|
log.flat "#{spacer}* on failure => #{cmd[:on_failure]}"
|
@@ -179,6 +185,9 @@ module CLISplash
|
|
179
185
|
option :detail, :type => :boolean, :aliases => "-D"
|
180
186
|
option :hostname, :type => :string, :aliases => "-H"
|
181
187
|
def list
|
188
|
+
unless is_root? then
|
189
|
+
splash_exit case: :not_root, :more => "Command list"
|
190
|
+
end
|
182
191
|
log = get_logger
|
183
192
|
list = {}
|
184
193
|
if options[:hostname] then
|
@@ -202,16 +211,16 @@ module CLISplash
|
|
202
211
|
list = get_config.commands
|
203
212
|
end
|
204
213
|
log.info "Splash configured commands :"
|
205
|
-
log.ko 'No configured commands found' if list.
|
206
|
-
list.
|
207
|
-
log.item "#{command.to_s}"
|
214
|
+
log.ko 'No configured commands found' if list.empty?
|
215
|
+
list.each do |command|
|
216
|
+
log.item "#{command[:name].to_s}"
|
208
217
|
if options[:detail] then
|
209
|
-
log.arrow "command line : '#{
|
210
|
-
log.arrow "command description : '#{
|
211
|
-
log.arrow "command failure callback : '#{
|
212
|
-
log.arrow "command success callback : '#{
|
213
|
-
if
|
214
|
-
sched,val =
|
218
|
+
log.arrow "command line : '#{command[:command]}'"
|
219
|
+
log.arrow "command description : '#{command[:desc]}'"
|
220
|
+
log.arrow "command failure callback : '#{command[:on_failure]}'" if command[:on_failure]
|
221
|
+
log.arrow "command success callback : '#{command[:on_success]}'" if command[:on_success]
|
222
|
+
if command[:schedule] then
|
223
|
+
sched,val = command[:schedule].flatten
|
215
224
|
log.arrow "command scheduled : #{sched} #{val}."
|
216
225
|
end
|
217
226
|
end
|
@@ -226,7 +235,10 @@ module CLISplash
|
|
226
235
|
with --hostname <HOSTNAME>, an other Splash monitored server (only with Redis backend configured)
|
227
236
|
LONGDESC
|
228
237
|
option :hostname, :type => :string, :aliases => "-H"
|
229
|
-
def show(
|
238
|
+
def show(name)
|
239
|
+
unless is_root? then
|
240
|
+
splash_exit case: :not_root, :more => "Command show specifications"
|
241
|
+
end
|
230
242
|
log = get_logger
|
231
243
|
list = {}
|
232
244
|
if options[:hostname] then
|
@@ -249,14 +261,15 @@ module CLISplash
|
|
249
261
|
else
|
250
262
|
list = get_config.commands
|
251
263
|
end
|
252
|
-
|
253
|
-
|
254
|
-
log.
|
255
|
-
log.item "command
|
256
|
-
log.item "command
|
257
|
-
log.item "command
|
258
|
-
if
|
259
|
-
|
264
|
+
command = list.select{|item| item[:name] == name.to_sym}.first
|
265
|
+
unless command.nil? then
|
266
|
+
log.info "Splash command : #{command[:name]}"
|
267
|
+
log.item "command line : '#{command[:command]}'"
|
268
|
+
log.item "command description : '#{command[:desc]}'"
|
269
|
+
log.item "command failure callback : '#{command[:on_failure]}'" if command[:on_failure]
|
270
|
+
log.item "command success callback : '#{command[:on_success]}'" if command[:on_success]
|
271
|
+
if command[:schedule]
|
272
|
+
sched,val = command[:schedule].flatten
|
260
273
|
log.item "command scheduled : #{sched} #{val}."
|
261
274
|
end
|
262
275
|
splash_exit case: :quiet_exit
|
@@ -265,14 +278,71 @@ module CLISplash
|
|
265
278
|
end
|
266
279
|
end
|
267
280
|
|
268
|
-
|
269
|
-
|
281
|
+
|
282
|
+
|
283
|
+
# Thor method : show commands executions history
|
284
|
+
long_desc <<-LONGDESC
|
285
|
+
show commands executions history for LABEL\n
|
286
|
+
LONGDESC
|
287
|
+
option :table, :type => :boolean, :aliases => "-t"
|
288
|
+
desc "history COMMAND", "show commands executions history"
|
289
|
+
def history(command)
|
290
|
+
if is_root? then
|
291
|
+
log = get_logger
|
292
|
+
log.info "Command : #{command}"
|
293
|
+
config = get_config
|
294
|
+
if options[:table] then
|
295
|
+
table = TTY::Table.new do |t|
|
296
|
+
t << ["Start Date","Status", "end_date", "Execution time","STDOUT empty ? ", "STDERR empty ? "]
|
297
|
+
t << ['','','','','','']
|
298
|
+
CmdRecords::new(command).get_all_records.each do |item|
|
299
|
+
record =item.keys.first
|
300
|
+
value=item[record]
|
301
|
+
t << [record, value[:status].to_s,
|
302
|
+
value[:end_date],
|
303
|
+
value[:exec_time],
|
304
|
+
value[:stdout].empty?,
|
305
|
+
value[:stderr].empty?]
|
306
|
+
end
|
307
|
+
end
|
308
|
+
if check_unicode_term then
|
309
|
+
puts table.render(:unicode)
|
310
|
+
else
|
311
|
+
puts table.render(:ascii)
|
312
|
+
end
|
313
|
+
|
314
|
+
else
|
315
|
+
CmdRecords::new(command).get_all_records.each do |item|
|
316
|
+
record =item.keys.first
|
317
|
+
value=item[record]
|
318
|
+
log.item record
|
319
|
+
log.arrow "Status : #{value[:status].to_s}"
|
320
|
+
log.arrow "End date : #{value[:end_date]}"
|
321
|
+
log.arrow "Execution time : #{value[:exec_time]}"
|
322
|
+
log.arrow "STDOUT empty ? : #{value[:stdout].empty?}"
|
323
|
+
log.arrow "STDERR empty ? : #{value[:stderr].empty?}"
|
324
|
+
end
|
325
|
+
end
|
326
|
+
splash_exit case: :quiet_exit
|
327
|
+
else
|
328
|
+
splash_exit case: :not_root, :more => "Command execution history"
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
# Thor method : getting information on one specific execution of a command
|
333
|
+
desc "get_result COMMAND", "Show running result for specific configured command COMMAND"
|
270
334
|
long_desc <<-LONGDESC
|
271
|
-
Show
|
335
|
+
Show specific running result for specific configured command COMMAND\n
|
272
336
|
with --hostname <HOSTNAME>, an other Splash monitored server (only with Redis backend configured)
|
337
|
+
with --date <DATE>, a date format string (same as in history ouput)
|
338
|
+
|
273
339
|
LONGDESC
|
274
340
|
option :hostname, :type => :string, :aliases => "-H"
|
275
|
-
|
341
|
+
option :date, :type => :string, :aliases => "-D"
|
342
|
+
def get_result(command)
|
343
|
+
unless is_root? then
|
344
|
+
splash_exit case: :not_root, :more => "Command specific execution report"
|
345
|
+
end
|
276
346
|
log = get_logger
|
277
347
|
backend = get_backend :execution_trace
|
278
348
|
redis = (backend.class == Splash::Backends::Redis)? true : false
|
@@ -280,12 +350,12 @@ module CLISplash
|
|
280
350
|
splash_exit case: :specific_config_required, :more => "Redis backend is requiered for Remote execution report request"
|
281
351
|
end
|
282
352
|
splash_exit case: :not_root if not is_root? and not redis
|
283
|
-
list = get_config.commands
|
353
|
+
list = get_config.commands
|
284
354
|
if options[:hostname] then
|
285
355
|
options[:hostname] = Socket.gethostname if options[:hostname] == 'hostname'
|
286
356
|
list = backend.list("*", options[:hostname]).map(&:to_sym)
|
287
357
|
end
|
288
|
-
if list.
|
358
|
+
if list.select{|cmd| cmd[:name] == command.to_sym}.count > 0 then
|
289
359
|
log.info "Splash command #{command} previous execution report:\n"
|
290
360
|
req = { :key => command}
|
291
361
|
req[:hostname] = options[:hostname] if options[:hostname]
|
@@ -294,19 +364,32 @@ module CLISplash
|
|
294
364
|
tp = Template::new(
|
295
365
|
list_token: get_config.execution_template_tokens,
|
296
366
|
template_file: get_config.execution_template_path)
|
297
|
-
|
298
|
-
|
367
|
+
if options[:date] then
|
368
|
+
prov = YAML::load(res).select{|key,value| key.keys.first == options[:date]}.first
|
369
|
+
else
|
370
|
+
prov = YAML::load(res).last
|
371
|
+
end
|
372
|
+
if prov.nil? then
|
373
|
+
log.ko "Command not runned one this date or date misformatted."
|
374
|
+
else
|
375
|
+
tp.map prov.values.first
|
376
|
+
log.flat tp.output
|
377
|
+
end
|
299
378
|
else
|
300
379
|
log.ko "Command not already runned."
|
301
380
|
end
|
302
381
|
splash_exit case: :quiet_exit
|
303
382
|
else
|
304
|
-
|
383
|
+
if options[:hostname]
|
384
|
+
splash_exit case: :not_found, :more => "Command never runned remotly"
|
385
|
+
else
|
386
|
+
splash_exit case: :not_found, :more => "Command never runned"
|
387
|
+
end
|
305
388
|
end
|
306
389
|
end
|
307
390
|
|
308
391
|
# Thor method : getting the list of avaibles executions reports
|
309
|
-
desc "
|
392
|
+
desc "reportlist", "list all executions report results "
|
310
393
|
long_desc <<-LONGDESC
|
311
394
|
list all executions report results\n
|
312
395
|
with --pattern <SEARCH>, search type string, wilcard * (group) ? (char)\n
|
@@ -319,7 +402,10 @@ module CLISplash
|
|
319
402
|
option :hostname, :type => :string, :aliases => "-H"
|
320
403
|
option :all, :type => :boolean, :negate => false, :aliases => "-A"
|
321
404
|
option :detail, :type => :boolean, :aliases => "-D"
|
322
|
-
def
|
405
|
+
def reportlist
|
406
|
+
unless is_root? then
|
407
|
+
splash_exit case: :not_root, :more => "Command execution report list"
|
408
|
+
end
|
323
409
|
log = get_logger
|
324
410
|
options[:hostname] = Socket.gethostname if options[:hostname] == 'hostname'
|
325
411
|
if options[:hostname] and options[:all] then
|
@@ -355,10 +441,9 @@ module CLISplash
|
|
355
441
|
req = { :key => command }
|
356
442
|
req[:hostname] = host if options[:all]
|
357
443
|
res = YAML::load(backend.get(req))
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
log.arrow "Execution time : #{res[:exec_time]}"
|
444
|
+
res.each do |record|
|
445
|
+
log.arrow "#{record.keys.first} : #{record[record.keys.first][:status]}"
|
446
|
+
end
|
362
447
|
end
|
363
448
|
end
|
364
449
|
splash_exit case: :quiet_exit
|
data/lib/splash/cli/config.rb
CHANGED
@@ -9,6 +9,7 @@ module CLISplash
|
|
9
9
|
include Splash::Helpers
|
10
10
|
include Splash::Exiter
|
11
11
|
include Splash::Loggers
|
12
|
+
include Splash::Backends
|
12
13
|
|
13
14
|
# Thor method : running of Splash setup
|
14
15
|
desc "setup", "Setup installation fo Splash"
|
@@ -49,8 +50,18 @@ module CLISplash
|
|
49
50
|
|
50
51
|
# Thor method : flushing configured backend
|
51
52
|
desc "flushbackend", "Flush configured backend"
|
53
|
+
option :name, :type => :string, :aliases => "-N"
|
52
54
|
def flushbackend
|
53
|
-
|
55
|
+
if options[:name] then
|
56
|
+
acase = run_as_root :flush_backend, options
|
57
|
+
else
|
58
|
+
return_cases = {}
|
59
|
+
list_backends.each do |key,value|
|
60
|
+
return_cases[key] = run_as_root :flush_backend, { :name => key }
|
61
|
+
end
|
62
|
+
errors = return_cases.select {|key,value| value[:case] != :quiet_exit}.keys
|
63
|
+
acase = (errors.empty?)? {:case => :quiet_exit, :more => "All backends flushed successfully"}: {:case => :configuration_error, :more => "Backends #{errors.join(',')} flushing failed"}
|
64
|
+
end
|
54
65
|
splash_exit acase
|
55
66
|
end
|
56
67
|
|
data/lib/splash/cli/daemon.rb
CHANGED
@@ -99,7 +99,7 @@ module CLISplash
|
|
99
99
|
end
|
100
100
|
|
101
101
|
# Thor method : sending reset verb over transport in the input queue of Splashd
|
102
|
-
desc "
|
102
|
+
desc "reset", "send a reset verb to HOSTNAME daemon over transport (need an active tranport), Typicallly RabbitMQ"
|
103
103
|
def reset(hostname=Socket.gethostname)
|
104
104
|
log = get_logger
|
105
105
|
log.info "ctrl+c for interrupt"
|
data/lib/splash/cli/logs.rb
CHANGED
@@ -12,61 +12,76 @@ module CLISplash
|
|
12
12
|
# Thor method : running Splash configured logs monitors analyse
|
13
13
|
desc "analyse", "analyze logs defined in Splash config"
|
14
14
|
def analyse
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
15
|
+
if is_root? then
|
16
|
+
log = get_logger
|
17
|
+
results = LogScanner::new
|
18
|
+
res = results.analyse
|
19
|
+
log.info "SPlash Configured log monitors :"
|
20
|
+
full_status = true
|
21
|
+
results.output.each do |result|
|
22
|
+
if result[:status] == :clean then
|
23
|
+
log.ok "Log : #{result[:log]} with label : #{result[:label]} : no errors"
|
24
|
+
log.item "Detected pattern : #{result[:pattern]}"
|
25
|
+
log.item "Nb lines = #{result[:lines]}"
|
26
|
+
elsif result[:status] == :missing then
|
27
|
+
log.ko "Log : #{result[:log]} with label : #{result[:label]} : missing !"
|
28
|
+
log.item "Detected pattern : #{result[:pattern]}"
|
29
|
+
else
|
30
|
+
log.ko "Log : #{result[:log]} with label : #{result[:label]} : #{result[:count]} errors"
|
31
|
+
log.item "Detected pattern : #{result[:pattern]}"
|
32
|
+
log.item "Nb lines = #{result[:lines]}"
|
33
|
+
end
|
33
34
|
|
34
|
-
|
35
|
-
|
35
|
+
full_status = false unless result[:status] == :clean
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
-
|
38
|
+
if full_status then
|
39
|
+
log.ok "Global status : no error found"
|
40
|
+
else
|
41
|
+
log.error "Global status : some error found"
|
42
|
+
end
|
43
|
+
splash_exit case: :quiet_exit
|
39
44
|
else
|
40
|
-
|
45
|
+
splash_exit case: :not_root, :more => "Log analysis"
|
41
46
|
end
|
42
|
-
splash_exit case: :quiet_exit
|
43
47
|
end
|
44
48
|
|
45
49
|
|
46
50
|
# Thor method : running Splash configured logs monitors analyse and sending to Prometheus Pushgateway
|
47
51
|
desc "monitor", "monitor logs defined in Splash config"
|
48
52
|
def monitor
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
53
|
+
if is_root? then
|
54
|
+
log = get_logger
|
55
|
+
log.level = :fatal if options[:quiet]
|
56
|
+
result = LogScanner::new
|
57
|
+
result.analyse
|
58
|
+
splash_exit result.notify
|
59
|
+
else
|
60
|
+
splash_exit case: :not_root, :more => "Log analysis"
|
61
|
+
end
|
54
62
|
|
55
63
|
end
|
56
64
|
|
65
|
+
|
66
|
+
|
67
|
+
|
57
68
|
# Thor method : display a specific Splash configured log monitor
|
58
|
-
desc "show
|
69
|
+
desc "show LABEL", "show Splash configured log monitoring for LOG"
|
59
70
|
def show(logrecord)
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
71
|
+
if is_root? then
|
72
|
+
log = get_logger
|
73
|
+
log_record_set = get_config.logs.select{|item| item[:log] == logrecord or item[:label] == logrecord.to_sym}
|
74
|
+
unless log_record_set.empty? then
|
75
|
+
record = log_record_set.first
|
76
|
+
log.info "Splash log monitor : #{record[:log]}"
|
77
|
+
log.item "pattern : /#{record[:pattern]}/"
|
78
|
+
log.item "label : #{record[:label]}"
|
79
|
+
splash_exit case: :quiet_exit
|
80
|
+
else
|
81
|
+
splash_exit case: :not_found, :more => "log not configured"
|
82
|
+
end
|
68
83
|
else
|
69
|
-
splash_exit case: :
|
84
|
+
splash_exit case: :not_root, :more => "Log analysis"
|
70
85
|
end
|
71
86
|
end
|
72
87
|
|
@@ -78,17 +93,98 @@ module CLISplash
|
|
78
93
|
LONGDESC
|
79
94
|
option :detail, :type => :boolean, :aliases => "-D"
|
80
95
|
def list
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
96
|
+
if is_root? then
|
97
|
+
log = get_logger
|
98
|
+
log.info "Splash configured log monitoring :"
|
99
|
+
log_record_set = get_config.logs
|
100
|
+
log.ko 'No configured commands found' if log_record_set.empty?
|
101
|
+
log_record_set.each do |record|
|
102
|
+
log.item "log monitor : #{record[:log]} label : #{record[:label]}"
|
103
|
+
if options[:detail] then
|
104
|
+
log.arrow "pattern : /#{record[:pattern]}/"
|
105
|
+
end
|
89
106
|
end
|
107
|
+
splash_exit case: :quiet_exit
|
108
|
+
else
|
109
|
+
splash_exit case: :not_root, :more => "Log analysis"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Thor method : display the full list of Splash configured log monitors
|
114
|
+
desc "get_result LABEL", "Get last or specific log monitoring report"
|
115
|
+
long_desc <<-LONGDESC
|
116
|
+
Get last or specific log monitoring report\n
|
117
|
+
with --date <DATE>, a date format string (same as in history ouput)
|
118
|
+
LONGDESC
|
119
|
+
option :date, :type => :string, :aliases => "-D"
|
120
|
+
def get_result(label)
|
121
|
+
if is_root? then
|
122
|
+
log = get_logger
|
123
|
+
log.info "Log : #{label}"
|
124
|
+
config = get_config
|
125
|
+
records = LogsRecords::new(label).get_all_records
|
126
|
+
if options[:date] then
|
127
|
+
wanted = records.select{|key,value| key.keys.first == options[:date]}.first
|
128
|
+
else
|
129
|
+
wanted = records.last
|
130
|
+
end
|
131
|
+
if wanted.nil? then
|
132
|
+
splash_exit case: :not_found, more: "Log never monitored"
|
133
|
+
else
|
134
|
+
record =wanted.keys.first
|
135
|
+
value=wanted[record]
|
136
|
+
log.item record
|
137
|
+
log.arrow "Status : #{value[:status].to_s}"
|
138
|
+
log.arrow "nb files : #{value[:errors]}"
|
139
|
+
log.arrow "nb lines : #{value[:lines]}"
|
140
|
+
end
|
141
|
+
else
|
142
|
+
splash_exit case: :not_root, :more => "Log get result"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# Thor method : show logs monitoring history
|
147
|
+
long_desc <<-LONGDESC
|
148
|
+
show logs monitoring history for LABEL\n
|
149
|
+
LONGDESC
|
150
|
+
option :table, :type => :boolean, :aliases => "-t"
|
151
|
+
desc "history LABEL", "show logs monitoring history"
|
152
|
+
def history(label)
|
153
|
+
if is_root? then
|
154
|
+
log = get_logger
|
155
|
+
log.info "Log : #{label}"
|
156
|
+
config = get_config
|
157
|
+
if options[:table] then
|
158
|
+
table = TTY::Table.new do |t|
|
159
|
+
t << ["Start Date", "File","Status", "Nb errors", "Nb lines"]
|
160
|
+
t << ['','','','','']
|
161
|
+
LogsRecords::new(label).get_all_records.each do |item|
|
162
|
+
record =item.keys.first
|
163
|
+
value=item[record]
|
164
|
+
|
165
|
+
t << [record, value[:file], value[:status].to_s, value[:errors], value[:lines]]
|
166
|
+
end
|
167
|
+
end
|
168
|
+
if check_unicode_term then
|
169
|
+
puts table.render(:unicode)
|
170
|
+
else
|
171
|
+
puts table.render(:ascii)
|
172
|
+
end
|
173
|
+
|
174
|
+
else
|
175
|
+
LogsRecords::new(label).get_all_records.each do |item|
|
176
|
+
record =item.keys.first
|
177
|
+
value=item[record]
|
178
|
+
log.item record
|
179
|
+
log.arrow "Status : #{value[:status].to_s}"
|
180
|
+
log.arrow "nb files : #{value[:errors]}"
|
181
|
+
log.arrow "nb lines : #{value[:lines]}"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
splash_exit case: :quiet_exit
|
185
|
+
else
|
186
|
+
splash_exit case: :not_root, :more => "Log analysis"
|
90
187
|
end
|
91
|
-
splash_exit case: :quiet_exit
|
92
188
|
end
|
93
189
|
|
94
190
|
end
|