Class: Geordi::Remote

Inherits:
Object
  • Object
show all
Defined in:
lib/geordi/remote.rb

Constant Summary collapse

REMOTE_DUMP_PATH =
'~/dumps/dump_for_download.dump'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(stage) ⇒ Remote

Returns a new instance of Remote.



13
14
15
16
# File 'lib/geordi/remote.rb', line 13

def initialize(stage)
  @stage = stage
  @config = CapistranoConfig.new(stage)
end

Instance Method Details

#console(options = {}) ⇒ Object



55
56
57
# File 'lib/geordi/remote.rb', line 55

def console(options = {})
  shell(options.merge(remote_command: Util.console_command(@config.env)))
end

#dump(options = {}) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/geordi/remote.rb', line 34

def dump(options = {})
  database = options[:database] ? " #{options[:database]}" : ''
  # Generate dump on the server
  shell options.merge({
    remote_command: "dumple #{@config.env}#{database} --for_download",
  })

  destination_directory = File.join(@config.root, 'tmp')
  FileUtils.mkdir_p destination_directory
  destination_path = File.join(destination_directory, "#{@stage}.dump")
  relative_destination = Pathname.new(destination_path).relative_path_from Pathname.new(@config.root)

  Interaction.note "Downloading remote dump to #{relative_destination} ..."
  server = @config.primary_server
  Util.run!("scp -C #{@config.user(server)}@#{server}:#{REMOTE_DUMP_PATH} #{destination_path}")

  Interaction.success "Dumped the#{database} #{@stage} database to #{relative_destination}."

  destination_path
end

#select_serverObject



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/geordi/remote.rb', line 18

def select_server
  selected_server = choose do |menu|
    @config.servers.each do |server|
      menu.choice(server) { server }
    end

    # Default to the first listed server (by convention, the first server
    # in the deploy files is the primary one).
    menu.default = '1'
    menu.prompt = 'Connect to? [1] '
  end

  puts
  selected_server
end

#shell(options = {}) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/geordi/remote.rb', line 59

def shell(options = {})
  server_option = options[:select_server]
  server_number = server_option.to_i

  server = if server_option == 'select_server'
    select_server
  elsif server_number != 0 && server_number <= @config.servers.count
    server_index = server_number - 1
    @config.servers[server_index]
  elsif server_option.nil?
    @config.primary_server
  else
    Interaction.warn "Invalid server number: #{server_option}"
    select_server
  end

  remote_command = "cd #{@config.remote_root} && #{@config.shell}"
  remote_command << " -c '#{options[:remote_command]}'" if options[:remote_command]

  Interaction.note 'Connecting to ' + server.to_s
  Util.run!(['ssh', "#{@config.user(server)}@#{server}", '-t', remote_command])
end