foreman 0.19.0 → 0.21.0
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.
- data/data/export/bluepill/master.pill.erb +27 -0
- data/data/export/upstart/process.conf.erb +1 -1
- data/lib/foreman/cli.rb +4 -3
- data/lib/foreman/engine.rb +16 -15
- data/lib/foreman/export/base.rb +2 -0
- data/lib/foreman/export/bluepill.rb +29 -0
- data/lib/foreman/export.rb +1 -0
- data/lib/foreman/version.rb +1 -1
- data/man/foreman.1 +19 -2
- data/spec/foreman/cli_spec.rb +1 -1
- data/spec/foreman/engine_spec.rb +24 -16
- data/spec/foreman/export/bluepill_spec.rb +20 -0
- data/spec/foreman/export/upstart_spec.rb +16 -0
- data/spec/resources/export/bluepill/app.pill +65 -0
- data/spec/spec_helper.rb +1 -0
- metadata +85 -90
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
Bluepill.application("<%= app %>", :foreground => false, :log_file => "/var/log/bluepill.log") do |app|
|
|
2
|
+
|
|
3
|
+
app.uid = "<%= user %>"
|
|
4
|
+
app.gid = "<%= user %>"
|
|
5
|
+
|
|
6
|
+
<% engine.processes.values.each do |process| %>
|
|
7
|
+
<% 1.upto(concurrency[process.name]) do |num| %>
|
|
8
|
+
<% port = engine.port_for(process, num, options[:port]) %>
|
|
9
|
+
app.process("<%= process.name %>-<%=num%>") do |process|
|
|
10
|
+
process.start_command = "<%= process.command.gsub("$PORT", port.to_s) %>"
|
|
11
|
+
|
|
12
|
+
process.working_dir = "<%= engine.directory %>"
|
|
13
|
+
process.daemonize = true
|
|
14
|
+
process.environment = {"PORT" => "<%= port %>"}
|
|
15
|
+
process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
|
|
16
|
+
|
|
17
|
+
process.stdout = process.stderr = "<%= log_root %>/<%= app %>-<%= process.name %>-<%=num%>.log"
|
|
18
|
+
|
|
19
|
+
process.monitor_children do |children|
|
|
20
|
+
children.stop_command "kill -QUIT {{PID}}"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
process.group = "<%= app %>-<%= process.name %>"
|
|
24
|
+
end
|
|
25
|
+
<% end %>
|
|
26
|
+
<% end %>
|
|
27
|
+
end
|
|
@@ -2,4 +2,4 @@ start on starting <%= app %>-<%= process.name %>
|
|
|
2
2
|
stop on stopping <%= app %>-<%= process.name %>
|
|
3
3
|
respawn
|
|
4
4
|
|
|
5
|
-
exec su - <%= user %> -c 'cd <%= engine.directory %>; export PORT=<%= port %>; <%= process.command %> >> <%= log_root %>/<%=process.name%>-<%=num%>.log 2>&1'
|
|
5
|
+
exec su - <%= user %> -c 'cd <%= engine.directory %>; export PORT=<%= port %>;<% engine.environment.each_pair do |var,env| %> export <%= var.upcase %>=<%= env %>; <% end %> <%= process.command %> >> <%= log_root %>/<%=process.name%>-<%=num%>.log 2>&1'
|
data/lib/foreman/cli.rb
CHANGED
|
@@ -18,9 +18,9 @@ class Foreman::CLI < Thor
|
|
|
18
18
|
check_procfile!
|
|
19
19
|
|
|
20
20
|
if process
|
|
21
|
-
engine.execute(process
|
|
21
|
+
engine.execute(process)
|
|
22
22
|
else
|
|
23
|
-
engine.start
|
|
23
|
+
engine.start
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
|
@@ -40,6 +40,7 @@ class Foreman::CLI < Thor
|
|
|
40
40
|
formatter = case format
|
|
41
41
|
when "inittab" then Foreman::Export::Inittab
|
|
42
42
|
when "upstart" then Foreman::Export::Upstart
|
|
43
|
+
when "bluepill" then Foreman::Export::Bluepill
|
|
43
44
|
else error "Unknown export format: #{format}."
|
|
44
45
|
end
|
|
45
46
|
|
|
@@ -64,7 +65,7 @@ private ######################################################################
|
|
|
64
65
|
end
|
|
65
66
|
|
|
66
67
|
def engine
|
|
67
|
-
@engine ||= Foreman::Engine.new(procfile)
|
|
68
|
+
@engine ||= Foreman::Engine.new(procfile, options)
|
|
68
69
|
end
|
|
69
70
|
|
|
70
71
|
def procfile
|
data/lib/foreman/engine.rb
CHANGED
|
@@ -11,21 +11,25 @@ class Foreman::Engine
|
|
|
11
11
|
|
|
12
12
|
attr_reader :procfile
|
|
13
13
|
attr_reader :directory
|
|
14
|
+
attr_reader :environment
|
|
15
|
+
attr_reader :options
|
|
14
16
|
|
|
15
17
|
extend Term::ANSIColor
|
|
16
18
|
|
|
17
19
|
COLORS = [ cyan, yellow, green, magenta, red ]
|
|
18
20
|
|
|
19
|
-
def initialize(procfile)
|
|
21
|
+
def initialize(procfile, options={})
|
|
20
22
|
@procfile = read_procfile(procfile)
|
|
21
23
|
@directory = File.expand_path(File.dirname(procfile))
|
|
24
|
+
@options = options
|
|
25
|
+
@environment = read_environment(options[:env])
|
|
22
26
|
end
|
|
23
27
|
|
|
24
28
|
def processes
|
|
25
29
|
@processes ||= begin
|
|
26
30
|
@order = []
|
|
27
31
|
procfile.split("\n").inject({}) do |hash, line|
|
|
28
|
-
next if line.strip == ""
|
|
32
|
+
next hash if line.strip == ""
|
|
29
33
|
name, command = line.split(/ *: +/, 2)
|
|
30
34
|
unless command
|
|
31
35
|
warn_deprecated_procfile!
|
|
@@ -50,13 +54,11 @@ class Foreman::Engine
|
|
|
50
54
|
end
|
|
51
55
|
end
|
|
52
56
|
|
|
53
|
-
def start
|
|
54
|
-
environment = read_environment(options[:env])
|
|
55
|
-
|
|
57
|
+
def start
|
|
56
58
|
proctitle "ruby: foreman master"
|
|
57
59
|
|
|
58
60
|
processes_in_order.each do |name, process|
|
|
59
|
-
fork process
|
|
61
|
+
fork process
|
|
60
62
|
end
|
|
61
63
|
|
|
62
64
|
trap("TERM") { puts "SIGTERM received"; terminate_gracefully }
|
|
@@ -65,10 +67,9 @@ class Foreman::Engine
|
|
|
65
67
|
watch_for_termination
|
|
66
68
|
end
|
|
67
69
|
|
|
68
|
-
def execute(name
|
|
69
|
-
environment = read_environment(options[:env])
|
|
70
|
+
def execute(name)
|
|
70
71
|
|
|
71
|
-
fork processes[name]
|
|
72
|
+
fork processes[name]
|
|
72
73
|
|
|
73
74
|
trap("TERM") { puts "SIGTERM received"; terminate_gracefully }
|
|
74
75
|
trap("INT") { puts "SIGINT received"; terminate_gracefully }
|
|
@@ -84,16 +85,16 @@ class Foreman::Engine
|
|
|
84
85
|
|
|
85
86
|
private ######################################################################
|
|
86
87
|
|
|
87
|
-
def fork(process
|
|
88
|
-
concurrency = Foreman::Utils.parse_concurrency(options[:concurrency])
|
|
88
|
+
def fork(process)
|
|
89
|
+
concurrency = Foreman::Utils.parse_concurrency(@options[:concurrency])
|
|
89
90
|
|
|
90
91
|
1.upto(concurrency[process.name]) do |num|
|
|
91
|
-
fork_individual(process, num, port_for(process, num, options[:port])
|
|
92
|
+
fork_individual(process, num, port_for(process, num, @options[:port]))
|
|
92
93
|
end
|
|
93
94
|
end
|
|
94
95
|
|
|
95
|
-
def fork_individual(process, num, port
|
|
96
|
-
environment.each { |k,v| ENV[k] = v }
|
|
96
|
+
def fork_individual(process, num, port)
|
|
97
|
+
@environment.each { |k,v| ENV[k] = v }
|
|
97
98
|
|
|
98
99
|
ENV["PORT"] = port.to_s
|
|
99
100
|
ENV["PS"] = "#{process.name}.#{num}"
|
|
@@ -119,7 +120,7 @@ private ######################################################################
|
|
|
119
120
|
end
|
|
120
121
|
end
|
|
121
122
|
end
|
|
122
|
-
rescue PTY::ChildExited, Interrupt
|
|
123
|
+
rescue PTY::ChildExited, Interrupt, Errno::EIO
|
|
123
124
|
begin
|
|
124
125
|
info "process exiting", process
|
|
125
126
|
rescue Interrupt
|
data/lib/foreman/export/base.rb
CHANGED
|
@@ -26,6 +26,8 @@ private ######################################################################
|
|
|
26
26
|
def export_template(exporter, file, template_root)
|
|
27
27
|
if template_root && File.exist?(file_path = File.join(template_root, file))
|
|
28
28
|
File.read(file_path)
|
|
29
|
+
elsif File.exist?(file_path = File.join("~/.foreman/templates", file))
|
|
30
|
+
File.read(file_path)
|
|
29
31
|
else
|
|
30
32
|
File.read(File.expand_path("../../../../data/export/#{exporter}/#{file}", __FILE__))
|
|
31
33
|
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require "erb"
|
|
2
|
+
require "foreman/export"
|
|
3
|
+
|
|
4
|
+
class Foreman::Export::Bluepill < Foreman::Export::Base
|
|
5
|
+
|
|
6
|
+
def export(location, options={})
|
|
7
|
+
error("Must specify a location") unless location
|
|
8
|
+
|
|
9
|
+
FileUtils.mkdir_p location
|
|
10
|
+
|
|
11
|
+
app = options[:app] || File.basename(engine.directory)
|
|
12
|
+
user = options[:user] || app
|
|
13
|
+
log_root = options[:log] || "/var/log/#{app}"
|
|
14
|
+
template_root = options[:template]
|
|
15
|
+
|
|
16
|
+
Dir["#{location}/#{app}.pill"].each do |file|
|
|
17
|
+
say "cleaning up: #{file}"
|
|
18
|
+
FileUtils.rm(file)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
concurrency = Foreman::Utils.parse_concurrency(options[:concurrency])
|
|
22
|
+
|
|
23
|
+
master_template = export_template("bluepill", "master.pill.erb", template_root)
|
|
24
|
+
master_config = ERB.new(master_template).result(binding)
|
|
25
|
+
write_file "#{location}/#{app}.pill", master_config
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
data/lib/foreman/export.rb
CHANGED
data/lib/foreman/version.rb
CHANGED
data/man/foreman.1
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
|
3
3
|
.
|
|
4
|
-
.TH "FOREMAN" "1" "
|
|
4
|
+
.TH "FOREMAN" "1" "September 2011" "Foreman 0.21.0" "Foreman Manual"
|
|
5
5
|
.
|
|
6
6
|
.SH "NAME"
|
|
7
7
|
\fBforeman\fR \- manage Procfile\-based applications
|
|
@@ -69,7 +69,7 @@ These options control all modes of foreman\'s operation\.
|
|
|
69
69
|
.
|
|
70
70
|
.TP
|
|
71
71
|
\fB\-e\fR, \fB\-\-env\fR
|
|
72
|
-
Specify
|
|
72
|
+
Specify an alternate environment file\.
|
|
73
73
|
.
|
|
74
74
|
.TP
|
|
75
75
|
\fB\-f\fR, \fB\-\-procfile\fR
|
|
@@ -79,6 +79,9 @@ Specify an alternate location for the application\'s Procfile\. This file\'s con
|
|
|
79
79
|
foreman currently supports the following output formats:
|
|
80
80
|
.
|
|
81
81
|
.IP "\(bu" 4
|
|
82
|
+
bluepill
|
|
83
|
+
.
|
|
84
|
+
.IP "\(bu" 4
|
|
82
85
|
inittab
|
|
83
86
|
.
|
|
84
87
|
.IP "\(bu" 4
|
|
@@ -141,6 +144,20 @@ $ foreman check
|
|
|
141
144
|
.
|
|
142
145
|
.IP "" 0
|
|
143
146
|
.
|
|
147
|
+
.SH "ENVIRONMENT"
|
|
148
|
+
If a \fB\.env\fR file exists in the current directory, the default environment will be read from it\. This file should contain key/value pairs, separated by \fB=\fR, with one key/value pair per line\.
|
|
149
|
+
.
|
|
150
|
+
.IP "" 4
|
|
151
|
+
.
|
|
152
|
+
.nf
|
|
153
|
+
|
|
154
|
+
FOO=bar
|
|
155
|
+
BAZ=qux
|
|
156
|
+
.
|
|
157
|
+
.fi
|
|
158
|
+
.
|
|
159
|
+
.IP "" 0
|
|
160
|
+
.
|
|
144
161
|
.SH "DEFAULT OPTIONS"
|
|
145
162
|
If a \fB\.foreman\fR file exists in the current directory, default options will be read from it\. This file should be in YAML format with the long option name as keys\. Example:
|
|
146
163
|
.
|
data/spec/foreman/cli_spec.rb
CHANGED
data/spec/foreman/engine_spec.rb
CHANGED
|
@@ -2,7 +2,7 @@ require "spec_helper"
|
|
|
2
2
|
require "foreman/engine"
|
|
3
3
|
|
|
4
4
|
describe "Foreman::Engine" do
|
|
5
|
-
subject { Foreman::Engine.new("Procfile") }
|
|
5
|
+
subject { Foreman::Engine.new("Procfile", {}) }
|
|
6
6
|
|
|
7
7
|
describe "initialize" do
|
|
8
8
|
describe "without an existing Procfile" do
|
|
@@ -37,53 +37,61 @@ describe "Foreman::Engine" do
|
|
|
37
37
|
describe "start" do
|
|
38
38
|
it "forks the processes" do
|
|
39
39
|
write_procfile
|
|
40
|
-
mock(subject).fork(subject.processes["alpha"]
|
|
41
|
-
mock(subject).fork(subject.processes["bravo"]
|
|
40
|
+
mock(subject).fork(subject.processes["alpha"])
|
|
41
|
+
mock(subject).fork(subject.processes["bravo"])
|
|
42
42
|
mock(subject).watch_for_termination
|
|
43
43
|
subject.start
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
it "handles concurrency" do
|
|
47
47
|
write_procfile
|
|
48
|
-
|
|
49
|
-
mock(
|
|
50
|
-
mock(
|
|
51
|
-
mock(
|
|
52
|
-
|
|
48
|
+
engine = Foreman::Engine.new("Procfile",:concurrency => "alpha=2")
|
|
49
|
+
mock(engine).fork_individual(engine.processes["alpha"], 1, 5000)
|
|
50
|
+
mock(engine).fork_individual(engine.processes["alpha"], 2, 5001)
|
|
51
|
+
mock(engine).fork_individual(engine.processes["bravo"], 1, 5100)
|
|
52
|
+
mock(engine).watch_for_termination
|
|
53
|
+
engine.start
|
|
53
54
|
end
|
|
54
55
|
end
|
|
55
56
|
|
|
56
57
|
describe "execute" do
|
|
57
58
|
it "runs the processes" do
|
|
58
59
|
write_procfile
|
|
59
|
-
mock(subject).fork(subject.processes["alpha"]
|
|
60
|
+
mock(subject).fork(subject.processes["alpha"])
|
|
60
61
|
mock(subject).watch_for_termination
|
|
61
62
|
subject.execute("alpha")
|
|
62
63
|
end
|
|
63
64
|
end
|
|
64
65
|
|
|
65
66
|
describe "environment" do
|
|
67
|
+
|
|
66
68
|
before(:each) do
|
|
67
69
|
write_procfile
|
|
68
70
|
stub(Process).fork
|
|
69
|
-
stub(subject).info
|
|
70
|
-
mock(subject).watch_for_termination
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
it "should read if specified" do
|
|
74
74
|
File.open("/tmp/env", "w") { |f| f.puts("FOO=baz") }
|
|
75
|
-
|
|
75
|
+
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env")
|
|
76
|
+
stub(engine).info
|
|
77
|
+
mock(engine).watch_for_termination
|
|
78
|
+
engine.environment.should == {"FOO"=>"baz"}
|
|
79
|
+
engine.execute("alpha")
|
|
76
80
|
end
|
|
77
81
|
|
|
78
82
|
it "should fail if specified and doesnt exist" do
|
|
79
|
-
mock(
|
|
80
|
-
|
|
83
|
+
mock.instance_of(Foreman::Engine).error("No such file: /tmp/env")
|
|
84
|
+
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env")
|
|
81
85
|
end
|
|
82
86
|
|
|
83
87
|
it "should read .env if none specified" do
|
|
84
88
|
File.open(".env", "w") { |f| f.puts("FOO=qoo") }
|
|
85
|
-
|
|
86
|
-
|
|
89
|
+
engine = Foreman::Engine.new("Procfile")
|
|
90
|
+
stub(engine).info
|
|
91
|
+
mock(engine).watch_for_termination
|
|
92
|
+
mock(engine).fork_individual(anything, anything, anything)
|
|
93
|
+
engine.environment.should == {"FOO"=>"qoo"}
|
|
94
|
+
engine.execute("bravo")
|
|
87
95
|
end
|
|
88
96
|
end
|
|
89
97
|
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
require "foreman/engine"
|
|
3
|
+
require "foreman/export/bluepill"
|
|
4
|
+
require "tmpdir"
|
|
5
|
+
|
|
6
|
+
describe Foreman::Export::Bluepill do
|
|
7
|
+
let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") }
|
|
8
|
+
let(:engine) { Foreman::Engine.new(procfile) }
|
|
9
|
+
let(:bluepill) { Foreman::Export::Bluepill.new(engine) }
|
|
10
|
+
|
|
11
|
+
before(:each) { load_export_templates_into_fakefs("bluepill") }
|
|
12
|
+
before(:each) { stub(bluepill).say }
|
|
13
|
+
|
|
14
|
+
it "exports to the filesystem" do
|
|
15
|
+
bluepill.export("/tmp/init")
|
|
16
|
+
|
|
17
|
+
File.read("/tmp/init/app.pill").should == example_export_file("bluepill/app.pill")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
@@ -36,4 +36,20 @@ describe Foreman::Export::Upstart do
|
|
|
36
36
|
File.read("/tmp/init/app.conf").should == "alternate_template\n"
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
|
+
|
|
40
|
+
context "with alternate templates from home dir" do
|
|
41
|
+
let(:default_template_root) {File.expand_path("~/.foreman/templates")}
|
|
42
|
+
|
|
43
|
+
before do
|
|
44
|
+
FileUtils.mkdir_p default_template_root
|
|
45
|
+
File.open("#{default_template_root}/master.conf.erb", "w") { |f| f.puts "default_alternate_template" }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "can export with alternate template files" do
|
|
49
|
+
upstart.export("/tmp/init")
|
|
50
|
+
|
|
51
|
+
File.read("/tmp/init/app.conf").should == "default_alternate_template\n"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
39
55
|
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
Bluepill.application("app", :foreground => false, :log_file => "/var/log/bluepill.log") do |app|
|
|
2
|
+
|
|
3
|
+
app.uid = "app"
|
|
4
|
+
app.gid = "app"
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
app.process("alpha-1") do |process|
|
|
10
|
+
process.start_command = "./alpha"
|
|
11
|
+
|
|
12
|
+
process.working_dir = "/tmp/app"
|
|
13
|
+
process.daemonize = true
|
|
14
|
+
process.environment = {"PORT" => "5000"}
|
|
15
|
+
process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
|
|
16
|
+
|
|
17
|
+
process.stdout = process.stderr = "/var/log/app/app-alpha-1.log"
|
|
18
|
+
|
|
19
|
+
process.monitor_children do |children|
|
|
20
|
+
children.stop_command "kill -QUIT {{PID}}"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
process.group = "app-alpha"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
app.process("alpha-2") do |process|
|
|
28
|
+
process.start_command = "./alpha"
|
|
29
|
+
|
|
30
|
+
process.working_dir = "/tmp/app"
|
|
31
|
+
process.daemonize = true
|
|
32
|
+
process.environment = {"PORT" => "5001"}
|
|
33
|
+
process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
|
|
34
|
+
|
|
35
|
+
process.stdout = process.stderr = "/var/log/app/app-alpha-2.log"
|
|
36
|
+
|
|
37
|
+
process.monitor_children do |children|
|
|
38
|
+
children.stop_command "kill -QUIT {{PID}}"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
process.group = "app-alpha"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
app.process("bravo-1") do |process|
|
|
48
|
+
process.start_command = "./bravo"
|
|
49
|
+
|
|
50
|
+
process.working_dir = "/tmp/app"
|
|
51
|
+
process.daemonize = true
|
|
52
|
+
process.environment = {"PORT" => "5100"}
|
|
53
|
+
process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
|
|
54
|
+
|
|
55
|
+
process.stdout = process.stderr = "/var/log/app/app-bravo-1.log"
|
|
56
|
+
|
|
57
|
+
process.monitor_children do |children|
|
|
58
|
+
children.stop_command "kill -QUIT {{PID}}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
process.group = "app-bravo"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
|
@@ -1,126 +1,122 @@
|
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: foreman
|
|
3
|
-
version: !ruby/object:Gem::Version
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.21.0
|
|
4
5
|
prerelease:
|
|
5
|
-
version: 0.19.0
|
|
6
6
|
platform: ruby
|
|
7
|
-
authors:
|
|
7
|
+
authors:
|
|
8
8
|
- David Dollar
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
dependencies:
|
|
16
|
-
- !ruby/object:Gem::Dependency
|
|
12
|
+
date: 2011-09-09 00:00:00.000000000Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
17
15
|
name: term-ansicolor
|
|
18
|
-
|
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
|
16
|
+
requirement: &70144026259620 !ruby/object:Gem::Requirement
|
|
20
17
|
none: false
|
|
21
|
-
requirements:
|
|
18
|
+
requirements:
|
|
22
19
|
- - ~>
|
|
23
|
-
- !ruby/object:Gem::Version
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
24
21
|
version: 1.0.5
|
|
25
22
|
type: :runtime
|
|
26
|
-
version_requirements: *id001
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: thor
|
|
29
23
|
prerelease: false
|
|
30
|
-
|
|
24
|
+
version_requirements: *70144026259620
|
|
25
|
+
- !ruby/object:Gem::Dependency
|
|
26
|
+
name: thor
|
|
27
|
+
requirement: &70144026258680 !ruby/object:Gem::Requirement
|
|
31
28
|
none: false
|
|
32
|
-
requirements:
|
|
33
|
-
- -
|
|
34
|
-
- !ruby/object:Gem::Version
|
|
29
|
+
requirements:
|
|
30
|
+
- - ! '>='
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
35
32
|
version: 0.13.6
|
|
36
33
|
type: :runtime
|
|
37
|
-
version_requirements: *id002
|
|
38
|
-
- !ruby/object:Gem::Dependency
|
|
39
|
-
name: parka
|
|
40
34
|
prerelease: false
|
|
41
|
-
|
|
35
|
+
version_requirements: *70144026258680
|
|
36
|
+
- !ruby/object:Gem::Dependency
|
|
37
|
+
name: parka
|
|
38
|
+
requirement: &70144026257860 !ruby/object:Gem::Requirement
|
|
42
39
|
none: false
|
|
43
|
-
requirements:
|
|
44
|
-
- -
|
|
45
|
-
- !ruby/object:Gem::Version
|
|
46
|
-
version:
|
|
40
|
+
requirements:
|
|
41
|
+
- - ! '>='
|
|
42
|
+
- !ruby/object:Gem::Version
|
|
43
|
+
version: '0'
|
|
47
44
|
type: :development
|
|
48
|
-
version_requirements: *id003
|
|
49
|
-
- !ruby/object:Gem::Dependency
|
|
50
|
-
name: rake
|
|
51
45
|
prerelease: false
|
|
52
|
-
|
|
46
|
+
version_requirements: *70144026257860
|
|
47
|
+
- !ruby/object:Gem::Dependency
|
|
48
|
+
name: rake
|
|
49
|
+
requirement: &70144026257080 !ruby/object:Gem::Requirement
|
|
53
50
|
none: false
|
|
54
|
-
requirements:
|
|
55
|
-
- -
|
|
56
|
-
- !ruby/object:Gem::Version
|
|
57
|
-
version:
|
|
51
|
+
requirements:
|
|
52
|
+
- - ! '>='
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
58
55
|
type: :development
|
|
59
|
-
version_requirements: *id004
|
|
60
|
-
- !ruby/object:Gem::Dependency
|
|
61
|
-
name: ronn
|
|
62
56
|
prerelease: false
|
|
63
|
-
|
|
57
|
+
version_requirements: *70144026257080
|
|
58
|
+
- !ruby/object:Gem::Dependency
|
|
59
|
+
name: ronn
|
|
60
|
+
requirement: &70144026256460 !ruby/object:Gem::Requirement
|
|
64
61
|
none: false
|
|
65
|
-
requirements:
|
|
66
|
-
- -
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version:
|
|
62
|
+
requirements:
|
|
63
|
+
- - ! '>='
|
|
64
|
+
- !ruby/object:Gem::Version
|
|
65
|
+
version: '0'
|
|
69
66
|
type: :development
|
|
70
|
-
version_requirements: *id005
|
|
71
|
-
- !ruby/object:Gem::Dependency
|
|
72
|
-
name: fakefs
|
|
73
67
|
prerelease: false
|
|
74
|
-
|
|
68
|
+
version_requirements: *70144026256460
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: fakefs
|
|
71
|
+
requirement: &70144026255820 !ruby/object:Gem::Requirement
|
|
75
72
|
none: false
|
|
76
|
-
requirements:
|
|
73
|
+
requirements:
|
|
77
74
|
- - ~>
|
|
78
|
-
- !ruby/object:Gem::Version
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
79
76
|
version: 0.2.1
|
|
80
77
|
type: :development
|
|
81
|
-
version_requirements: *id006
|
|
82
|
-
- !ruby/object:Gem::Dependency
|
|
83
|
-
name: rcov
|
|
84
78
|
prerelease: false
|
|
85
|
-
|
|
79
|
+
version_requirements: *70144026255820
|
|
80
|
+
- !ruby/object:Gem::Dependency
|
|
81
|
+
name: rcov
|
|
82
|
+
requirement: &70144026255120 !ruby/object:Gem::Requirement
|
|
86
83
|
none: false
|
|
87
|
-
requirements:
|
|
84
|
+
requirements:
|
|
88
85
|
- - ~>
|
|
89
|
-
- !ruby/object:Gem::Version
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
90
87
|
version: 0.9.8
|
|
91
88
|
type: :development
|
|
92
|
-
version_requirements: *id007
|
|
93
|
-
- !ruby/object:Gem::Dependency
|
|
94
|
-
name: rr
|
|
95
89
|
prerelease: false
|
|
96
|
-
|
|
90
|
+
version_requirements: *70144026255120
|
|
91
|
+
- !ruby/object:Gem::Dependency
|
|
92
|
+
name: rr
|
|
93
|
+
requirement: &70144026254400 !ruby/object:Gem::Requirement
|
|
97
94
|
none: false
|
|
98
|
-
requirements:
|
|
95
|
+
requirements:
|
|
99
96
|
- - ~>
|
|
100
|
-
- !ruby/object:Gem::Version
|
|
97
|
+
- !ruby/object:Gem::Version
|
|
101
98
|
version: 1.0.2
|
|
102
99
|
type: :development
|
|
103
|
-
version_requirements: *id008
|
|
104
|
-
- !ruby/object:Gem::Dependency
|
|
105
|
-
name: rspec
|
|
106
100
|
prerelease: false
|
|
107
|
-
|
|
101
|
+
version_requirements: *70144026254400
|
|
102
|
+
- !ruby/object:Gem::Dependency
|
|
103
|
+
name: rspec
|
|
104
|
+
requirement: &70144026253300 !ruby/object:Gem::Requirement
|
|
108
105
|
none: false
|
|
109
|
-
requirements:
|
|
106
|
+
requirements:
|
|
110
107
|
- - ~>
|
|
111
|
-
- !ruby/object:Gem::Version
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
112
109
|
version: 2.6.0
|
|
113
110
|
type: :development
|
|
114
|
-
|
|
111
|
+
prerelease: false
|
|
112
|
+
version_requirements: *70144026253300
|
|
115
113
|
description: Process manager for applications with multiple components
|
|
116
114
|
email: ddollar@gmail.com
|
|
117
|
-
executables:
|
|
115
|
+
executables:
|
|
118
116
|
- foreman
|
|
119
117
|
extensions: []
|
|
120
|
-
|
|
121
118
|
extra_rdoc_files: []
|
|
122
|
-
|
|
123
|
-
files:
|
|
119
|
+
files:
|
|
124
120
|
- bin/foreman
|
|
125
121
|
- bin/foreman-runner
|
|
126
122
|
- data/example/error
|
|
@@ -128,12 +124,14 @@ files:
|
|
|
128
124
|
- data/example/Procfile
|
|
129
125
|
- data/example/Procfile.without_colon
|
|
130
126
|
- data/example/ticker
|
|
127
|
+
- data/export/bluepill/master.pill.erb
|
|
131
128
|
- data/export/upstart/master.conf.erb
|
|
132
129
|
- data/export/upstart/process.conf.erb
|
|
133
130
|
- data/export/upstart/process_master.conf.erb
|
|
134
131
|
- lib/foreman/cli.rb
|
|
135
132
|
- lib/foreman/engine.rb
|
|
136
133
|
- lib/foreman/export/base.rb
|
|
134
|
+
- lib/foreman/export/bluepill.rb
|
|
137
135
|
- lib/foreman/export/inittab.rb
|
|
138
136
|
- lib/foreman/export/upstart.rb
|
|
139
137
|
- lib/foreman/export.rb
|
|
@@ -144,10 +142,12 @@ files:
|
|
|
144
142
|
- README.markdown
|
|
145
143
|
- spec/foreman/cli_spec.rb
|
|
146
144
|
- spec/foreman/engine_spec.rb
|
|
145
|
+
- spec/foreman/export/bluepill_spec.rb
|
|
147
146
|
- spec/foreman/export/upstart_spec.rb
|
|
148
147
|
- spec/foreman/export_spec.rb
|
|
149
148
|
- spec/foreman/process_spec.rb
|
|
150
149
|
- spec/foreman_spec.rb
|
|
150
|
+
- spec/resources/export/bluepill/app.pill
|
|
151
151
|
- spec/resources/export/upstart/app-alpha-1.conf
|
|
152
152
|
- spec/resources/export/upstart/app-alpha-2.conf
|
|
153
153
|
- spec/resources/export/upstart/app-alpha.conf
|
|
@@ -156,33 +156,28 @@ files:
|
|
|
156
156
|
- spec/resources/export/upstart/app.conf
|
|
157
157
|
- spec/spec_helper.rb
|
|
158
158
|
- man/foreman.1
|
|
159
|
-
has_rdoc: true
|
|
160
159
|
homepage: http://github.com/ddollar/foreman
|
|
161
160
|
licenses: []
|
|
162
|
-
|
|
163
161
|
post_install_message:
|
|
164
162
|
rdoc_options: []
|
|
165
|
-
|
|
166
|
-
require_paths:
|
|
163
|
+
require_paths:
|
|
167
164
|
- lib
|
|
168
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
|
165
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
169
166
|
none: false
|
|
170
|
-
requirements:
|
|
171
|
-
- -
|
|
172
|
-
- !ruby/object:Gem::Version
|
|
173
|
-
version:
|
|
174
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
|
+
requirements:
|
|
168
|
+
- - ! '>='
|
|
169
|
+
- !ruby/object:Gem::Version
|
|
170
|
+
version: '0'
|
|
171
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
172
|
none: false
|
|
176
|
-
requirements:
|
|
177
|
-
- -
|
|
178
|
-
- !ruby/object:Gem::Version
|
|
179
|
-
version:
|
|
173
|
+
requirements:
|
|
174
|
+
- - ! '>='
|
|
175
|
+
- !ruby/object:Gem::Version
|
|
176
|
+
version: '0'
|
|
180
177
|
requirements: []
|
|
181
|
-
|
|
182
178
|
rubyforge_project:
|
|
183
|
-
rubygems_version: 1.
|
|
179
|
+
rubygems_version: 1.8.10
|
|
184
180
|
signing_key:
|
|
185
181
|
specification_version: 3
|
|
186
182
|
summary: Process manager for applications with multiple components
|
|
187
183
|
test_files: []
|
|
188
|
-
|