CloudyScripts 1.5.21 → 1.5.22
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/Rakefile +1 -1
- data/lib/help/remote_command_handler.rb +2 -0
- data/lib/help/state_transition_helper.rb +36 -11
- data/lib/scripts/ec2/copy_ami.rb +6 -3
- data/lib/scripts/ec2/copy_snapshot.rb +5 -2
- metadata +2 -2
data/Rakefile
CHANGED
@@ -12,7 +12,7 @@ require 'rake/testtask'
|
|
12
12
|
|
13
13
|
spec = Gem::Specification.new do |s|
|
14
14
|
s.name = 'CloudyScripts'
|
15
|
-
s.version = '1.5.
|
15
|
+
s.version = '1.5.22'
|
16
16
|
s.has_rdoc = true
|
17
17
|
s.extra_rdoc_files = ['README.rdoc', 'LICENSE']
|
18
18
|
s.summary = 'Scripts to facilitate programming for infrastructure clouds.'
|
@@ -16,6 +16,7 @@ class RemoteCommandHandler
|
|
16
16
|
# * ip: ip address of the machine to connect to
|
17
17
|
# * keyfile: path of the keyfile to be used for authentication
|
18
18
|
def connect_with_keyfile(ip, user_name, keyfile, timeout = 30)
|
19
|
+
@use_sudo = false
|
19
20
|
@ssh_session = Net::SSH.start(ip, user_name, {:keys => [keyfile], :timeout => timeout})
|
20
21
|
@use_sudo = true unless user_name.strip == 'root'
|
21
22
|
end
|
@@ -26,6 +27,7 @@ class RemoteCommandHandler
|
|
26
27
|
# * user: user name
|
27
28
|
# * key_data: key_data to be used for authentication
|
28
29
|
def connect(ip, user, key_data, timeout = 30)
|
30
|
+
@use_sudo = false
|
29
31
|
@ssh_session = Net::SSH.start(ip, user, {:key_data => [key_data], :timeout => timeout})
|
30
32
|
@use_sudo = true unless user.strip == 'root'
|
31
33
|
end
|
@@ -75,8 +75,9 @@ module StateTransitionHelper
|
|
75
75
|
raise Exception.new("connection attempts stopped (#{last_connection_problem})")
|
76
76
|
end
|
77
77
|
os = remote_handler().retrieve_os()
|
78
|
-
|
79
|
-
|
78
|
+
sudo = remote_handler().use_sudo ? " [sudo]" : ""
|
79
|
+
post_message("connected to #{dns_name}#{sudo}. OS installed is #{os}")
|
80
|
+
@logger.info "connected to #{dns_name}#{sudo}"
|
80
81
|
return os
|
81
82
|
end
|
82
83
|
|
@@ -444,23 +445,47 @@ module StateTransitionHelper
|
|
444
445
|
post_message("EBS volume successfully zipped")
|
445
446
|
end
|
446
447
|
|
447
|
-
def remote_copy(keyname, source_dir, dest_machine, dest_dir)
|
448
|
+
def remote_copy(user_name, keyname, source_dir, dest_machine, dest_dir)
|
448
449
|
post_message("going to remote copy all files from volume. This may take some time...")
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
450
|
+
key_path_candidates = ["/#{user_name}/.ssh/", "/home/#{user_name}/.ssh/"]
|
451
|
+
key_path_candidates.each() {|key_path|
|
452
|
+
key_file = "#{key_path}#{keyname}.pem"
|
453
|
+
if remote_handler().file_exists?(key_path)
|
454
|
+
if remote_handler().tools_installed?("rsync")
|
455
|
+
@logger.debug "use rsync command on #{key_file}"
|
456
|
+
remote_handler().remote_rsync(key_file, source_dir, dest_machine, dest_dir)
|
457
|
+
else
|
458
|
+
@logger.debug "use scp command #{key_file}"
|
459
|
+
remote_handler().scp(key_file, source_dir, dest_machine, dest_dir)
|
460
|
+
end
|
461
|
+
break
|
462
|
+
end
|
463
|
+
}
|
456
464
|
post_message("remote copy operation done")
|
457
465
|
end
|
458
466
|
|
459
467
|
def upload_file(ip, user, key_data, file, target_file)
|
460
|
-
post_message("going to upload #{file} to #{ip}
|
468
|
+
post_message("going to upload #{file} to #{user}@#{ip}:#{target_file}")
|
461
469
|
remote_handler().upload(ip, user, key_data, file, target_file)
|
462
470
|
end
|
463
471
|
|
472
|
+
# From a list of existing files, return the first that exists
|
473
|
+
def determine_file(ip, user_name, ssh_keydata, file_candidates)
|
474
|
+
connect(ip, user_name, nil, ssh_keydata)
|
475
|
+
begin
|
476
|
+
file_candidates.each() {|file_path|
|
477
|
+
if remote_handler().file_exists?(file_path)
|
478
|
+
return file_path
|
479
|
+
end
|
480
|
+
}
|
481
|
+
return nil
|
482
|
+
rescue
|
483
|
+
raise
|
484
|
+
ensure
|
485
|
+
disconnect()
|
486
|
+
end
|
487
|
+
end
|
488
|
+
|
464
489
|
#setting/retrieving handlers
|
465
490
|
|
466
491
|
def remote_handler()
|
data/lib/scripts/ec2/copy_ami.rb
CHANGED
@@ -164,8 +164,11 @@ class CopyAmi < Ec2Script
|
|
164
164
|
class TargetVolumeReadyState < CopyAmiState
|
165
165
|
def enter()
|
166
166
|
post_message("upload key of target-instance to source-instance...")
|
167
|
-
|
168
|
-
|
167
|
+
path_candidates = ["/#{@context[:source_ssh_username]}/.ssh/",
|
168
|
+
"/home/#{@context[:source_ssh_username]}/.ssh/"]
|
169
|
+
key_path = determine_file(@context[:source_dns_name], @context[:source_ssh_username], @context[:source_ssh_keydata], path_candidates)
|
170
|
+
upload_file(@context[:source_dns_name], @context[:source_ssh_username], @context[:source_ssh_keydata],
|
171
|
+
@context[:target_ssh_keyfile], "#{key_path}#{@context[:target_key_name]}.pem")
|
169
172
|
post_message("credentials are in place to connect source and target.")
|
170
173
|
KeyInPlaceState.new(@context)
|
171
174
|
end
|
@@ -177,7 +180,7 @@ class CopyAmi < Ec2Script
|
|
177
180
|
connect(@context[:source_dns_name], @context[:source_ssh_username], nil, @context[:source_ssh_keydata])
|
178
181
|
source_dir = "/mnt/tmp_#{@context[:source_volume_id]}/"
|
179
182
|
dest_dir = "/mnt/tmp_#{@context[:target_volume_id]}"
|
180
|
-
remote_copy(@context[:target_key_name], source_dir, @context[:target_dns_name], dest_dir)
|
183
|
+
remote_copy(@context[:source_ssh_username], @context[:target_key_name], source_dir, @context[:target_dns_name], dest_dir)
|
181
184
|
disconnect()
|
182
185
|
DataCopiedState.new(@context)
|
183
186
|
end
|
@@ -140,8 +140,11 @@ class CopySnapshot< Ec2Script
|
|
140
140
|
class TargetVolumeReadyState < CopySnapshotState
|
141
141
|
def enter()
|
142
142
|
post_message("upload key of target-instance to source-instance...")
|
143
|
+
path_candidates = ["/#{@context[:source_ssh_username]}/.ssh/",
|
144
|
+
"/home/#{@context[:source_ssh_username]}/.ssh/"]
|
145
|
+
key_path = determine_file(@context[:source_dns_name], @context[:source_ssh_username], @context[:source_ssh_keydata], path_candidates)
|
143
146
|
upload_file(@context[:source_dns_name], "root", @context[:source_ssh_keydata],
|
144
|
-
@context[:target_ssh_keyfile], "
|
147
|
+
@context[:target_ssh_keyfile], "#{key_path}#{@context[:target_key_name]}.pem")
|
145
148
|
post_message("credentials are in place to connect source and target.")
|
146
149
|
KeyInPlaceState.new(@context)
|
147
150
|
end
|
@@ -153,7 +156,7 @@ class CopySnapshot< Ec2Script
|
|
153
156
|
connect(@context[:source_dns_name], @context[:source_ssh_username], nil, @context[:source_ssh_keydata])
|
154
157
|
source_dir = "/mnt/tmp_#{@context[:source_volume_id]}/"
|
155
158
|
dest_dir = "/mnt/tmp_#{@context[:target_volume_id]}"
|
156
|
-
remote_copy(@context[:target_key_name], source_dir, @context[:target_dns_name], dest_dir)
|
159
|
+
remote_copy(@context[:source_ssh_username], @context[:target_key_name], source_dir, @context[:target_dns_name], dest_dir)
|
157
160
|
disconnect()
|
158
161
|
DataCopiedState.new(@context)
|
159
162
|
end
|