foreman-systemd 0.78.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +64 -0
- data/bin/foreman +7 -0
- data/bin/foreman-runner +41 -0
- data/data/example/Procfile +4 -0
- data/data/example/Procfile.without_colon +2 -0
- data/data/example/error +7 -0
- data/data/example/log/neverdie.log +4 -0
- data/data/example/spawnee +14 -0
- data/data/example/spawner +7 -0
- data/data/example/ticker +14 -0
- data/data/example/utf8 +11 -0
- data/data/export/bluepill/master.pill.erb +28 -0
- 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/launchd/launchd.plist.erb +33 -0
- data/data/export/runit/log/run.erb +7 -0
- data/data/export/runit/run.erb +4 -0
- data/data/export/supervisord/app.conf.erb +28 -0
- data/data/export/systemd/master.target.erb +6 -0
- data/data/export/systemd/process.service.erb +16 -0
- data/data/export/systemd/process_master.target.erb +4 -0
- data/data/export/upstart/master.conf.erb +2 -0
- data/data/export/upstart/process.conf.erb +14 -0
- data/data/export/upstart/process_master.conf.erb +2 -0
- data/lib/foreman.rb +17 -0
- data/lib/foreman/cli.rb +161 -0
- data/lib/foreman/distribution.rb +9 -0
- data/lib/foreman/engine.rb +441 -0
- data/lib/foreman/engine/cli.rb +104 -0
- data/lib/foreman/env.rb +29 -0
- data/lib/foreman/export.rb +36 -0
- data/lib/foreman/export/base.rb +156 -0
- data/lib/foreman/export/bluepill.rb +12 -0
- data/lib/foreman/export/daemon.rb +28 -0
- data/lib/foreman/export/inittab.rb +42 -0
- data/lib/foreman/export/launchd.rb +22 -0
- data/lib/foreman/export/runit.rb +34 -0
- data/lib/foreman/export/supervisord.rb +16 -0
- data/lib/foreman/export/systemd.rb +32 -0
- data/lib/foreman/export/upstart.rb +43 -0
- data/lib/foreman/helpers.rb +45 -0
- data/lib/foreman/process.rb +80 -0
- data/lib/foreman/procfile.rb +92 -0
- data/lib/foreman/version.rb +5 -0
- data/man/foreman.1 +278 -0
- data/spec/foreman/cli_spec.rb +107 -0
- data/spec/foreman/engine_spec.rb +112 -0
- data/spec/foreman/export/base_spec.rb +19 -0
- data/spec/foreman/export/bluepill_spec.rb +37 -0
- data/spec/foreman/export/daemon_spec.rb +97 -0
- data/spec/foreman/export/inittab_spec.rb +40 -0
- data/spec/foreman/export/launchd_spec.rb +31 -0
- data/spec/foreman/export/runit_spec.rb +36 -0
- data/spec/foreman/export/supervisord_spec.rb +36 -0
- data/spec/foreman/export/systemd_spec.rb +91 -0
- data/spec/foreman/export/upstart_spec.rb +118 -0
- data/spec/foreman/export_spec.rb +24 -0
- data/spec/foreman/helpers_spec.rb +26 -0
- data/spec/foreman/process_spec.rb +71 -0
- data/spec/foreman/procfile_spec.rb +43 -0
- data/spec/foreman_spec.rb +16 -0
- data/spec/helper_spec.rb +19 -0
- data/spec/resources/Procfile +5 -0
- data/spec/resources/bin/echo +2 -0
- data/spec/resources/bin/env +2 -0
- data/spec/resources/bin/test +2 -0
- data/spec/resources/bin/utf8 +2 -0
- data/spec/resources/export/bluepill/app-concurrency.pill +49 -0
- data/spec/resources/export/bluepill/app.pill +81 -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/inittab/inittab.concurrency +4 -0
- data/spec/resources/export/inittab/inittab.default +6 -0
- data/spec/resources/export/launchd/launchd-a.default +29 -0
- data/spec/resources/export/launchd/launchd-b.default +29 -0
- data/spec/resources/export/launchd/launchd-c.default +30 -0
- data/spec/resources/export/runit/app-alpha-1/log/run +7 -0
- data/spec/resources/export/runit/app-alpha-1/run +4 -0
- data/spec/resources/export/runit/app-alpha-2/log/run +7 -0
- data/spec/resources/export/runit/app-alpha-2/run +4 -0
- data/spec/resources/export/runit/app-bravo-1/log/run +7 -0
- data/spec/resources/export/runit/app-bravo-1/run +4 -0
- data/spec/resources/export/supervisord/app-alpha-1.conf +46 -0
- data/spec/resources/export/supervisord/app-alpha-2.conf +24 -0
- data/spec/resources/export/systemd/concurrency/app-alpha-1.service +14 -0
- data/spec/resources/export/systemd/concurrency/app-alpha-2.service +14 -0
- data/spec/resources/export/systemd/concurrency/app-alpha.target +3 -0
- data/spec/resources/export/systemd/concurrency/app.target +6 -0
- data/spec/resources/export/systemd/standard/app-alpha-1.service +14 -0
- data/spec/resources/export/systemd/standard/app-alpha.target +3 -0
- data/spec/resources/export/systemd/standard/app-bravo-1.service +14 -0
- data/spec/resources/export/systemd/standard/app-bravo.target +3 -0
- data/spec/resources/export/systemd/standard/app.target +6 -0
- data/spec/resources/export/upstart/app-alpha-1.conf +11 -0
- data/spec/resources/export/upstart/app-alpha-2.conf +11 -0
- data/spec/resources/export/upstart/app-alpha.conf +2 -0
- data/spec/resources/export/upstart/app-bravo-1.conf +11 -0
- data/spec/resources/export/upstart/app-bravo.conf +2 -0
- data/spec/resources/export/upstart/app.conf +2 -0
- data/spec/spec_helper.rb +166 -0
- metadata +164 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9865c6f9b79dad208c1f50914ceb5a3e83a8bb76
|
4
|
+
data.tar.gz: 8fe409579cf4d8d9c74b56c0829169e11cd8621f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dc06e84934cea95497f9c2a63889e8bb5f6d5dd7ef63b61f818806681aca00c71a1afcf6a2bc903e02758562fc4e31a423c708b9f783da14a04946b0dda5c9ec
|
7
|
+
data.tar.gz: d302f2133a60208fa63d6e76b3d7a3ff7a2326c78a9a5d1611752f1ddcc4c90f7cf786d790da9ade5095ef207d99a9e95c4588718d6b2f67ca8dd913c993f59a
|
data/README.md
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# Foreman
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/ddollar/foreman.svg?branch=master)](https://travis-ci.org/ddollar/foreman)
|
4
|
+
[![Code Climate](https://codeclimate.com/github/ddollar/foreman.png)](https://codeclimate.com/github/ddollar/foreman)
|
5
|
+
[![Inline docs](http://inch-ci.org/github/ddollar/foreman.svg?branch=master)](http://inch-ci.org/github/ddollar/foreman)
|
6
|
+
|
7
|
+
Manage Procfile-based applications
|
8
|
+
|
9
|
+
<table>
|
10
|
+
<tr>
|
11
|
+
<th>If you have...</th>
|
12
|
+
<th>Install with...</th>
|
13
|
+
</tr>
|
14
|
+
<tr>
|
15
|
+
<td>Ruby (MRI, JRuby, Windows)</td>
|
16
|
+
<td><pre>$ gem install foreman</pre></td>
|
17
|
+
</tr>
|
18
|
+
<tr>
|
19
|
+
<td>Mac OS X</td>
|
20
|
+
<td><a href="http://assets.foreman.io/foreman/foreman.pkg">foreman.pkg</a></td>
|
21
|
+
</tr>
|
22
|
+
</table>
|
23
|
+
|
24
|
+
## Installation
|
25
|
+
|
26
|
+
$ gem install foreman
|
27
|
+
|
28
|
+
Ruby users should take care *not* to install foreman in their project's `Gemfile`.
|
29
|
+
|
30
|
+
## Getting Started
|
31
|
+
|
32
|
+
* http://blog.daviddollar.org/2011/05/06/introducing-foreman.html
|
33
|
+
|
34
|
+
## Supported Ruby versions
|
35
|
+
|
36
|
+
See [.travis.yml](.travis.yml) for a list of Ruby versions against which Foreman is tested.
|
37
|
+
|
38
|
+
## Documentation
|
39
|
+
|
40
|
+
* [man page](http://ddollar.github.com/foreman)
|
41
|
+
* [wiki](http://github.com/ddollar/foreman/wiki)
|
42
|
+
* [changelog](https://github.com/ddollar/foreman/blob/master/Changelog.md)
|
43
|
+
|
44
|
+
## Ports
|
45
|
+
|
46
|
+
* [forego](https://github.com/ddollar/forego) - Go
|
47
|
+
* [gaffer](https://github.com/jingweno/gaffer) - Java/JVM
|
48
|
+
* [honcho](https://github.com/nickstenning/honcho) - python
|
49
|
+
* [proclet](https://github.com/kazeburo/Proclet) - Perl
|
50
|
+
* [shoreman](https://github.com/hecticjeff/shoreman) - shell
|
51
|
+
|
52
|
+
## Authors
|
53
|
+
|
54
|
+
#### Created and maintained by
|
55
|
+
David Dollar
|
56
|
+
|
57
|
+
#### Patches contributed by
|
58
|
+
[Contributor List](https://github.com/ddollar/foreman/contributors)
|
59
|
+
|
60
|
+
## License
|
61
|
+
|
62
|
+
Foreman is licensed under the MIT license.
|
63
|
+
|
64
|
+
See LICENSE for the full license text.
|
data/bin/foreman
ADDED
data/bin/foreman-runner
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
#
|
3
|
+
#/ Usage: foreman-runner [-d <dir>] [-p] <command> [<args>...]
|
4
|
+
#/
|
5
|
+
#/ Run a command with exec, optionally changing directory first
|
6
|
+
|
7
|
+
set -e
|
8
|
+
|
9
|
+
error() {
|
10
|
+
echo $@ >&2
|
11
|
+
exit 1
|
12
|
+
}
|
13
|
+
|
14
|
+
usage() {
|
15
|
+
cat $0 | grep '^#/' | cut -c4-
|
16
|
+
exit
|
17
|
+
}
|
18
|
+
|
19
|
+
read_profile=""
|
20
|
+
|
21
|
+
while getopts ":hd:p" OPT; do
|
22
|
+
case $OPT in
|
23
|
+
d) cd "$OPTARG" ;;
|
24
|
+
p) read_profile="1" ;;
|
25
|
+
h) usage ;;
|
26
|
+
\?) error "invalid option: -$OPTARG" ;;
|
27
|
+
:) error "option -$OPTARG requires an argument" ;;
|
28
|
+
esac
|
29
|
+
done
|
30
|
+
|
31
|
+
shift $((OPTIND-1))
|
32
|
+
|
33
|
+
[ -z "$1" ] && usage
|
34
|
+
|
35
|
+
if [ "$read_profile" = "1" ]; then
|
36
|
+
if [ -f .profile ]; then
|
37
|
+
. ./.profile
|
38
|
+
fi
|
39
|
+
fi
|
40
|
+
|
41
|
+
exec "$@"
|
data/data/example/error
ADDED
data/data/example/ticker
ADDED
data/data/example/utf8
ADDED
@@ -0,0 +1,28 @@
|
|
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.each_process do |name, process| %>
|
7
|
+
<% 1.upto(engine.formation[name]) do |num| %>
|
8
|
+
<% port = engine.port_for(process, num) %>
|
9
|
+
app.process("<%= name %>-<%= num %>") do |process|
|
10
|
+
process.start_command = %Q{<%= process.command %>}
|
11
|
+
|
12
|
+
process.working_dir = "<%= engine.root %>"
|
13
|
+
process.daemonize = true
|
14
|
+
process.environment = <%= engine.env.merge("PORT" => port.to_s).inspect %>
|
15
|
+
process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
|
16
|
+
process.stop_grace_time = 45.seconds
|
17
|
+
|
18
|
+
process.stdout = process.stderr = "<%= log %>/<%= app %>-<%= name %>-<%= num %>.log"
|
19
|
+
|
20
|
+
process.monitor_children do |children|
|
21
|
+
children.stop_command "kill {{PID}}"
|
22
|
+
end
|
23
|
+
|
24
|
+
process.group = "<%= app %>-<%= name %>"
|
25
|
+
end
|
26
|
+
<% end %>
|
27
|
+
<% end %>
|
28
|
+
end
|
@@ -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
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>Label</key>
|
6
|
+
<string><%= "#{app}-#{name}-#{num}" %></string>
|
7
|
+
<key>EnvironmentVariables</key>
|
8
|
+
<dict>
|
9
|
+
<%- engine.env.merge("PORT" => port).each_pair do |var,env| -%>
|
10
|
+
<key><%= var.upcase %></key>
|
11
|
+
<string><%= env %></string>
|
12
|
+
<%- end -%>
|
13
|
+
</dict>
|
14
|
+
<key>ProgramArguments</key>
|
15
|
+
<array>
|
16
|
+
<%- command_args.each do |command| -%>
|
17
|
+
<string><%= command %></string>
|
18
|
+
<%- end -%>
|
19
|
+
</array>
|
20
|
+
<key>KeepAlive</key>
|
21
|
+
<true/>
|
22
|
+
<key>RunAtLoad</key>
|
23
|
+
<true/>
|
24
|
+
<key>StandardOutPath</key>
|
25
|
+
<string><%= log %>/<%= app %>-<%= name %>-<%=num%>.log</string>
|
26
|
+
<key>StandardErrorPath</key>
|
27
|
+
<string><%= log %>/<%= app %>-<%= name %>-<%=num%>.log</string>
|
28
|
+
<key>UserName</key>
|
29
|
+
<string><%= user %></string>
|
30
|
+
<key>WorkingDirectory</key>
|
31
|
+
<string><%= engine.root %></string>
|
32
|
+
</dict>
|
33
|
+
</plist>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<%
|
2
|
+
app_names = []
|
3
|
+
engine.each_process do |name, process|
|
4
|
+
1.upto(engine.formation[name]) do |num|
|
5
|
+
port = engine.port_for(process, num)
|
6
|
+
full_name = "#{app}-#{name}-#{num}"
|
7
|
+
environment = engine.env.merge("PORT" => port.to_s).map do |key, value|
|
8
|
+
"#{key}=\"#{shell_quote(value)}\""
|
9
|
+
end
|
10
|
+
app_names << full_name
|
11
|
+
-%>
|
12
|
+
[program:<%= full_name %>]
|
13
|
+
command=<%= process.command %>
|
14
|
+
autostart=true
|
15
|
+
autorestart=true
|
16
|
+
stopsignal=QUIT
|
17
|
+
stdout_logfile=<%= log %>/<%= name %>-<%= num %>.log
|
18
|
+
stderr_logfile=<%= log %>/<%= name %>-<%= num %>.error.log
|
19
|
+
user=<%= user %>
|
20
|
+
directory=<%= engine.root %>
|
21
|
+
environment=<%= environment.join(',') %>
|
22
|
+
|
23
|
+
<%
|
24
|
+
end
|
25
|
+
end
|
26
|
+
-%>
|
27
|
+
[group:<%= app %>]
|
28
|
+
programs=<%= app_names.join(',') %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
[Unit]
|
2
|
+
StopWhenUnneeded=true
|
3
|
+
PartOf=<%= "#{app}-#{name}.target" %>
|
4
|
+
|
5
|
+
[Service]
|
6
|
+
User=<%= user %>
|
7
|
+
WorkingDirectory=<%= engine.root %>
|
8
|
+
Environment=PORT=<%= port %><% engine.env.each_pair do |var,env| %>
|
9
|
+
Environment=<%= var.upcase %>=<%= env %><% end %>
|
10
|
+
ExecStart=/bin/bash -lc '<%= process.command %>'
|
11
|
+
Restart=always
|
12
|
+
StandardInput=null
|
13
|
+
StandardOutput=syslog
|
14
|
+
StandardError=syslog
|
15
|
+
SyslogIdentifier=%n
|
16
|
+
KillMode=process
|
@@ -0,0 +1,14 @@
|
|
1
|
+
start on starting <%= app %>-<%= name %>
|
2
|
+
stop on stopping <%= app %>-<%= name %>
|
3
|
+
respawn
|
4
|
+
|
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.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "foreman/version"
|
2
|
+
|
3
|
+
module Foreman
|
4
|
+
|
5
|
+
def self.runner
|
6
|
+
File.expand_path("../../bin/foreman-runner", __FILE__)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.ruby_18?
|
10
|
+
defined?(RUBY_VERSION) and RUBY_VERSION =~ /^1\.8\.\d+/
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.windows?
|
14
|
+
defined?(RUBY_PLATFORM) and RUBY_PLATFORM =~ /(win|w)32$/
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/lib/foreman/cli.rb
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
require "foreman"
|
2
|
+
require "foreman/helpers"
|
3
|
+
require "foreman/engine"
|
4
|
+
require "foreman/engine/cli"
|
5
|
+
require "foreman/export"
|
6
|
+
require "foreman/version"
|
7
|
+
require "shellwords"
|
8
|
+
require "yaml"
|
9
|
+
require "thor"
|
10
|
+
|
11
|
+
class Foreman::CLI < Thor
|
12
|
+
|
13
|
+
include Foreman::Helpers
|
14
|
+
|
15
|
+
map ["-v", "--version"] => :version
|
16
|
+
|
17
|
+
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
|
18
|
+
class_option :root, :type => :string, :aliases => "-d", :desc => "Default: Procfile directory"
|
19
|
+
|
20
|
+
desc "start [PROCESS]", "Start the application (or a specific PROCESS)"
|
21
|
+
|
22
|
+
method_option :color, :type => :boolean, :aliases => "-c", :desc => "Force color to be enabled"
|
23
|
+
method_option :env, :type => :string, :aliases => "-e", :desc => "Specify an environment file to load, defaults to .env"
|
24
|
+
method_option :formation, :type => :string, :aliases => "-m", :banner => '"alpha=5,bar=3"'
|
25
|
+
method_option :port, :type => :numeric, :aliases => "-p"
|
26
|
+
method_option :timeout, :type => :numeric, :aliases => "-t", :desc => "Specify the amount of time (in seconds) processes have to shutdown gracefully before receiving a SIGKILL, defaults to 5."
|
27
|
+
|
28
|
+
class << self
|
29
|
+
# Hackery. Take the run method away from Thor so that we can redefine it.
|
30
|
+
def is_thor_reserved_word?(word, type)
|
31
|
+
return false if word == "run"
|
32
|
+
super
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def start(process=nil)
|
37
|
+
check_procfile!
|
38
|
+
load_environment!
|
39
|
+
engine.load_procfile(procfile)
|
40
|
+
engine.options[:formation] = "#{process}=1" if process
|
41
|
+
engine.start
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "export FORMAT LOCATION", "Export the application to another process management format"
|
45
|
+
|
46
|
+
method_option :app, :type => :string, :aliases => "-a"
|
47
|
+
method_option :log, :type => :string, :aliases => "-l"
|
48
|
+
method_option :run, :type => :string, :aliases => "-r", :desc => "Specify the pid file directory, defaults to /var/run/<application>"
|
49
|
+
method_option :env, :type => :string, :aliases => "-e", :desc => "Specify an environment file to load, defaults to .env"
|
50
|
+
method_option :port, :type => :numeric, :aliases => "-p"
|
51
|
+
method_option :user, :type => :string, :aliases => "-u"
|
52
|
+
method_option :template, :type => :string, :aliases => "-t"
|
53
|
+
method_option :concurrency, :type => :string, :aliases => "-c", :banner => '"alpha=5,bar=3"'
|
54
|
+
|
55
|
+
def export(format, location=nil)
|
56
|
+
check_procfile!
|
57
|
+
load_environment!
|
58
|
+
engine.load_procfile(procfile)
|
59
|
+
formatter = Foreman::Export.formatter(format)
|
60
|
+
formatter.new(location, engine, options).export
|
61
|
+
rescue Foreman::Export::Exception => ex
|
62
|
+
error ex.message
|
63
|
+
end
|
64
|
+
|
65
|
+
desc "check", "Validate your application's Procfile"
|
66
|
+
|
67
|
+
def check
|
68
|
+
check_procfile!
|
69
|
+
engine.load_procfile(procfile)
|
70
|
+
error "no processes defined" unless engine.processes.length > 0
|
71
|
+
puts "valid procfile detected (#{engine.process_names.join(', ')})"
|
72
|
+
end
|
73
|
+
|
74
|
+
desc "run COMMAND [ARGS...]", "Run a command using your application's environment"
|
75
|
+
|
76
|
+
method_option :env, :type => :string, :aliases => "-e", :desc => "Specify an environment file to load, defaults to .env"
|
77
|
+
stop_on_unknown_option! :run
|
78
|
+
|
79
|
+
def run(*args)
|
80
|
+
load_environment!
|
81
|
+
|
82
|
+
if File.exist?(procfile)
|
83
|
+
engine.load_procfile(procfile)
|
84
|
+
end
|
85
|
+
|
86
|
+
pid = fork do
|
87
|
+
begin
|
88
|
+
engine.env.each { |k,v| ENV[k] = v }
|
89
|
+
if args.size == 1 && process = engine.process(args.first)
|
90
|
+
process.exec(:env => engine.env)
|
91
|
+
else
|
92
|
+
exec args.shelljoin
|
93
|
+
end
|
94
|
+
rescue Errno::EACCES
|
95
|
+
error "not executable: #{args.first}"
|
96
|
+
rescue Errno::ENOENT
|
97
|
+
error "command not found: #{args.first}"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
trap("INT") do
|
101
|
+
Process.kill(:INT, pid)
|
102
|
+
end
|
103
|
+
Process.wait(pid)
|
104
|
+
exit $?.exitstatus
|
105
|
+
rescue Interrupt
|
106
|
+
end
|
107
|
+
|
108
|
+
desc "version", "Display Foreman gem version"
|
109
|
+
|
110
|
+
def version
|
111
|
+
puts Foreman::VERSION
|
112
|
+
end
|
113
|
+
|
114
|
+
no_tasks do
|
115
|
+
def engine
|
116
|
+
@engine ||= begin
|
117
|
+
engine_class = Foreman::Engine::CLI
|
118
|
+
engine = engine_class.new(options)
|
119
|
+
engine
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
private ######################################################################
|
125
|
+
|
126
|
+
def error(message)
|
127
|
+
puts "ERROR: #{message}"
|
128
|
+
exit 1
|
129
|
+
end
|
130
|
+
|
131
|
+
def check_procfile!
|
132
|
+
error("#{procfile} does not exist.") unless File.exist?(procfile)
|
133
|
+
end
|
134
|
+
|
135
|
+
def load_environment!
|
136
|
+
if options[:env]
|
137
|
+
options[:env].split(",").each do |file|
|
138
|
+
engine.load_env file
|
139
|
+
end
|
140
|
+
else
|
141
|
+
default_env = File.join(engine.root, ".env")
|
142
|
+
engine.load_env default_env if File.exists?(default_env)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def procfile
|
147
|
+
case
|
148
|
+
when options[:procfile] then options[:procfile]
|
149
|
+
when options[:root] then File.expand_path(File.join(options[:root], "Procfile"))
|
150
|
+
else "Procfile"
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def options
|
155
|
+
original_options = super
|
156
|
+
return original_options unless File.exists?(".foreman")
|
157
|
+
defaults = ::YAML::load_file(".foreman") || {}
|
158
|
+
Thor::CoreExt::HashWithIndifferentAccess.new(defaults.merge(original_options))
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|