Guest User

Untitled

a guest
Feb 21st, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.84 KB | None | 0 0
  1. #!/usr/local/bin/ruby
  2. require 'rubygems'
  3. require 'merb'
  4. require 'optparse'
  5. require 'ostruct'
  6. require 'fileutils'
  7. module Merb
  8. end
  9.  
  10. class Merb::Config
  11. def self.setup
  12. defaults = {
  13. :host => "0.0.0.0",
  14. :port => "4000",
  15. :allow_reloading => true,
  16. :merb_root => Dir.pwd
  17. }
  18.  
  19. begin
  20. options = defaults.merge(YAML.load(ERB.new(IO.read("#{defaults[:merb_root]}/dist/conf/merb.yml")).result))
  21. rescue
  22. options = defaults
  23. end
  24.  
  25. options
  26. end
  27. end
  28.  
  29. class Merb::Server
  30.  
  31. def self.merb_config
  32. options = Merb::Config.setup
  33.  
  34. opts = OptionParser.new do |opts|
  35. opts.on("-f", "--config-file [String]") do |config|
  36. options[:config] = config
  37. end
  38.  
  39. opts.on("-d", "--daemonize [String]") do |config|
  40. options[:daemonize] = true
  41. end
  42.  
  43. opts.on("-c", "--cluster-nodes [String]") do |nodes|
  44. options[:cluster] = nodes
  45. end
  46.  
  47. opts.on("-p", "--port [Integer]") do |port|
  48. options[:port] = port
  49. end
  50.  
  51. opts.on("-n", "--num-procs [Integer]") do |numprocs|
  52. options[:numprocs] = numprocs
  53. end
  54.  
  55. opts.on("-h", "--host [String]") do |host|
  56. options[:host] = host
  57. end
  58.  
  59. opts.on("-m", "--merb-root [String]") do |merb_root|
  60. options[:merb_root] = File.expand_path(merb_root)
  61. end
  62.  
  63. opts.on("-i", "--irb-console [String]") do |console|
  64. options[:console] = true
  65. end
  66. end
  67.  
  68. opts.parse!(@@merb_raw_opts)
  69.  
  70.  
  71. @@merb_opts = options
  72. puts %{Merb started with these options:}
  73. puts @@merb_opts.to_yaml; puts
  74. end
  75.  
  76. def self.run
  77. @@merb_raw_opts = ARGV
  78. merb_config
  79.  
  80. @@merb_opts[:dist_root] = @@merb_opts[:merb_root]+'/dist'
  81.  
  82. $LOAD_PATH.unshift( File.join(@@merb_opts[:merb_root] , '/dist/app/controllers') )
  83. $LOAD_PATH.unshift( File.join(@@merb_opts[:merb_root] , '/dist/lib') )
  84. require @@merb_opts[:merb_root]+'/dist/conf/router.rb'
  85. require @@merb_opts[:merb_root]+'/dist/conf/merb_init.rb'
  86.  
  87. if @@merb_opts[:console]
  88. ARGV.clear # Avoid passing args to IRB
  89. require 'irb'
  90. require 'irb/completion'
  91. def exit
  92. exit!
  93. end
  94. if File.exists? ".irbrc"
  95. ENV['IRBRC'] = ".irbrc"
  96. end
  97. IRB.start
  98. exit!
  99. end
  100.  
  101. if @@merb_opts[:cluster]
  102. delete_pidfile
  103. @@merb_opts[:port].to_i.upto(@@merb_opts[:port].to_i+@@merb_opts[:cluster].to_i-1) do |port|
  104. puts "Starting merb server on port: #{port}"
  105. start(port)
  106. end
  107. elsif @@merb_opts[:daemonize]
  108. delete_pidfile
  109. start(@@merb_opts[:port])
  110. else
  111. trap('INT') {exit}
  112. mongrel_start(@@merb_opts[:port])
  113. end
  114.  
  115. end
  116.  
  117. def self.store_pid(pid)
  118. File.open("#{@@merb_opts[:merb_root]}/log/merb.pid", 'a'){|f| f.write("#{Process.pid}\n")}
  119. end
  120.  
  121. def self.start(port)
  122. fork do
  123. Process.setsid
  124. exit if fork
  125. store_pid(Process.pid)
  126. Dir.chdir @@merb_opts[:merb_root]
  127. File.umask 0000
  128. STDIN.reopen "/dev/null"
  129. STDOUT.reopen "/dev/null", "a"
  130. STDERR.reopen STDOUT
  131. trap("TERM") { exit }
  132. mongrel_start(port)
  133. end
  134. end
  135.  
  136. def self.delete_pidfile
  137. FileUtils.rm("#{@@merb_opts[:merb_root]}/log/merb.pid") rescue nil
  138. end
  139.  
  140. def self.start_cluster(ports)
  141. delete_pidfile
  142. ports.each do |p|
  143. start(port)
  144. end
  145. end
  146.  
  147. def self.mongrel_start(port)
  148. h = Mongrel::HttpServer.new((@@merb_opts[:host]||"0.0.0.0"), (port ||4000), (@@merb_opts[:numprocs]||100))
  149. h.register("/", MerbHandler.new(@@merb_opts[:dist_root]+'/public'))
  150. h.register("/favicon.ico", Mongrel::Error404Handler.new(""))
  151. h.run.join
  152. end
  153.  
  154. def self.config
  155. @@merb_opts
  156. end
  157.  
  158. end
  159.  
  160.  
  161. Merb::Server.run
Add Comment
Please, Sign In to add comment