prometheus-splash 0.8.3 → 0.8.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -4
- data/README.md +400 -178
- data/config/splash.yml +15 -13
- data/lib/splash/backends/file.rb +1 -1
- data/lib/splash/backends.rb +7 -1
- data/lib/splash/cli/commands.rb +45 -80
- data/lib/splash/cli/config.rb +12 -1
- data/lib/splash/cli/daemon.rb +1 -1
- data/lib/splash/cli/logs.rb +34 -2
- data/lib/splash/cli/process.rb +33 -0
- data/lib/splash/cli/webadmin.rb +2 -1
- data/lib/splash/commands.rb +31 -22
- data/lib/splash/config/flush.rb +2 -2
- data/lib/splash/config.rb +15 -8
- data/lib/splash/constants.rb +1 -1
- data/lib/splash/daemon/orchestrator/grammar.rb +1 -1
- data/lib/splash/daemon/orchestrator.rb +6 -7
- data/lib/splash/dependencies.rb +1 -0
- data/lib/splash/logs.rb +5 -1
- data/lib/splash/monkeys.rb +5 -0
- data/lib/splash/processes.rb +4 -0
- data/lib/splash/sequences.rb +6 -1
- data/lib/splash/webadmin/api/routes/commands.rb +13 -1
- data/lib/splash/webadmin/api/routes/config.rb +95 -8
- data/lib/splash/webadmin/api/routes/process.rb +21 -9
- data/lib/splash/webadmin/main.rb +15 -1
- data/lib/splash/webadmin/portal/controllers/commands.rb +99 -1
- data/lib/splash/webadmin/portal/controllers/logs.rb +31 -4
- data/lib/splash/webadmin/portal/controllers/processes.rb +74 -4
- 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 +69 -19
- data/lib/splash/webadmin/portal/views/{logs_form.slim → log_form.slim} +3 -0
- data/lib/splash/webadmin/portal/views/log_history.slim +24 -0
- data/lib/splash/webadmin/portal/views/logs.slim +34 -7
- 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 +79 -6
- data/lib/splash/webadmin.rb +3 -1
- data/prometheus-splash.gemspec +1 -1
- data/templates/.env +0 -0
- data/templates/Dockerfile +5 -0
- data/templates/docker-compose.yml +14 -0
- metadata +18 -9
data/config/splash.yml
CHANGED
@@ -73,49 +73,51 @@
|
|
73
73
|
|
74
74
|
### Sample configuration of commands and scheduling
|
75
75
|
:commands:
|
76
|
-
:id_root
|
76
|
+
- :name: :id_root
|
77
77
|
:desc: run id command on root
|
78
78
|
:command: id root
|
79
|
-
:true_test
|
79
|
+
- :name: :true_test
|
80
80
|
:desc: "test command returning true : 0"
|
81
81
|
:command: "true"
|
82
82
|
:schedule:
|
83
83
|
:every: "1h"
|
84
84
|
:on_failure: :ls_slash_tmp
|
85
85
|
:on_success: :pwd
|
86
|
-
:false_test
|
86
|
+
- :name: :false_test
|
87
87
|
:desc: "test command returning false > 0"
|
88
88
|
:command: "false"
|
89
89
|
:schedule:
|
90
90
|
:every: "1h"
|
91
91
|
:on_failure: :ls_slash_tmp
|
92
92
|
:on_success: :pwd
|
93
|
-
:ls_slash_tmp
|
93
|
+
- :name: :ls_slash_tmp
|
94
94
|
:desc: list file in /tmp
|
95
95
|
:command: ls -al /tmp
|
96
96
|
:user: daemon
|
97
97
|
:on_success: :echo1
|
98
|
-
:pwd
|
98
|
+
- :name: :pwd
|
99
99
|
:desc: run pwd
|
100
100
|
:command: pwd
|
101
101
|
:on_success: :echo1
|
102
102
|
:on_failure: :echo2
|
103
|
-
:echo1
|
103
|
+
- :name: :echo1
|
104
104
|
:desc: echo 'foo'
|
105
105
|
:command: echo foo
|
106
106
|
:on_failure: :echo3
|
107
|
-
:echo2
|
107
|
+
- :name: :echo2
|
108
108
|
:desc: echo 'bar'
|
109
109
|
:command: echo bar
|
110
|
-
:echo3
|
110
|
+
- :name: :echo3
|
111
111
|
:desc: echo 'been'
|
112
112
|
:command: echo been
|
113
|
-
:rand_sleep_5
|
113
|
+
- :name: :rand_sleep_5
|
114
114
|
:desc: sleep on a rand 5
|
115
115
|
:command: ruby -e 'sleep rand(5)'
|
116
116
|
:schedule:
|
117
|
-
:every: "
|
118
|
-
|
117
|
+
:every: "30s"
|
118
|
+
:retention:
|
119
|
+
:hours: 1
|
120
|
+
- :name: :test_remote_call
|
119
121
|
:desc: remote call test
|
120
122
|
:delegate_to:
|
121
123
|
:host: omicron
|
@@ -138,11 +140,11 @@
|
|
138
140
|
|
139
141
|
### configuration of monitored processes
|
140
142
|
:processes:
|
141
|
-
- :process: cron
|
143
|
+
- :process: :cron
|
142
144
|
:patterns:
|
143
145
|
- cron
|
144
146
|
:retention:
|
145
|
-
|
147
|
+
:hours: 5
|
146
148
|
|
147
149
|
|
148
150
|
###
|
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/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/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
|
@@ -125,7 +125,7 @@ module CLISplash
|
|
125
125
|
end
|
126
126
|
|
127
127
|
# Thor method : getting a treeview of sequence of commands
|
128
|
-
desc "treeview", "Show commands sequence tree"
|
128
|
+
desc "treeview COMMAND", "Show commands sequence tree"
|
129
129
|
long_desc <<-LONGDESC
|
130
130
|
Show commands sequence tree\n
|
131
131
|
with --hostname, ask other Splash daemon via transport\n
|
@@ -159,7 +159,7 @@ module CLISplash
|
|
159
159
|
end
|
160
160
|
log.info "Command : #{command.to_s}" if depht == 0
|
161
161
|
aproc = Proc::new do |command,depht|
|
162
|
-
cmd = commands[command.to_sym
|
162
|
+
cmd = commands.select{|item| item[:name] == command.to_sym}.first
|
163
163
|
if cmd[:on_failure] then
|
164
164
|
spacer= " " * depht + " "
|
165
165
|
log.flat "#{spacer}* on failure => #{cmd[:on_failure]}"
|
@@ -211,16 +211,16 @@ module CLISplash
|
|
211
211
|
list = get_config.commands
|
212
212
|
end
|
213
213
|
log.info "Splash configured commands :"
|
214
|
-
log.ko 'No configured commands found' if list.
|
215
|
-
list.
|
216
|
-
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}"
|
217
217
|
if options[:detail] then
|
218
|
-
log.arrow "command line : '#{
|
219
|
-
log.arrow "command description : '#{
|
220
|
-
log.arrow "command failure callback : '#{
|
221
|
-
log.arrow "command success callback : '#{
|
222
|
-
if
|
223
|
-
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
|
224
224
|
log.arrow "command scheduled : #{sched} #{val}."
|
225
225
|
end
|
226
226
|
end
|
@@ -235,7 +235,7 @@ module CLISplash
|
|
235
235
|
with --hostname <HOSTNAME>, an other Splash monitored server (only with Redis backend configured)
|
236
236
|
LONGDESC
|
237
237
|
option :hostname, :type => :string, :aliases => "-H"
|
238
|
-
def show(
|
238
|
+
def show(name)
|
239
239
|
unless is_root? then
|
240
240
|
splash_exit case: :not_root, :more => "Command show specifications"
|
241
241
|
end
|
@@ -261,14 +261,15 @@ module CLISplash
|
|
261
261
|
else
|
262
262
|
list = get_config.commands
|
263
263
|
end
|
264
|
-
|
265
|
-
|
266
|
-
log.
|
267
|
-
log.item "command
|
268
|
-
log.item "command
|
269
|
-
log.item "command
|
270
|
-
if
|
271
|
-
|
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
|
272
273
|
log.item "command scheduled : #{sched} #{val}."
|
273
274
|
end
|
274
275
|
splash_exit case: :quiet_exit
|
@@ -284,11 +285,11 @@ module CLISplash
|
|
284
285
|
show commands executions history for LABEL\n
|
285
286
|
LONGDESC
|
286
287
|
option :table, :type => :boolean, :aliases => "-t"
|
287
|
-
desc "history
|
288
|
+
desc "history COMMAND", "show commands executions history"
|
288
289
|
def history(command)
|
289
290
|
if is_root? then
|
290
291
|
log = get_logger
|
291
|
-
log.info "
|
292
|
+
log.info "Command : #{command}"
|
292
293
|
config = get_config
|
293
294
|
if options[:table] then
|
294
295
|
table = TTY::Table.new do |t|
|
@@ -301,7 +302,7 @@ module CLISplash
|
|
301
302
|
value[:end_date],
|
302
303
|
value[:exec_time],
|
303
304
|
value[:stdout].empty?,
|
304
|
-
value[:
|
305
|
+
value[:stderr].empty?]
|
305
306
|
end
|
306
307
|
end
|
307
308
|
if check_unicode_term then
|
@@ -328,52 +329,8 @@ module CLISplash
|
|
328
329
|
end
|
329
330
|
end
|
330
331
|
|
331
|
-
# Thor method : getting information on the last execution of a command
|
332
|
-
desc "lastrun COMMAND", "Show last running result for specific configured command COMMAND"
|
333
|
-
long_desc <<-LONGDESC
|
334
|
-
Show last running result for specific configured command COMMAND\n
|
335
|
-
with --hostname <HOSTNAME>, an other Splash monitored server (only with Redis backend configured)
|
336
|
-
LONGDESC
|
337
|
-
option :hostname, :type => :string, :aliases => "-H"
|
338
|
-
def lastrun(command)
|
339
|
-
unless is_root? then
|
340
|
-
splash_exit case: :not_root, :more => "Command last execution report"
|
341
|
-
end
|
342
|
-
log = get_logger
|
343
|
-
backend = get_backend :execution_trace
|
344
|
-
redis = (backend.class == Splash::Backends::Redis)? true : false
|
345
|
-
if not redis and options[:hostname] then
|
346
|
-
splash_exit case: :specific_config_required, :more => "Redis backend is requiered for Remote execution report request"
|
347
|
-
end
|
348
|
-
splash_exit case: :not_root if not is_root? and not redis
|
349
|
-
list = get_config.commands.keys
|
350
|
-
if options[:hostname] then
|
351
|
-
options[:hostname] = Socket.gethostname if options[:hostname] == 'hostname'
|
352
|
-
list = backend.list("*", options[:hostname]).map(&:to_sym)
|
353
|
-
end
|
354
|
-
if list.include? command.to_sym then
|
355
|
-
log.info "Splash command #{command} previous execution report:\n"
|
356
|
-
req = { :key => command}
|
357
|
-
req[:hostname] = options[:hostname] if options[:hostname]
|
358
|
-
if backend.exist? req then
|
359
|
-
res = backend.get req
|
360
|
-
tp = Template::new(
|
361
|
-
list_token: get_config.execution_template_tokens,
|
362
|
-
template_file: get_config.execution_template_path)
|
363
|
-
tp.map YAML::load(res).last.values.first
|
364
|
-
log.flat tp.output
|
365
|
-
else
|
366
|
-
log.ko "Command not already runned."
|
367
|
-
end
|
368
|
-
splash_exit case: :quiet_exit
|
369
|
-
else
|
370
|
-
splash_exit case: :not_found, :more => "Command report never runned remotly" if options[:hostname]
|
371
|
-
end
|
372
|
-
end
|
373
|
-
|
374
|
-
|
375
332
|
# Thor method : getting information on one specific execution of a command
|
376
|
-
desc "
|
333
|
+
desc "get_result COMMAND", "Show running result for specific configured command COMMAND"
|
377
334
|
long_desc <<-LONGDESC
|
378
335
|
Show specific running result for specific configured command COMMAND\n
|
379
336
|
with --hostname <HOSTNAME>, an other Splash monitored server (only with Redis backend configured)
|
@@ -381,8 +338,8 @@ module CLISplash
|
|
381
338
|
|
382
339
|
LONGDESC
|
383
340
|
option :hostname, :type => :string, :aliases => "-H"
|
384
|
-
option :date, :type => :string, :aliases => "-D"
|
385
|
-
def
|
341
|
+
option :date, :type => :string, :aliases => "-D"
|
342
|
+
def get_result(command)
|
386
343
|
unless is_root? then
|
387
344
|
splash_exit case: :not_root, :more => "Command specific execution report"
|
388
345
|
end
|
@@ -393,12 +350,12 @@ module CLISplash
|
|
393
350
|
splash_exit case: :specific_config_required, :more => "Redis backend is requiered for Remote execution report request"
|
394
351
|
end
|
395
352
|
splash_exit case: :not_root if not is_root? and not redis
|
396
|
-
list = get_config.commands
|
353
|
+
list = get_config.commands
|
397
354
|
if options[:hostname] then
|
398
355
|
options[:hostname] = Socket.gethostname if options[:hostname] == 'hostname'
|
399
356
|
list = backend.list("*", options[:hostname]).map(&:to_sym)
|
400
357
|
end
|
401
|
-
if list.
|
358
|
+
if list.select{|cmd| cmd[:name] == command.to_sym}.count > 0 then
|
402
359
|
log.info "Splash command #{command} previous execution report:\n"
|
403
360
|
req = { :key => command}
|
404
361
|
req[:hostname] = options[:hostname] if options[:hostname]
|
@@ -407,11 +364,15 @@ module CLISplash
|
|
407
364
|
tp = Template::new(
|
408
365
|
list_token: get_config.execution_template_tokens,
|
409
366
|
template_file: get_config.execution_template_path)
|
410
|
-
|
411
|
-
|
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
|
412
373
|
log.ko "Command not runned one this date or date misformatted."
|
413
374
|
else
|
414
|
-
tp.map prov.
|
375
|
+
tp.map prov.values.first
|
415
376
|
log.flat tp.output
|
416
377
|
end
|
417
378
|
else
|
@@ -419,12 +380,16 @@ module CLISplash
|
|
419
380
|
end
|
420
381
|
splash_exit case: :quiet_exit
|
421
382
|
else
|
422
|
-
|
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
|
423
388
|
end
|
424
389
|
end
|
425
390
|
|
426
391
|
# Thor method : getting the list of avaibles executions reports
|
427
|
-
desc "
|
392
|
+
desc "reportlist", "list all executions report results "
|
428
393
|
long_desc <<-LONGDESC
|
429
394
|
list all executions report results\n
|
430
395
|
with --pattern <SEARCH>, search type string, wilcard * (group) ? (char)\n
|
@@ -437,7 +402,7 @@ module CLISplash
|
|
437
402
|
option :hostname, :type => :string, :aliases => "-H"
|
438
403
|
option :all, :type => :boolean, :negate => false, :aliases => "-A"
|
439
404
|
option :detail, :type => :boolean, :aliases => "-D"
|
440
|
-
def
|
405
|
+
def reportlist
|
441
406
|
unless is_root? then
|
442
407
|
splash_exit case: :not_root, :more => "Command execution report list"
|
443
408
|
end
|
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
@@ -63,10 +63,10 @@ module CLISplash
|
|
63
63
|
end
|
64
64
|
|
65
65
|
|
66
|
-
|
66
|
+
|
67
67
|
|
68
68
|
# Thor method : display a specific Splash configured log monitor
|
69
|
-
desc "show
|
69
|
+
desc "show LABEL", "show Splash configured log monitoring for LOG"
|
70
70
|
def show(logrecord)
|
71
71
|
if is_root? then
|
72
72
|
log = get_logger
|
@@ -110,6 +110,38 @@ module CLISplash
|
|
110
110
|
end
|
111
111
|
end
|
112
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
|
113
145
|
|
114
146
|
# Thor method : show logs monitoring history
|
115
147
|
long_desc <<-LONGDESC
|
data/lib/splash/cli/process.rb
CHANGED
@@ -114,6 +114,39 @@ module CLISplash
|
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
|
+
# Thor method : display the full list of Splash configured process monitors
|
118
|
+
desc "get_result PROCESS", "Get last or specific process monitoring report"
|
119
|
+
long_desc <<-LONGDESC
|
120
|
+
Get last or specific process monitoring report\n
|
121
|
+
with --date <DATE>, a date format string (same as in history ouput)
|
122
|
+
LONGDESC
|
123
|
+
option :date, :type => :string, :aliases => "-D"
|
124
|
+
def get_result(process)
|
125
|
+
if is_root? then
|
126
|
+
log = get_logger
|
127
|
+
log.info "Process : #{process}"
|
128
|
+
config = get_config
|
129
|
+
records = ProcessRecords::new(process).get_all_records
|
130
|
+
if options[:date] then
|
131
|
+
wanted = records.select{|key,value| key.keys.first == options[:date]}.first
|
132
|
+
else
|
133
|
+
wanted = records.last
|
134
|
+
end
|
135
|
+
if wanted.nil? then
|
136
|
+
splash_exit case: :not_found, more: "Process never monitored"
|
137
|
+
else
|
138
|
+
record =wanted.keys.first
|
139
|
+
value=wanted[record]
|
140
|
+
log.item record
|
141
|
+
log.arrow "Status : #{value[:status].to_s}"
|
142
|
+
log.arrow "CPU Percent : #{value[:cpu_percent]}"
|
143
|
+
log.arrow "MEM Percent : #{value[:mem_percent]}"
|
144
|
+
end
|
145
|
+
else
|
146
|
+
splash_exit case: :not_root, :more => "Process get result"
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
117
150
|
|
118
151
|
# Thor method : show logs monitoring history
|
119
152
|
long_desc <<-LONGDESC
|
data/lib/splash/cli/webadmin.rb
CHANGED
@@ -35,9 +35,10 @@ module CLISplash
|
|
35
35
|
long_desc <<-LONGDESC
|
36
36
|
Starting Splash Daemon\n
|
37
37
|
LONGDESC
|
38
|
+
option :foreground, :type => :boolean, :aliases => "-F"
|
38
39
|
desc "start", "Splash WebAdmin Daemon status"
|
39
40
|
def start
|
40
|
-
acase = run_as_root :startweb
|
41
|
+
acase = run_as_root :startweb, options
|
41
42
|
splash_exit acase
|
42
43
|
end
|
43
44
|
|
data/lib/splash/commands.rb
CHANGED
@@ -48,6 +48,11 @@ module Splash
|
|
48
48
|
@backend = get_backend :execution_trace
|
49
49
|
end
|
50
50
|
|
51
|
+
|
52
|
+
def clear
|
53
|
+
@backend.del({:key => @name}) if @backend.exist?({key: @name})
|
54
|
+
end
|
55
|
+
|
51
56
|
def purge(retention)
|
52
57
|
retention = {} if retention.nil?
|
53
58
|
if retention.include? :hours then
|
@@ -96,7 +101,7 @@ module Splash
|
|
96
101
|
@config = get_config
|
97
102
|
@url = @config.prometheus_pushgateway_url
|
98
103
|
@name = name
|
99
|
-
unless @config.commands.
|
104
|
+
unless @config.commands.select{|cmd| cmd[:name] == @name.to_sym }.count > 0 then
|
100
105
|
splash_exit case: :not_found, more: "command #{@name} is not defined in configuration"
|
101
106
|
end
|
102
107
|
end
|
@@ -139,18 +144,20 @@ module Splash
|
|
139
144
|
session = (options[:session])? options[:session] : get_session
|
140
145
|
acase = { :case => :quiet_exit }
|
141
146
|
exit_code = 0
|
142
|
-
|
147
|
+
command = @config.commands.select{|command| command[:name] == @name.to_sym}.first
|
148
|
+
if command[:delegate_to] then
|
143
149
|
return { :case => :options_incompatibility, :more => '--hostname forbidden with delagate commands'} if options[:hostname]
|
144
|
-
log.send "Remote command : #{@name} execution delegate to : #{
|
150
|
+
log.send "Remote command : #{@name} execution delegate to : #{command[:delegate_to][:host]} as : #{command[:delegate_to][:remote_command]}", session
|
151
|
+
log.warn "Local command : #{command[:command]} defined but ignored, because delegate have the priority"
|
145
152
|
begin
|
146
153
|
transport = get_default_client
|
147
154
|
if transport.class == Hash and transport.include? :case then
|
148
155
|
return transport
|
149
156
|
else
|
150
157
|
res = transport.execute({ :verb => :execute_command,
|
151
|
-
payload: {:name =>
|
158
|
+
payload: {:name => command[:delegate_to][:remote_command].to_s},
|
152
159
|
:return_to => "splash.#{Socket.gethostname}.return",
|
153
|
-
:queue => "splash.#{
|
160
|
+
:queue => "splash.#{command[:delegate_to][:host]}.input" })
|
154
161
|
exit_code = res[:exit_code]
|
155
162
|
log.receive "return with exitcode #{exit_code}", session
|
156
163
|
|
@@ -164,35 +171,35 @@ module Splash
|
|
164
171
|
start_date = DateTime.now.to_s
|
165
172
|
unless options[:trace] then
|
166
173
|
log.item "Traceless execution", session
|
167
|
-
if
|
168
|
-
log.item "Execute with user : #{
|
169
|
-
system("sudo -u #{
|
174
|
+
if command[:user] then
|
175
|
+
log.item "Execute with user : #{command[:user]}.", session
|
176
|
+
system("sudo -u #{command[:user]} #{command[:command]} > /dev/null 2>&1")
|
170
177
|
else
|
171
|
-
system("#{
|
178
|
+
system("#{command[:command]} > /dev/null 2>&1")
|
172
179
|
end
|
173
180
|
time = Time.now - start
|
174
181
|
exit_code = $?.exitstatus
|
175
182
|
else
|
176
183
|
log.item "Tracefull execution", session
|
177
|
-
if
|
178
|
-
log.item "Execute with user : #{
|
179
|
-
stdout, stderr, status = Open3.capture3("sudo -u #{
|
184
|
+
if command[:user] then
|
185
|
+
log.item "Execute with user : #{command[:user]}.", session
|
186
|
+
stdout, stderr, status = Open3.capture3("sudo -u #{command[:user]} #{command[:command]}")
|
180
187
|
else
|
181
|
-
stdout, stderr, status = Open3.capture3(
|
188
|
+
stdout, stderr, status = Open3.capture3(command[:command])
|
182
189
|
end
|
183
190
|
time = Time.now - start
|
184
191
|
data = Hash::new
|
185
192
|
data[:start_date] = start_date
|
186
193
|
data[:end_date] = DateTime.now.to_s
|
187
194
|
data[:cmd_name] = @name
|
188
|
-
data[:cmd_line] =
|
189
|
-
data[:desc] =
|
195
|
+
data[:cmd_line] = command[:command]
|
196
|
+
data[:desc] = command[:desc]
|
190
197
|
data[:status] = status.to_s
|
191
198
|
data[:stdout] = stdout
|
192
199
|
data[:stderr] = stderr
|
193
200
|
data[:exec_time] = time.to_s
|
194
201
|
cmdrec = CmdRecords::new @name
|
195
|
-
cmdrec.purge(
|
202
|
+
cmdrec.purge(command[:retention])
|
196
203
|
cmdrec.add_record data
|
197
204
|
exit_code = status.exitstatus
|
198
205
|
end
|
@@ -205,24 +212,26 @@ module Splash
|
|
205
212
|
end
|
206
213
|
end
|
207
214
|
if options[:callback] then
|
208
|
-
on_failure = (
|
209
|
-
on_success = (
|
215
|
+
on_failure = (command[:on_failure])? command[:on_failure] : false
|
216
|
+
on_success = (command[:on_success])? command[:on_success] : false
|
210
217
|
if on_failure and exit_code > 0 then
|
211
218
|
log.item "On failure callback : #{on_failure}", session
|
212
|
-
if @config.commands.
|
219
|
+
if @config.commands.select {|item| item[:name] == on_failure}.count > 0 then
|
213
220
|
@name = on_failure.to_s
|
214
221
|
call_and_notify options
|
215
222
|
else
|
216
|
-
|
223
|
+
log.error "on_failure call error : #{on_failure.to_s} command inexistant.", session
|
224
|
+
acase = { :case => :configuration_error , :more => "Command #{command[:name]} callback coniguration error"}
|
217
225
|
end
|
218
226
|
end
|
219
227
|
if on_success and exit_code == 0 then
|
220
228
|
log.item "On success callback : #{on_success}", session
|
221
|
-
if @config.commands.
|
229
|
+
if @config.commands.select {|item| item[:name] == on_success}.count > 0 then
|
222
230
|
@name = on_success.to_s
|
223
231
|
call_and_notify options
|
224
232
|
else
|
225
|
-
|
233
|
+
log.error "on_success call error : #{on_success.to_s} command inexistant."
|
234
|
+
acase = { :case => :configuration_error , :more => "Command #{command[:name]} callback coniguration error"}
|
226
235
|
end
|
227
236
|
end
|
228
237
|
else
|
data/lib/splash/config/flush.rb
CHANGED
@@ -16,8 +16,8 @@ module Splash
|
|
16
16
|
self.extend Splash::Backends
|
17
17
|
self.extend Splash::Loggers
|
18
18
|
log = get_logger
|
19
|
-
|
20
|
-
|
19
|
+
name = (options[:name])? options[:name].to_sym : :execution_trace
|
20
|
+
log.info "Splash backend #{name.to_s} flushing"
|
21
21
|
backend = get_backend name
|
22
22
|
if backend.flush then
|
23
23
|
return { :case => :quiet_exit, :more => "Splash backend #{name.to_s} flushed" }
|