mongrel_service 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/COPYING ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2006 Luis Lavena, luislavena@gmail.com
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2006 Luis Lavena, luislavena@gmail.com
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,13 @@
1
+ == Mongrel Native Win32 Service Plugin
2
+
3
+ This plugin offer native win32 services for rails. This replace mongrel_rails_service.
4
+ It will work like before, with this this syntax when calling mongrel_rails:
5
+
6
+ service::install
7
+ service::remove
8
+ service::start
9
+ service::stop
10
+ service::status
11
+
12
+ = Author:
13
+ Luis Lavena
@@ -0,0 +1,42 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/clean'
4
+ require 'rake/gempackagetask'
5
+ require 'rake/rdoctask'
6
+ require 'tools/rakehelp'
7
+ require 'fileutils'
8
+ include FileUtils
9
+
10
+ setup_tests
11
+ setup_clean ["pkg", "lib/*.bundle", "*.gem", ".config"]
12
+
13
+ setup_rdoc ['README', 'LICENSE', 'COPYING', 'lib/**/*.rb', 'doc/**/*.rdoc']
14
+
15
+ desc "Does a full compile, test run"
16
+ task :default => [:test, :package]
17
+
18
+ version="0.1"
19
+ name="mongrel_service"
20
+
21
+ setup_gem(name, version) do |spec|
22
+ spec.summary = "Mongrel Native Win32 Service Plugin for Rails"
23
+ spec.description = "This plugin offer native win32 services for rails, powered by Mongrel."
24
+ spec.author="Luis Lavena"
25
+
26
+ # added mongrel_service executable
27
+ spec.executables = ["mongrel_service"]
28
+
29
+ spec.add_dependency('gem_plugin', '>= 0.2.1')
30
+ spec.add_dependency('mongrel', '>= 0.3.12.4')
31
+ spec.files += Dir.glob("resources/**/*")
32
+ end
33
+
34
+
35
+ task :install => [:test, :package] do
36
+ sh %{gem install pkg/#{name}-#{version}.gem}
37
+ end
38
+
39
+ task :uninstall => [:clean] do
40
+ sh %{gem uninstall #{name}}
41
+ end
42
+
@@ -0,0 +1,153 @@
1
+ require 'rubygems'
2
+ require 'win32/service'
3
+ require 'mongrel'
4
+ require 'mongrel/rails'
5
+ require 'optparse'
6
+ require 'yaml'
7
+
8
+ # Avoid curious users from running this script from command line
9
+ if ENV["HOMEDRIVE"]!=nil
10
+ puts "mongrel_service is not designed to run form commandline,"
11
+ puts "please use mongrel_rails service:: commands to create a win32 service."
12
+ exit
13
+ end
14
+
15
+ # We need to use OpenProcess and SetProcessAffinityMask on WinNT/2K/XP for
16
+ # binding the process to each cpu.
17
+ # Kernel32 Module Just for Win32 :D
18
+ require 'dl/win32'
19
+
20
+ module Kernel32
21
+ [
22
+ %w/OpenProcess LLL L/,
23
+ %w/SetProcessAffinityMask LL L/,
24
+ ].each do |fn|
25
+ const_set fn[0].intern, Win32API.new('kernel32.dll', *fn)
26
+ end
27
+
28
+ PROCESS_ALL_ACCESS = 0x1f0fff
29
+
30
+ module_function
31
+
32
+ def set_affinity(pid, cpu)
33
+ handle = OpenProcess.call(PROCESS_ALL_ACCESS, 0, pid)
34
+
35
+ # CPU mask is a bit weird, hehehe :)
36
+ # default mask for CPU 1
37
+ mask = 1
38
+ mask = %w{1 2 4 8 16 32 64 128}[cpu.to_i - 1] if cpu.to_i.between?(1, 8)
39
+
40
+ SetProcessAffinityMask.call(handle, mask.to_i)
41
+ end
42
+ end
43
+ # End Kernel32 Module
44
+
45
+ # RailsService code here
46
+ class RailsService < Win32::Daemon
47
+ def initialize(settings)
48
+ @settings = settings
49
+ end
50
+
51
+ def service_init
52
+ @config = Mongrel::Rails::RailsConfigurator.new(@settings) do
53
+ log "Starting Mongrel in #{defaults[:environment]} mode at #{defaults[:host]}:#{defaults[:port]}"
54
+
55
+ listener do
56
+ mime = {}
57
+ if defaults[:mime_map]
58
+ log "Loading additional MIME types from #{defaults[:mime_map]}"
59
+ mime = load_mime_map(defaults[:mime_map], mime)
60
+ end
61
+
62
+ if defaults[:debug]
63
+ log "Installing debugging prefixed filters. Look in log/mongrel_debug for the files."
64
+ debug "/"
65
+ end
66
+
67
+ log "Starting Rails in environment #{defaults[:environment]} ..."
68
+ uri "/", :handler => rails(:mime => mime)
69
+ log "Rails loaded."
70
+
71
+ #log "Loading any Rails specific GemPlugins"
72
+ #load_plugins
73
+
74
+ if defaults[:config_script]
75
+ log "Loading #{defaults[:config_script]} external config script"
76
+ run_config(defaults[:config_script])
77
+ end
78
+ end
79
+ end
80
+
81
+ end
82
+
83
+ def service_main
84
+ @config.run
85
+ @config.log "Mongrel available at #{@settings[:host]}:#{@settings[:port]}"
86
+
87
+ while state == RUNNING
88
+ sleep 1
89
+ end
90
+
91
+ @config.stop
92
+ end
93
+
94
+ end
95
+
96
+ # default options
97
+ OPTIONS = {
98
+ :environment => ENV['RAILS_ENV'] || "development",
99
+ :port => 3000,
100
+ :address => "0.0.0.0",
101
+ :log_file => "log/mongrel.log",
102
+ :pid_file => "log/mongrel.pid",
103
+ :num_procs => 1024,
104
+ :timeout => 0,
105
+ :mime_map => nil,
106
+ :cwd => Dir.pwd,
107
+ :docroot => "public",
108
+ :debug => false,
109
+ :config_file => nil,
110
+ :config_script => nil,
111
+ :cpu => nil
112
+ }
113
+
114
+ ARGV.options do |opts|
115
+ opts.on('-e', '--environment ENV', "Rails environment to run as") { |OPTIONS[:environment]| }
116
+ opts.on('-p', '--port PORT', "Which port to bind to") { |OPTIONS[:port]| }
117
+ opts.on('-a', '--address ADDR', "Address to bind to") { |OPTIONS[:address]| }
118
+ opts.on('-l', '--log FILE', "Where to write log messages") { |OPTIONS[:log_file]| }
119
+ opts.on('-P', '--pid FILE', "Where to write the PID") { |OPTIONS[:pid_file]| }
120
+ opts.on('-n', '--num-procs INT', "Number of processors active before clients denied") { |OPTIONS[:num_procs]| }
121
+ opts.on('-t', '--timeout TIME', "Timeout all requests after 100th seconds time") { |OPTIONS[:timeout]| }
122
+ opts.on('-m', '--mime PATH', "A YAML file that lists additional MIME types") { |OPTIONS[:mime_map]| }
123
+ opts.on('-c', '--chdir PATH', "Change to dir before starting (will be expanded)") { |OPTIONS[:cwd]| }
124
+ opts.on('-r', '--root PATH', "Set the document root (default 'public')") { |OPTIONS[:docroot]| }
125
+ opts.on('-B', '--debug', "Enable debugging mode") { |OPTIONS[:debug]| }
126
+ opts.on('-C', '--config FILE', "Use a config file") { |OPTIONS[:config_file]| }
127
+ opts.on('-S', '--script FILE', "Load the given file as an extra config script.") { |OPTIONS[:config_script]| }
128
+ opts.on('-u', '--cpu CPU', "Bind the process to specific cpu, starting from 1.") { |OPTIONS[:cpu]| }
129
+
130
+ opts.parse!
131
+ end
132
+
133
+ # We must bind to a specific cpu?
134
+ if OPTIONS[:cpu]
135
+ Kernel32.set_affinity(Process.pid, OPTIONS[:cpu])
136
+ end
137
+
138
+ # expand path
139
+ OPTIONS[:cwd] = File.expand_path(OPTIONS[:cwd])
140
+
141
+ # chdir to that path
142
+ Dir.chdir(OPTIONS[:cwd])
143
+
144
+ # redirecting STDERR to a file so we could trace it.
145
+ STDERR.reopen("log/service.log", "w")
146
+ STDERR.sync = true
147
+
148
+ #FIXME: I commented this because fails during load_plugins from configurator, we need to fix
149
+ #GemPlugin::Manager.instance.load "mongrel" => GemPlugin::INCLUDE, "rails" => GemPlugin::EXCLUDE
150
+
151
+ # initialize the daemon and pass control to win32/service
152
+ svc = RailsService.new(OPTIONS)
153
+ svc.mainloop
@@ -0,0 +1,220 @@
1
+ require 'gem_plugin'
2
+ require 'mongrel'
3
+ require 'mongrel/rails'
4
+ require 'rbconfig'
5
+ require 'win32/service'
6
+
7
+
8
+ module Service
9
+ class Install < GemPlugin::Plugin "/commands"
10
+ include Mongrel::Command::Base
11
+
12
+ def configure
13
+ options [
14
+ ['-N', '--name SVC_NAME', "Required name for the service to be registered/installed.", :@svc_name, nil],
15
+ ['-D', '--display SVC_DISPLAY', "Adjust the display name of the service.", :@svc_display, nil],
16
+ ["-e", "--environment ENV", "Rails environment to run as", :@environment, ENV['RAILS_ENV'] || "development"],
17
+ ['-p', '--port PORT', "Which port to bind to", :@port, 3000],
18
+ ['-a', '--address ADDR', "Address to bind to", :@address, "0.0.0.0"],
19
+ ['-l', '--log FILE', "Where to write log messages", :@log_file, "log/mongrel.log"],
20
+ ['-P', '--pid FILE', "Where to write the PID", :@pid_file, "log/mongrel.pid"],
21
+ ['-n', '--num-procs INT', "Number of processors active before clients denied", :@num_procs, 1024],
22
+ ['-t', '--timeout TIME', "Timeout all requests after 100th seconds time", :@timeout, 0],
23
+ ['-m', '--mime PATH', "A YAML file that lists additional MIME types", :@mime_map, nil],
24
+ ['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, Dir.pwd],
25
+ ['-r', '--root PATH', "Set the document root (default 'public')", :@docroot, "public"],
26
+ ['-B', '--debug', "Enable debugging mode", :@debug, false],
27
+ ['-C', '--config PATH', "Use a config file", :@config_file, nil],
28
+ ['-S', '--script PATH', "Load the given file as an extra config script.", :@config_script, nil],
29
+ ['-u', '--cpu CPU', "Bind the process to specific cpu, starting from 1.", :@cpu, nil]
30
+ ]
31
+ end
32
+
33
+ # When we validate the options, we need to make sure the --root is actually RAILS_ROOT
34
+ # of the rails application we wanted to serve, because later "as service" no error
35
+ # show to trace this.
36
+ def validate
37
+ @cwd = File.expand_path(@cwd)
38
+ valid_dir? @cwd, "Invalid path to change to: #@cwd"
39
+
40
+ # change there to start, then we'll have to come back after daemonize
41
+ Dir.chdir(@cwd)
42
+
43
+ # start with the premise of app really exist.
44
+ app_exist = true
45
+ %w{app config db log public}.each do |path|
46
+ if !File.directory?(File.join(@cwd, path))
47
+ app_exist = false
48
+ break
49
+ end
50
+ end
51
+
52
+ valid? app_exist == true, "The path you specified isn't a valid Rails application."
53
+
54
+ valid_dir? File.dirname(@log_file), "Path to log file not valid: #@log_file"
55
+ valid_dir? File.dirname(@pid_file), "Path to pid file not valid: #@pid_file"
56
+ valid_dir? @docroot, "Path to docroot not valid: #@docroot"
57
+ valid_exists? @mime_map, "MIME mapping file does not exist: #@mime_map" if @mime_map
58
+ valid_exists? @config_file, "Config file not there: #@config_file" if @config_file
59
+
60
+ # Validate the number of cpu to bind to.
61
+ valid? @cpu.to_i > 0, "You must specify a numeric value for cpu. (1..8)" if @cpu
62
+
63
+ # We should validate service existance here, right Zed?
64
+ begin
65
+ valid? !Win32::Service.exists?(@svc_name), "The service already exist, please remove it first."
66
+ rescue
67
+ end
68
+
69
+ valid? @svc_name != nil, "A service name is mandatory."
70
+
71
+ # default service display to service name
72
+ @svc_display = @svc_name if !@svc_display
73
+
74
+ return @valid
75
+ end
76
+
77
+ def run
78
+ # command line setting override config file settings
79
+ @options = { :host => @address, :port => @port, :cwd => @cwd,
80
+ :log_file => @log_file, :pid_file => @pid_file, :environment => @environment,
81
+ :docroot => @docroot, :mime_map => @mime_map,
82
+ :debug => @debug, :includes => ["mongrel"], :config_script => @config_script,
83
+ :num_procs => @num_procs, :timeout => @timeout, :cpu => @cpu
84
+ }
85
+
86
+ if @config_file
87
+ STDERR.puts "** Loading settings from #{@config_file} (command line options override)."
88
+ conf = YAML.load_file(@config_file)
89
+ @options = conf.merge(@options)
90
+ end
91
+
92
+ argv = []
93
+
94
+ # ruby.exe instead of rubyw.exe due a exception raised when stoping the service!
95
+ argv << '"' + Config::CONFIG['bindir'] + '/ruby.exe' + '"'
96
+
97
+ # add service_script, we now use the rubygem powered one
98
+ argv << '"' + Config::CONFIG['bindir'] + '/mongrel_service' + '"'
99
+
100
+ # now the options
101
+ argv << "-e #{@options[:environment]}" if @options[:environment]
102
+ argv << "-p #{@options[:port]}"
103
+ argv << "-a #{@options[:address]}" if @options[:address]
104
+ argv << "-l \"#{@options[:log_file]}\"" if @options[:log_file]
105
+ argv << "-P \"#{@options[:pid_file]}\""
106
+ argv << "-c \"#{@options[:cwd]}\"" if @options[:cwd]
107
+ argv << "-t #{@options[:timeout]}" if @options[:timeout]
108
+ argv << "-m \"#{@options[:mime_map]}\"" if @options[:mime_map]
109
+ argv << "-r \"#{@options[:docroot]}\"" if @options[:docroot]
110
+ argv << "-n #{@options[:num_procs]}" if @options[:num_procs]
111
+ argv << "-B" if @options[:debug]
112
+ argv << "-S \"#{@options[:config_script]}\"" if @options[:config_script]
113
+ argv << "-u #{@options[:cpu.to_i]}" if @options[:cpu]
114
+
115
+ svc = Win32::Service.new
116
+ begin
117
+ svc.create_service{ |s|
118
+ s.service_name = @svc_name
119
+ s.display_name = @svc_display
120
+ s.binary_path_name = argv.join ' '
121
+ s.dependencies = []
122
+ }
123
+ puts "Mongrel service '#{@svc_display}' installed as '#{@svc_name}'."
124
+ rescue Win32::ServiceError => err
125
+ puts "There was a problem installing the service:"
126
+ puts err
127
+ end
128
+ svc.close
129
+ end
130
+ end
131
+
132
+ module ServiceValidation
133
+ def configure
134
+ options [
135
+ ['-N', '--name SVC_NAME', "Required name for the service to be registered/installed.", :@svc_name, nil],
136
+ ]
137
+ end
138
+
139
+ def validate
140
+ valid? @svc_name != nil, "A service name is mandatory."
141
+
142
+ # Validate that the service exists
143
+ begin
144
+ valid? Win32::Service.exists?(@svc_name), "There is no service with that name, cannot proceed."
145
+ rescue
146
+ end
147
+
148
+ return @valid
149
+ end
150
+ end
151
+
152
+ class Remove < GemPlugin::Plugin "/commands"
153
+ include Mongrel::Command::Base
154
+ include ServiceValidation
155
+
156
+ def run
157
+ display_name = Win32::Service.getdisplayname(@svc_name)
158
+
159
+ begin
160
+ Win32::Service.stop(@svc_name)
161
+ rescue
162
+ end
163
+ begin
164
+ Win32::Service.delete(@svc_name)
165
+ rescue
166
+ end
167
+ puts "#{display_name} service removed."
168
+ end
169
+ end
170
+
171
+ class Start < GemPlugin::Plugin "/commands"
172
+ include Mongrel::Command::Base
173
+ include ServiceValidation
174
+
175
+ def run
176
+ display_name = Win32::Service.getdisplayname(@svc_name)
177
+
178
+ begin
179
+ Win32::Service.start(@svc_name)
180
+ started = false
181
+ while started == false
182
+ s = Win32::Service.status(@svc_name)
183
+ started = true if s.current_state == "running"
184
+ break if started == true
185
+ puts "One moment, " + s.current_state
186
+ sleep 1
187
+ end
188
+ puts "#{display_name} service started"
189
+ rescue Win32::ServiceError => err
190
+ puts "There was a problem starting the service:"
191
+ puts err
192
+ end
193
+ end
194
+ end
195
+
196
+ class Stop < GemPlugin::Plugin "/commands"
197
+ include Mongrel::Command::Base
198
+ include ServiceValidation
199
+
200
+ def run
201
+ display_name = Win32::Service.getdisplayname(@svc_name)
202
+
203
+ begin
204
+ Win32::Service.stop(@svc_name)
205
+ stopped = false
206
+ while stopped == false
207
+ s = Win32::Service.status(@svc_name)
208
+ stopped = true if s.current_state == "stopped"
209
+ break if stopped == true
210
+ puts "One moment, " + s.current_state
211
+ sleep 1
212
+ end
213
+ puts "#{display_name} service stopped"
214
+ rescue Win32::ServiceError => err
215
+ puts "There was a problem stopping the service:"
216
+ puts err
217
+ end
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,2 @@
1
+ ---
2
+ :debug: false
@@ -0,0 +1,106 @@
1
+
2
+ def make(makedir)
3
+ Dir.chdir(makedir) do
4
+ sh(PLATFORM =~ /win32/ ? 'nmake' : 'make')
5
+ end
6
+ end
7
+
8
+
9
+ def extconf(dir)
10
+ Dir.chdir(dir) do ruby "extconf.rb" end
11
+ end
12
+
13
+
14
+ def setup_tests
15
+ Rake::TestTask.new do |t|
16
+ t.libs << "test"
17
+ t.test_files = FileList['test/test*.rb']
18
+ t.verbose = true
19
+ end
20
+ end
21
+
22
+
23
+ def setup_clean otherfiles
24
+ files = ['build/*', '**/*.o', '**/*.so', '**/*.a', 'lib/*-*', '**/*.log'] + otherfiles
25
+ CLEAN.include(files)
26
+ end
27
+
28
+
29
+ def setup_rdoc files
30
+ Rake::RDocTask.new do |rdoc|
31
+ rdoc.rdoc_dir = 'doc/rdoc'
32
+ rdoc.options << '--line-numbers'
33
+ rdoc.rdoc_files.add(files)
34
+ end
35
+ end
36
+
37
+
38
+ def setup_extension(dir, extension)
39
+ ext = "ext/#{dir}"
40
+ ext_so = "#{ext}/#{extension}.#{Config::CONFIG['DLEXT']}"
41
+ ext_files = FileList[
42
+ "#{ext}/*.c",
43
+ "#{ext}/*.h",
44
+ "#{ext}/extconf.rb",
45
+ "#{ext}/Makefile",
46
+ "lib"
47
+ ]
48
+
49
+ task "lib" do
50
+ directory "lib"
51
+ end
52
+
53
+ desc "Builds just the #{extension} extension"
54
+ task extension.to_sym => ["#{ext}/Makefile", ext_so ]
55
+
56
+ file "#{ext}/Makefile" => ["#{ext}/extconf.rb"] do
57
+ extconf "#{ext}"
58
+ end
59
+
60
+ file ext_so => ext_files do
61
+ make "#{ext}"
62
+ cp ext_so, "lib"
63
+ end
64
+ end
65
+
66
+
67
+ def base_gem_spec(pkg_name, pkg_version)
68
+ pkg_version = pkg_version
69
+ pkg_name = pkg_name
70
+ pkg_file_name = "#{pkg_name}-#{pkg_version}"
71
+ Gem::Specification.new do |s|
72
+ s.name = pkg_name
73
+ s.version = pkg_version
74
+ s.platform = Gem::Platform::RUBY
75
+ s.has_rdoc = true
76
+ s.extra_rdoc_files = [ "README" ]
77
+
78
+ s.files = %w(COPYING LICENSE README Rakefile) +
79
+ Dir.glob("{bin,doc/rdoc,test,lib}/**/*") +
80
+ Dir.glob("ext/**/*.{h,c,rb}") +
81
+ Dir.glob("examples/**/*.rb") +
82
+ Dir.glob("tools/*.rb")
83
+
84
+ s.require_path = "lib"
85
+ s.extensions = FileList["ext/**/extconf.rb"].to_a
86
+ s.bindir = "bin"
87
+ end
88
+ end
89
+
90
+ def setup_gem(pkg_name, pkg_version)
91
+ spec = base_gem_spec(pkg_name, pkg_version)
92
+ yield spec if block_given?
93
+
94
+ Rake::GemPackageTask.new(spec) do |p|
95
+ p.gem_spec = spec
96
+ # win32 chokes on this
97
+ p.need_tar = true if RUBY_PLATFORM !~ /mswin/
98
+ end
99
+ end
100
+
101
+ def setup_win32_gem(pkg_name, pkg_version)
102
+ spec = base_gem_spec(pkg_name, pkg_version)
103
+ yield spec if block_given?
104
+
105
+ Gem::Builder.new(spec).build
106
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.11
3
+ specification_version: 1
4
+ name: mongrel_service
5
+ version: !ruby/object:Gem::Version
6
+ version: "0.1"
7
+ date: 2006-06-16 00:00:00 -04:00
8
+ summary: Mongrel Native Win32 Service Plugin for Rails
9
+ require_paths:
10
+ - lib
11
+ email:
12
+ homepage:
13
+ rubyforge_project:
14
+ description: This plugin offer native win32 services for rails, powered by Mongrel.
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ authors:
29
+ - Luis Lavena
30
+ files:
31
+ - COPYING
32
+ - LICENSE
33
+ - README
34
+ - Rakefile
35
+ - bin/mongrel_service
36
+ - lib/mongrel_service
37
+ - lib/mongrel_service/init.rb
38
+ - tools/rakehelp.rb
39
+ - resources/defaults.yaml
40
+ test_files: []
41
+
42
+ rdoc_options: []
43
+
44
+ extra_rdoc_files:
45
+ - README
46
+ executables:
47
+ - mongrel_service
48
+ extensions: []
49
+
50
+ requirements: []
51
+
52
+ dependencies:
53
+ - !ruby/object:Gem::Dependency
54
+ name: gem_plugin
55
+ version_requirement:
56
+ version_requirements: !ruby/object:Gem::Version::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 0.2.1
61
+ version:
62
+ - !ruby/object:Gem::Dependency
63
+ name: mongrel
64
+ version_requirement:
65
+ version_requirements: !ruby/object:Gem::Version::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 0.3.12.4
70
+ version: