ferret_daemon 2.34 KB
# Ferret Win32 Service Daemon, called by Win 32 service, 
# created by Herryanto Siatono <herryanto@pluitsolutions.com>
#
# 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