2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
# File 'lib/caplets/ssh.rb', line 2
def ssh_to_server(opts={})
servers = []
selected_role = opts[:role] ? opts[:role].to_sym : nil
task_roles = selected_role ? {selected_role => roles[selected_role]} :
roles.sort_by(&:to_s)
task_roles.each do |role_name, role|
role.servers.each do |role_server|
role_server_data = servers.detect { |s| s[:host] == role_server.host }
if role_server_data
role_server_data[:role_names] << role_name
else
servers << {:host => role_server.host, :role_names => [role_name]}
end
end
end
if servers.size > 1
env_desc = "#{fetch(:environment)} #{selected_role}".strip
puts "\nWhich #{env_desc} server?"
servers.each_with_index do |server, i|
server_desc = server[:host].dup
unless selected_role
server_desc << " (#{server[:role_names].join(', ')})"
end
puts " #{(i+1).to_s.rjust(2)}. #{server_desc}"
end
input = Capistrano::CLI.ui.
ask('> ', Integer) { |q| q.in = 1..servers.size }
host = servers[input - 1][:host]
else
host = servers.first[:host]
end
cmd = %|ssh -t #{fetch(:user)}@#{host} "cd #{fetch(:current_path)}; bash"|
puts "Connecting to #{host}..."
exec(cmd)
end
|