prometheus-splash 0.1.0 → 0.1.1
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/README.md +31 -1
- data/bin/splash +6 -364
- data/lib/splash/backends.rb +1 -0
- data/lib/splash/backends/file.rb +1 -0
- data/lib/splash/backends/redis.rb +1 -3
- data/lib/splash/cli.rb +20 -0
- data/lib/splash/cli/commands.rb +164 -0
- data/lib/splash/cli/config.rb +37 -0
- data/lib/splash/cli/daemon.rb +52 -0
- data/lib/splash/cli/documentation.rb +24 -0
- data/lib/splash/cli/logs.rb +72 -0
- data/lib/splash/commands.rb +10 -15
- data/lib/splash/config.rb +7 -9
- data/lib/splash/constants.rb +2 -1
- data/lib/splash/controller.rb +12 -24
- data/lib/splash/dependencies.rb +51 -0
- data/lib/splash/exiter.rb +52 -0
- data/lib/splash/helpers.rb +2 -8
- data/lib/splash/logs.rb +4 -5
- data/lib/splash/orchestrator.rb +4 -5
- data/lib/splash/templates.rb +1 -0
- data/lib/splash/transports.rb +1 -0
- data/lib/splash/transports/rabbitmq.rb +1 -4
- data/prometheus-splash.gemspec +3 -1
- metadata +38 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62507dbefc8ccad97a7388a4527a79991b7224e5d6181d8edc06fcd6299c6791
|
4
|
+
data.tar.gz: 62fa6ab6b86cd2442a9f3d6e2a4bf3e073f3a2d0a51154dba4fa64590c4b5f54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f651a3c3a6c758ce7939403d16c48d4b8f3666e30ad378c9de2db38a3e5ff7bfaf5565a0ffedf971781305a3098b15e9d5111efa1b4be6db16db8642b43ddbfc
|
7
|
+
data.tar.gz: fe6b45de95e4ecde64eb7361d4edc6da5268bfebabd312617b44983612155f02a7bc20c6297adf85797abe069350f81bf9cc46ec43ebb3fc493fcdd115306280
|
data/README.md
CHANGED
@@ -647,8 +647,38 @@ TRANSPORTS_STRUCT = { :list => [:rabbitmq],
|
|
647
647
|
|
648
648
|
|
649
649
|
#### Splash CLI return code significations
|
650
|
+
```ruby
|
651
|
+
EXIT_MAP= {
|
650
652
|
|
651
|
-
|
653
|
+
# context execution
|
654
|
+
:not_root => {:message => "This operation need to be run as root (use sudo or rvmsudo)", :code => 10},
|
655
|
+
:options_incompatibility => {:message => "Options incompatibility", :code => 40},
|
656
|
+
:service_dependence_missing => {:message => "Splash Service dependence missing", :code => 60},
|
657
|
+
|
658
|
+
# config
|
659
|
+
:specific_config_required => {:message => "Specific configuration required", :code => 30},
|
660
|
+
:splash_setup_error => {:message => "Splash Setup terminated unsuccessfully", :code => 25},
|
661
|
+
:splash_setup_success => {:message => "Splash Setup terminated successfully", :code => 0},
|
662
|
+
:splash_sanitycheck_error => {:message => "Splash Sanitycheck terminated unsuccessfully", :code => 20},
|
663
|
+
:splash_sanitycheck_success => {:message => "Splash Sanitycheck terminated successfully", :code => 0},
|
664
|
+
:configuration_error => {:message => "Splash Configuration Error", :code => 50},
|
665
|
+
|
666
|
+
|
667
|
+
# global
|
668
|
+
:quiet_exit => {:code => 0},
|
669
|
+
|
670
|
+
# events
|
671
|
+
:interrupt => {:message => "Splash user operation interrupted", :code => 33},
|
672
|
+
|
673
|
+
# request
|
674
|
+
:not_found => {:message => "Object not found", :code => 44},
|
675
|
+
:already_exist => {:message => "Object already exist", :code => 48},
|
676
|
+
|
677
|
+
# daemon
|
678
|
+
:status_ok => {:message => "Status OK", :code => 0},
|
679
|
+
:status_ko => {:message => "Status KO", :code => 31}
|
680
|
+
```
|
681
|
+
}
|
652
682
|
|
653
683
|
### In the Futur ?
|
654
684
|
|
data/bin/splash
CHANGED
@@ -1,374 +1,16 @@
|
|
1
1
|
#!/usr/bin/env ruby -W:no-deprecated
|
2
|
-
|
3
|
-
require 'yaml'
|
4
|
-
require 'thread'
|
2
|
+
# coding: utf-8
|
5
3
|
|
6
|
-
|
7
|
-
|
8
|
-
require 'prometheus/client/push'
|
9
|
-
require 'thor'
|
10
|
-
require 'rufus-scheduler'
|
11
|
-
|
12
|
-
rescue Gem::GemNotFoundException
|
13
|
-
$stderr.puts "Loadind error, it's like you try to run Splash, with a lake of dependencies."
|
14
|
-
$stderr.puts "If you run on RVM, please run with rvmsudo and not with sudo."
|
15
|
-
$stderr.puts "If problem is percistant, please, proceed to new install and Setup."
|
16
|
-
end
|
17
|
-
|
18
|
-
require 'yaml'
|
19
|
-
|
20
|
-
require 'splash/constants'
|
21
|
-
require 'splash/helpers'
|
22
|
-
require 'splash/config'
|
23
|
-
require 'splash/templates'
|
24
|
-
require 'splash/backends'
|
25
|
-
require 'splash/transports'
|
26
|
-
|
27
|
-
require 'splash/commands'
|
28
|
-
require 'splash/logs'
|
29
|
-
require 'splash/orchestrator'
|
30
|
-
require 'splash/controller'
|
4
|
+
require 'splash/dependencies'
|
5
|
+
require 'splash/cli'
|
31
6
|
|
32
7
|
#inhibit warning : due to prometheus-client call to URI.encode warning
|
33
8
|
$-w = nil
|
34
9
|
|
10
|
+
include Splash::Dependencies
|
35
11
|
include Splash::Helpers
|
36
|
-
|
37
|
-
module CLISplash
|
38
|
-
|
39
|
-
|
40
|
-
class Commands < Thor
|
41
|
-
include Splash::Config
|
42
|
-
include Splash::Backends
|
43
|
-
|
44
|
-
desc "execute NAME", "run for command/sequence or ack result"
|
45
|
-
long_desc <<-LONGDESC
|
46
|
-
execute command or sequence or ack result
|
47
|
-
with --no-trace prevent storing execution trace in configured backend (see config file)
|
48
|
-
with --ack, notify errorcode=0 to Prometheus PushGateway
|
49
|
-
with --no-notify, bypass Prometheus notification
|
50
|
-
with --no-callback, never execute callback (:on_failure, :on_success)
|
51
|
-
never follow sequences
|
52
|
-
LONGDESC
|
53
|
-
option :trace, :type => :boolean, :default => true
|
54
|
-
option :ack, :type => :boolean, negate: false
|
55
|
-
option :notify, :type => :boolean, :default => true
|
56
|
-
option :callback, :type => :boolean, :default => true
|
57
|
-
def execute(name)
|
58
|
-
if is_root? then
|
59
|
-
command = Splash::CommandWrapper::new(name)
|
60
|
-
command.ack if options[:ack]
|
61
|
-
command.call_and_notify trace: options[:trace], notify: options[:notify], callback: options[:callback]
|
62
|
-
else
|
63
|
-
$stderr.puts "Command wrapping need to be run as root"
|
64
|
-
exit 60
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
desc "treeview", "Show commands sequence tree"
|
71
|
-
def treeview(command, depht = 0)
|
72
|
-
puts "Command : #{command.to_s}" if depht == 0
|
73
|
-
cmd = get_config.commands[command.to_sym]
|
74
|
-
if cmd[:on_failure] then
|
75
|
-
print " " * depht + " "
|
76
|
-
puts "* on failure => #{cmd[:on_failure]}"
|
77
|
-
treeview(cmd[:on_failure], depht+2)
|
78
|
-
end
|
79
|
-
if cmd[:on_success] then
|
80
|
-
print " " * depht + " "
|
81
|
-
puts "* on success => #{cmd[:on_success]}"
|
82
|
-
treeview(cmd[:on_success],depht+2)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
desc "list", "Show configured commands"
|
95
|
-
long_desc <<-LONGDESC
|
96
|
-
Show configured commands
|
97
|
-
with --detail, show command details
|
98
|
-
LONGDESC
|
99
|
-
option :detail, :type => :boolean
|
100
|
-
def list
|
101
|
-
puts "Splash configured commands :"
|
102
|
-
list = get_config.commands
|
103
|
-
puts 'No configured commands found' if list.keys.empty?
|
104
|
-
list.keys.each do |command|
|
105
|
-
puts " * #{command.to_s}"
|
106
|
-
if options[:detail] then
|
107
|
-
puts " - command line : '#{list[command][:command]}'"
|
108
|
-
puts " - command description : '#{list[command][:desc]}'"
|
109
|
-
puts " - command failure callback : '#{list[command.to_sym][:on_failure]}'" if list[command.to_sym][:on_failure]
|
110
|
-
puts " - command success callback : '#{list[command.to_sym][:on_success]}'" if list[command.to_sym][:on_success]
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
|
116
|
-
desc "show COMMAND", "Show specific configured command COMMAND"
|
117
|
-
def show(command)
|
118
|
-
list = get_config.commands
|
119
|
-
if list.keys.include? command.to_sym then
|
120
|
-
puts "Splash command : #{command}"
|
121
|
-
puts " - command line : '#{list[command.to_sym][:command]}'"
|
122
|
-
puts " - command description : '#{list[command.to_sym][:desc]}'"
|
123
|
-
puts " - command failure callback : '#{list[command.to_sym][:on_failure]}'" if list[command.to_sym][:on_failure]
|
124
|
-
puts " - command success callback : '#{list[command.to_sym][:on_success]}'" if list[command.to_sym][:on_success]
|
125
|
-
else
|
126
|
-
$stderr.puts "Command not configured"
|
127
|
-
exit 50
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
|
132
|
-
desc "lastrun COMMAND", "Show last running result for specific configured command COMMAND"
|
133
|
-
long_desc <<-LONGDESC
|
134
|
-
Show last running result for specific configured command COMMAND
|
135
|
-
with --hostname <HOSTNAME>, an other Splash monitored server (only with Redis backend configured)
|
136
|
-
LONGDESC
|
137
|
-
option :hostname, :type => :string
|
138
|
-
def lastrun(command)
|
139
|
-
backend = get_backend :execution_trace
|
140
|
-
redis = (backend.class == Splash::Backends::Redis)? true : false
|
141
|
-
if not redis and options[:hostname] then
|
142
|
-
$stderr.puts "Remote execution report request only possible with Redis backend"
|
143
|
-
end
|
144
|
-
list = get_config.commands
|
145
|
-
if list.keys.include? command.to_sym then
|
146
|
-
print "Splash command #{command} previous execution report:\n\n"
|
147
|
-
req = { :key => command}
|
148
|
-
req[:hostname] = options[:hostname] if options[:hostname]
|
149
|
-
if backend.exist? req then
|
150
|
-
print backend.get req
|
151
|
-
else
|
152
|
-
puts "Command not already runned."
|
153
|
-
end
|
154
|
-
else
|
155
|
-
$stderr.puts "Command not configured"
|
156
|
-
exit 50
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
desc "getreportlist COMMAND", "list all executions report results "
|
161
|
-
long_desc <<-LONGDESC
|
162
|
-
Show configured commands
|
163
|
-
with --pattern <SEARCH>, search type string, wilcard * (group) ? (char)
|
164
|
-
with --hostname <HOSTNAME>, an other Splash monitored server (only with Redis backend configured)
|
165
|
-
with --all, get all execution report for all servers (only with Redis backend configured)
|
166
|
-
--all and --hostname are exclusives
|
167
|
-
LONGDESC
|
168
|
-
option :pattern, :type => :string
|
169
|
-
option :hostname, :type => :string
|
170
|
-
option :all, :type => :boolean, :negate => false
|
171
|
-
def getreportlist
|
172
|
-
if options[:hostname] and options[:all] then
|
173
|
-
$stderr.puts "--all option imcompatible with --hostname"
|
174
|
-
exit 40
|
175
|
-
end
|
176
|
-
backend = get_backend :execution_trace
|
177
|
-
redis = (backend.class == Splash::Backends::Redis)? true : false
|
178
|
-
if not redis and (options[:hostname] or options[:all]) then
|
179
|
-
$stderr.puts "Remote execution report request only possible with Redis backend"
|
180
|
-
exit 40
|
181
|
-
end
|
182
|
-
pattern = (options[:pattern])? options[:pattern] : '*'
|
183
|
-
if options[:all] then
|
184
|
-
res = backend.listall pattern
|
185
|
-
elsif options[:hostname]
|
186
|
-
res = backend.list pattern, options[:hostname]
|
187
|
-
else
|
188
|
-
res = backend.list pattern
|
189
|
-
end
|
190
|
-
print "List of Executions reports :\n\n"
|
191
|
-
puts "Not reports found" if res.empty?
|
192
|
-
res.each do |item|
|
193
|
-
if options[:all]
|
194
|
-
host,command = item.split('#')
|
195
|
-
puts " * Command : #{command} @ host : #{host}"
|
196
|
-
else
|
197
|
-
puts " * Command : #{item}"
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
end
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
class CLIController < Thor
|
210
|
-
include Splash::LogsMonitor::DaemonController
|
211
|
-
include Splash::Transports
|
212
|
-
|
213
|
-
option :foreground, :type => :boolean
|
214
|
-
desc "start", "Starting Logs Monitor Daemon"
|
215
|
-
def start
|
216
|
-
errorcode = run_as_root :startdaemon
|
217
|
-
exit errorcode
|
218
|
-
end
|
219
|
-
|
220
|
-
desc "stop", "Stopping Logs Monitor Daemon"
|
221
|
-
def stop
|
222
|
-
errorcode = run_as_root :stopdaemon
|
223
|
-
exit errorcode
|
224
|
-
end
|
225
|
-
|
226
|
-
desc "status", "Logs Monitor Daemon status"
|
227
|
-
def status
|
228
|
-
errorcode = run_as_root :statusdaemon
|
229
|
-
exit errorcode
|
230
|
-
end
|
231
|
-
|
232
|
-
desc "ping HOSTNAME", "send a ping to HOSTNAME daemon over transport (need an active tranport), Typicallly RabbitMQ"
|
233
|
-
def ping(hostname=Socket.gethostname)
|
234
|
-
puts "ctrl+c for interrupt"
|
235
|
-
queue = "splash.#{Socket.gethostname}.returncli"
|
236
|
-
order = {:verb => :ping, :payload => {:hostname => Socket.gethostname}, :return_to => queue}
|
237
|
-
|
238
|
-
lock = Mutex.new
|
239
|
-
condition = ConditionVariable.new
|
240
|
-
begin
|
241
|
-
get_default_subscriber(queue: queue).subscribe(timeout: 10) do |delivery_info, properties, payload|
|
242
|
-
puts YAML::load(payload)
|
243
|
-
lock.synchronize { condition.signal }
|
244
|
-
end
|
245
|
-
get_default_client.publish queue: "splash.#{hostname}.input", message: order.to_yaml
|
246
|
-
lock.synchronize { condition.wait(lock) }
|
247
|
-
rescue Interrupt
|
248
|
-
puts "Splash : ping : Interrupted by user. "
|
249
|
-
exit 33
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
end
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
class Config < Thor
|
259
|
-
include Splash::Config
|
260
|
-
include Splash::Helpers
|
261
|
-
|
262
|
-
desc "setup", "Setup installation fo Splash"
|
263
|
-
long_desc <<-LONGDESC
|
264
|
-
Setup installation fo Splash
|
265
|
-
with --preserve, preserve from reinstallation of the config
|
266
|
-
LONGDESC
|
267
|
-
option :preserve, :type => :boolean
|
268
|
-
def setup
|
269
|
-
errorcode = run_as_root :setupsplash
|
270
|
-
exit errorcode
|
271
|
-
end
|
272
|
-
|
273
|
-
desc "sanitycheck", "Verify installation fo Splash"
|
274
|
-
def sanitycheck
|
275
|
-
errorcode = run_as_root :checkconfig
|
276
|
-
exit errorcode
|
277
|
-
end
|
278
|
-
|
279
|
-
desc "version", "display current Splash version"
|
280
|
-
def version
|
281
|
-
config = get_config
|
282
|
-
puts "Splash version : #{config.version}, Author : #{config.author}"
|
283
|
-
puts config.copyright
|
284
|
-
end
|
285
|
-
|
286
|
-
|
287
|
-
end
|
288
|
-
|
289
|
-
|
290
|
-
class Logs < Thor
|
291
|
-
include Splash::Config
|
292
|
-
|
293
|
-
desc "analyse", "analyze logs in config"
|
294
|
-
def analyse
|
295
|
-
results = Splash::LogScanner::new
|
296
|
-
results.analyse
|
297
|
-
puts "SPlash Configured logs status :"
|
298
|
-
full_status = true
|
299
|
-
results.output.each do |result|
|
300
|
-
status = (result[:status] == :clean)? "OK": "KO"
|
301
|
-
puts " * Log : #{result[:log]} : [#{status}]"
|
302
|
-
puts " - Detected pattern : #{result[:pattern]}"
|
303
|
-
puts " - detailled Status : #{result[:status].to_s}"
|
304
|
-
puts " count = #{result[:count]}" if result[:status] == :matched
|
305
|
-
puts " nb lines = #{result[:lines]}" if result[:status] != :missing
|
306
|
-
full_status = false unless result[:status] == :clean
|
307
|
-
end
|
308
|
-
display_status = (full_status)? "OK": "KO"
|
309
|
-
puts "Global Status : [#{display_status}]"
|
310
|
-
end
|
311
|
-
|
312
|
-
desc "monitor", "monitor logs in config"
|
313
|
-
def monitor
|
314
|
-
result = Splash::LogScanner::new
|
315
|
-
result.analyse
|
316
|
-
result.notify
|
317
|
-
end
|
318
|
-
|
319
|
-
desc "show LOG", "show configured log monitoring for LOG"
|
320
|
-
def show(log)
|
321
|
-
log_record_set = get_config.logs.select{|item| item[:log] == log }
|
322
|
-
unless log_record_set.empty? then
|
323
|
-
record = log_record_set.first
|
324
|
-
puts "Splash log monitor : #{record[:log]}"
|
325
|
-
puts " -> pattern : /#{record[:pattern]}/"
|
326
|
-
else
|
327
|
-
$stderr.puts "log not configured"
|
328
|
-
exit 50
|
329
|
-
end
|
330
|
-
end
|
331
|
-
|
332
|
-
desc "list", "Show configured logs monitoring"
|
333
|
-
long_desc <<-LONGDESC
|
334
|
-
Show configured logs monitoring
|
335
|
-
with --detail, show logs monitor details
|
336
|
-
LONGDESC
|
337
|
-
option :detail, :type => :boolean
|
338
|
-
def list
|
339
|
-
puts "Splash configured log monitoring :"
|
340
|
-
log_record_set = get_config.logs
|
341
|
-
puts 'No configured commands found' if log_record_set.empty?
|
342
|
-
log_record_set.each do |record|
|
343
|
-
puts " * log monitor : #{record[:log]}"
|
344
|
-
if options[:detail] then
|
345
|
-
puts " -> pattern : /#{record[:pattern]}/"
|
346
|
-
end
|
347
|
-
end
|
348
|
-
end
|
349
|
-
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
class CLI < Thor
|
354
|
-
def self.exit_on_failure?
|
355
|
-
true
|
356
|
-
end
|
357
|
-
|
358
|
-
include CLISplash
|
359
|
-
desc "commands SUBCOMMAND ...ARGS", "Managing commands/batchs supervision"
|
360
|
-
subcommand "commands", Commands
|
361
|
-
desc "logs SUBCOMMAND ...ARGS", "Managing Files/Logs supervision"
|
362
|
-
subcommand "logs", Logs
|
363
|
-
desc "daemon SUBCOMMAND ...ARGS", "Logs monitor daemon contoller"
|
364
|
-
subcommand "daemon", CLIController
|
365
|
-
desc "config SUBCOMMAND ...ARGS", "config tools for Splash"
|
366
|
-
subcommand "config", Config
|
367
|
-
end
|
368
|
-
|
369
|
-
|
370
|
-
|
12
|
+
include Splash::Exiter
|
371
13
|
|
372
14
|
|
373
15
|
|
374
|
-
CLI.start(ARGV)
|
16
|
+
CLI.start(ARGV)
|
data/lib/splash/backends.rb
CHANGED
data/lib/splash/backends/file.rb
CHANGED