foreman 0.63.0-mingw32 → 0.66.0-mingw32
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/README.md +1 -0
- data/data/export/bluepill/master.pill.erb +1 -1
- data/data/export/daemon/master.conf.erb +14 -0
- data/data/export/daemon/process.conf.erb +8 -0
- data/data/export/daemon/process_master.conf.erb +2 -0
- data/data/export/runit/log/run.erb +1 -1
- data/data/export/runit/run.erb +1 -0
- data/data/export/supervisord/app.conf.erb +1 -1
- data/data/export/systemd/master.target.erb +6 -0
- data/data/export/systemd/process.service.erb +15 -0
- data/data/export/systemd/process_master.target.erb +3 -0
- data/data/export/upstart/master.conf.erb +1 -11
- data/data/export/upstart/process.conf.erb +10 -1
- data/lib/foreman/cli.rb +10 -0
- data/lib/foreman/engine.rb +7 -2
- data/lib/foreman/export.rb +2 -0
- data/lib/foreman/export/base.rb +12 -2
- data/lib/foreman/export/daemon.rb +28 -0
- data/lib/foreman/export/launchd.rb +6 -1
- data/lib/foreman/export/systemd.rb +32 -0
- data/lib/foreman/process.rb +17 -13
- data/lib/foreman/version.rb +1 -1
- data/man/foreman.1 +23 -2
- data/spec/foreman/cli_spec.rb +15 -0
- data/spec/foreman/export/daemon_spec.rb +97 -0
- data/spec/foreman/export/systemd_spec.rb +91 -0
- data/spec/foreman/process_spec.rb +1 -1
- data/spec/resources/Procfile +1 -0
- data/spec/resources/export/daemon/app-alpha-1.conf +7 -0
- data/spec/resources/export/daemon/app-alpha-2.conf +7 -0
- data/spec/resources/export/daemon/app-alpha.conf +2 -0
- data/spec/resources/export/daemon/app-bravo-1.conf +7 -0
- data/spec/resources/export/daemon/app-bravo.conf +2 -0
- data/spec/resources/export/daemon/app.conf +14 -0
- data/spec/resources/export/runit/app-alpha-1/log/run +1 -1
- data/spec/resources/export/runit/app-alpha-2/log/run +1 -1
- data/spec/resources/export/runit/app-bravo-1/log/run +1 -1
- data/spec/resources/export/supervisord/app-alpha-1.conf +4 -4
- data/spec/resources/export/supervisord/app-alpha-2.conf +2 -2
- data/spec/resources/export/systemd/app-alpha-1.service +17 -0
- data/spec/resources/export/systemd/app-alpha-2.service +17 -0
- data/spec/resources/export/systemd/app-alpha.target +5 -0
- data/spec/resources/export/systemd/app-bravo-1.service +17 -0
- data/spec/resources/export/systemd/app-bravo.target +5 -0
- data/spec/resources/export/systemd/app.target +1 -0
- data/spec/spec_helper.rb +27 -5
- metadata +50 -15
- data/bin/taskman +0 -8
- data/lib/foreman/capistrano.rb +0 -54
data/README.md
CHANGED
@@ -32,6 +32,7 @@ Manage Procfile-based applications
|
|
32
32
|
* [shoreman](https://github.com/hecticjeff/shoreman) - shell
|
33
33
|
* [honcho](https://github.com/nickstenning/honcho) - python
|
34
34
|
* [norman](https://github.com/josh/norman) - node.js
|
35
|
+
* [forego](https://github.com/ddollar/forego) - Go
|
35
36
|
|
36
37
|
## Authors
|
37
38
|
|
@@ -7,7 +7,7 @@ Bluepill.application("<%= app %>", :foreground => false, :log_file => "/var/log/
|
|
7
7
|
<% 1.upto(engine.formation[name]) do |num| %>
|
8
8
|
<% port = engine.port_for(process, num) %>
|
9
9
|
app.process("<%= name %>-<%= num %>") do |process|
|
10
|
-
process.start_command =
|
10
|
+
process.start_command = %Q{<%= process.command %>}
|
11
11
|
|
12
12
|
process.working_dir = "<%= engine.root %>"
|
13
13
|
process.daemonize = true
|
@@ -0,0 +1,8 @@
|
|
1
|
+
start on starting <%= app %>-<%= name.gsub('_', '-') %>
|
2
|
+
stop on stopping <%= app %>-<%= name.gsub('_', '-') %>
|
3
|
+
respawn
|
4
|
+
|
5
|
+
env PORT=<%= port %><% engine.env.each_pair do |var, env| %>
|
6
|
+
env <%= var.upcase %>=<%= env %><% end %>
|
7
|
+
|
8
|
+
exec start-stop-daemon --start --chuid <%= user %> --chdir <%= engine.root %> --make-pidfile --pidfile <%= run %>/<%= app %>-<%= name %>-<%= num %>.pid --exec <%= executable %><%= arguments %> >> <%= log %>/<%= app %>-<%= name %>-<%= num %>.log 2>&1
|
data/data/export/runit/run.erb
CHANGED
@@ -5,7 +5,7 @@ engine.each_process do |name, process|
|
|
5
5
|
port = engine.port_for(process, num)
|
6
6
|
full_name = "#{app}-#{name}-#{num}"
|
7
7
|
environment = engine.env.merge("PORT" => port.to_s).map do |key, value|
|
8
|
-
"#{key}
|
8
|
+
"#{key}=\"#{shell_quote(value)}\""
|
9
9
|
end
|
10
10
|
app_names << full_name
|
11
11
|
%>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
[Unit]
|
2
|
+
StopWhenUnneeded=true
|
3
|
+
|
4
|
+
[Service]
|
5
|
+
User=<%= user %>
|
6
|
+
WorkingDirectory=<%= engine.root %>
|
7
|
+
Environment=PORT=<%= port %><% engine.env.each_pair do |var,env| %>
|
8
|
+
Environment=<%= var.upcase %>=<%= env %><% end %>
|
9
|
+
ExecStart=/bin/bash -lc '<%= process.command %>'
|
10
|
+
Restart=always
|
11
|
+
StandardInput=null
|
12
|
+
StandardOutput=syslog
|
13
|
+
StandardError=syslog
|
14
|
+
SyslogIdentifier=%n
|
15
|
+
KillMode=process
|
@@ -2,4 +2,13 @@ start on starting <%= app %>-<%= name %>
|
|
2
2
|
stop on stopping <%= app %>-<%= name %>
|
3
3
|
respawn
|
4
4
|
|
5
|
-
|
5
|
+
env PORT=<%= port %>
|
6
|
+
<% engine.env.each do |name,value| -%>
|
7
|
+
env <%= name.upcase %>='<%= value.gsub(/'/, "'\"'\"'") %>'
|
8
|
+
<% end -%>
|
9
|
+
|
10
|
+
setuid <%= user %>
|
11
|
+
|
12
|
+
chdir <%= engine.root %>
|
13
|
+
|
14
|
+
exec <%= process.command %>
|
data/lib/foreman/cli.rb
CHANGED
@@ -34,6 +34,7 @@ class Foreman::CLI < Thor
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def start(process=nil)
|
37
|
+
require_posix_spawn_for_ruby_18!
|
37
38
|
check_procfile!
|
38
39
|
load_environment!
|
39
40
|
engine.load_procfile(procfile)
|
@@ -45,6 +46,7 @@ class Foreman::CLI < Thor
|
|
45
46
|
|
46
47
|
method_option :app, :type => :string, :aliases => "-a"
|
47
48
|
method_option :log, :type => :string, :aliases => "-l"
|
49
|
+
method_option :run, :type => :string, :aliases => "-r", :desc => "Specify the pid file directory, defaults to /var/run/<application>"
|
48
50
|
method_option :env, :type => :string, :aliases => "-e", :desc => "Specify an environment file to load, defaults to .env"
|
49
51
|
method_option :port, :type => :numeric, :aliases => "-p"
|
50
52
|
method_option :user, :type => :string, :aliases => "-u"
|
@@ -137,6 +139,14 @@ private ######################################################################
|
|
137
139
|
end
|
138
140
|
end
|
139
141
|
|
142
|
+
def require_posix_spawn_for_ruby_18!
|
143
|
+
begin
|
144
|
+
Kernel.require 'posix/spawn' # Use Kernel explicitly so we can mock the require call in the spec
|
145
|
+
rescue LoadError
|
146
|
+
error "foreman requires gem `posix-spawn` on Ruby #{RUBY_VERSION}. Please `gem install posix-spawn`."
|
147
|
+
end if Foreman.ruby_18?
|
148
|
+
end
|
149
|
+
|
140
150
|
def procfile
|
141
151
|
case
|
142
152
|
when options[:procfile] then options[:procfile]
|
data/lib/foreman/engine.rb
CHANGED
@@ -302,6 +302,10 @@ private
|
|
302
302
|
|
303
303
|
def name_for(pid)
|
304
304
|
process, index = @running[pid]
|
305
|
+
name_for_index(process, index)
|
306
|
+
end
|
307
|
+
|
308
|
+
def name_for_index(process, index)
|
305
309
|
[ @names[process], index.to_s ].compact.join(".")
|
306
310
|
end
|
307
311
|
|
@@ -350,7 +354,8 @@ private
|
|
350
354
|
reader, writer = create_pipe
|
351
355
|
begin
|
352
356
|
pid = process.run(:output => writer, :env => {
|
353
|
-
"PORT" => port_for(process, n).to_s
|
357
|
+
"PORT" => port_for(process, n).to_s,
|
358
|
+
"PS" => name_for_index(process, n)
|
354
359
|
})
|
355
360
|
writer.puts "started with pid #{pid}"
|
356
361
|
rescue Errno::ENOENT
|
@@ -422,7 +427,7 @@ private
|
|
422
427
|
end
|
423
428
|
rescue Timeout::Error
|
424
429
|
system "sending SIGKILL to all processes"
|
425
|
-
|
430
|
+
kill_children "SIGKILL"
|
426
431
|
end
|
427
432
|
|
428
433
|
end
|
data/lib/foreman/export.rb
CHANGED
@@ -28,7 +28,9 @@ end
|
|
28
28
|
require "foreman/export/base"
|
29
29
|
require "foreman/export/inittab"
|
30
30
|
require "foreman/export/upstart"
|
31
|
+
require "foreman/export/daemon"
|
31
32
|
require "foreman/export/bluepill"
|
32
33
|
require "foreman/export/runit"
|
33
34
|
require "foreman/export/supervisord"
|
34
35
|
require "foreman/export/launchd"
|
36
|
+
require "foreman/export/systemd"
|
data/lib/foreman/export/base.rb
CHANGED
@@ -46,8 +46,8 @@ class Foreman::Export::Base
|
|
46
46
|
def export
|
47
47
|
error("Must specify a location") unless location
|
48
48
|
FileUtils.mkdir_p(location) rescue error("Could not create: #{location}")
|
49
|
-
|
50
|
-
|
49
|
+
chown user, log
|
50
|
+
chown user, run
|
51
51
|
end
|
52
52
|
|
53
53
|
def app
|
@@ -58,6 +58,10 @@ class Foreman::Export::Base
|
|
58
58
|
options[:log] || "/var/log/#{app}"
|
59
59
|
end
|
60
60
|
|
61
|
+
def run
|
62
|
+
options[:run] || "/var/run/#{app}"
|
63
|
+
end
|
64
|
+
|
61
65
|
def user
|
62
66
|
options[:user] || app
|
63
67
|
end
|
@@ -76,6 +80,12 @@ private ######################################################################
|
|
76
80
|
@@deprecation_warned = true
|
77
81
|
end
|
78
82
|
|
83
|
+
def chown user, dir
|
84
|
+
FileUtils.chown user, nil, dir
|
85
|
+
rescue
|
86
|
+
error("Could not chown #{dir} to #{user}") unless File.writable?(dir) || ! File.exists?(dir)
|
87
|
+
end
|
88
|
+
|
79
89
|
def error(message)
|
80
90
|
raise Foreman::Export::Exception.new(message)
|
81
91
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "erb"
|
2
|
+
require "foreman/export"
|
3
|
+
|
4
|
+
class Foreman::Export::Daemon < Foreman::Export::Base
|
5
|
+
|
6
|
+
def export
|
7
|
+
super
|
8
|
+
|
9
|
+
(Dir["#{location}/#{app}-*.conf"] << "#{location}/#{app}.conf").each do |file|
|
10
|
+
clean file
|
11
|
+
end
|
12
|
+
|
13
|
+
write_template "daemon/master.conf.erb", "#{app}.conf", binding
|
14
|
+
|
15
|
+
engine.each_process do |name, process|
|
16
|
+
next if engine.formation[name] < 1
|
17
|
+
write_template "daemon/process_master.conf.erb", "#{app}-#{name}.conf", binding
|
18
|
+
|
19
|
+
1.upto(engine.formation[name]) do |num|
|
20
|
+
port = engine.port_for(process, num)
|
21
|
+
arguments = process.command.split(" ")
|
22
|
+
executable = arguments.slice!(0)
|
23
|
+
arguments = arguments.size > 0 ? " -- #{arguments.join(' ')}" : ""
|
24
|
+
write_template "daemon/process.conf.erb", "#{app}-#{name}-#{num}.conf", binding
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -8,7 +8,12 @@ class Foreman::Export::Launchd < Foreman::Export::Base
|
|
8
8
|
engine.each_process do |name, process|
|
9
9
|
1.upto(engine.formation[name]) do |num|
|
10
10
|
port = engine.port_for(process, num)
|
11
|
-
command_args = process.command.split(
|
11
|
+
command_args = process.command.split(/\s+/).map{|arg|
|
12
|
+
case arg
|
13
|
+
when "$PORT" then port
|
14
|
+
else arg
|
15
|
+
end
|
16
|
+
}
|
12
17
|
write_template "launchd/launchd.plist.erb", "#{app}-#{name}-#{num}.plist", binding
|
13
18
|
end
|
14
19
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "erb"
|
2
|
+
require "foreman/export"
|
3
|
+
|
4
|
+
class Foreman::Export::Systemd < Foreman::Export::Base
|
5
|
+
|
6
|
+
def export
|
7
|
+
super
|
8
|
+
|
9
|
+
Dir["#{location}/#{app}*.target"].concat(Dir["#{location}/#{app}*.service"]).each do |file|
|
10
|
+
clean file
|
11
|
+
end
|
12
|
+
|
13
|
+
process_master_names = []
|
14
|
+
|
15
|
+
engine.each_process do |name, process|
|
16
|
+
next if engine.formation[name] < 1
|
17
|
+
|
18
|
+
process_names = []
|
19
|
+
|
20
|
+
1.upto(engine.formation[name]) do |num|
|
21
|
+
port = engine.port_for(process, num)
|
22
|
+
write_template "systemd/process.service.erb", "#{app}-#{name}-#{num}.service", binding
|
23
|
+
process_names << "#{app}-#{name}-#{num}.service"
|
24
|
+
end
|
25
|
+
|
26
|
+
write_template "systemd/process_master.target.erb", "#{app}-#{name}.target", binding
|
27
|
+
process_master_names << "#{app}-#{name}.target"
|
28
|
+
end
|
29
|
+
|
30
|
+
write_template "systemd/master.target.erb", "#{app}.target", binding
|
31
|
+
end
|
32
|
+
end
|
data/lib/foreman/process.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "foreman"
|
2
|
+
require "shellwords"
|
2
3
|
|
3
4
|
class Foreman::Process
|
4
5
|
|
@@ -47,25 +48,18 @@ class Foreman::Process
|
|
47
48
|
def run(options={})
|
48
49
|
env = @options[:env].merge(options[:env] || {})
|
49
50
|
output = options[:output] || $stdout
|
50
|
-
|
51
|
+
runner = "#{Foreman.runner}".shellescape
|
52
|
+
|
51
53
|
if Foreman.windows?
|
52
54
|
Dir.chdir(cwd) do
|
53
55
|
Process.spawn env, expanded_command(env), :out => output, :err => output
|
54
56
|
end
|
55
|
-
elsif Foreman.jruby_18?
|
57
|
+
elsif Foreman.jruby_18? || Foreman.ruby_18?
|
56
58
|
require "posix/spawn"
|
57
|
-
wrapped_command = "#{
|
58
|
-
POSIX::Spawn.spawn
|
59
|
-
elsif Foreman.ruby_18?
|
60
|
-
fork do
|
61
|
-
$stdout.reopen output
|
62
|
-
$stderr.reopen output
|
63
|
-
env.each { |k,v| ENV[k] = v }
|
64
|
-
wrapped_command = "#{Foreman.runner} -d '#{cwd}' -p -- #{command}"
|
65
|
-
Kernel.exec wrapped_command
|
66
|
-
end
|
59
|
+
wrapped_command = "#{runner} -d '#{cwd.shellescape}' -p -- #{expanded_command(env)}"
|
60
|
+
POSIX::Spawn.spawn(*spawn_args(env, wrapped_command.shellsplit, {:out => output, :err => output}))
|
67
61
|
else
|
68
|
-
wrapped_command = "#{
|
62
|
+
wrapped_command = "exec #{runner} -d '#{cwd.shellescape}' -p -- #{command}"
|
69
63
|
Process.spawn env, wrapped_command, :out => output, :err => output
|
70
64
|
end
|
71
65
|
end
|
@@ -122,4 +116,14 @@ class Foreman::Process
|
|
122
116
|
File.expand_path(@options[:cwd] || ".")
|
123
117
|
end
|
124
118
|
|
119
|
+
private
|
120
|
+
|
121
|
+
def spawn_args(env, argv, options)
|
122
|
+
args = []
|
123
|
+
args << env
|
124
|
+
args += argv
|
125
|
+
args << options
|
126
|
+
args
|
127
|
+
end
|
128
|
+
|
125
129
|
end
|
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" "April 2014" "Foreman 0.66.0" "Foreman Manual"
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
7
|
\fBforeman\fR \- manage Procfile\-based applications
|
@@ -107,9 +107,18 @@ bluepill
|
|
107
107
|
inittab
|
108
108
|
.
|
109
109
|
.IP "\(bu" 4
|
110
|
+
launchd
|
111
|
+
.
|
112
|
+
.IP "\(bu" 4
|
110
113
|
runit
|
111
114
|
.
|
112
115
|
.IP "\(bu" 4
|
116
|
+
supervisord
|
117
|
+
.
|
118
|
+
.IP "\(bu" 4
|
119
|
+
systemd
|
120
|
+
.
|
121
|
+
.IP "\(bu" 4
|
113
122
|
upstart
|
114
123
|
.
|
115
124
|
.IP "" 0
|
@@ -130,6 +139,18 @@ EX02:4:respawn:/bin/su \- example \-c \'PORT=5100 bundle exec rake jobs:work >>
|
|
130
139
|
.
|
131
140
|
.IP "" 0
|
132
141
|
.
|
142
|
+
.SH "SYSTEMD EXPORT"
|
143
|
+
Will create a series of systemd scripts in the location you specify\. Scripts will be structured to make the following commands valid:
|
144
|
+
.
|
145
|
+
.P
|
146
|
+
\fBsystemctl start appname\.target\fR
|
147
|
+
.
|
148
|
+
.P
|
149
|
+
\fBsystemctl stop appname\-processname\.target\fR
|
150
|
+
.
|
151
|
+
.P
|
152
|
+
\fBsystemctl restart appname\-processname\-3\.service\fR
|
153
|
+
.
|
133
154
|
.SH "UPSTART EXPORT"
|
134
155
|
Will create a series of upstart scripts in the location you specify\. Scripts will be structured to make the following commands valid:
|
135
156
|
.
|
@@ -157,7 +178,7 @@ job: bundle exec rake jobs:work
|
|
157
178
|
.IP "" 0
|
158
179
|
.
|
159
180
|
.P
|
160
|
-
A process name may contain letters, numbers
|
181
|
+
A process name may contain letters, numbers and the underscore character\. You can validate your Procfile format using the \fBcheck\fR command:
|
161
182
|
.
|
162
183
|
.IP "" 4
|
163
184
|
.
|
data/spec/foreman/cli_spec.rb
CHANGED
@@ -44,6 +44,13 @@ describe "Foreman::CLI", :fakefs do
|
|
44
44
|
output.should =~ /test.1 \| testing/
|
45
45
|
end
|
46
46
|
end
|
47
|
+
|
48
|
+
it "sets PS variable with the process name" do
|
49
|
+
without_fakefs do
|
50
|
+
output = foreman("start -f #{resource_path("Procfile")}")
|
51
|
+
output.should =~ /ps.1 \| PS env var is ps.1/
|
52
|
+
end
|
53
|
+
end
|
47
54
|
end
|
48
55
|
end
|
49
56
|
|
@@ -93,4 +100,12 @@ describe "Foreman::CLI", :fakefs do
|
|
93
100
|
end
|
94
101
|
end
|
95
102
|
|
103
|
+
describe "when posix-spawn is not present on ruby 1.8" do
|
104
|
+
it "should fail with an error" do
|
105
|
+
mock(Kernel).require('posix/spawn') { raise LoadError }
|
106
|
+
output = foreman("start -f #{resource_path("Procfile")}")
|
107
|
+
output.should == "ERROR: foreman requires gem `posix-spawn` on Ruby #{RUBY_VERSION}. Please `gem install posix-spawn`.\n"
|
108
|
+
end
|
109
|
+
end if running_ruby_18?
|
110
|
+
|
96
111
|
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "foreman/engine"
|
3
|
+
require "foreman/export/daemon"
|
4
|
+
require "tmpdir"
|
5
|
+
|
6
|
+
describe Foreman::Export::Daemon, :fakefs do
|
7
|
+
let(:procfile) { write_procfile("/tmp/app/Procfile") }
|
8
|
+
let(:formation) { nil }
|
9
|
+
let(:engine) { Foreman::Engine.new(:formation => formation).load_procfile(procfile) }
|
10
|
+
let(:options) { Hash.new }
|
11
|
+
let(:daemon) { Foreman::Export::Daemon.new("/tmp/init", engine, options) }
|
12
|
+
|
13
|
+
before(:each) { load_export_templates_into_fakefs("daemon") }
|
14
|
+
before(:each) { stub(daemon).say }
|
15
|
+
|
16
|
+
it "exports to the filesystem" do
|
17
|
+
daemon.export
|
18
|
+
|
19
|
+
File.read("/tmp/init/app.conf").should == example_export_file("daemon/app.conf")
|
20
|
+
File.read("/tmp/init/app-alpha.conf").should == example_export_file("daemon/app-alpha.conf")
|
21
|
+
File.read("/tmp/init/app-alpha-1.conf").should == example_export_file("daemon/app-alpha-1.conf")
|
22
|
+
File.read("/tmp/init/app-bravo.conf").should == example_export_file("daemon/app-bravo.conf")
|
23
|
+
File.read("/tmp/init/app-bravo-1.conf").should == example_export_file("daemon/app-bravo-1.conf")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "cleans up if exporting into an existing dir" do
|
27
|
+
mock(FileUtils).rm("/tmp/init/app.conf")
|
28
|
+
mock(FileUtils).rm("/tmp/init/app-alpha.conf")
|
29
|
+
mock(FileUtils).rm("/tmp/init/app-alpha-1.conf")
|
30
|
+
mock(FileUtils).rm("/tmp/init/app-bravo.conf")
|
31
|
+
mock(FileUtils).rm("/tmp/init/app-bravo-1.conf")
|
32
|
+
mock(FileUtils).rm("/tmp/init/app-foo-bar.conf")
|
33
|
+
mock(FileUtils).rm("/tmp/init/app-foo-bar-1.conf")
|
34
|
+
mock(FileUtils).rm("/tmp/init/app-foo_bar.conf")
|
35
|
+
mock(FileUtils).rm("/tmp/init/app-foo_bar-1.conf")
|
36
|
+
|
37
|
+
daemon.export
|
38
|
+
daemon.export
|
39
|
+
end
|
40
|
+
|
41
|
+
it "does not delete exported files for similarly named applications" do
|
42
|
+
FileUtils.mkdir_p "/tmp/init"
|
43
|
+
|
44
|
+
["app2", "app2-alpha", "app2-alpha-1"].each do |name|
|
45
|
+
path = "/tmp/init/#{name}.conf"
|
46
|
+
FileUtils.touch(path)
|
47
|
+
dont_allow(FileUtils).rm(path)
|
48
|
+
end
|
49
|
+
|
50
|
+
daemon.export
|
51
|
+
end
|
52
|
+
|
53
|
+
context "with a formation" do
|
54
|
+
let(:formation) { "alpha=2" }
|
55
|
+
|
56
|
+
it "exports to the filesystem with concurrency" do
|
57
|
+
daemon.export
|
58
|
+
|
59
|
+
File.read("/tmp/init/app.conf").should == example_export_file("daemon/app.conf")
|
60
|
+
File.read("/tmp/init/app-alpha.conf").should == example_export_file("daemon/app-alpha.conf")
|
61
|
+
File.read("/tmp/init/app-alpha-1.conf").should == example_export_file("daemon/app-alpha-1.conf")
|
62
|
+
File.read("/tmp/init/app-alpha-2.conf").should == example_export_file("daemon/app-alpha-2.conf")
|
63
|
+
File.exists?("/tmp/init/app-bravo-1.conf").should == false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "with alternate templates" do
|
68
|
+
let(:template) { "/tmp/alternate" }
|
69
|
+
let(:options) { { :app => "app", :template => template } }
|
70
|
+
|
71
|
+
before do
|
72
|
+
FileUtils.mkdir_p template
|
73
|
+
File.open("#{template}/master.conf.erb", "w") { |f| f.puts "alternate_template" }
|
74
|
+
end
|
75
|
+
|
76
|
+
it "can export with alternate template files" do
|
77
|
+
daemon.export
|
78
|
+
File.read("/tmp/init/app.conf").should == "alternate_template\n"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "with alternate templates from home dir" do
|
83
|
+
|
84
|
+
before do
|
85
|
+
FileUtils.mkdir_p File.expand_path("~/.foreman/templates/daemon")
|
86
|
+
File.open(File.expand_path("~/.foreman/templates/daemon/master.conf.erb"), "w") do |file|
|
87
|
+
file.puts "default_alternate_template"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it "can export with alternate template files" do
|
92
|
+
daemon.export
|
93
|
+
File.read("/tmp/init/app.conf").should == "default_alternate_template\n"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "foreman/engine"
|
3
|
+
require "foreman/export/systemd"
|
4
|
+
require "tmpdir"
|
5
|
+
|
6
|
+
describe Foreman::Export::Systemd, :fakefs do
|
7
|
+
let(:procfile) { write_procfile("/tmp/app/Procfile") }
|
8
|
+
let(:formation) { nil }
|
9
|
+
let(:engine) { Foreman::Engine.new(:formation => formation).load_procfile(procfile) }
|
10
|
+
let(:options) { Hash.new }
|
11
|
+
let(:systemd) { Foreman::Export::Systemd.new("/tmp/init", engine, options) }
|
12
|
+
|
13
|
+
before(:each) { load_export_templates_into_fakefs("systemd") }
|
14
|
+
before(:each) { stub(systemd).say }
|
15
|
+
|
16
|
+
it "exports to the filesystem" do
|
17
|
+
systemd.export
|
18
|
+
|
19
|
+
File.read("/tmp/init/app.target").should == example_export_file("systemd/app.target")
|
20
|
+
File.read("/tmp/init/app-alpha.target").should == example_export_file("systemd/app-alpha.target")
|
21
|
+
File.read("/tmp/init/app-alpha-1.service").should == example_export_file("systemd/app-alpha-1.service")
|
22
|
+
File.read("/tmp/init/app-bravo.target").should == example_export_file("systemd/app-bravo.target")
|
23
|
+
File.read("/tmp/init/app-bravo-1.service").should == example_export_file("systemd/app-bravo-1.service")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "cleans up if exporting into an existing dir" do
|
27
|
+
mock(FileUtils).rm("/tmp/init/app.target")
|
28
|
+
mock(FileUtils).rm("/tmp/init/app-alpha.target")
|
29
|
+
mock(FileUtils).rm("/tmp/init/app-alpha-1.service")
|
30
|
+
mock(FileUtils).rm("/tmp/init/app-bravo.target")
|
31
|
+
mock(FileUtils).rm("/tmp/init/app-bravo-1.service")
|
32
|
+
mock(FileUtils).rm("/tmp/init/app-foo-bar.target")
|
33
|
+
mock(FileUtils).rm("/tmp/init/app-foo-bar-1.service")
|
34
|
+
mock(FileUtils).rm("/tmp/init/app-foo_bar.target")
|
35
|
+
mock(FileUtils).rm("/tmp/init/app-foo_bar-1.service")
|
36
|
+
|
37
|
+
systemd.export
|
38
|
+
systemd.export
|
39
|
+
end
|
40
|
+
|
41
|
+
it "includes environment variables" do
|
42
|
+
engine.env['KEY'] = 'some "value"'
|
43
|
+
systemd.export
|
44
|
+
File.read("/tmp/init/app-alpha-1.service").should =~ /KEY=some "value"$/
|
45
|
+
end
|
46
|
+
|
47
|
+
context "with a formation" do
|
48
|
+
let(:formation) { "alpha=2" }
|
49
|
+
|
50
|
+
it "exports to the filesystem with concurrency" do
|
51
|
+
systemd.export
|
52
|
+
|
53
|
+
File.read("/tmp/init/app.target").should == example_export_file("systemd/app.target")
|
54
|
+
File.read("/tmp/init/app-alpha.target").should == example_export_file("systemd/app-alpha.target")
|
55
|
+
File.read("/tmp/init/app-alpha-1.service").should == example_export_file("systemd/app-alpha-1.service")
|
56
|
+
File.read("/tmp/init/app-alpha-2.service").should == example_export_file("systemd/app-alpha-2.service")
|
57
|
+
File.exists?("/tmp/init/app-bravo-1.service").should == false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "with alternate templates" do
|
62
|
+
let(:template) { "/tmp/alternate" }
|
63
|
+
let(:options) { { :app => "app", :template => template } }
|
64
|
+
|
65
|
+
before do
|
66
|
+
FileUtils.mkdir_p template
|
67
|
+
File.open("#{template}/master.target.erb", "w") { |f| f.puts "alternate_template" }
|
68
|
+
end
|
69
|
+
|
70
|
+
it "can export with alternate template files" do
|
71
|
+
systemd.export
|
72
|
+
File.read("/tmp/init/app.target").should == "alternate_template\n"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "with alternate templates from home dir" do
|
77
|
+
|
78
|
+
before do
|
79
|
+
FileUtils.mkdir_p File.expand_path("~/.foreman/templates/systemd")
|
80
|
+
File.open(File.expand_path("~/.foreman/templates/systemd/master.target.erb"), "w") do |file|
|
81
|
+
file.puts "default_alternate_template"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
it "can export with alternate template files" do
|
86
|
+
systemd.export
|
87
|
+
File.read("/tmp/init/app.target").should == "default_alternate_template\n"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -41,7 +41,7 @@ describe Foreman::Process do
|
|
41
41
|
|
42
42
|
it "should output utf8 properly" do
|
43
43
|
process = Foreman::Process.new(resource_path("bin/utf8"))
|
44
|
-
run(process).should == "\xFF\x03\n".force_encoding('binary')
|
44
|
+
run(process).should == (Foreman.ruby_18? ? "\xFF\x03\n" : "\xFF\x03\n".force_encoding('binary'))
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
data/spec/resources/Procfile
CHANGED
@@ -8,7 +8,7 @@ stdout_logfile=/var/log/app/alpha-1.log
|
|
8
8
|
stderr_logfile=/var/log/app/alpha-1.error.log
|
9
9
|
user=app
|
10
10
|
directory=/tmp/app
|
11
|
-
environment=PORT=5000
|
11
|
+
environment=PORT="5000"
|
12
12
|
[program:app-bravo-1]
|
13
13
|
command=./bravo
|
14
14
|
autostart=true
|
@@ -18,7 +18,7 @@ stdout_logfile=/var/log/app/bravo-1.log
|
|
18
18
|
stderr_logfile=/var/log/app/bravo-1.error.log
|
19
19
|
user=app
|
20
20
|
directory=/tmp/app
|
21
|
-
environment=PORT=5100
|
21
|
+
environment=PORT="5100"
|
22
22
|
[program:app-foo_bar-1]
|
23
23
|
command=./foo_bar
|
24
24
|
autostart=true
|
@@ -28,7 +28,7 @@ stdout_logfile=/var/log/app/foo_bar-1.log
|
|
28
28
|
stderr_logfile=/var/log/app/foo_bar-1.error.log
|
29
29
|
user=app
|
30
30
|
directory=/tmp/app
|
31
|
-
environment=PORT=5200
|
31
|
+
environment=PORT="5200"
|
32
32
|
[program:app-foo-bar-1]
|
33
33
|
command=./foo-bar
|
34
34
|
autostart=true
|
@@ -38,7 +38,7 @@ stdout_logfile=/var/log/app/foo-bar-1.log
|
|
38
38
|
stderr_logfile=/var/log/app/foo-bar-1.error.log
|
39
39
|
user=app
|
40
40
|
directory=/tmp/app
|
41
|
-
environment=PORT=5300
|
41
|
+
environment=PORT="5300"
|
42
42
|
|
43
43
|
[group:app]
|
44
44
|
programs=app-alpha-1,app-bravo-1,app-foo_bar-1,app-foo-bar-1
|
@@ -8,7 +8,7 @@ stdout_logfile=/var/log/app/alpha-1.log
|
|
8
8
|
stderr_logfile=/var/log/app/alpha-1.error.log
|
9
9
|
user=app
|
10
10
|
directory=/tmp/app
|
11
|
-
environment=PORT=5000
|
11
|
+
environment=PORT="5000"
|
12
12
|
[program:app-alpha-2]
|
13
13
|
command=./alpha
|
14
14
|
autostart=true
|
@@ -18,7 +18,7 @@ stdout_logfile=/var/log/app/alpha-2.log
|
|
18
18
|
stderr_logfile=/var/log/app/alpha-2.error.log
|
19
19
|
user=app
|
20
20
|
directory=/tmp/app
|
21
|
-
environment=PORT=5001
|
21
|
+
environment=PORT="5001"
|
22
22
|
|
23
23
|
[group:app]
|
24
24
|
programs=app-alpha-1,app-alpha-2
|
@@ -0,0 +1,17 @@
|
|
1
|
+
[Unit]
|
2
|
+
StopWhenUnneeded=true
|
3
|
+
|
4
|
+
[Service]
|
5
|
+
User=app
|
6
|
+
WorkingDirectory=/tmp/app
|
7
|
+
Environment=PORT=5000
|
8
|
+
ExecStart=/bin/bash -lc './alpha'
|
9
|
+
Restart=always
|
10
|
+
StandardInput=null
|
11
|
+
StandardOutput=syslog
|
12
|
+
StandardError=syslog
|
13
|
+
SyslogIdentifier=%n
|
14
|
+
KillMode=process
|
15
|
+
|
16
|
+
[Install]
|
17
|
+
WantedBy=app-alpha.target
|
@@ -0,0 +1,17 @@
|
|
1
|
+
[Unit]
|
2
|
+
StopWhenUnneeded=true
|
3
|
+
|
4
|
+
[Service]
|
5
|
+
User=app
|
6
|
+
WorkingDirectory=/tmp/app
|
7
|
+
Environment=PORT=5001
|
8
|
+
ExecStart=/bin/bash -lc './alpha'
|
9
|
+
Restart=always
|
10
|
+
StandardInput=null
|
11
|
+
StandardOutput=syslog
|
12
|
+
StandardError=syslog
|
13
|
+
SyslogIdentifier=%n
|
14
|
+
KillMode=process
|
15
|
+
|
16
|
+
[Install]
|
17
|
+
WantedBy=app-alpha.target
|
@@ -0,0 +1,17 @@
|
|
1
|
+
[Unit]
|
2
|
+
StopWhenUnneeded=true
|
3
|
+
|
4
|
+
[Service]
|
5
|
+
User=app
|
6
|
+
WorkingDirectory=/tmp/app
|
7
|
+
Environment=PORT=5100
|
8
|
+
ExecStart=/bin/bash -lc './bravo'
|
9
|
+
Restart=always
|
10
|
+
StandardInput=null
|
11
|
+
StandardOutput=syslog
|
12
|
+
StandardError=syslog
|
13
|
+
SyslogIdentifier=%n
|
14
|
+
KillMode=process
|
15
|
+
|
16
|
+
[Install]
|
17
|
+
WantedBy=app-bravo.target
|
@@ -0,0 +1 @@
|
|
1
|
+
[Unit]
|
data/spec/spec_helper.rb
CHANGED
@@ -10,6 +10,15 @@ require "fakefs/spec_helpers"
|
|
10
10
|
|
11
11
|
$:.unshift File.expand_path("../../lib", __FILE__)
|
12
12
|
|
13
|
+
begin
|
14
|
+
def running_ruby_18?
|
15
|
+
defined?(RUBY_VERSION) and RUBY_VERSION =~ /^1\.8\.\d+/
|
16
|
+
end
|
17
|
+
require 'posix/spawn' if running_ruby_18?
|
18
|
+
rescue LoadError
|
19
|
+
STDERR.puts "WARNING: foreman requires gem `posix-spawn` on Ruby #{RUBY_VERSION}. Please `gem install posix-spawn`."
|
20
|
+
end
|
21
|
+
|
13
22
|
def mock_export_error(message)
|
14
23
|
lambda { yield }.should raise_error(Foreman::Export::Exception, message)
|
15
24
|
end
|
@@ -21,6 +30,10 @@ def mock_error(subject, message)
|
|
21
30
|
end
|
22
31
|
end
|
23
32
|
|
33
|
+
def make_pipe
|
34
|
+
IO.method(:pipe).arity.zero? ? IO.pipe : IO.pipe("BINARY")
|
35
|
+
end
|
36
|
+
|
24
37
|
def foreman(args)
|
25
38
|
capture_stdout do
|
26
39
|
begin
|
@@ -31,14 +44,18 @@ def foreman(args)
|
|
31
44
|
end
|
32
45
|
|
33
46
|
def forked_foreman(args)
|
34
|
-
rd, wr =
|
35
|
-
|
47
|
+
rd, wr = make_pipe
|
48
|
+
if running_ruby_18?
|
49
|
+
POSIX::Spawn.spawn({}, "bundle exec bin/foreman #{args}", :out => wr, :err => wr)
|
50
|
+
else
|
51
|
+
Process.spawn("bundle exec bin/foreman #{args}", :out => wr, :err => wr)
|
52
|
+
end
|
36
53
|
wr.close
|
37
54
|
rd.read
|
38
55
|
end
|
39
56
|
|
40
57
|
def fork_and_capture(&blk)
|
41
|
-
rd, wr =
|
58
|
+
rd, wr = make_pipe
|
42
59
|
pid = fork do
|
43
60
|
rd.close
|
44
61
|
wr.sync = true
|
@@ -57,7 +74,11 @@ def fork_and_capture(&blk)
|
|
57
74
|
end
|
58
75
|
|
59
76
|
def fork_and_get_exitstatus(args)
|
60
|
-
pid =
|
77
|
+
pid = if running_ruby_18?
|
78
|
+
POSIX::Spawn.spawn({}, "bundle exec bin/foreman #{args}", :out => "/dev/null", :err => "/dev/null")
|
79
|
+
else
|
80
|
+
Process.spawn("bundle exec bin/foreman #{args}", :out => "/dev/null", :err => "/dev/null")
|
81
|
+
end
|
61
82
|
Process.wait(pid)
|
62
83
|
$?.exitstatus
|
63
84
|
end
|
@@ -141,7 +162,7 @@ end
|
|
141
162
|
|
142
163
|
def capture_stdout
|
143
164
|
old_stdout = $stdout.dup
|
144
|
-
rd, wr =
|
165
|
+
rd, wr = make_pipe
|
145
166
|
$stdout = wr
|
146
167
|
yield
|
147
168
|
wr.close
|
@@ -156,4 +177,5 @@ RSpec.configure do |config|
|
|
156
177
|
config.order = 'rand'
|
157
178
|
config.include FakeFS::SpecHelpers, :fakefs
|
158
179
|
config.mock_with :rr
|
180
|
+
config.backtrace_clean_patterns = []
|
159
181
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.66.0
|
5
5
|
prerelease:
|
6
6
|
platform: mingw32
|
7
7
|
authors:
|
@@ -9,33 +9,43 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-04-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.19.1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.19.1
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: dotenv
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
|
-
- -
|
35
|
+
- - ~>
|
31
36
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
37
|
+
version: 0.7.0
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.7.0
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: win32console
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,7 +53,12 @@ dependencies:
|
|
43
53
|
version: 1.3.0
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.3.0
|
47
62
|
description: Process manager for applications with multiple components
|
48
63
|
email: ddollar@gmail.com
|
49
64
|
executables:
|
@@ -53,7 +68,6 @@ extra_rdoc_files: []
|
|
53
68
|
files:
|
54
69
|
- bin/foreman
|
55
70
|
- bin/foreman-runner
|
56
|
-
- bin/taskman
|
57
71
|
- data/example/error
|
58
72
|
- data/example/log/neverdie.log
|
59
73
|
- data/example/Procfile
|
@@ -63,24 +77,31 @@ files:
|
|
63
77
|
- data/example/ticker
|
64
78
|
- data/example/utf8
|
65
79
|
- data/export/bluepill/master.pill.erb
|
80
|
+
- data/export/daemon/master.conf.erb
|
81
|
+
- data/export/daemon/process.conf.erb
|
82
|
+
- data/export/daemon/process_master.conf.erb
|
66
83
|
- data/export/launchd/launchd.plist.erb
|
67
84
|
- data/export/runit/log/run.erb
|
68
85
|
- data/export/runit/run.erb
|
69
86
|
- data/export/supervisord/app.conf.erb
|
87
|
+
- data/export/systemd/master.target.erb
|
88
|
+
- data/export/systemd/process.service.erb
|
89
|
+
- data/export/systemd/process_master.target.erb
|
70
90
|
- data/export/upstart/master.conf.erb
|
71
91
|
- data/export/upstart/process.conf.erb
|
72
92
|
- data/export/upstart/process_master.conf.erb
|
73
|
-
- lib/foreman/capistrano.rb
|
74
93
|
- lib/foreman/cli.rb
|
75
94
|
- lib/foreman/distribution.rb
|
76
95
|
- lib/foreman/engine/cli.rb
|
77
96
|
- lib/foreman/engine.rb
|
78
97
|
- lib/foreman/export/base.rb
|
79
98
|
- lib/foreman/export/bluepill.rb
|
99
|
+
- lib/foreman/export/daemon.rb
|
80
100
|
- lib/foreman/export/inittab.rb
|
81
101
|
- lib/foreman/export/launchd.rb
|
82
102
|
- lib/foreman/export/runit.rb
|
83
103
|
- lib/foreman/export/supervisord.rb
|
104
|
+
- lib/foreman/export/systemd.rb
|
84
105
|
- lib/foreman/export/upstart.rb
|
85
106
|
- lib/foreman/export.rb
|
86
107
|
- lib/foreman/helpers.rb
|
@@ -93,10 +114,12 @@ files:
|
|
93
114
|
- spec/foreman/engine_spec.rb
|
94
115
|
- spec/foreman/export/base_spec.rb
|
95
116
|
- spec/foreman/export/bluepill_spec.rb
|
117
|
+
- spec/foreman/export/daemon_spec.rb
|
96
118
|
- spec/foreman/export/inittab_spec.rb
|
97
119
|
- spec/foreman/export/launchd_spec.rb
|
98
120
|
- spec/foreman/export/runit_spec.rb
|
99
121
|
- spec/foreman/export/supervisord_spec.rb
|
122
|
+
- spec/foreman/export/systemd_spec.rb
|
100
123
|
- spec/foreman/export/upstart_spec.rb
|
101
124
|
- spec/foreman/export_spec.rb
|
102
125
|
- spec/foreman/helpers_spec.rb
|
@@ -110,6 +133,12 @@ files:
|
|
110
133
|
- spec/resources/bin/utf8
|
111
134
|
- spec/resources/export/bluepill/app-concurrency.pill
|
112
135
|
- spec/resources/export/bluepill/app.pill
|
136
|
+
- spec/resources/export/daemon/app-alpha-1.conf
|
137
|
+
- spec/resources/export/daemon/app-alpha-2.conf
|
138
|
+
- spec/resources/export/daemon/app-alpha.conf
|
139
|
+
- spec/resources/export/daemon/app-bravo-1.conf
|
140
|
+
- spec/resources/export/daemon/app-bravo.conf
|
141
|
+
- spec/resources/export/daemon/app.conf
|
113
142
|
- spec/resources/export/inittab/inittab.concurrency
|
114
143
|
- spec/resources/export/inittab/inittab.default
|
115
144
|
- spec/resources/export/launchd/launchd-a.default
|
@@ -123,6 +152,12 @@ files:
|
|
123
152
|
- spec/resources/export/runit/app-bravo-1/run
|
124
153
|
- spec/resources/export/supervisord/app-alpha-1.conf
|
125
154
|
- spec/resources/export/supervisord/app-alpha-2.conf
|
155
|
+
- spec/resources/export/systemd/app-alpha-1.service
|
156
|
+
- spec/resources/export/systemd/app-alpha-2.service
|
157
|
+
- spec/resources/export/systemd/app-alpha.target
|
158
|
+
- spec/resources/export/systemd/app-bravo-1.service
|
159
|
+
- spec/resources/export/systemd/app-bravo.target
|
160
|
+
- spec/resources/export/systemd/app.target
|
126
161
|
- spec/resources/export/upstart/app-alpha-1.conf
|
127
162
|
- spec/resources/export/upstart/app-alpha-2.conf
|
128
163
|
- spec/resources/export/upstart/app-alpha.conf
|
@@ -153,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
188
|
version: '0'
|
154
189
|
requirements: []
|
155
190
|
rubyforge_project:
|
156
|
-
rubygems_version: 1.8.
|
191
|
+
rubygems_version: 1.8.23
|
157
192
|
signing_key:
|
158
193
|
specification_version: 3
|
159
194
|
summary: Process manager for applications with multiple components
|
data/bin/taskman
DELETED
data/lib/foreman/capistrano.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
if defined?(Capistrano)
|
2
|
-
Capistrano::Configuration.instance(:must_exist).load do
|
3
|
-
|
4
|
-
namespace :foreman do
|
5
|
-
desc <<-DESC
|
6
|
-
Export the Procfile to upstart. Will use sudo if available.
|
7
|
-
|
8
|
-
You can override any of these defaults by setting the variables shown below.
|
9
|
-
|
10
|
-
set :foreman_format, "upstart"
|
11
|
-
set :foreman_location, "/etc/init"
|
12
|
-
set :foreman_procfile, "Procfile"
|
13
|
-
set :foreman_app, application
|
14
|
-
set :foreman_user, user
|
15
|
-
set :foreman_log, 'shared_path/log'
|
16
|
-
set :foreman_concurrency, false
|
17
|
-
DESC
|
18
|
-
task :export, :roles => :app do
|
19
|
-
bundle_cmd = fetch(:bundle_cmd, "bundle")
|
20
|
-
foreman_format = fetch(:foreman_format, "upstart")
|
21
|
-
foreman_location = fetch(:foreman_location, "/etc/init")
|
22
|
-
foreman_procfile = fetch(:foreman_procfile, "Procfile")
|
23
|
-
foreman_app = fetch(:foreman_app, application)
|
24
|
-
foreman_user = fetch(:foreman_user, user)
|
25
|
-
foreman_log = fetch(:foreman_log, "#{shared_path}/log")
|
26
|
-
foreman_concurrency = fetch(:foreman_concurrency, false)
|
27
|
-
|
28
|
-
args = ["#{foreman_format} #{foreman_location}"]
|
29
|
-
args << "-f #{foreman_procfile}"
|
30
|
-
args << "-a #{foreman_app}"
|
31
|
-
args << "-u #{foreman_user}"
|
32
|
-
args << "-l #{foreman_log}"
|
33
|
-
args << "-c #{foreman_concurrency}" if foreman_concurrency
|
34
|
-
run "cd #{release_path} && #{sudo} #{bundle_cmd} exec foreman export #{args.join(' ')}"
|
35
|
-
end
|
36
|
-
|
37
|
-
desc "Start the application services"
|
38
|
-
task :start, :roles => :app do
|
39
|
-
run "#{sudo} start #{application}"
|
40
|
-
end
|
41
|
-
|
42
|
-
desc "Stop the application services"
|
43
|
-
task :stop, :roles => :app do
|
44
|
-
run "#{sudo} stop #{application}"
|
45
|
-
end
|
46
|
-
|
47
|
-
desc "Restart the application services"
|
48
|
-
task :restart, :roles => :app do
|
49
|
-
run "#{sudo} start #{application} || #{sudo} restart #{application}"
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|