Compare commits

..

2 Commits

Author SHA1 Message Date
David Dollar
d0f5b2412c 0.7.4 2010-09-17 09:30:20 -04:00
David Dollar
15ab54bc18 include files from export in the gem 2010-09-17 09:30:09 -04:00
17 changed files with 39 additions and 68 deletions

View File

@@ -3,7 +3,6 @@ source "http://rubygems.org"
group :development do
gem 'parka'
gem 'rake'
gem 'ronn'
end
group :test do

View File

@@ -3,21 +3,14 @@ GEM
specs:
diff-lcs (1.1.2)
fakefs (0.2.1)
hpricot (0.8.2)
mime-types (1.16)
mustache (0.11.2)
parka (0.3.1)
rest-client
thor
rake (0.8.7)
rcov (0.9.8)
rdiscount (1.6.5)
rest-client (1.6.0)
mime-types (>= 1.16)
ronn (0.7.3)
hpricot (>= 0.8.2)
mustache (>= 0.7.0)
rdiscount (>= 1.5.8)
rr (0.10.11)
rspec (2.0.0.beta.19)
rspec-core (= 2.0.0.beta.19)
@@ -38,7 +31,6 @@ DEPENDENCIES
parka
rake
rcov (~> 0.9.8)
ronn
rr (~> 0.10.11)
rspec (~> 2.0.0.beta.19)
term-ansicolor (~> 1.0.5)

View File

@@ -1,4 +0,0 @@
tick
tick
./never_die:6:in `sleep': Interrupt
from ./never_die:6

View File

@@ -3,4 +3,4 @@ stop on stopping <%= app %>-<%= process.name %>
respawn
chdir <%= engine.directory %>
exec su - <%= user %> -c 'export PORT=<%= port %>; <%= process.command %> >> <%= log_root %>/<%=process.name%>-<%=num%>.log 2>&1'
exec su <%= user %> -c "PORT=<%= port %> <%= process.command %> >> <%= log_root %>/<%=process.name%>-<%=num%>.log 2>&1"

View File

@@ -9,4 +9,5 @@ Parka::Specification.new do |gem|
gem.executables = "foreman"
gem.files << "man/foreman.1"
gem.files << Dir["export/**/*"]
end

View File

@@ -1,6 +1,6 @@
module Foreman
VERSION = "0.9.0"
VERSION = "0.7.4"
class AppDoesNotExist < Exception; end

View File

@@ -5,7 +5,7 @@ require "thor"
class Foreman::CLI < Thor
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: ./Procfile"
desc "start [PROCESS]", "Start the application, or a specific process"
@@ -50,7 +50,7 @@ class Foreman::CLI < Thor
private ######################################################################
def check_procfile!
error("#{procfile} does not exist.") unless File.exist?(procfile)
error("Procfile does not exist.") unless File.exist?(procfile)
end
def engine
@@ -58,7 +58,7 @@ private ######################################################################
end
def procfile
options[:procfile] || "Procfile"
options[:procfile] || "./Procfile"
end
private ######################################################################

View File

@@ -22,38 +22,25 @@ class Foreman::Engine
def processes
@processes ||= begin
@order = []
procfile.split("\n").inject({}) do |hash, line|
next if line.strip == ""
name, command = line.split(" ", 2)
process = Foreman::Process.new(name, command)
process.color = next_color
@order << process.name
hash.update(process.name => process)
end
end
end
def process_order
processes
@order
end
def processes_in_order
process_order.map do |name|
[name, processes[name]]
end
end
def start(options={})
proctitle "ruby: foreman master"
processes_in_order.each do |name, process|
processes.each do |name, process|
fork process, options
end
trap("TERM") { puts "SIGTERM received"; kill_all("TERM") }
trap("INT") { puts "SIGINT received"; kill_all("INT") }
trap("TERM") { kill_and_exit("TERM") }
trap("INT") { kill_and_exit("INT") }
watch_for_termination
end
@@ -61,8 +48,8 @@ class Foreman::Engine
def execute(name, options={})
fork processes[name], options
trap("TERM") { puts "SIGTERM received"; kill_all("TERM") }
trap("INT") { puts "SIGINT received"; kill_all("INT") }
trap("TERM") { kill_and_exit("TERM") }
trap("INT") { kill_and_exit("INT") }
watch_for_termination
end
@@ -79,13 +66,12 @@ private ######################################################################
concurrency = Foreman::Utils.parse_concurrency(options[:concurrency])
1.upto(concurrency[process.name]) do |num|
fork_individual(process, num, port_for(process, num, options[:port]))
fork_individual(process, port_for(process, num, options[:port]))
end
end
def fork_individual(process, num, port)
def fork_individual(process, port)
ENV["PORT"] = port.to_s
ENV["PS"] = "#{process.name}.#{num}"
pid = Process.fork do
run(process)
@@ -98,31 +84,29 @@ private ######################################################################
def run(process, log_to_file=true)
proctitle "ruby: foreman #{process.name}"
begin
Dir.chdir directory do
FileUtils.mkdir_p "log"
command = process.command
Dir.chdir directory do
FileUtils.mkdir_p "log"
command = process.command
begin
PTY.spawn("#{process.command} 2>&1") do |stdin, stdout, pid|
until stdin.eof?
info stdin.gets, process
end
end
end
rescue PTY::ChildExited, Interrupt
begin
rescue PTY::ChildExited, Interrupt
info "process exiting", process
rescue Interrupt
end
end
end
def kill_all(signal="TERM")
def kill_and_exit(signal="TERM")
info "terminating"
running_processes.each do |pid, process|
info "killing #{process.name} in pid #{pid}"
Process.kill(signal, pid)
end
exit 0
end
def info(message, process=nil)
@@ -142,8 +126,8 @@ private ######################################################################
end
def pad_process_name(process)
name = process ? "#{ENV["PS"]}" : "system"
name.ljust(longest_process_name + 3) # add 3 for process number padding
name = process ? "#{process.name}:#{ENV["PORT"]}" : "system"
name.ljust(longest_process_name + 6) # add 6 for port padding
end
def print_info
@@ -165,8 +149,7 @@ private ######################################################################
pid, status = Process.wait2
process = running_processes.delete(pid)
info "process terminated", process
kill_all
Process.waitall
kill_and_exit
end
def running_processes

View File

@@ -24,7 +24,7 @@ private ######################################################################
end
def export_template(name)
File.read(File.expand_path("../../../../data/export/#{name}", __FILE__))
File.read(File.expand_path("../../../../export/#{name}", __FILE__))
end
def write_file(filename, contents)

View File

@@ -27,8 +27,8 @@ class Foreman::Export::Inittab < Foreman::Export::Base
inittab = inittab.join("\n") + "\n"
if fname
FileUtils.mkdir_p(log_root) rescue error "could not create #{log_root}"
FileUtils.chown(user, nil, log_root) rescue error "could not chown #{log_root} to #{user}"
FileUtils.mkdir_p(log_root)
FileUtils.chown(user, nil, log_root)
write_file(fname, inittab)
else
puts inittab

View File

@@ -1,4 +1,4 @@
foreman(1) -- manage Psfile-based applications
foreman(1) -- manage Procfile-based applications
================================================
## SYNOPSIS
@@ -8,8 +8,8 @@ foreman(1) -- manage Psfile-based applications
## DESCRIPTION
**Foreman** is a manager for Psfile-based applications. Its aim is to
abstract away the details of the Psfile format, and allow you to either run
**Foreman** is a manager for Procfile-based applications. Its aim is to
abstract away the details of the Procfile format, and allow you to either run
your application directly or export it to some other process management
format.
@@ -18,7 +18,7 @@ format.
`foreman start` is used to run your application directly from the command line.
If no additional parameters are passed, foreman will run one instance of each
type of process defined in your Psfile.
type of process defined in your Procfile.
If a parameter is passed, foreman will run one instance of the specified
application type.
@@ -66,8 +66,8 @@ The following options control how the application is run:
These options control all modes of foreman's operation.
* `-f`, `--psfile`:
Specify an alternate location for the application's Psfile. This file's
* `-f`, `--procfile`:
Specify an alternate location for the application's Procfile. This file's
containing directory will be assumed to be the root directory of the
application.
@@ -99,9 +99,9 @@ will be structured to make the following commands valid:
`restart appname-processname-3`
## PSFILE
## PROCFILE
A Psfile should contain both a name for the process and the command used
A Procfile should contain both a name for the process and the command used
to run it.
web bundle exec thin start
@@ -117,9 +117,9 @@ Export the application in upstart format:
$ foreman export upstart /etc/init
Run one process type from the application defined in a specific Psfile:
Run one process type from the application defined in a specific Procfile:
$ foreman start alpha -p ~/myapp/Psfile
$ foreman start alpha -p ~/app/Procfile
## COPYRIGHT

View File

@@ -31,9 +31,9 @@ describe "Foreman::Engine" do
it "handles concurrency" do
write_procfile
mock(subject).fork_individual(subject.processes["alpha"], 1, 5000)
mock(subject).fork_individual(subject.processes["alpha"], 2, 5001)
mock(subject).fork_individual(subject.processes["bravo"], 1, 5100)
mock(subject).fork_individual(subject.processes["alpha"], 5000)
mock(subject).fork_individual(subject.processes["alpha"], 5001)
mock(subject).fork_individual(subject.processes["bravo"], 5100)
mock(subject).watch_for_termination
subject.start(:concurrency => "alpha=2")
end