class Zashoku::Daemon

Public Class Methods

new(port:) click to toggle source
# File lib/daemon.rb, line 45
def initialize(port:)
  @port = port
  @semaphore = Mutex.new

  Zashoku.logger = Logger.new(STDOUT)
  Zashoku.logger.level = Zashoku::CConf[:app][:log_level][:daemon]
  Zashoku.logger.info("server using zashoku v#{Version.join('.')}")
  # Load conf
  Zashoku.conf = DaemonConfig.new
  # Load modules
  Zashoku.modules = Zashoku::Module.load(Zashoku::CConf[:app][:modules][:daemon])
  # Update conf with module defaults
  Zashoku.conf.reload

  Zashoku.controllers =
    Zashoku.modules.keys.zip(Zashoku.modules.values.map(&:controller)).to_h

  Zashoku.controllers.each_value { |c| c.add_observer(self) }
end

Public Instance Methods

cleanup() click to toggle source
# File lib/daemon.rb, line 113
def cleanup
  @server.exit
  exit
end
lay_traps!() click to toggle source
# File lib/daemon.rb, line 105
def lay_traps!
  Signal.trap('INT') do
    Thread.new do
      @semaphore.synchronize { cleanup }
    end
  end
end
listen() click to toggle source
# File lib/daemon.rb, line 65
def listen
  lay_traps!
  @server = Net::Server.new(@port)
  @server.handler = method(:respond)
  Zashoku.logger.info('server listening')
  sleep
end
respond(message) click to toggle source
# File lib/daemon.rb, line 78
def respond(message)
  Zashoku.logger.debug("daemon.respond #{message}")
  case message['msg']
  when 'modules'
    Zashoku.modules.map { |m, _| m }
  when 'items'
    Zashoku.command(mod: message[:mod], meth: :items)
  when 'fwd'
    Zashoku.command(message)
  when 'helo'
    Zashoku.logger.info("Client saying helo #{message}")
    if message['zv'] == Zashoku::Version && message['app'] == Zashoku::CConf[:app][:name]
      'ok'
    else
      'rejected'
    end
  when 'disconnect'
    nil
  when 'stop'
    cleanup
  when 'up?'
    true
  else
    'what?'
  end
end
update(e) click to toggle source
# File lib/daemon.rb, line 73
def update(e)
  Zashoku.logger.debug("controller #{e['sender']} sent update #{e['event']}")
  @server.event(e)
end