foreman-export-daemontools 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
data/.env ADDED
@@ -0,0 +1,5 @@
1
+ MONGREL2=/Users/mgranger/source/C/mongrel2/bin/mongrel2
2
+ STRELKA_DATADIR=/Users/mgranger/source/ruby/Strelka/data
3
+ FANCYERRORS_DATADIR=/Users/mgranger/source/ruby/Strelka-FancyErrors/data/strelka-fancyerrors
4
+ RUNMODE=development
5
+ RUBYOPT=-I/Users/mgranger/source/ruby/Strelka-FancyErrors/lib:/Users/mgranger/source/ruby/Strelka/lib
@@ -0,0 +1,2 @@
1
+ concurrency: mongrel=0,cms=3
2
+
File without changes
File without changes
@@ -0,0 +1,4 @@
1
+ == v0.0.1 [2012-04-27] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ Initial release.
4
+
@@ -0,0 +1,16 @@
1
+ .env
2
+ .foreman
3
+ ChangeLog
4
+ History.rdoc
5
+ Manifest.txt
6
+ Procfile
7
+ README.rdoc
8
+ Rakefile
9
+ data/foreman-export-daemontools/templates/log-run.erb
10
+ data/foreman-export-daemontools/templates/run.erb
11
+ lib/foreman/export/daemontools.rb
12
+ spec/data/.env
13
+ spec/data/.foreman
14
+ spec/data/Procfile
15
+ spec/foreman/export/daemontools_spec.rb
16
+ spec/helpers.rb
@@ -0,0 +1,2 @@
1
+ mongrel: m2sh.rb -c mongrel2.sqlite start
2
+ cms: /Users/mgranger/source/ruby/Strelka/bin/strelka -l debug -c etc/config.yaml start cms
@@ -0,0 +1,88 @@
1
+ = foreman-export-daemontools
2
+
3
+ home :: https://bitbucket.org/ged/foreman-export-daemontools
4
+ github :: https://github.com/ged/foreman-export-daemontools
5
+ docs :: http://deveiate.org/code/foreman-export-daemontools
6
+
7
+
8
+ == Description
9
+
10
+ An exporter for David Dollar's Foreman[https://github.com/ddollar/foreman] that
11
+ outputs service directories that can be managed by 'supervise' from DJB's
12
+ daemontools[http://cr.yp.to/daemontools.html].
13
+
14
+
15
+ == Prerequisites
16
+
17
+ * Ruby 1.9.3 or better
18
+ * Foreman
19
+
20
+
21
+ == Installation
22
+
23
+ $ gem install foreman-export-daemontools
24
+
25
+
26
+ == Usage
27
+
28
+ To export your Procfile to the standard +/service+ directory:
29
+
30
+ $ foreman export daemontools /service
31
+
32
+ This will create a <tt>/service/<app>-<proc></tt> directory for each +Procfile+
33
+ process. If you have the concurrency set to something > 1 for any of them it
34
+ will create an individual numbered service directory for each one in the
35
+ format: <tt>/service/<app>-<proc>-<num></tt>
36
+
37
+ Each directory will be generated with a +down+ file, which will prevent
38
+ supervise from automatically starting it before you have a chance to look it over.
39
+ After you confirm that everything looks okay, you can start them up just by
40
+ removing +down+.
41
+
42
+
43
+ == Contributing
44
+
45
+ You can check out the current development source with Mercurial from its
46
+ {main repository}[https://bitbucket.org/ged/foreman-export-daemontools]. Or
47
+ if you prefer Git, via its
48
+ {Github mirror}[https://github.com/ged/foreman-export-daemontools].
49
+
50
+ After checking out the source, run:
51
+
52
+ $ rake newb
53
+
54
+ This task will install any missing dependencies, run the tests/specs,
55
+ and generate the API documentation.
56
+
57
+
58
+ == License
59
+
60
+ Copyright (c) 2012, Michael Granger
61
+ All rights reserved.
62
+
63
+ Redistribution and use in source and binary forms, with or without
64
+ modification, are permitted provided that the following conditions are met:
65
+
66
+ * Redistributions of source code must retain the above copyright notice,
67
+ this list of conditions and the following disclaimer.
68
+
69
+ * Redistributions in binary form must reproduce the above copyright notice,
70
+ this list of conditions and the following disclaimer in the documentation
71
+ and/or other materials provided with the distribution.
72
+
73
+ * Neither the name of the author/s, nor the names of the project's
74
+ contributors may be used to endorse or promote products derived from this
75
+ software without specific prior written permission.
76
+
77
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
78
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
79
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
80
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
81
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
82
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
83
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
84
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
85
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
86
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
87
+
88
+
@@ -0,0 +1,35 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ Hoe.plugin :signing
7
+ Hoe.plugin :deveiate
8
+ Hoe.plugin :mercurial
9
+
10
+ Hoe.plugins.delete :rubyforge
11
+
12
+ hoespec = Hoe.spec( 'foreman-export-daemontools' ) do
13
+ self.readme_file = 'README.rdoc'
14
+ self.history_file = 'History.rdoc'
15
+ self.extra_rdoc_files = FileList[ '*.rdoc' ]
16
+
17
+ self.developer 'Michael Granger', 'ged@FaerieMUD.org'
18
+
19
+ self.dependency 'foreman', '~> 0.45'
20
+ self.dependency 'hoe-deveiate', '~> 0.1', :developer
21
+
22
+ self.spec_extras[:licenses] = ["BSD"]
23
+ self.spec_extras[:rdoc_options] = ['-f', 'fivefish', '-t', 'Foreman Daemontools Exporter']
24
+ self.require_ruby_version( '>=1.9.2' )
25
+ self.hg_sign_tags = true if self.respond_to?( :hg_sign_tags= )
26
+ self.check_history_on_release = true if self.respond_to?( :check_history_on_release= )
27
+
28
+ self.rdoc_locations << "deveiate:/usr/local/www/public/code/#{remote_rdoc_dir}"
29
+ end
30
+
31
+ ENV['VERSION'] ||= hoespec.spec.version.to_s
32
+
33
+ # Ensure the specs pass before checking in
34
+ task 'hg:precheckin' => [ :check_history, :check_manifest, :spec ]
35
+
@@ -0,0 +1,8 @@
1
+ #!/bin/sh
2
+
3
+ <% if self.log %>
4
+ % logdir = self.log + '/' + procdir.basename
5
+ exec setuidgid <%= user %> multilog t <%= logdir %>
6
+ <% else %>
7
+ exec setuidgid <%= user %> multilog t ./main
8
+ <% end %>
@@ -0,0 +1,5 @@
1
+ #!/bin/sh
2
+
3
+ exec 2>&1
4
+ exec setuidgid <%= user %> envdir ./env <%= process.command %>
5
+
@@ -0,0 +1,180 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: set nosta noet ts=4 sw=4:
3
+ #encoding: utf-8
4
+
5
+ require 'erb'
6
+ require 'logger'
7
+ require 'pathname'
8
+ require 'foreman/export'
9
+ require 'foreman/cli'
10
+
11
+
12
+ # A Foreman exporter for daemontools[http://cr.yp.to/daemontools.html]. This exports
13
+ # processes from the Procfile as a hierarchy of directories intended to be run under
14
+ # 'supervise'
15
+ #
16
+ # Some of this code was borrowed from the 'runit' exporter.
17
+ class Foreman::Export::Daemontools < Foreman::Export::Base
18
+
19
+ # Library version constant
20
+ VERSION = '0.0.1'
21
+
22
+ # Version-control revision constant
23
+ REVISION = %q$Revision: 7e1c6eafef91 $
24
+
25
+ # The data directory in the project if that exists, otherwise the gem datadir
26
+ DEFAULT_DATADIR = if ENV['FOREMAN_EXPORT_DATADIR']
27
+ Pathname( ENV['FOREMAN_EXPORT_DATADIR'] )
28
+ elsif File.directory?( 'data/foreman-export-daemontools' )
29
+ Pathname( 'data/foreman-export-daemontools' )
30
+ elsif path = Gem.datadir( 'foreman-export-daemontools' )
31
+ Pathname( path )
32
+ else
33
+ raise ScriptError, "can't find the data directory!"
34
+ end
35
+
36
+ # Directory to look in for personal templates
37
+ HOME_TEMPLATEDIR = Pathname( "~/.foreman/templates" ).expand_path
38
+
39
+ # Pattern used to extract inline env variables from the command
40
+ ENV_VARIABLE_REGEX = /([a-zA-Z_]+[a-zA-Z0-9_]*)=(\S+)/
41
+
42
+
43
+ ##
44
+ # The data directory for the gem
45
+ class << self; attr_accessor :datadir; end
46
+ @datadir = DEFAULT_DATADIR
47
+
48
+
49
+ ### Set up the template root
50
+ def initialize( location, engine, options={} ) # :notnew:
51
+ super
52
+ @logger = Logger.new( $stderr )
53
+ @template_search_path = [ HOME_TEMPLATEDIR, DEFAULT_DATADIR + 'templates' ]
54
+ @template_search_path.unshift( Pathname(options[:template]) ) if options.key?( :template )
55
+ end
56
+
57
+
58
+ ######
59
+ public
60
+ ######
61
+
62
+ ##
63
+ # The list of directories to search in for templates
64
+ attr_accessor :template_search_path
65
+
66
+ ##
67
+ # The Logger object that gets exporter output
68
+ attr_accessor :logger
69
+
70
+
71
+ ### Main API method -- export the loaded Procfile as supervise service directories
72
+ def export
73
+ servicedir = self.location or
74
+ raise Foreman::Export::Exception, "No service directory specified."
75
+ servicedir = Pathname( servicedir )
76
+ app = self.app || File.basename( self.engine.directory )
77
+ user = self.user || app
78
+
79
+ unless servicedir.exist?
80
+ say "Creating #{servicedir}..."
81
+ servicedir.mkpath
82
+ end
83
+
84
+ engine.procfile.entries.each do |process|
85
+ say "Setting up %s-%s service directories..." % [ app, process.name ]
86
+ count = self.concurrency[ process.name ]
87
+ say " concurrency = #{count}"
88
+ procdir = servicedir + "%s-%s" % [ app, process.name ]
89
+
90
+ # Create a numbered service dir for each instance if there are
91
+ # more than one
92
+ if count != 1
93
+ 1.upto( count ) do |i|
94
+ self.write_servicedir( process, Pathname(procdir.to_s + "-#{i}"), user, i )
95
+ end
96
+ else
97
+ self.write_servicedir( process, procdir, user )
98
+ end
99
+ end
100
+ end
101
+
102
+
103
+ ### Write a supervise directory to +targetdir+
104
+ def write_servicedir( process, procdir, user, num=1 )
105
+ say "Making directory %s..." % [ procdir ]
106
+ procdir.mkpath
107
+
108
+ # Write the down file to keep the service from spinning up before the user has
109
+ # a chance to look things over
110
+ write_file( procdir + 'down', '' )
111
+
112
+ # Set up logging
113
+ say " setting up logging..."
114
+ logdir = procdir + 'log'
115
+ logdir.mkpath
116
+ logruntmpl = self.load_template( 'log-run' )
117
+ runfile = logdir + 'run'
118
+ write_file( runfile, logruntmpl.result(binding()) )
119
+ runfile.chmod( 0755 )
120
+
121
+ # Set up the envdir
122
+ say " setting up environment variables..."
123
+ envdir = procdir + 'env'
124
+ envdir.mkpath
125
+ port = engine.port_for( process, num, self.port )
126
+ environment_variables = { 'PORT' => port }.
127
+ merge( engine.environment ).
128
+ merge( inline_variables(process.command) )
129
+ environment_variables.each_pair do |var, env|
130
+ write_file( envdir + var, env )
131
+ end
132
+
133
+ # Set up the runfile
134
+ runtmpl = self.load_template( 'run' )
135
+ runfile = procdir + 'run'
136
+ write_file( runfile, runtmpl.result(binding()) )
137
+ runfile.chmod( 0755 )
138
+
139
+ end
140
+
141
+
142
+ ### Load the daemontools template for the file named +name+, and return it
143
+ ### as an ERB object.
144
+ def load_template( name )
145
+ template_name = "#{name}.erb"
146
+ template = self.template_search_path.
147
+ map {|dir| dir + template_name }.
148
+ find {|tmpl| tmpl.exist? }
149
+
150
+ template or raise Foreman::Export::Exception,
151
+ "Can't find the %p template in any of: %p" %
152
+ [ name, self.template_search_path.map(&:to_s) ]
153
+
154
+ erbtmpl = ERB.new( template.read, nil, '<%>' )
155
+ end
156
+
157
+
158
+ #########
159
+ protected
160
+ #########
161
+
162
+ ### Override to output to the logger instead of STDERR.
163
+ def say( message )
164
+ @logger.info( '[foreman export]' ) { message }
165
+ end
166
+
167
+
168
+ #######
169
+ private
170
+ #######
171
+
172
+ ### Extract the inline environment variables from +command+ and return them as
173
+ ### a Hash.
174
+ def inline_variables( command )
175
+ pairs = command.scan( ENV_VARIABLE_REGEX )
176
+ return Hash[ *pairs.flatten ]
177
+ end
178
+
179
+
180
+ end # Foreman::Export::Daemontools
@@ -0,0 +1,2 @@
1
+ HOMEDIR=/Users/ged
2
+ MONGREL2_HOME=/var/run/mongrel2
@@ -0,0 +1,2 @@
1
+ concurrency: cms=2,api=0,mongrel2=1
2
+
@@ -0,0 +1,4 @@
1
+ cms: strelka -l info -c config.yml cms
2
+ api: strelka -l debug -c config.yml apiv1
3
+ mongrel2: m2sh.rb -c m2.sqlite start
4
+
@@ -0,0 +1,88 @@
1
+ # -*- ruby -*-
2
+ # vim: set nosta noet ts=4 sw=4:
3
+ # encoding: utf-8
4
+
5
+ BEGIN {
6
+ require 'pathname'
7
+ basedir = Pathname.new( __FILE__ ).dirname.parent.parent.parent
8
+ $LOAD_PATH.unshift( basedir ) unless $LOAD_PATH.include?( basedir )
9
+ }
10
+
11
+ require 'helpers'
12
+
13
+ require 'pathname'
14
+ require 'rspec'
15
+ require 'tmpdir'
16
+
17
+ require 'foreman/engine'
18
+ require 'foreman/export/daemontools'
19
+
20
+
21
+ #####################################################################
22
+ ### C O N T E X T S
23
+ #####################################################################
24
+ RSpec.configure do |config|
25
+ config.treat_symbols_as_metadata_keys_with_true_values = true
26
+ config.order = 'rand'
27
+ config.mock_with( :rspec )
28
+ end
29
+
30
+
31
+ describe Foreman::Export::Daemontools do
32
+
33
+ let( :servicedir ) { Pathname(Dir.tmpdir) + 'service' }
34
+ let( :datadir ) { Pathname(__FILE__).dirname.parent.parent + 'data' }
35
+ let( :procfile ) { datadir + 'Procfile' }
36
+ let( :engine ) { Foreman::Engine.new(procfile) }
37
+ let( :options ) {{
38
+ :app_root => datadir,
39
+ :app => 'test',
40
+ :env => datadir + '.env',
41
+ :concurrency => 'cms=2,api=0,mongrel2=1',
42
+ :user => 'www',
43
+ }}
44
+
45
+ subject { described_class.new(servicedir, engine, options) }
46
+
47
+ before( :each ) do
48
+ logdevice = ArrayLogger.new
49
+ subject.logger = Logger.new( logdevice )
50
+ subject.logger.formatter = HtmlFormatter.new( subject.logger )
51
+ if ENV['HTML_LOGGING'] || (ENV['TM_FILENAME'] && ENV['TM_FILENAME'] =~ /_spec\.rb/)
52
+ Thread.current['logger-output'] = logdevice.array
53
+ end
54
+ end
55
+
56
+ after( :all ) do
57
+ servicedir.rmtree
58
+ end
59
+
60
+
61
+ it "exports to the filesystem" do
62
+ subject.export
63
+ servicedir.should exist()
64
+
65
+ %w[ test-cms-1 test-cms-2 test-mongrel2 ].each do |procname|
66
+ procdir = servicedir + procname
67
+
68
+ runfile = procdir + 'run'
69
+ runfile.should exist()
70
+ runfile.should be_executable()
71
+ runfile.read.should =~ %r{exec setuidgid www envdir \./env}
72
+
73
+ logdir = procdir + 'log'
74
+ logdir.should be_directory()
75
+ logrun = logdir + 'run'
76
+ logrun.should be_executable()
77
+ logrun.read.should =~ /exec setuidgid www multilog t/
78
+
79
+ envdir = procdir + 'env'
80
+ envdir.should be_directory()
81
+ ( envdir + 'HOMEDIR' ).read.should == "/Users/ged\n"
82
+ ( envdir + 'MONGREL2_HOME' ).read.should == "/var/run/mongrel2\n"
83
+
84
+ end
85
+ end
86
+
87
+ end
88
+
@@ -0,0 +1,99 @@
1
+ # -*- ruby -*-
2
+ # vim: set nosta noet ts=4 sw=4:
3
+ #encoding: utf-8
4
+
5
+ require 'logger'
6
+
7
+ # An alternate formatter for Logger instances that outputs +div+ HTML
8
+ # fragments.
9
+ class HtmlFormatter < Logger::Formatter
10
+
11
+ # The default HTML fragment that'll be used as the template for each log message.
12
+ HTML_LOG_FORMAT = %q{
13
+ <div class="log-message %5$s">
14
+ <span class="log-time">%1$s.%2$06d</span>
15
+ [
16
+ <span class="log-pid">%3$d</span>
17
+ /
18
+ <span class="log-tid">%4$s</span>
19
+ ]
20
+ <span class="log-level">%5$s</span>
21
+ :
22
+ <span class="log-name">%6$s</span>
23
+ <span class="log-message-text">%7$s</span>
24
+ </div>
25
+ }
26
+
27
+ ### Override the logging formats with ones that generate HTML fragments
28
+ def initialize( logger, format=HTML_LOG_FORMAT ) # :notnew:
29
+ @logger = logger
30
+ @format = format
31
+ super()
32
+ end
33
+
34
+
35
+ ######
36
+ public
37
+ ######
38
+
39
+ # The HTML fragment that will be used as a format() string for the log
40
+ attr_accessor :format
41
+
42
+
43
+ ### Return a log message composed out of the arguments formatted using the
44
+ ### formatter's format string
45
+ def call( severity, time, progname, msg )
46
+ args = [
47
+ time.strftime( '%Y-%m-%d %H:%M:%S' ), # %1$s
48
+ time.usec, # %2$d
49
+ Process.pid, # %3$d
50
+ Thread.current == Thread.main ? 'main' : Thread.object_id, # %4$s
51
+ severity.downcase, # %5$s
52
+ progname, # %6$s
53
+ escape_html( msg ).gsub(/\n/, '<br />') # %7$s
54
+ ]
55
+
56
+ return self.format % args
57
+ end
58
+
59
+
60
+ #######
61
+ private
62
+ #######
63
+
64
+ ### Escape any HTML special characters in +string+.
65
+ def escape_html( string )
66
+ return string.
67
+ gsub( '&', '&amp;' ).
68
+ gsub( '<', '&lt;' ).
69
+ gsub( '>', '&gt;' )
70
+ end
71
+
72
+ end # class HtmlFormatter
73
+
74
+
75
+ # A logger outputter that logs to an Array.
76
+ class ArrayLogger
77
+ ### Create a new ArrayLogger that will append content to +array+.
78
+ def initialize( array=[] )
79
+ @array = array
80
+ end
81
+
82
+ ######
83
+ public
84
+ ######
85
+
86
+ ##
87
+ # The array of logger output
88
+ attr_reader :array
89
+
90
+ ### Write the specified +message+ to the array.
91
+ def write( message )
92
+ @array << message
93
+ end
94
+
95
+ ### No-op -- this is here just so Logger doesn't complain
96
+ def close; end
97
+
98
+ end # class ArrayLogger
99
+
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: foreman-export-daemontools
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Michael Granger
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain:
12
+ - !binary |-
13
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURMRENDQWhTZ0F3SUJB
14
+ Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREE4TVF3d0NnWURWUVFEREFOblpX
15
+ UXgKRnpBVkJnb0praWFKay9Jc1pBRVpGZ2RmWVdWeWFXVmZNUk13RVFZS0Na
16
+ SW1pWlB5TEdRQkdSWURiM0puTUI0WApEVEV3TURreE5qRTBORGcxTVZvWERU
17
+ RXhNRGt4TmpFME5EZzFNVm93UERFTU1Bb0dBMVVFQXd3RFoyVmtNUmN3CkZR
18
+ WUtDWkltaVpQeUxHUUJHUllIWDJGbGNtbGxYekVUTUJFR0NnbVNKb21UOGl4
19
+ a0FSa1dBMjl5WnpDQ0FTSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURD
20
+ Q0FRb0NnZ0VCQUx5Ly9CRnhDMWYvY1BTbnd0SkJXb0ZpRnJpcgpoN1JpY0kr
21
+ am9xL29jVlhRcUk0VERXUHlGLzh0cWt2dCtyRDk5WDlxczJZZVI4Q1UvWWlJ
22
+ cExXclFPWVNUNzBKCnZEbjdVdmhiMm11RlZxcTYrdm9iZVRrSUxCRU82cGlv
23
+ bldERzhqU2JvM3FLbTFSaktKRHdnOXA0d05LaFB1dTgKS0d1ZS9CRmI2N0tm
24
+ bHF5QXBQbVBlYjNWZGQ5Y2xzcHpxZUZxcDdjVUJNRXBGUzZMV3h5NEdrK3F2
25
+ RkZKQkpMQgpCVUhFL0xaVkpNVnpmcEM1VXErUW1ZN0IrRkgvUXFObmRuM3RP
26
+ SGdzUGFkTFROaW11QjFzQ3VMMWE0ejNQZXBkClRlTEJFRm1FYW81RGszSy9R
27
+ OG84dmxiSUIvakJEVFV4NkRqYmd4dzc3OTA5eDZnSTlkb1U0TEQ1WE1jQ0F3
28
+ RUEKQWFNNU1EY3dDUVlEVlIwVEJBSXdBREFMQmdOVkhROEVCQU1DQkxBd0hR
29
+ WURWUjBPQkJZRUZKZW9Ha09yOWw0Qgorc2FNa1cvWlhUNFVlU3ZWTUEwR0NT
30
+ cUdTSWIzRFFFQkJRVUFBNElCQVFCRzJLT2J2WUkyZUh5eUJVSlNKM2pOCnZF
31
+ blUzZDYwem5BWGJyU2QycWIzcjFsWTFFUEREM2JjeTBNZ2dDZkdkZzNYdTU0
32
+ ejIxb3F5SWRrOHVHdFdCUEwKSElhOUVnZkZHU1VFZ3ZjSXZhWXFpTjRqVFV0
33
+ aWRmRUZ3K0x0anM4QVA5Z1dnU0lZUzZHcjM4VjBXR0ZGTnpJSAphT0Qyd211
34
+ OW9vL1JmZlc0aFMvOEd1dmZNemN3N0NRMzU1d0ZSNEtCL255emUrRXNaMVk1
35
+ RGVyQ0FhZ01WdURRClUwQkxtV0RGelBHR1dsUGVRQ3JZSENyK0FjSnorTlJu
36
+ YUhDS0xaZFNLai9SSHVUT3QrZ2JsUmV4OEZBaDhOZUEKY21saFhlNDZwWk5K
37
+ Z1dLYnhaYWg4NWpJang5NWhSOHZPSStOQU01aUg5a09xSzEzRHJ4YWNUS1Bo
38
+ cWo1UGp3RgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
39
+ date: 2012-05-02 00:00:00.000000000 Z
40
+ dependencies:
41
+ - !ruby/object:Gem::Dependency
42
+ name: foreman
43
+ requirement: &70130722360800 !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: '0.45'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: *70130722360800
52
+ - !ruby/object:Gem::Dependency
53
+ name: hoe-mercurial
54
+ requirement: &70130722359620 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ version: 1.4.0
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: *70130722359620
63
+ - !ruby/object:Gem::Dependency
64
+ name: hoe-highline
65
+ requirement: &70130722357580 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: 0.1.0
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: *70130722357580
74
+ - !ruby/object:Gem::Dependency
75
+ name: rdoc
76
+ requirement: &70130722377660 !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ~>
80
+ - !ruby/object:Gem::Version
81
+ version: '3.10'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: *70130722377660
85
+ - !ruby/object:Gem::Dependency
86
+ name: hoe-deveiate
87
+ requirement: &70130722371520 !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ~>
91
+ - !ruby/object:Gem::Version
92
+ version: '0.1'
93
+ type: :development
94
+ prerelease: false
95
+ version_requirements: *70130722371520
96
+ - !ruby/object:Gem::Dependency
97
+ name: hoe
98
+ requirement: &70130722405460 !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: *70130722405460
107
+ description: ! 'An exporter for David Dollar''s Foreman[https://github.com/ddollar/foreman]
108
+ that
109
+
110
+ outputs service directories that can be managed by ''supervise'' from DJB''s
111
+
112
+ daemontools[http://cr.yp.to/daemontools.html].'
113
+ email:
114
+ - ged@FaerieMUD.org
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files:
118
+ - History.rdoc
119
+ - Manifest.txt
120
+ - README.rdoc
121
+ files:
122
+ - .env
123
+ - .foreman
124
+ - ChangeLog
125
+ - History.rdoc
126
+ - Manifest.txt
127
+ - Procfile
128
+ - README.rdoc
129
+ - Rakefile
130
+ - data/foreman-export-daemontools/templates/log-run.erb
131
+ - data/foreman-export-daemontools/templates/run.erb
132
+ - lib/foreman/export/daemontools.rb
133
+ - spec/data/.env
134
+ - spec/data/.foreman
135
+ - spec/data/Procfile
136
+ - spec/foreman/export/daemontools_spec.rb
137
+ - spec/helpers.rb
138
+ - .gemtest
139
+ homepage: https://bitbucket.org/ged/foreman-export-daemontools
140
+ licenses:
141
+ - BSD
142
+ post_install_message:
143
+ rdoc_options:
144
+ - -f
145
+ - fivefish
146
+ - -t
147
+ - Foreman Daemontools Exporter
148
+ require_paths:
149
+ - lib
150
+ required_ruby_version: !ruby/object:Gem::Requirement
151
+ none: false
152
+ requirements:
153
+ - - ! '>='
154
+ - !ruby/object:Gem::Version
155
+ version: 1.9.2
156
+ required_rubygems_version: !ruby/object:Gem::Requirement
157
+ none: false
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubyforge_project: foreman-export-daemontools
164
+ rubygems_version: 1.8.16
165
+ signing_key:
166
+ specification_version: 3
167
+ summary: An exporter for David Dollar's Foreman[https://github.com/ddollar/foreman]
168
+ that outputs service directories that can be managed by 'supervise' from DJB's daemontools[http://cr.yp.to/daemontools.html].
169
+ test_files: []
Binary file