class Eye::Server

Attributes

server[R]
socket_path[R]

Public Class Methods

new(socket_path) click to toggle source
# File lib/eye/server.rb, line 10
def initialize(socket_path)
  @socket_path = socket_path
  @server = begin
    UNIXServer.open(socket_path)
  rescue Errno::EADDRINUSE
    unlink_socket_file
    UNIXServer.open(socket_path)
  end
end

Public Instance Methods

close_socket() click to toggle source
# File lib/eye/server.rb, line 69
def close_socket
  @server.close if @server
  unlink_socket_file
end
handle_connection(socket) click to toggle source
# File lib/eye/server.rb, line 24
def handle_connection(socket)
  text = socket.read

  begin
    # TODO, remove in 1.0

    payload = Marshal.load(text)
    raise "unknown payload #{payload.inspect}" unless payload.is_a?(Array)
    cmd, *args = payload

  rescue
    # new format
    begin
      sign, msg_size = text[0...8].unpack('N*')
      raise "unknown protocol #{sign}" unless sign == Eye::Client::SIGN
      content = text[8..-1]
      content << socket.read(msg_size - content.length) while content.length < msg_size
      payload = Marshal.load(content)
      cmd = payload[:command]
      args = payload[:args]

    rescue => ex
      error "Failed to read from socket: #{ex.message}"
      return
    end
  end

  response = Eye::Control.command(cmd, *args, {})
  socket.write(Marshal.dump(response))

rescue Errno::EPIPE
  # client timeouted
  # do nothing

ensure
  socket.close
end
run() click to toggle source
# File lib/eye/server.rb, line 20
def run
  loop { async.handle_connection @server.accept }
end