Module: Bluepill::Socket

Defined in:
lib/bluepill/socket.rb

Constant Summary collapse

TIMEOUT =

Used for client commands

60
MAX_ATTEMPTS =
5

Class Method Summary collapse

Class Method Details

.client(base_dir, name, &block) ⇒ Object



10
11
12
# File 'lib/bluepill/socket.rb', line 10

def client(base_dir, name, &block)
  UNIXSocket.open(socket_path(base_dir, name), &block)
end

.client_command(base_dir, name, command) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/bluepill/socket.rb', line 14

def client_command(base_dir, name, command)
  res = nil
  MAX_ATTEMPTS.times do |current_attempt|
    begin
      client(base_dir, name) do |socket|
        Timeout.timeout(TIMEOUT) do
          socket.puts command
          res = Marshal.load(socket.read)
        end
      end
      break
    rescue EOFError, Timeout::Error
      if current_attempt == MAX_ATTEMPTS - 1
        abort('Socket Timeout: Server may not be responding')
      end
      puts "Retry #{current_attempt + 1} of #{MAX_ATTEMPTS}"
    end
  end
  res
end

.server(base_dir, name) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/bluepill/socket.rb', line 35

def server(base_dir, name)
  socket_path = self.socket_path(base_dir, name)
  UNIXServer.open(socket_path)
rescue Errno::EADDRINUSE
  begin
    # if sock file has been created, test to see if there is a server
    UNIXSocket.open(socket_path)
  rescue Errno::ECONNREFUSED
    File.delete(socket_path)
    return UNIXServer.open(socket_path)
  else
    logger.err('Server is already running!')
    exit(7)
  end
end

.socket_path(base_dir, name) ⇒ Object



51
52
53
# File 'lib/bluepill/socket.rb', line 51

def socket_path(base_dir, name)
  File.join(base_dir, 'socks', name + '.sock')
end