Compare commits

..

4 Commits

Author SHA1 Message Date
David Dollar 9b704ad852 0.48.0.pre2 2012-06-17 22:02:14 -04:00
David Dollar 43428175c3 allow color to be forced on 2012-06-17 22:02:00 -04:00
David Dollar 87f65e489c terminate gracefully if stdout goes away 2012-06-17 21:55:28 -04:00
David Dollar e5521f2cbb always flush output 2012-06-17 21:55:19 -04:00
15 changed files with 38 additions and 170 deletions
-9
View File
@@ -1,12 +1,3 @@
## 0.48.0.pre2 (2012-06-17)
* 0.48.0.pre2 [David Dollar]
* allow color to be forced on [David Dollar]
* terminate gracefully if stdout goes away [David Dollar]
* always flush output [David Dollar]
* test on more things, but don't fail [David Dollar]
* changelog [David Dollar]
## 0.48.0.pre1 (2012-06-11)
* Massive refactoring for programmatic control and stability [David Dollar]
+2 -2
View File
@@ -1,7 +1,7 @@
PATH
remote: .
specs:
foreman (0.50.0)
foreman (0.48.0.pre2)
thor (>= 0.13.6)
GEM
@@ -39,7 +39,7 @@ GEM
multi_json (~> 1.0.3)
simplecov-html (~> 0.5.3)
simplecov-html (0.5.3)
thor (0.15.4)
thor (0.15.2)
timecop (0.3.5)
win32console (1.3.0-x86-mingw32)
xml-simple (1.0.15)
+1 -1
View File
@@ -9,6 +9,6 @@ sigterm() {
#trap sigterm SIGTERM
while true; do
echo "$NAME: ping $$"
echo "$NAME: ping"
sleep 1
done
-4
View File
@@ -12,10 +12,6 @@ module Foreman
defined?(RUBY_PLATFORM) and RUBY_PLATFORM == "java"
end
def self.ruby_18?
defined?(RUBY_VERSION) and RUBY_VERSION =~ /^1\.8\.\d+/
end
def self.windows?
defined?(RUBY_PLATFORM) and RUBY_PLATFORM =~ /(win|w)32$/
end
+1 -11
View File
@@ -3,17 +3,13 @@ require "foreman/helpers"
require "foreman/engine"
require "foreman/engine/cli"
require "foreman/export"
require "foreman/version"
require "shellwords"
require "yaml"
require "thor"
class Foreman::CLI < Thor
include Foreman::Helpers
map ["-v", "--version"] => :version
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
class_option :root, :type => :string, :aliases => "-d", :desc => "Default: Procfile directory"
@@ -84,12 +80,6 @@ class Foreman::CLI < Thor
end
end
desc "version", "Display Foreman gem version"
def version
puts Foreman::VERSION
end
no_tasks do
def engine
@engine ||= begin
@@ -133,7 +123,7 @@ private ######################################################################
def options
original_options = super
return original_options unless File.exists?(".foreman")
defaults = ::YAML::load_file(".foreman") || {}
defaults = YAML::load_file(".foreman") || {}
Thor::CoreExt::HashWithIndifferentAccess.new(defaults.merge(original_options))
end
+16 -41
View File
@@ -24,7 +24,7 @@ class Foreman::Engine
def initialize(options={})
@options = options.dup
@options[:formation] ||= (options[:concurrency] || "all=1")
@options[:formation] ||= "all=1"
@env = {}
@mutex = Mutex.new
@@ -39,7 +39,7 @@ class Foreman::Engine
def start
trap("TERM") { puts "SIGTERM received"; terminate_gracefully }
trap("INT") { puts "SIGINT received"; terminate_gracefully }
trap("HUP") { puts "SIGHUP received"; terminate_gracefully } if ::Signal.list.keys.include? 'HUP'
trap("HUP") { puts "SIGHUP received"; terminate_gracefully }
startup
spawn_processes
@@ -99,17 +99,10 @@ class Foreman::Engine
# @param [String] signal The signal to send to each process
#
def killall(signal="SIGTERM")
if Foreman.windows?
@running.each do |pid, (process, index)|
system "sending #{signal} to #{name_for(pid)} at pid #{pid}"
begin
Process.kill(signal, pid)
rescue Errno::ESRCH, Errno::EPERM
end
end
else
@running.each do |pid, (process, index)|
system "sending #{signal} to #{name_for(pid)} at pid #{pid}"
begin
Process.kill "-#{signal}", Process.pid
Process.kill(signal, -1 * pid)
rescue Errno::ESRCH, Errno::EPERM
end
end
@@ -161,28 +154,11 @@ class Foreman::Engine
#
# @param [Foreman::Process] process A +Process+ associated with this engine
# @param [Fixnum] instance The instance of the process
#
#
# @returns [Fixnum] port The port to use for this instance of this process
#
def port_for(process, instance, base=nil)
if base
base + (@processes.index(process.process) * 100) + (instance - 1)
else
base_port + (@processes.index(process) * 100) + (instance - 1)
end
end
# Get the base port for this foreman instance
#
# @returns [Fixnum] port The base port
#
def base_port
(options[:port] || env["PORT"] || ENV["PORT"] || 5000).to_i
end
# deprecated
def environment
env
def port_for(process, instance)
base_port + (@processes.index(process) * 100) + (instance - 1)
end
private
@@ -203,6 +179,10 @@ private
## Helpers ##########################################################
def base_port
(options[:port] || env["PORT"] || ENV["PORT"] || 5000).to_i
end
def create_pipe
IO.method(:pipe).arity.zero? ? IO.pipe : IO.pipe("BINARY")
end
@@ -213,7 +193,7 @@ private
end
def parse_formation(formation)
pairs = formation.to_s.gsub(/\s/, "").split(",")
pairs = @options[:formation].to_s.gsub(/\s/, "").split(",")
pairs.inject(Hash.new(0)) do |ax, pair|
process, amount = pair.split("=")
@@ -273,7 +253,7 @@ private
loop do
(IO.select(@readers.values).first || []).each do |reader|
data = reader.gets
output_with_mutex name_for(@readers.invert[reader]), data
output_with_mutex name_for(@readers.key(reader)), data
end
end
rescue Exception => ex
@@ -295,13 +275,8 @@ private
def terminate_gracefully
return if @terminating
@terminating = true
if Foreman.windows?
system "sending SIGKILL to all processes"
killall "SIGKILL"
else
system "sending SIGTERM to all processes"
killall "SIGTERM"
end
system "sending SIGTERM to all processes"
killall "SIGTERM"
Timeout.timeout(5) do
watch_for_termination while @running.length > 0
end
+1 -3
View File
@@ -31,7 +31,6 @@ class Foreman::Engine::CLI < Foreman::Engine
def color?
return true if @@color_force
return true if Foreman.windows?
return false unless self.respond_to?(:isatty)
self.isatty && ENV["TERM"]
end
@@ -50,12 +49,11 @@ class Foreman::Engine::CLI < Foreman::Engine
def startup
@colors = map_colors
proctitle "foreman: master"
require "win32console" if Foreman.windows?
Color.enable($stdout, options[:color]) unless $stdout.respond_to?(:color?)
end
def output(name, data)
data.to_s.chomp.split("\n").each do |message|
Color.enable($stdout, options[:color]) unless $stdout.respond_to?(:color?)
output = ""
output += $stdout.color(@colors[name.split(".").first].to_sym)
output += "#{Time.now.strftime("%H:%M:%S")} #{pad_process_name(name)} | "
+1 -1
View File
@@ -1,6 +1,5 @@
require "foreman"
require "foreman/helpers"
require "pathname"
module Foreman::Export
extend Foreman::Helpers
@@ -32,3 +31,4 @@ require "foreman/export/bluepill"
require "foreman/export/runit"
require "foreman/export/supervisord"
require "foreman/export/launchd"
+8 -65
View File
@@ -1,6 +1,4 @@
require "foreman/export"
require "ostruct"
require "pathname"
require "shellwords"
class Foreman::Export::Base
@@ -10,37 +8,11 @@ class Foreman::Export::Base
attr_reader :options
attr_reader :formation
# deprecated
attr_reader :port
def initialize(location, engine, options={})
@location = location
@engine = engine
@options = options.dup
@formation = engine.formation
# deprecated
def port
Foreman::Export::Base.warn_deprecation!
engine.base_port
end
# deprecated
def template
Foreman::Export::Base.warn_deprecation!
options[:template]
end
# deprecated
def @engine.procfile
Foreman::Export::Base.warn_deprecation!
@processes.map do |process|
OpenStruct.new(
:name => @names[process],
:process => process
)
end
end
end
def export
@@ -64,18 +36,6 @@ class Foreman::Export::Base
private ######################################################################
def self.warn_deprecation!
@@deprecation_warned ||= false
return if @@deprecation_warned
puts "WARNING: Using deprecated exporter interface. Please update your exporter"
puts "the interface shown in the upstart exporter:"
puts
puts "https://github.com/ddollar/foreman/blob/master/lib/foreman/export/upstart.rb"
puts "https://github.com/ddollar/foreman/blob/master/data/export/upstart/process.conf.erb"
puts
@@deprecation_warned = true
end
def error(message)
raise Foreman::Export::Exception.new(message)
end
@@ -94,28 +54,13 @@ private ######################################################################
'"' + Shellwords.escape(value) + '"'
end
# deprecated
def old_export_template(exporter, file, template_root)
if template_root && File.exist?(file_path = File.join(template_root, file))
File.read(file_path)
elsif File.exist?(file_path = File.expand_path(File.join("~/.foreman/templates", file)))
File.read(file_path)
else
File.read(File.expand_path("../../../../data/export/#{exporter}/#{file}", __FILE__))
end
end
def export_template(name, file=nil, template_root=nil)
if file && template_root
old_export_template name, file, template_root
else
name_without_first = name.split("/")[1..-1].join("/")
matchers = []
matchers << File.join(options[:template], name_without_first) if options[:template]
matchers << File.expand_path("~/.foreman/templates/#{name}")
matchers << File.expand_path("../../../../data/export/#{name}", __FILE__)
File.read(matchers.detect { |m| File.exists?(m) })
end
def export_template(name)
name_without_first = name.split("/")[1..-1].join("/")
matchers = []
matchers << File.join(options[:template], name_without_first) if options[:template]
matchers << File.expand_path("~/.foreman/templates/#{name}")
matchers << File.expand_path("../../../../data/export/#{name}", __FILE__)
File.read(matchers.detect { |m| File.exists?(m) })
end
def write_template(name, target, binding)
@@ -136,9 +81,7 @@ private ######################################################################
def write_file(filename, contents)
say "writing: #{filename}"
filename = File.join(location, filename) unless Pathname.new(filename).absolute?
File.open(filename, "w") do |file|
File.open(File.join(location, filename), "w") do |file|
file.puts contents
end
end
+4 -21
View File
@@ -36,29 +36,16 @@ class Foreman::Process
if Foreman.windows?
Dir.chdir(cwd) do
expanded_command = command.dup
env.each do |key, val|
expanded_command.gsub!("$#{key}", val)
end
Process.spawn env, expanded_command, :out => output, :err => output
Process.spawn env, command, :out => output, :err => output, :new_pgroup => true
end
elsif Foreman.jruby?
Dir.chdir(cwd) do
require "posix/spawn"
POSIX::Spawn.spawn env, command, :out => output, :err => output
end
elsif Foreman.ruby_18?
Dir.chdir(cwd) do
fork do
$stdout.reopen output
$stderr.reopen output
env.each { |k,v| ENV[k] = v }
exec command
end
POSIX::Spawn.spawn env, command, :out => output, :err => output, :pgroup => 0
end
else
Dir.chdir(cwd) do
Process.spawn env, command, :out => output, :err => output
Process.spawn env, command, :out => output, :err => output, :pgroup => 0
end
end
end
@@ -68,11 +55,7 @@ class Foreman::Process
# @param [String] signal The signal to send
#
def kill(signal)
if Foreman.windows?
pid && Process.kill(signal, pid)
else
pid && Process.kill("-#{signal}", pid)
end
pid && Process.kill(signal, -1 * pid)
rescue Errno::ESRCH
false
end
+1 -1
View File
@@ -1,5 +1,5 @@
module Foreman
VERSION = "0.50.0"
VERSION = "0.48.0.pre2"
end
+1 -1
View File
@@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "FOREMAN" "1" "June 2012" "Foreman 0.49.0" "Foreman Manual"
.TH "FOREMAN" "1" "April 2012" "Foreman 0.46.0" "Foreman Manual"
.
.SH "NAME"
\fBforeman\fR \- manage Procfile\-based applications
-10
View File
@@ -74,14 +74,4 @@ describe "Foreman::CLI", :fakefs do
end
end
describe "version" do
it "displays gem version" do
foreman("version").chomp.should == Foreman::VERSION
end
it "displays gem version on shortcut command" do
foreman("-v").chomp.should == Foreman::VERSION
end
end
end
+1
View File
@@ -54,6 +54,7 @@ def fork_and_capture(&blk)
Process.wait pid
buffer = ""
until rd.eof?
p [:foo]
buffer += rd.gets
end
end
+1
View File
@@ -60,6 +60,7 @@ end
desc "Cut a release"
task :release do
Rake::Task["authors"].invoke
Rake::Task["changelog"].invoke
Rake::Task["pages"].invoke
end