# Ferret Win32 Service Daemon, called by Win 32 service, # created by Herryanto Siatono # # see doc/README.win32 for usage instructions # require 'optparse' require 'win32/service' include Win32 # Read options options = {} ARGV.options do |opts| opts.banner = 'Usage: ferret_daemon [options]' opts.on("-l", "--log FILE", "Daemon log file") {|file| options[:log] = file } opts.on("-c","--console","Run Ferret server on console.") {options[:console] = true} opts.on_tail("-h","--help", "Show this help message") {puts opts; exit} opts.on("-e", "--environment ENV ", "Rails environment") {|env| options[:environment] = env ENV['RAILS_ENV'] = env } opts.parse! end require File.dirname(__FILE__) + '/../config/environment' # Ferret Win32 Service Daemon, called by Win 32 service, # to run on the console, use -c or --console option. module Ferret class FerretDaemon < Daemon # Standard logger to redirect STDOUT and STDERR to a log file class FerretStandardLogger def initialize(logger) @logger = logger end def write(s) @logger.info s end end def initialize(options={}) @options = options # initialize logger if options[:log] @logger = Logger.new @options[:log] else @logger = Logger.new RAILS_ROOT + "/log/ferret_service_#{RAILS_ENV}.log" end # redirect stout and stderr to Ferret logger if running as windows service $stdout = $stderr = FerretStandardLogger.new(@logger) unless @options[:console] log "Initializing FerretDaemon..." if @options[:console] self.service_init self.service_main end end def service_main log "Service main enterred..." while running? log "Listening..." sleep end log "Service main exit..." end def service_init log "Starting Ferret DRb server..." ActsAsFerret::Remote::Server.start log "FerretDaemon started." end def service_stop log "Stopping service..." DRb.stop_service log "FerretDaemon stopped." end def log(msg) @logger.info msg puts msg if @options[:console] end end end if __FILE__ == $0 d = Ferret::FerretDaemon.new(options) d.mainloop end