Module: Caplets::SSH

Defined in:
lib/caplets/ssh.rb

Instance Method Summary collapse

Instance Method Details

#ssh_to_server(opts = {}) ⇒ Object



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)

  # Convert from an array of roles (i.e., servers grouped by role) to an
  # array of server data hashes (i.e., roles grouped by server)
  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

  # Prompt for a server if needed
  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