chef-provisioning-ssh 0.0.7 → 0.0.8.rc.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/lib/chef/provisioning/ssh_driver/driver.rb +159 -47
- data/lib/chef/provisioning/ssh_driver/version.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3271039d59883f27dc58d29d172f54d37aa72a2
|
4
|
+
data.tar.gz: eac579801f2bb8492c0bb74407a0f2baf082d4b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47f9c741cf883fde0972e57c4e7083e8f95f3a822e2b860ae9b807004778cfa71b7e70643d32de443d02bab2762492ab472bfd096e25361e65eda3069ae46c2c
|
7
|
+
data.tar.gz: 76485ca7698c2e22c864801b6769a4f68a631ff8f7a334ff440711164565550e509cc38d692db52451ddc2d9852595cbf8b180e15d8d635bc7d91a777b8231dc
|
@@ -41,23 +41,31 @@ class Chef
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def allocate_machine(action_handler, machine_spec, machine_options)
|
44
|
-
existing_machine
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
ssh_machine = create_ssh_machine(action_handler, machine_spec, machine_options)
|
44
|
+
existing_machine = ssh_machine_exists?(machine_spec)
|
45
|
+
ssh_machine_file_updated = create_machine(action_handler, machine_spec, machine_options)
|
46
|
+
|
47
|
+
if !existing_machine || !machine_spec.location
|
49
48
|
machine_spec.location = {
|
50
49
|
'driver_url' => driver_url,
|
51
50
|
'driver_version' => Chef::Provisioning::SshDriver::VERSION,
|
52
51
|
'target_name' => machine_spec.name,
|
53
|
-
'ssh_machine_file' =>
|
54
|
-
'allocated_at' => Time.now.utc.to_s
|
52
|
+
'ssh_machine_file' => ssh_machine_file_updated,
|
53
|
+
'allocated_at' => Time.now.utc.to_s,
|
54
|
+
'updated_at' => Time.now.utc.to_s,
|
55
|
+
'host' => action_handler.host_node
|
55
56
|
}
|
57
|
+
elsif ssh_machine_file_updated
|
58
|
+
machine_spec.location['updated_at'] = Time.now.utc.to_s
|
59
|
+
end
|
60
|
+
|
61
|
+
if machine_spec.location && (machine_spec.location['driver_version'] != Chef::Provisioning::SshDriver::VERSION)
|
62
|
+
machine_spec.location['driver_version'] = Chef::Provisioning::SshDriver::VERSION
|
56
63
|
end
|
64
|
+
|
57
65
|
end
|
58
66
|
|
59
67
|
def ready_machine(action_handler, machine_spec, machine_options)
|
60
|
-
ssh_machine =
|
68
|
+
ssh_machine = existing_ssh_machine_to_sym(machine_spec)
|
61
69
|
|
62
70
|
if !ssh_machine
|
63
71
|
raise "SSH Machine #{machine_spec.name} does not have a machine file associated with it!"
|
@@ -68,21 +76,29 @@ class Chef
|
|
68
76
|
end
|
69
77
|
|
70
78
|
def connect_to_machine(machine_spec, machine_options)
|
71
|
-
|
79
|
+
ssh_machine = existing_ssh_machine_to_sym(machine_spec)
|
80
|
+
machine_for(machine_spec, ssh_machine)
|
72
81
|
end
|
73
82
|
|
74
83
|
def destroy_machine(action_handler, machine_spec, machine_options)
|
75
|
-
ssh_machine =
|
84
|
+
ssh_machine = ssh_machine_exists?(machine_spec)
|
76
85
|
|
77
|
-
if !ssh_machine
|
86
|
+
if !ssh_machine || !::File.exists?(machine_spec.location['ssh_machine_file'])
|
78
87
|
raise "SSH Machine #{machine_spec.name} does not have a machine file associated with it!"
|
79
|
-
|
88
|
+
else
|
89
|
+
Chef::Provisioning.inline_resource(action_handler) do
|
90
|
+
file machine_spec.location['ssh_machine_file'] do
|
91
|
+
action :delete
|
92
|
+
backup false
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
80
96
|
|
81
97
|
|
82
98
|
end
|
83
99
|
|
84
100
|
def stop_machine(action_handler, machine_spec, machine_options)
|
85
|
-
ssh_machine =
|
101
|
+
ssh_machine = existing_ssh_machine_to_sym(machine_spec)
|
86
102
|
|
87
103
|
if !ssh_machine
|
88
104
|
raise "SSH Machine #{machine_spec.name} does not have a machine file associated with it!"
|
@@ -92,13 +108,13 @@ class Chef
|
|
92
108
|
end
|
93
109
|
|
94
110
|
def machine_for(machine_spec, machine_options)
|
95
|
-
ssh_machine =
|
111
|
+
ssh_machine = existing_ssh_machine_to_sym(machine_spec)
|
96
112
|
|
97
113
|
if !ssh_machine
|
98
114
|
raise "SSH Machine #{machine_spec.name} does not have a machine file associated with it!"
|
99
115
|
end
|
100
116
|
|
101
|
-
if ssh_machine[:is_windows]
|
117
|
+
if ssh_machine[:transport_options][:is_windows]
|
102
118
|
Chef::Provisioning::Machine::WindowsMachine.new(machine_spec,
|
103
119
|
transport_for(ssh_machine),
|
104
120
|
convergence_strategy_for(ssh_machine))
|
@@ -110,7 +126,7 @@ class Chef
|
|
110
126
|
end
|
111
127
|
|
112
128
|
def transport_for(ssh_machine)
|
113
|
-
if ssh_machine[:is_windows]
|
129
|
+
if ssh_machine[:transport_options][:is_windows]
|
114
130
|
create_winrm_transport(ssh_machine)
|
115
131
|
else
|
116
132
|
create_ssh_transport(ssh_machine)
|
@@ -118,31 +134,28 @@ class Chef
|
|
118
134
|
end
|
119
135
|
|
120
136
|
def convergence_strategy_for(ssh_machine)
|
121
|
-
if ssh_machine[:is_windows]
|
137
|
+
if ssh_machine[:transport_options][:is_windows]
|
122
138
|
Chef::Provisioning::ConvergenceStrategy::InstallMsi.
|
123
|
-
|
139
|
+
new(ssh_machine[:convergence_options], config)
|
124
140
|
else
|
125
141
|
Chef::Provisioning::ConvergenceStrategy::InstallSh.
|
126
|
-
|
142
|
+
new(ssh_machine[:convergence_options], config)
|
127
143
|
end
|
128
144
|
end
|
129
145
|
|
130
146
|
def create_ssh_transport(ssh_machine)
|
131
|
-
hostname
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
ssh_machine[:transport_options][:ssh_options] : {}
|
136
|
-
options = ssh_machine[:transport_options][:options] ?
|
137
|
-
ssh_machine[:transport_options][:options] : {}
|
147
|
+
hostname = ssh_machine[:transport_options][:host]
|
148
|
+
username = ssh_machine[:transport_options][:username]
|
149
|
+
ssh_options = ssh_machine[:transport_options][:ssh_options]
|
150
|
+
options = ssh_machine[:transport_options][:options]
|
138
151
|
Chef::Provisioning::Transport::SSH.new(hostname, username,
|
139
|
-
ssh_options,
|
152
|
+
ssh_options, options, config)
|
140
153
|
end
|
141
154
|
|
142
155
|
def create_winrm_transport(ssh_machine)
|
143
|
-
# TODO IPv6 loopback? What do we do for that?
|
156
|
+
# # TODO IPv6 loopback? What do we do for that?
|
144
157
|
hostname = ssh_machine[:transport_options][:host] ||
|
145
|
-
|
158
|
+
ssh_machine[:transport_options][:ip_address]
|
146
159
|
port = ssh_machine[:transport_options][:port] || 5985
|
147
160
|
# port = forwarded_ports[port] if forwarded_ports[port]
|
148
161
|
endpoint = "http://#{hostname}:#{port}/wsman"
|
@@ -152,7 +165,6 @@ class Chef
|
|
152
165
|
:pass => ssh_machine[:transport_options][:password],
|
153
166
|
:disable_sspi => true
|
154
167
|
}
|
155
|
-
|
156
168
|
Chef::Provisioning::Transport::WinRM.new(endpoint, type, options, config)
|
157
169
|
end
|
158
170
|
|
@@ -192,48 +204,48 @@ class Chef
|
|
192
204
|
|
193
205
|
missing = req_and_valid_fields.flatten - machine_options[:transport_options].keys
|
194
206
|
|
195
|
-
|
207
|
+
one_of_fields.each do |oof|
|
196
208
|
if oof == oof & missing
|
197
209
|
error_msgs << ":transport_options => :#{oof.join(" or :")} required."
|
198
210
|
end
|
199
211
|
missing -= oof
|
200
212
|
end
|
201
213
|
|
202
|
-
|
214
|
+
missing.each do |missed|
|
203
215
|
error_msgs << ":transport_options => :#{missed} required."
|
204
216
|
valid = false
|
205
217
|
end
|
206
218
|
|
207
219
|
extras = machine_options[:transport_options].keys - req_and_valid_fields.flatten
|
208
220
|
|
209
|
-
|
210
|
-
error_msgs << ":transport_options => :#{extra} not allowed."
|
221
|
+
extras.each do |extra|
|
222
|
+
error_msgs << ":transport_options => :#{extra} not allowed." unless extra == :port
|
211
223
|
valid = false
|
212
224
|
end
|
213
225
|
else
|
214
226
|
# Validate Unix Options
|
215
|
-
req_fields = [[:host, :ip_address], :username]
|
227
|
+
req_fields = [[:host, :hostname, :ip_address], :username]
|
216
228
|
one_of_fields = req_fields.select{ |i| i.kind_of?(Array)}
|
217
229
|
|
218
230
|
missing = req_fields.flatten - machine_options[:transport_options].keys
|
219
231
|
|
220
|
-
|
232
|
+
one_of_fields.each do |oof|
|
221
233
|
if oof == oof & missing
|
222
234
|
error_msgs << ":transport_options => :#{oof.join(" or :")} required."
|
223
235
|
end
|
224
236
|
missing -= oof
|
225
237
|
end
|
226
238
|
|
227
|
-
|
239
|
+
missing.each do |missed|
|
228
240
|
error_msgs << ":transport_options => :#{missed} required."
|
229
241
|
valid = false
|
230
242
|
end
|
231
243
|
|
232
|
-
valid_fields = [:is_windows, :host, :ip_address, :username, :ssh_options, :options]
|
244
|
+
valid_fields = [:is_windows, :host, :hostname, :ip_address, :username, :ssh_options, :options]
|
233
245
|
|
234
246
|
extras = machine_options[:transport_options].keys - valid_fields
|
235
247
|
|
236
|
-
|
248
|
+
extras.each do |extra|
|
237
249
|
error_msgs << ":transport_options => :#{extra} not allowed."
|
238
250
|
valid = false
|
239
251
|
end
|
@@ -243,7 +255,7 @@ class Chef
|
|
243
255
|
|
244
256
|
extras = machine_options[:transport_options][:ssh_options].keys - valid_fields
|
245
257
|
|
246
|
-
|
258
|
+
extras.each do |extra|
|
247
259
|
error_msgs << ":transport_options => ssh_options => :#{extra} not allowed."
|
248
260
|
valid = false
|
249
261
|
end
|
@@ -254,7 +266,7 @@ class Chef
|
|
254
266
|
|
255
267
|
extras = machine_options[:transport_options][:options].keys - valid_fields
|
256
268
|
|
257
|
-
|
269
|
+
extras.each do |extra|
|
258
270
|
error_msgs << ":transport_options => :options => :#{extra} not allowed."
|
259
271
|
valid = false
|
260
272
|
end
|
@@ -264,7 +276,7 @@ class Chef
|
|
264
276
|
|
265
277
|
if !valid
|
266
278
|
exception_string = "Machine Options for #{machine_spec.name} are invalid cannot create machine."
|
267
|
-
|
279
|
+
error_msgs.each do |string|
|
268
280
|
exception_string = "#{exception_string}\n #{string}"
|
269
281
|
end
|
270
282
|
raise exception_string
|
@@ -273,17 +285,47 @@ class Chef
|
|
273
285
|
|
274
286
|
def ensure_ssh_cluster(action_handler)
|
275
287
|
_cluster_path = cluster_path
|
276
|
-
|
277
|
-
|
288
|
+
unless ::File.exists?(_cluster_path)
|
289
|
+
Chef::Provisioning.inline_resource(action_handler) do
|
290
|
+
ssh_cluster _cluster_path
|
291
|
+
end
|
278
292
|
end
|
279
293
|
end
|
280
294
|
|
281
|
-
def
|
295
|
+
def create_machine(action_handler, machine_spec, machine_options)
|
296
|
+
ensure_ssh_cluster(action_handler)
|
297
|
+
|
298
|
+
machine_options_hash_for_sym = deep_hashify(machine_options)
|
299
|
+
symbolized_machine_options = symbolize_keys(machine_options_hash_for_sym)
|
300
|
+
validate_machine_options(action_handler, machine_spec, symbolized_machine_options)
|
301
|
+
# end
|
302
|
+
|
303
|
+
|
304
|
+
# def create_ssh_machine(action_handler, machine_spec, machine_options)
|
282
305
|
log_info("File is = #{ssh_machine_file(machine_spec)}")
|
283
306
|
log_info("current_machine_options = #{machine_options.to_s}")
|
307
|
+
|
308
|
+
machine_options_hash_for_s = deep_hashify(machine_options)
|
309
|
+
stringy_machine_options = stringify_keys(machine_options_hash_for_s)
|
310
|
+
given_machine_options = create_machine_hash(stringy_machine_options)
|
311
|
+
|
312
|
+
if ssh_machine_exists?(machine_spec)
|
313
|
+
existing_machine_hash = existing_ssh_machine(machine_spec)
|
314
|
+
if !existing_machine_hash.eql?(given_machine_options)
|
315
|
+
create_machine_file(action_handler, machine_spec, given_machine_options)
|
316
|
+
else
|
317
|
+
return false
|
318
|
+
end
|
319
|
+
else
|
320
|
+
file_updated = create_machine_file(action_handler, machine_spec, given_machine_options)
|
321
|
+
file_updated
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
def create_machine_file(action_handler, machine_spec, machine_options)
|
326
|
+
file_path = ssh_machine_file(machine_spec)
|
284
327
|
machine_options_hash = deep_hashify(machine_options)
|
285
328
|
stringy_machine_options = stringify_keys(machine_options_hash)
|
286
|
-
file_path = ssh_machine_file(machine_spec)
|
287
329
|
options_parsed = ::JSON.parse(stringy_machine_options.to_json)
|
288
330
|
json_machine_options = ::JSON.pretty_generate(options_parsed)
|
289
331
|
Chef::Provisioning.inline_resource(action_handler) do
|
@@ -307,7 +349,16 @@ class Chef
|
|
307
349
|
def existing_ssh_machine(machine_spec)
|
308
350
|
if ssh_machine_exists?(machine_spec)
|
309
351
|
existing_machine_hash = JSON.parse(File.read(ssh_machine_file(machine_spec)))
|
310
|
-
|
352
|
+
existing_machine_hash.to_hash
|
353
|
+
else
|
354
|
+
return {}
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
def existing_ssh_machine_to_sym(machine_spec)
|
359
|
+
if ssh_machine_exists?(machine_spec)
|
360
|
+
existing_machine_hash = existing_ssh_machine(machine_spec)
|
361
|
+
symbolize_keys(existing_machine_hash)
|
311
362
|
else
|
312
363
|
return false
|
313
364
|
end
|
@@ -329,6 +380,67 @@ class Chef
|
|
329
380
|
ssh_machine_file
|
330
381
|
end
|
331
382
|
end
|
383
|
+
|
384
|
+
def create_machine_hash(machine_options)
|
385
|
+
if !machine_options['transport_options']['host']
|
386
|
+
machine_options['transport_options']['host'] = machine_options['transport_options']['ip_address'] ||
|
387
|
+
machine_options['transport_options']['hostname']
|
388
|
+
end
|
389
|
+
validate_transport_options_host(machine_options['transport_options']['host'])
|
390
|
+
unless machine_options['transport_options']['is_windows']
|
391
|
+
machine_options['transport_options']['options'] ||= {}
|
392
|
+
unless machine_options['transport_options']['username'] == 'root'
|
393
|
+
machine_options['transport_options']['options']['prefix'] = 'sudo '
|
394
|
+
end
|
395
|
+
end
|
396
|
+
ensure_has_keys_or_password(machine_options['transport_options'])
|
397
|
+
machine_options.to_hash
|
398
|
+
end
|
399
|
+
|
400
|
+
def ensure_has_keys_or_password(transport_hash)
|
401
|
+
if transport_hash['is_windows']
|
402
|
+
password = transport_hash['password'] || false
|
403
|
+
has_either = (password && password.kind_of?(String))
|
404
|
+
else
|
405
|
+
if transport_hash['ssh_options']
|
406
|
+
ssh_hash = transport_hash['ssh_options']
|
407
|
+
keys = ssh_hash['keys'] || false
|
408
|
+
password = ssh_hash['password'] || false
|
409
|
+
has_either = ((password && password.kind_of?(String)) ||
|
410
|
+
(keys && !keys.empty? && keys.kind_of?(Array)))
|
411
|
+
else
|
412
|
+
has_either = false
|
413
|
+
end
|
414
|
+
end
|
415
|
+
raise 'No Keys OR Password, No Can Do Compadre' unless has_either
|
416
|
+
has_either
|
417
|
+
end
|
418
|
+
|
419
|
+
def validate_transport_options_host(target_host)
|
420
|
+
rh = Resolv::Hosts.new
|
421
|
+
rd = Resolv.new
|
422
|
+
|
423
|
+
begin
|
424
|
+
rh.getaddress(target_host)
|
425
|
+
in_hosts_file = true
|
426
|
+
rescue
|
427
|
+
in_hosts_file = false
|
428
|
+
end
|
429
|
+
|
430
|
+
begin
|
431
|
+
rd.getaddress(target_host)
|
432
|
+
in_dns = true
|
433
|
+
rescue
|
434
|
+
in_dns = false
|
435
|
+
end
|
436
|
+
|
437
|
+
valid_ip = ( target_host =~ Resolv::IPv4::Regex ||
|
438
|
+
target_host =~ Resolv::IPv6::Regex )
|
439
|
+
|
440
|
+
raise 'Host is not a Valid IP or Resolvable Hostname' unless ( valid_ip || in_hosts_file || in_dns )
|
441
|
+
end
|
442
|
+
|
443
|
+
|
332
444
|
end
|
333
445
|
end
|
334
446
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-provisioning-ssh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8.rc.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zack Zondlo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef-provisioning
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.1.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.1.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,9 +98,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
98
98
|
version: '0'
|
99
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - ">"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: 1.3.1
|
104
104
|
requirements: []
|
105
105
|
rubyforge_project:
|
106
106
|
rubygems_version: 2.4.4
|