Class: Opsicle::SSH

Inherits:
Object
  • Object
show all
Defined in:
lib/opsicle/commands/ssh.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(environment) ⇒ SSH

Returns a new instance of SSH.



7
8
9
10
11
# File 'lib/opsicle/commands/ssh.rb', line 7

def initialize(environment)
  @client = Client.new(environment)
  @stack = Opsicle::Stack.new(@client)
  @user_profile = Opsicle::UserProfile.new(@client)
end

Instance Attribute Details

#clientObject (readonly)

Returns the value of attribute client.



5
6
7
# File 'lib/opsicle/commands/ssh.rb', line 5

def client
  @client
end

Instance Method Details

#execute(options = {}) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/opsicle/commands/ssh.rb', line 13

def execute(options={})

  if instances.length == 1
    choice = 1
  else
    Output.say "Choose an Opsworks instance:"
    instances.each_with_index do |instance, index|
      Output.say "#{index+1}) #{instance[:hostname]} #{instance_info(instance)}"
    end
    choice = Output.ask("? ", Integer) { |q| q.in = 1..instances.length }
  end

  command = ssh_command(instances[choice-1], options)

  Output.say_verbose "Executing shell command: #{command}"
  system(command)
end

#instance_info(instance) ⇒ Object



67
68
69
70
71
72
# File 'lib/opsicle/commands/ssh.rb', line 67

def instance_info(instance)
  infos = []
  infos << instance[:layer_ids].map{ |layer_id| @stack.layer_name(layer_id) } if instance[:layer_ids]
  infos << "EIP" if instance[:elastic_ip]
  "(#{infos.join(', ')})"
end

#instancesObject



31
32
33
34
35
# File 'lib/opsicle/commands/ssh.rb', line 31

def instances
  @instances ||= client.api_call(:describe_instances, { stack_id: client.config.opsworks_config[:stack_id] })[:instances]
                       .select { |instance| instance[:status].to_s == 'online'}
                       .sort { |a,b| a[:hostname] <=> b[:hostname] }
end

#public_ipsObject



37
38
39
# File 'lib/opsicle/commands/ssh.rb', line 37

def public_ips
  instances.map{|instance| instance[:elastic_ip] || instance[:public_ip] }.compact
end

#ssh_command(instance, options = {}) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/opsicle/commands/ssh.rb', line 54

def ssh_command(instance, options={})
  ssh_command = " \"#{options[:"ssh-cmd"].gsub(/'/){ %q(\') }}\"" if options[:"ssh-cmd"] #escape single quotes
  ssh_options = options[:"ssh-opts"] ? "#{options[:"ssh-opts"]} " : ""
  if instance_ip = ssh_ip(instance)
    ssh_string = "#{ssh_username}@#{instance_ip}"
  else
    ssh_string = "#{ssh_username}@#{public_ips.sample} ssh #{instance[:private_ip]}"
    ssh_options.concat('-A -t ')
  end

  "ssh #{ssh_options}#{ssh_string}#{ssh_command}"
end

#ssh_ip(instance) ⇒ Object



45
46
47
48
49
50
51
52
# File 'lib/opsicle/commands/ssh.rb', line 45

def ssh_ip(instance)
  if client.config.opsworks_config[:internal_ssh_only]
    Output.say "This stack requires a private connection, only using internal IPs."
    instance[:private_ip]
  else
    instance[:elastic_ip] || instance[:public_ip]
  end
end

#ssh_usernameObject



41
42
43
# File 'lib/opsicle/commands/ssh.rb', line 41

def ssh_username
  @user_profile.ssh_username
end