* README w/MIT
[sinatra.git] / lib / sinatra / server.rb
blobfaf34da1649a30b179934c71043dddf23f64263f
1 require 'fileutils'
3 module Sinatra
4   
5   class Server
6     
7     cattr_accessor :logger
8     cattr_accessor :running
9     
10     def start
11       begin
12         setup_environment
13         tail_thread = tail(Options.log_file)
14         Rack::Handler::Mongrel.run(Dispatcher.new, :Port => Options.port) do |server|
15           logger.info "== Sinatra has taken the stage on port #{server.port}!"
16           trap("INT") do
17             server.stop
18             self.class.running = false
19             logger.info "\n== Sinatra has ended his set (crowd applauds)"
20           end
21         end
22         self.class.running = true
23       rescue => e
24         logger.exception e
25       ensure
26         tail_thread.kill if tail_thread
27       end
28     end
29         
30     private 
31   
32       def setup_environment
33         Options.parse!(ARGV)
34         set_loggers
35       end
36     
37       def set_loggers
38         logger = Logger.new(open(Options.log_file, 'w'))
39         [Server, EventContext, Event, Dispatcher].each do |klass|
40           klass.logger = logger
41         end
42       end
43       
44       def tail(log_file)
45         FileUtils.touch(log_file)
46         cursor = File.size(log_file)
47         last_checked = Time.now
48         tail_thread = Thread.new do
49           File.open(log_file, 'r') do |f|
50             loop do
51               f.seek cursor
52               if f.mtime > last_checked
53                 last_checked = f.mtime
54                 contents = f.read
55                 cursor += contents.length
56                 print contents
57               end
58               sleep 1
59             end
60           end
61         end
62         tail_thread
63       end
64       
65   end
66   
67 end