start 2
[sinatra.git] / lib / sinatra / server.rb
blobf32254e36140324860e5d3334225ae2752e543ac
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         tail_thread = tail(Options.log_file)
13         Rack::Handler::Mongrel.run(Dispatcher.new, :Port => Options.port) do |server|
14           puts "== Sinatra has taken the stage on port #{server.port}!"
15           trap("INT") do
16             server.stop
17             self.class.running = false
18             puts "\n== Sinatra has ended his set (crowd applauds)"
19           end
20         end
21         self.class.running = true
22       rescue Errno::EADDRINUSE => e
23         puts "== Someone is already performing on port #{Options.port}!"
24         logger.exception e
25       rescue => e
26         logger.exception e
27       ensure
28         tail_thread.kill if tail_thread
29       end
30     end
31         
32     private 
33         
34       def tail(log_file)
35         FileUtils.touch(log_file)
36         cursor = File.size(log_file)
37         last_checked = Time.now
38         tail_thread = Thread.new do
39           File.open(log_file, 'r') do |f|
40             loop do
41               f.seek cursor
42               if f.mtime > last_checked
43                 last_checked = f.mtime
44                 contents = f.read
45                 cursor += contents.length
46                 print contents
47               end
48               sleep 1
49             end
50           end
51         end
52         tail_thread
53       end
54       
55   end
56   
57 end