# we must require rubygems because LocalService account don't have RUBYOPT= defined require 'rubygems' require "win32/service" SERVICE_NAME = "MongrelHttp" SERVICE_DISPLAYNAME = "Mongrel Basic HTTP Service" SERVICE_ROOT = File.expand_path(File.dirname(__FILE__)) SERVICE_SCRIPT = File.join(SERVICE_ROOT, __FILE__) if ARGV[0] == "install" require 'rbconfig' argv = [] argv << '"' + Config::CONFIG['bindir'] + '/rubyw.exe"' argv << '"' + SERVICE_SCRIPT + '"' svc = Win32::Service.new begin svc.create_service{ |s| s.service_name = SERVICE_NAME s.display_name = SERVICE_DISPLAYNAME s.binary_path_name = argv.join(' ') s.dependencies = [] } puts "#{SERVICE_DISPLAYNAME} service installed" rescue Win32::ServiceError => err puts "There was a problem installing the service:" puts err end svc.close elsif ARGV[0] == "start" begin Win32::Service.start(SERVICE_NAME) started = false while started == false s = Win32::Service.status(SERVICE_NAME) started = true if s.current_state == "running" break if started == true puts "One moment, " + s.current_state sleep 1 end puts "#{SERVICE_DISPLAYNAME} service started" rescue Win32::ServiceError => err puts "There was a problem installing the service:" puts err end elsif ARGV[0] == "stop" begin Win32::Service.stop(SERVICE_NAME) stopped = false while stopped == false s = Win32::Service.status(SERVICE_NAME) stopped = true if s.current_state == "stopped" break if stopped == true puts "One moment, " + s.current_state sleep 1 end puts "#{SERVICE_DISPLAYNAME} service stopped" rescue Win32::ServiceError => err puts "There was a problem installing the service:" puts err end elsif ARGV[0] == "remove" begin Win32::Service.stop(SERVICE_NAME) rescue end begin Win32::Service.delete(SERVICE_NAME) rescue end puts "#{SERVICE_DISPLAYNAME} service removed." else # This was added to avoid users running the service script form plain command line # (LocalService accound don't have HOMEDRIVE defined.) if ENV["HOMEDRIVE"]!=nil puts "No option provided. You must provide an option. Exiting..." exit end require 'mongrel' require 'yaml' require 'zlib' class SimpleHandler < Mongrel::HttpHandler def process(request, response) response.start do |head,out| head["Content-Type"] = "text/html" results = "
Your request:#{request.params.to_yaml}View the files."
if request.params["HTTP_ACCEPT_ENCODING"] == "gzip,deflate"
head["Content-Encoding"] = "deflate"
# send it back deflated
out << Zlib::Deflate.deflate(results)
else
# no gzip supported, send it back normal
out << results
end
end
end
end
def log(message)
if !$log_file
$log_file = File.open(File.join(SERVICE_ROOT, 'service.log'), 'a+')
end
$log_file.puts(Time.now.strftime("%Y-%m-%d %H:%M:%S") + ' - ' + message)
$log_file.flush
end
class HttpDaemon < Win32::Daemon
def service_init
log "** #{SERVICE_DISPLAYNAME} starting..."
@config = Mongrel::Configurator.new :host => "0.0.0.0" do
listener :port => 3000 do
uri "/", :handler => SimpleHandler.new
uri "/files", :handler => Mongrel::DirHandler.new(SERVICE_ROOT)
end
end
log "** Done initialization."
end
# I commented this because doing file handling or actually stopping the listeners
# here brake the service.
# My guess is because the ruby interperter was called from a Thread different
# than the one where was initialized (but, as usual, could be wrong).
# I think this need to be reported to win32utils guys.
#def service_stop
# log "Stop Signal received."
#end
def service_main
log "Entering Service Main"
@config.run
while state == RUNNING
sleep 1
end
@config.stop
log "Leaving Service Main"
end
end
svc = HttpDaemon.new
svc.mainloop
end