Class: EY::Serverside::Server

Inherits:
Struct
  • Object
show all
Defined in:
lib/engineyard-serverside/server.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Struct

#as_json, json_create, #to_json

Instance Attribute Details

#hostnameObject

Returns the value of attribute hostname

Returns:

  • (Object)

    the current value of hostname


6
7
8
# File 'lib/engineyard-serverside/server.rb', line 6

def hostname
  @hostname
end

#nameObject

Returns the value of attribute name

Returns:

  • (Object)

    the current value of name


6
7
8
# File 'lib/engineyard-serverside/server.rb', line 6

def name
  @name
end

#rolesObject

Returns the value of attribute roles

Returns:

  • (Object)

    the current value of roles


6
7
8
# File 'lib/engineyard-serverside/server.rb', line 6

def roles
  @roles
end

#userObject

Returns the value of attribute user

Returns:

  • (Object)

    the current value of user


6
7
8
# File 'lib/engineyard-serverside/server.rb', line 6

def user
  @user
end

Class Method Details

.from_hash(server_hash) ⇒ Object


7
8
9
# File 'lib/engineyard-serverside/server.rb', line 7

def self.from_hash(server_hash)
  new(server_hash[:hostname], Set.new(server_hash[:roles].map{|r|r.to_sym}), server_hash[:name], server_hash[:user])
end

.known_hosts_fileObject

Make a known hosts tempfile to absorb host fingerprints so we don't show

Warning: Permanently added 'xxx' (RSA) to the list of known hosts.

for every ssh command. (even with StrictHostKeyChecking=no, the warning output is annoying)


83
84
85
# File 'lib/engineyard-serverside/server.rb', line 83

def self.known_hosts_file
  @known_hosts_file ||= Tempfile.new('ey-ss-known-hosts')
end

Instance Method Details

#authorityObject


11
12
13
# File 'lib/engineyard-serverside/server.rb', line 11

def authority
  "#{user}@#{hostname}"
end

#command_on_server(prefix, cmd, &block) ⇒ Object


61
62
63
64
65
# File 'lib/engineyard-serverside/server.rb', line 61

def command_on_server(prefix, cmd, &block)
  command = block ? block.call(self, cmd.dup) : cmd
  command = "#{prefix} #{Escape.shell_command([command])}"
  local? ? command : remote_command(command)
end

#inspectObject


15
16
17
18
# File 'lib/engineyard-serverside/server.rb', line 15

def inspect
  name_s = name && ":#{name}"
  "#{hostname}(#{role}#{name_s})"
end

#local?Boolean

Returns:

  • (Boolean)

33
34
35
# File 'lib/engineyard-serverside/server.rb', line 33

def local?
  hostname == 'localhost'
end

#matches_roles?(set) ⇒ Boolean

Returns:

  • (Boolean)

24
25
26
# File 'lib/engineyard-serverside/server.rb', line 24

def matches_roles?(set)
  (roles & set).any?
end

#remote_command(command) ⇒ Object

Explicitly putting that space in helps us make sure we don't accidentally leave off the space on the end of ssh_command.


73
74
75
# File 'lib/engineyard-serverside/server.rb', line 73

def remote_command(command)
  ssh_command + " " + Escape.shell_command(["#{user}@#{hostname}", command])
end

#roleObject


20
21
22
# File 'lib/engineyard-serverside/server.rb', line 20

def role
  roles.to_a.first
end

#run(command) {|local? ? command : remote_command(command)| ... } ⇒ Object

Yields:


67
68
69
# File 'lib/engineyard-serverside/server.rb', line 67

def run(command)
  yield local? ? command : remote_command(command)
end

#scp_command(local_file, remote_file) ⇒ Object


49
50
51
52
53
54
55
56
57
58
59
# File 'lib/engineyard-serverside/server.rb', line 49

def scp_command(local_file, remote_file)
  Escape.shell_command([
    'scp',
    '-i', "#{ENV['HOME']}/.ssh/internal",
    "-o", "StrictHostKeyChecking=no",
    "-o", "UserKnownHostsFile=#{self.class.known_hosts_file.path}",
    "-o", "PasswordAuthentication=no",
    local_file,
    "#{authority}:#{remote_file}",
  ])
end

#ssh_commandObject


87
88
89
# File 'lib/engineyard-serverside/server.rb', line 87

def ssh_command
  "ssh -i #{ENV['HOME']}/.ssh/internal -o StrictHostKeyChecking=no -o UserKnownHostsFile=#{self.class.known_hosts_file.path} -o PasswordAuthentication=no -o ServerAliveInterval=60"
end

#sync_directory_command(directory, ignore_existing = false) ⇒ Object


37
38
39
40
41
42
43
44
45
46
47
# File 'lib/engineyard-serverside/server.rb', line 37

def sync_directory_command(directory, ignore_existing = false)
  return nil if local?
  ignore_flag = ignore_existing ? ["--ignore-existing"] : []
  [
    remote_command("mkdir -p #{directory}"),
    # File mod times aren't important during deploy, and
    # -a (archive mode) sets --times which causes problems.
    # -a is equivalent to -rlptgoD. We remove the -t, and add -q.
    Escape.shell_command(%w[rsync --delete -rlpgoDq] + ignore_flag + ["-e", ssh_command, "#{directory}/", "#{user}@#{hostname}:#{directory}"])
  ].join(' && ')
end