class Evesync::Service

Class for creating daemons which are DRb servers with proxy object to accept requests.

Traps signals to exit.

Example:

d = Evesync::Service.new(:mydaemond) do |config|
  config.proxy = SomeProxyObject.new
end

d.start

Public Class Methods

new(name) { |factory| ... } click to toggle source
# File lib/evesync/service.rb, line 20
def initialize(name)
  @factory = ServiceFactory.new
  @factory.name = name unless name.nil?
  yield @factory
end

Public Instance Methods

daemonize() click to toggle source
# File lib/evesync/service.rb, line 68
def daemonize
  Process.daemon
  Process.setproctitle(@factory.name.to_s) \
    if Process.respond_to? :setproctitle
  $0 = @factory.name.to_s
  FileUtils.mkdir_p @factory.pids
  File.open("#{@factory.pids}/#{@factory.name}.pid", 'w') do |f|
    f.puts(Process.pid)
  end
end
start() { || ... } click to toggle source
# File lib/evesync/service.rb, line 26
def start
  daemonize

  Log.info("#{@factory.name} daemon starting...")

  @ipc_server = IPC::Server.new(
    port: @factory.port,
    proxy: @factory.proxy,
    ip: @factory.ip,
  ).start

  Signal.trap('TERM') do
    @ipc_server.stop
    exit 0
  end

  Log.info("#{@factory.name} daemon started!")

  @factory.at_start.call if @factory.at_start.respond_to? :call

  loop do
    sleep @factory.interval
    yield if block_given?
  end

rescue SignalException => e
  Log.warn("#{@factory.name} daemon received signal: " \
           "#{e.signm}(#{e.signo})")
  exit 0

# rubocop:disable Lint/RescueException
rescue Exception => crit
  Log.fatal(crit)
  crit.backtrace.each { |line| Log.fatal(line) }
  exit 1

# rubocop:enable Lint/RescueException
ensure
  @factory.at_exit.call if @factory.at_exit.respond_to? :call
  @ipc_server.stop
end