caterer 0.4.0 → 0.5.0
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.
- data/lib/caterer/action/provisioner.rb +3 -0
- data/lib/caterer/action/provisioner/validate.rb +9 -0
- data/lib/caterer/action/provisioner/validate/bootstrapped.rb +22 -0
- data/lib/caterer/action/server.rb +3 -0
- data/lib/caterer/action/server/lock.rb +14 -0
- data/lib/caterer/action/server/reboot.rb +12 -0
- data/lib/caterer/action/server/unlock.rb +14 -0
- data/lib/caterer/action/server/validate.rb +2 -1
- data/lib/caterer/action/server/validate/unlocked.rb +21 -0
- data/lib/caterer/actions.rb +32 -12
- data/lib/caterer/command.rb +2 -0
- data/lib/caterer/command/base.rb +4 -1
- data/lib/caterer/command/lock.rb +24 -0
- data/lib/caterer/command/reboot.rb +5 -3
- data/lib/caterer/command/unlock.rb +24 -0
- data/lib/caterer/commands.rb +3 -2
- data/lib/caterer/communication/rsync.rb +16 -15
- data/lib/caterer/provisioner/base.rb +6 -5
- data/lib/caterer/provisioner/chef_solo.rb +22 -14
- data/lib/caterer/server.rb +51 -1
- data/lib/caterer/version.rb +1 -1
- metadata +10 -2
@@ -5,8 +5,11 @@ module Caterer
|
|
5
5
|
autoload :Bootstrap, 'caterer/action/provisioner/bootstrap'
|
6
6
|
autoload :Cleanup, 'caterer/action/provisioner/cleanup'
|
7
7
|
autoload :Install, 'caterer/action/provisioner/install'
|
8
|
+
autoload :Lock, 'caterer/action/provisioner/lock'
|
8
9
|
autoload :Prepare, 'caterer/action/provisioner/prepare'
|
9
10
|
autoload :Provision, 'caterer/action/provisioner/provision'
|
11
|
+
autoload :Unlock, 'caterer/action/provisioner/unlock'
|
12
|
+
autoload :Validate, 'caterer/action/provisioner/validate'
|
10
13
|
end
|
11
14
|
end
|
12
15
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Caterer
|
2
|
+
module Action
|
3
|
+
module Provisioner
|
4
|
+
module Validate
|
5
|
+
class Bootstrapped < Base
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
|
9
|
+
if not provisioner(env).bootstrapped?
|
10
|
+
env[:ui].error "Server not bootstrapped, cannot continue"
|
11
|
+
return
|
12
|
+
end
|
13
|
+
|
14
|
+
@app.call(env)
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module Caterer
|
2
2
|
module Action
|
3
3
|
module Server
|
4
|
+
autoload :Lock, 'caterer/action/server/lock'
|
5
|
+
autoload :Reboot, 'caterer/action/server/reboot'
|
4
6
|
autoload :Validate, 'caterer/action/server/validate'
|
7
|
+
autoload :Unlock, 'caterer/action/server/unlock'
|
5
8
|
end
|
6
9
|
end
|
7
10
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Caterer
|
2
|
+
module Action
|
3
|
+
module Server
|
4
|
+
module Validate
|
5
|
+
class Unlocked < Base
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
|
9
|
+
if env[:server].locked?
|
10
|
+
env[:ui].error "Server is currently locked, cannot proceed"
|
11
|
+
return
|
12
|
+
end
|
13
|
+
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/caterer/actions.rb
CHANGED
@@ -4,47 +4,67 @@ Caterer.actions.register(:validate) do
|
|
4
4
|
use Caterer::Action::Config::Validate::Image
|
5
5
|
use Caterer::Action::Config::Validate::Provisioner
|
6
6
|
use Caterer::Action::Server::Validate::SSH
|
7
|
+
use Caterer::Action::Server::Validate::Unlocked
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
10
|
-
Caterer.actions.register(:
|
11
|
+
Caterer.actions.register(:lock) do
|
11
12
|
Vli::Action::Builder.new do
|
12
|
-
use Caterer::Action::
|
13
|
+
use Caterer::Action::Config::Validate::Image
|
14
|
+
use Caterer::Action::Config::Validate::Provisioner
|
15
|
+
use Caterer::Action::Server::Validate::SSH
|
16
|
+
use Caterer::Action::Server::Lock
|
13
17
|
end
|
14
18
|
end
|
15
19
|
|
16
|
-
Caterer.actions.register(:
|
20
|
+
Caterer.actions.register(:unlock) do
|
17
21
|
Vli::Action::Builder.new do
|
18
|
-
use Caterer::Action::
|
22
|
+
use Caterer::Action::Config::Validate::Image
|
23
|
+
use Caterer::Action::Config::Validate::Provisioner
|
24
|
+
use Caterer::Action::Server::Validate::SSH
|
25
|
+
use Caterer::Action::Server::Unlock
|
19
26
|
end
|
20
27
|
end
|
21
28
|
|
22
29
|
Caterer.actions.register(:bootstrap) do
|
23
30
|
Vli::Action::Builder.new do
|
24
31
|
use Caterer.actions.get(:validate)
|
25
|
-
use Caterer
|
32
|
+
use Caterer::Action::Provisioner::Prepare
|
33
|
+
use Caterer::Action::Server::Lock
|
26
34
|
use Caterer::Action::Provisioner::Bootstrap
|
27
|
-
use Caterer
|
35
|
+
use Caterer::Action::Provisioner::Install
|
36
|
+
use Caterer::Action::Provisioner::Cleanup
|
37
|
+
use Caterer::Action::Server::Unlock
|
28
38
|
end
|
29
39
|
end
|
30
40
|
|
31
41
|
Caterer.actions.register(:provision) do
|
32
42
|
Vli::Action::Builder.new do
|
33
43
|
use Caterer.actions.get(:validate)
|
34
|
-
use Caterer
|
35
|
-
use Caterer::Action::Provisioner::
|
44
|
+
use Caterer::Action::Provisioner::Validate::Bootstrapped
|
45
|
+
use Caterer::Action::Provisioner::Prepare
|
46
|
+
use Caterer::Action::Server::Lock
|
36
47
|
use Caterer::Action::Provisioner::Provision
|
37
|
-
use Caterer
|
48
|
+
use Caterer::Action::Provisioner::Cleanup
|
49
|
+
use Caterer::Action::Server::Unlock
|
38
50
|
end
|
39
51
|
end
|
40
52
|
|
41
53
|
Caterer.actions.register(:up) do
|
42
54
|
Vli::Action::Builder.new do
|
43
55
|
use Caterer.actions.get(:validate)
|
44
|
-
use Caterer
|
56
|
+
use Caterer::Action::Provisioner::Prepare
|
57
|
+
use Caterer::Action::Server::Lock
|
45
58
|
use Caterer::Action::Provisioner::Bootstrap
|
46
|
-
use Caterer::Action::Provisioner::Install
|
47
59
|
use Caterer::Action::Provisioner::Provision
|
48
|
-
use Caterer
|
60
|
+
use Caterer::Action::Provisioner::Cleanup
|
61
|
+
use Caterer::Action::Server::Unlock
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
Caterer.actions.register(:reboot) do
|
66
|
+
Vli::Action::Builder.new do
|
67
|
+
use Caterer::Action::Server::Validate::SSH
|
68
|
+
use Caterer::Action::Server::Reboot
|
49
69
|
end
|
50
70
|
end
|
data/lib/caterer/command.rb
CHANGED
@@ -2,9 +2,11 @@ module Caterer
|
|
2
2
|
module Command
|
3
3
|
autoload :Base, 'caterer/command/base'
|
4
4
|
autoload :Bootstrap, 'caterer/command/bootstrap'
|
5
|
+
autoload :Lock, 'caterer/command/lock'
|
5
6
|
autoload :Provision, 'caterer/command/provision'
|
6
7
|
autoload :Reboot, 'caterer/command/reboot'
|
7
8
|
autoload :Test, 'caterer/command/test'
|
9
|
+
autoload :Unlock, 'caterer/command/unlock'
|
8
10
|
autoload :Up, 'caterer/command/up'
|
9
11
|
end
|
10
12
|
end
|
data/lib/caterer/command/base.rb
CHANGED
@@ -22,7 +22,10 @@ module Caterer
|
|
22
22
|
opts.on('-P PORT', '--port PORT', 'assumes 22') do |p|
|
23
23
|
options[:port] = p
|
24
24
|
end
|
25
|
-
opts.on('-
|
25
|
+
opts.on('-e ENGINE', '--engine ENGINE', 'provision engine' ) do |e|
|
26
|
+
options[:engine] = e
|
27
|
+
end
|
28
|
+
opts.on('-d JSON', '--data JSON', 'json data that the provisioner may use' ) do |d|
|
26
29
|
options[:data] = d
|
27
30
|
end
|
28
31
|
opts.on('-i IMAGE', '--image IMAGE', 'corresponds to a image in Caterfile') do |i|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Caterer
|
2
|
+
module Command
|
3
|
+
class Lock < Base
|
4
|
+
|
5
|
+
def execute
|
6
|
+
options = {}
|
7
|
+
opts = OptionParser.new do |opts|
|
8
|
+
opts.banner = "Usage: cater lock HOST [options]"
|
9
|
+
end
|
10
|
+
|
11
|
+
# Parse the options
|
12
|
+
argv = parse_options(opts, options, true)
|
13
|
+
return if not argv
|
14
|
+
|
15
|
+
with_target_servers(argv, options) do |server|
|
16
|
+
server.lock
|
17
|
+
end
|
18
|
+
|
19
|
+
0
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -5,15 +5,17 @@ module Caterer
|
|
5
5
|
def execute
|
6
6
|
options = {}
|
7
7
|
opts = OptionParser.new do |opts|
|
8
|
-
opts.banner = "Usage: cater
|
8
|
+
opts.banner = "Usage: cater reboot HOST [options]"
|
9
9
|
end
|
10
10
|
|
11
11
|
# Parse the options
|
12
12
|
argv = parse_options(opts, options, true)
|
13
13
|
return if not argv
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
with_target_servers(argv, options) do |server|
|
16
|
+
server.reboot
|
17
|
+
end
|
18
|
+
|
17
19
|
0
|
18
20
|
end
|
19
21
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Caterer
|
2
|
+
module Command
|
3
|
+
class Unlock < Base
|
4
|
+
|
5
|
+
def execute
|
6
|
+
options = {}
|
7
|
+
opts = OptionParser.new do |opts|
|
8
|
+
opts.banner = "Usage: cater unlock HOST [options]"
|
9
|
+
end
|
10
|
+
|
11
|
+
# Parse the options
|
12
|
+
argv = parse_options(opts, options, true)
|
13
|
+
return if not argv
|
14
|
+
|
15
|
+
with_target_servers(argv, options) do |server|
|
16
|
+
server.unlock
|
17
|
+
end
|
18
|
+
|
19
|
+
0
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/caterer/commands.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# commands
|
2
|
-
Caterer.commands.register(:test) { Caterer::Command::Test }
|
3
2
|
Caterer.commands.register(:bootstrap) { Caterer::Command::Bootstrap }
|
3
|
+
Caterer.commands.register(:lock) { Caterer::Command::Lock }
|
4
4
|
Caterer.commands.register(:provision) { Caterer::Command::Provision }
|
5
|
+
Caterer.commands.register(:reboot) { Caterer::Command::Reboot }
|
6
|
+
Caterer.commands.register(:unlock) { Caterer::Command::Unlock }
|
5
7
|
Caterer.commands.register(:up) { Caterer::Command::Up }
|
6
|
-
Caterer.commands.register(:reboot) { Caterer::Command::Reboot }
|
@@ -4,13 +4,23 @@ module Caterer
|
|
4
4
|
module Communication
|
5
5
|
class Rsync
|
6
6
|
|
7
|
+
class << self
|
8
|
+
|
9
|
+
def available?
|
10
|
+
`command -v rsync &>/dev/null`
|
11
|
+
$?.exitstatus == 0 ? true : false
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
7
16
|
def initialize(server)
|
8
17
|
@server = server
|
9
|
-
@logger = Log4r::Logger.new("caterer::communication::
|
18
|
+
@logger = Log4r::Logger.new("caterer::communication::rsync")
|
10
19
|
end
|
11
20
|
|
12
21
|
def sync(from, to)
|
13
|
-
|
22
|
+
exit_status = nil
|
23
|
+
PTY.spawn(rsync_cmd(from, to)) do |stdout, stdin, pid|
|
14
24
|
eof = false
|
15
25
|
until eof do
|
16
26
|
begin
|
@@ -18,29 +28,20 @@ module Caterer
|
|
18
28
|
if out.match /password:/
|
19
29
|
stdin.puts @server.password
|
20
30
|
else
|
21
|
-
|
31
|
+
@logger.debug("stdout: #{out}")
|
22
32
|
end
|
23
33
|
rescue EOFError
|
24
34
|
eof = true
|
25
35
|
end
|
26
36
|
end
|
37
|
+
Process.wait(pid)
|
38
|
+
exit_status = $?.exitstatus
|
27
39
|
end
|
40
|
+
exit_status
|
28
41
|
end
|
29
42
|
|
30
43
|
protected
|
31
44
|
|
32
|
-
def print_worthy(data)
|
33
|
-
[
|
34
|
-
/^\r\n$/, # empty lines
|
35
|
-
/^Warning: Permanently added/, # key added nonsense
|
36
|
-
].each do |cruft|
|
37
|
-
if data.match cruft
|
38
|
-
return false
|
39
|
-
end
|
40
|
-
end
|
41
|
-
true
|
42
|
-
end
|
43
|
-
|
44
45
|
def rsync_cmd(from, to)
|
45
46
|
"rsync -zr -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p #{@server.port}' --delete #{from} #{@server.username}@#{@server.host}:#{to}"
|
46
47
|
end
|
@@ -9,11 +9,12 @@ module Caterer
|
|
9
9
|
@config = config
|
10
10
|
end
|
11
11
|
|
12
|
-
def bootstrap
|
13
|
-
def
|
14
|
-
def
|
15
|
-
def
|
16
|
-
def
|
12
|
+
def bootstrap; end
|
13
|
+
def bootstrapped?; true; end
|
14
|
+
def cleanup; end
|
15
|
+
def install; end
|
16
|
+
def prepare; end
|
17
|
+
def provision; end
|
17
18
|
|
18
19
|
end
|
19
20
|
end
|
@@ -10,10 +10,6 @@ module Caterer
|
|
10
10
|
|
11
11
|
def bootstrap
|
12
12
|
|
13
|
-
if bootstrap_scripts.length == 0
|
14
|
-
server.ui.warn "No bootstrap scripts to execute"
|
15
|
-
end
|
16
|
-
|
17
13
|
# validate
|
18
14
|
with_bootstrap_scripts do |script, count|
|
19
15
|
|
@@ -45,6 +41,11 @@ module Caterer
|
|
45
41
|
|
46
42
|
end
|
47
43
|
|
44
|
+
def bootstrapped?
|
45
|
+
res = server.ssh.sudo "command -v chef-solo &>/dev/null"
|
46
|
+
res == 0 ? true : false
|
47
|
+
end
|
48
|
+
|
48
49
|
def prepare
|
49
50
|
# create base dir
|
50
51
|
server.ssh.sudo "mkdir -p #{base_path}", :stream => true
|
@@ -115,6 +116,8 @@ module Caterer
|
|
115
116
|
end
|
116
117
|
|
117
118
|
def cleanup
|
119
|
+
server.ui.info "Cleaning up..."
|
120
|
+
|
118
121
|
# installer
|
119
122
|
server.ssh.sudo "rm -f #{install_path}", :stream => true
|
120
123
|
|
@@ -136,11 +139,16 @@ module Caterer
|
|
136
139
|
if File.exists? from
|
137
140
|
if @server.can_rsync?
|
138
141
|
from += "/" if not from.match /\/$/
|
139
|
-
@server.rsync.sync(from, to)
|
142
|
+
res = @server.rsync.sync(from, to)
|
143
|
+
server.ui.error "rsync was unsuccessful" if res != 0
|
140
144
|
else
|
145
|
+
server.ui.warn "Rsync unavailable, falling back to scp (slower)..."
|
141
146
|
unique = Digest::MD5.hexdigest(from)
|
147
|
+
server.ssh.sudo "rm -rf #{to}/*", :stream => true
|
148
|
+
server.ssh.sudo "mkdir -p #{to}/#{unique}", :stream => true
|
149
|
+
server.ssh.sudo "chown -R #{server.username} #{to}/#{unique}", :stream => true
|
142
150
|
server.ssh.upload from, "#{to}/#{unique}"
|
143
|
-
server.ssh.sudo "mv #{to}/#{unique}
|
151
|
+
server.ssh.sudo "mv #{to}/#{unique}/**/* #{to}/", :stream => true
|
144
152
|
server.ssh.sudo "rm -rf #{to}/#{unique}", :stream => true
|
145
153
|
end
|
146
154
|
end
|
@@ -180,6 +188,14 @@ module Caterer
|
|
180
188
|
"#{base_path}/data_bags"
|
181
189
|
end
|
182
190
|
|
191
|
+
def solo_path
|
192
|
+
"#{base_path}/solo.rb"
|
193
|
+
end
|
194
|
+
|
195
|
+
def json_config_path
|
196
|
+
"#{base_path}/config.json"
|
197
|
+
end
|
198
|
+
|
183
199
|
def config_bootstrap
|
184
200
|
config.bootstrap_script
|
185
201
|
end
|
@@ -188,10 +204,6 @@ module Caterer
|
|
188
204
|
File.expand_path("../../../templates/provisioner/chef_solo/bootstrap.sh", __FILE__)
|
189
205
|
end
|
190
206
|
|
191
|
-
def solo_path
|
192
|
-
"#{base_path}/solo.rb"
|
193
|
-
end
|
194
|
-
|
195
207
|
def solo_content
|
196
208
|
Tilt.new(File.expand_path('../../../templates/provisioner/chef_solo/solo.erb', __FILE__)).render(self)
|
197
209
|
end
|
@@ -204,10 +216,6 @@ module Caterer
|
|
204
216
|
{:run_list => config.run_list}.merge(config.json).merge(server.data)
|
205
217
|
end
|
206
218
|
|
207
|
-
def json_config_path
|
208
|
-
"#{base_path}/config.json"
|
209
|
-
end
|
210
|
-
|
211
219
|
def command_string
|
212
220
|
"chef-solo -c #{solo_path} -j #{json_config_path}"
|
213
221
|
end
|
data/lib/caterer/server.rb
CHANGED
@@ -15,6 +15,10 @@ module Caterer
|
|
15
15
|
@key = opts[:key]
|
16
16
|
@images = opts[:images] || []
|
17
17
|
@data = opts[:data] || {}
|
18
|
+
|
19
|
+
@logger = Log4r::Logger.new("caterer::server")
|
20
|
+
|
21
|
+
@logger.info("Server: #{opts.inspect}")
|
18
22
|
end
|
19
23
|
|
20
24
|
def bootstrap(opts={})
|
@@ -51,6 +55,46 @@ module Caterer
|
|
51
55
|
end
|
52
56
|
end
|
53
57
|
|
58
|
+
def lock(opts={})
|
59
|
+
if @images.length == 0
|
60
|
+
ui.error "image list is empty, nothing to do"
|
61
|
+
end
|
62
|
+
@images.each do |i|
|
63
|
+
ui.info "*** Locking image: #{i} ***"
|
64
|
+
run_action(:lock, opts.merge({:image => i}))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def unlock(opts={})
|
69
|
+
if @images.length == 0
|
70
|
+
ui.error "image list is empty, nothing to do"
|
71
|
+
end
|
72
|
+
@images.each do |i|
|
73
|
+
ui.info "*** Unlocking image: #{i} ***"
|
74
|
+
run_action(:unlock, opts.merge({:image => i}))
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def reboot!
|
79
|
+
ui.info "Rebooting..."
|
80
|
+
ssh.sudo "shutdown -r now", :stream => true
|
81
|
+
end
|
82
|
+
|
83
|
+
def lock!
|
84
|
+
ui.info "Locking..."
|
85
|
+
ssh.sudo "touch #{lock_path}"
|
86
|
+
end
|
87
|
+
|
88
|
+
def unlock!
|
89
|
+
ui.info "Unlocking..."
|
90
|
+
ssh.sudo "rm -f #{lock_path}"
|
91
|
+
end
|
92
|
+
|
93
|
+
def locked?
|
94
|
+
res = ssh.sudo "[ -f #{lock_path} ]"
|
95
|
+
res == 0 ? true : false
|
96
|
+
end
|
97
|
+
|
54
98
|
def ssh
|
55
99
|
@ssh ||= Communication::SSH.new(self)
|
56
100
|
end
|
@@ -60,7 +104,7 @@ module Caterer
|
|
60
104
|
end
|
61
105
|
|
62
106
|
def can_rsync?
|
63
|
-
|
107
|
+
!Vli::Util::Platform.windows? and Communication::Rsync.available?
|
64
108
|
end
|
65
109
|
|
66
110
|
def ssh_opts
|
@@ -116,5 +160,11 @@ module Caterer
|
|
116
160
|
env.action_runner.run(name, options)
|
117
161
|
end
|
118
162
|
|
163
|
+
protected
|
164
|
+
|
165
|
+
def lock_path
|
166
|
+
"/tmp/cater.lock"
|
167
|
+
end
|
168
|
+
|
119
169
|
end
|
120
170
|
end
|
data/lib/caterer/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caterer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: log4r
|
@@ -193,17 +193,25 @@ files:
|
|
193
193
|
- lib/caterer/action/provisioner/install.rb
|
194
194
|
- lib/caterer/action/provisioner/prepare.rb
|
195
195
|
- lib/caterer/action/provisioner/provision.rb
|
196
|
+
- lib/caterer/action/provisioner/validate.rb
|
197
|
+
- lib/caterer/action/provisioner/validate/bootstrapped.rb
|
196
198
|
- lib/caterer/action/server.rb
|
199
|
+
- lib/caterer/action/server/lock.rb
|
200
|
+
- lib/caterer/action/server/reboot.rb
|
201
|
+
- lib/caterer/action/server/unlock.rb
|
197
202
|
- lib/caterer/action/server/validate.rb
|
198
203
|
- lib/caterer/action/server/validate/ssh.rb
|
204
|
+
- lib/caterer/action/server/validate/unlocked.rb
|
199
205
|
- lib/caterer/actions.rb
|
200
206
|
- lib/caterer/cli.rb
|
201
207
|
- lib/caterer/command.rb
|
202
208
|
- lib/caterer/command/base.rb
|
203
209
|
- lib/caterer/command/bootstrap.rb
|
210
|
+
- lib/caterer/command/lock.rb
|
204
211
|
- lib/caterer/command/provision.rb
|
205
212
|
- lib/caterer/command/reboot.rb
|
206
213
|
- lib/caterer/command/test.rb
|
214
|
+
- lib/caterer/command/unlock.rb
|
207
215
|
- lib/caterer/command/up.rb
|
208
216
|
- lib/caterer/commands.rb
|
209
217
|
- lib/caterer/communication.rb
|