runsible 0.1.4.5 → 0.1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/runsible.rb +23 -32
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3555f9e44cc10f2dd93aaa61d532c2094db9c210
|
4
|
+
data.tar.gz: aa837e80e9aff3ff4e852dad7ddd1291a6f9c120
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c7d9e19f63ae44c4183170cca0783017fceec93c0f497a6cab2979cabc0ca48c2b33dc96ed63e0d193d1e6bd922350f400913e81fc0fc821dd5a8c9954d938f
|
7
|
+
data.tar.gz: 58aecf9c8b625cb252264e6281f46943775a14ebf674938ffd331302777c858dd5a58da371fb3baa8d9b48ba5fb4fc383637728fffc101e41322ecc028418371
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.5.1
|
data/lib/runsible.rb
CHANGED
@@ -6,13 +6,14 @@ autoload :Slop, 'slop'
|
|
6
6
|
# - this module is deliberately written without private state
|
7
7
|
# - whenever a remote command sends data to STDOUT or STDERR, Runsible will
|
8
8
|
# immediately send it to the corresponding local IO
|
9
|
-
# - Runsible itself writes some warnings and timestamped command
|
9
|
+
# - Runsible itself writes some warnings and timestamped command delimiters to
|
10
10
|
# STDOUT and STDERR
|
11
11
|
#
|
12
12
|
module Runsible
|
13
13
|
class Error < RuntimeError; end
|
14
14
|
class CommandFailure < Runsible::Error; end # nonzero exit
|
15
15
|
|
16
|
+
# defaults
|
16
17
|
SETTINGS = {
|
17
18
|
user: ENV['USER'],
|
18
19
|
host: '127.0.0.1',
|
@@ -22,20 +23,18 @@ module Runsible
|
|
22
23
|
}
|
23
24
|
SSH_CNX_TIMEOUT = 10
|
24
25
|
|
25
|
-
|
26
|
-
# Utility stuff
|
27
|
-
#
|
26
|
+
### Utility stuff ###
|
28
27
|
|
29
28
|
# provide a better string representation for all Exceptions
|
30
29
|
def self.excp(excp)
|
31
30
|
"#{excp.class}: #{excp.message}"
|
32
31
|
end
|
33
32
|
|
34
|
-
# return SETTINGS with string keys
|
35
|
-
def self.
|
36
|
-
hsh
|
33
|
+
# return SETTINGS with string keys, using values from hsh if passed in
|
34
|
+
def self.apply_defaults(hsh = nil)
|
35
|
+
hsh ||= Hash.new
|
37
36
|
SETTINGS.each { |sym, v|
|
38
|
-
hsh[sym.to_s]
|
37
|
+
hsh[sym.to_s] ||= v
|
39
38
|
}
|
40
39
|
hsh
|
41
40
|
end
|
@@ -45,7 +44,7 @@ module Runsible
|
|
45
44
|
File.read(File.join(__dir__, '..', 'VERSION'))
|
46
45
|
end
|
47
46
|
|
48
|
-
# send alert depending on settings
|
47
|
+
# send alert depending on settings
|
49
48
|
def self.alert(topic, message, settings)
|
50
49
|
backend = settings['alerts'] && settings['alerts']['backend']
|
51
50
|
case backend
|
@@ -77,19 +76,7 @@ module Runsible
|
|
77
76
|
exit 1
|
78
77
|
end
|
79
78
|
|
80
|
-
|
81
|
-
#
|
82
|
-
# CLI or bin/runsible stuff
|
83
|
-
#
|
84
|
-
|
85
|
-
# bin/runsible entry point
|
86
|
-
def self.spoon(ssh_options = Hash.new)
|
87
|
-
opts = Runsible.slop_parse
|
88
|
-
yaml = self.extract_yaml(opts)
|
89
|
-
settings = Runsible.default_settings.merge(yaml['settings'] || Hash.new)
|
90
|
-
settings = self.merge(opts, settings)
|
91
|
-
self.ssh_runlist(settings, yaml['runlist'] || Array.new, ssh_options, yaml)
|
92
|
-
end
|
79
|
+
### CLI or bin/runsible stuff ###
|
93
80
|
|
94
81
|
# parse CLI arguments
|
95
82
|
def self.slop_parse
|
@@ -137,15 +124,21 @@ module Runsible
|
|
137
124
|
exit 1
|
138
125
|
end
|
139
126
|
|
140
|
-
#
|
141
|
-
|
142
|
-
|
127
|
+
# bin/runsible entry point
|
128
|
+
def self.spoon(ssh_options = Hash.new)
|
129
|
+
opts = Runsible.slop_parse
|
130
|
+
yaml = self.extract_yaml(opts)
|
131
|
+
settings = self.merge(opts, Runsible.apply_defaults(yaml['settings']))
|
132
|
+
self.ssh_runlist(settings, yaml['runlist'], ssh_options, yaml)
|
133
|
+
end
|
134
|
+
|
135
|
+
### Library stuff ###
|
143
136
|
|
144
137
|
# run a YAML file without any consideration for command line options
|
145
138
|
def self.run_yaml(yaml_filename, ssh_options = Hash.new)
|
146
139
|
yaml = YAML.load_file(yaml_filename)
|
147
|
-
self.
|
148
|
-
|
140
|
+
settings = self.apply_defaults(yaml['settings'])
|
141
|
+
self.ssh_runlist(settings, yaml['runlist'], ssh_options, yaml)
|
149
142
|
end
|
150
143
|
|
151
144
|
# initiate ssh connection, perform the runlist
|
@@ -161,8 +154,9 @@ module Runsible
|
|
161
154
|
end
|
162
155
|
|
163
156
|
# execute runlist with failure handling, retries, alerting, etc.
|
157
|
+
# runlist can be nil
|
164
158
|
def self.exec_runlist(ssh, runlist, settings, yaml = Hash.new)
|
165
|
-
runlist.each { |run|
|
159
|
+
(runlist || Array.new).each { |run|
|
166
160
|
cmd = run.fetch('command')
|
167
161
|
retries = run['retries'] || settings['retries']
|
168
162
|
on_failure = run['on_failure'] || 'exit'
|
@@ -238,10 +232,7 @@ module Runsible
|
|
238
232
|
true
|
239
233
|
end
|
240
234
|
|
241
|
-
|
242
|
-
#
|
243
|
-
# Necessities
|
244
|
-
#
|
235
|
+
### Necessities ###
|
245
236
|
|
246
237
|
# opts has symbol keys, overrides settings (string keys)
|
247
238
|
# return a hash with string keys
|