alt-foreman 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/alt-foreman +27 -4
- data/lib/alt-foreman/process.rb +46 -1
- data/lib/alt-foreman/version.rb +1 -1
- data/lib/alt-foreman.rb +6 -2
- metadata +2 -3
data/bin/alt-foreman
CHANGED
@@ -1,9 +1,25 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
3
|
require 'alt-foreman'
|
4
|
+
require 'alt-foreman/version'
|
4
5
|
require 'alt-foreman/process'
|
5
6
|
|
6
|
-
|
7
|
+
|
8
|
+
pf = ARGV[0] || "Procfile"
|
9
|
+
is_fail = !File.exist?(pf)
|
10
|
+
is_help = ARGV.include?('-h') or ARGV.include?("--help")
|
11
|
+
|
12
|
+
if is_help or is_fail
|
13
|
+
unless is_help
|
14
|
+
puts "No such file `#{ARGV[0]}'"
|
15
|
+
end
|
16
|
+
puts "alt-foreman #{Alt::Foreman::VERSION}"
|
17
|
+
puts "Crude alternative to foreman for local development"
|
18
|
+
puts "Usage: alt-foreman [/path/to/Procfile]"
|
19
|
+
exit(is_help ? 0 : 1)
|
20
|
+
end
|
21
|
+
|
22
|
+
Dir.chdir(File.dirname(ARGV[0] || 'Procfile'))
|
7
23
|
|
8
24
|
if File.exist?('Gemfile')
|
9
25
|
ENV["BUNDLE_GEMFILE"]= File.expand_path("Gemfile")
|
@@ -11,14 +27,21 @@ end
|
|
11
27
|
|
12
28
|
processes = IO.readlines(ARGV[0]).map do |line|
|
13
29
|
line = line.chomp.gsub(/#.*$/, '')
|
14
|
-
if line =~
|
15
|
-
Alt::Foreman::Process.new(*line.split(
|
30
|
+
if line =~ /:\s+/
|
31
|
+
Alt::Foreman::Process.new(*line.split(/:\s+/,2))
|
16
32
|
else
|
17
33
|
nil
|
18
34
|
end
|
19
35
|
end.compact
|
20
36
|
|
21
37
|
threads = processes.map do |process|
|
22
|
-
Thread.new
|
38
|
+
Thread.new do
|
39
|
+
loop do
|
40
|
+
process.run
|
41
|
+
process.log("Process #{$?.pid} `#{process.cmd}' died (#{$?.status})", :red)
|
42
|
+
sleep 2
|
43
|
+
process.log("`#{process.cmd}' re-spawning", :red)
|
44
|
+
end
|
45
|
+
end
|
23
46
|
end.each { |t| t.join }
|
24
47
|
|
data/lib/alt-foreman/process.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
1
3
|
module Alt
|
2
4
|
module Foreman
|
3
5
|
class Process
|
@@ -5,12 +7,55 @@ module Alt
|
|
5
7
|
def initialize(name, cmd)
|
6
8
|
@name, @cmd = name, cmd
|
7
9
|
end
|
10
|
+
def log(info, col = nil)
|
11
|
+
Alt::Foreman.log(@name, info, col)
|
12
|
+
end
|
8
13
|
def run
|
14
|
+
args = Shellwords.split(@cmd)
|
15
|
+
args.each_with_index do |arg, index|
|
16
|
+
if arg =~ /-p(\d+)/
|
17
|
+
Foreman.kill_tcp_server!($1, @name)
|
18
|
+
elsif arg == '-p' && args[index+1] =~ /\d+/
|
19
|
+
Foreman.kill_tcp_server!(args[index+1], @name)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
9
23
|
IO.popen(@cmd, 'rb') do |io|
|
10
24
|
while line = io.gets
|
11
|
-
|
25
|
+
log(line)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
module_function
|
33
|
+
def kill_tcp_server!(need_port, name)
|
34
|
+
tries = 0
|
35
|
+
loop do
|
36
|
+
found = false
|
37
|
+
|
38
|
+
`netstat -nWlp 2>/dev/null|grep '^tcp '`.each_line do |line|
|
39
|
+
_, _, _, addr, _, what, program = line.strip.split(/\s+/)
|
40
|
+
ip, port = addr.split(%r/:/)
|
41
|
+
pid, process = program.split(%r:/:)
|
42
|
+
|
43
|
+
if (port.to_i == need_port.to_i) && (pid.to_i > 0)
|
44
|
+
found = true
|
45
|
+
sig = (tries <= 5 ? 'TERM' : 'KILL')
|
46
|
+
Alt::Foreman.log(name, "Found conflicting server process - sending #{sig} to #{pid} & sleeping for 2s", :red)
|
47
|
+
::Process.kill(sig, pid.to_i)
|
48
|
+
sleep 2
|
49
|
+
tries += 1
|
12
50
|
end
|
13
51
|
end
|
52
|
+
|
53
|
+
return unless found
|
54
|
+
|
55
|
+
if found && tries > 15
|
56
|
+
STDERR.puts "Failed to kill existing process - continuing anyway."
|
57
|
+
return
|
58
|
+
end
|
14
59
|
end
|
15
60
|
end
|
16
61
|
end
|
data/lib/alt-foreman/version.rb
CHANGED
data/lib/alt-foreman.rb
CHANGED
@@ -7,13 +7,17 @@ module Alt
|
|
7
7
|
@mutex = Mutex.new
|
8
8
|
@senders = {}
|
9
9
|
@colours = [:blue, :red, :yellow, :cyan, :green]
|
10
|
-
def self.log(sender, line)
|
10
|
+
def self.log(sender, line, line_colour = nil)
|
11
11
|
@mutex.synchronize do
|
12
12
|
colour = @senders[sender]
|
13
13
|
unless colour
|
14
14
|
colour = @senders[sender] = @colours[@senders.size % @colours.size]
|
15
15
|
end
|
16
|
-
|
16
|
+
line = line.chomp
|
17
|
+
if line_colour
|
18
|
+
line = Term::ANSIColor.send(line_colour, line)
|
19
|
+
end
|
20
|
+
puts Term::ANSIColor.send(colour, Term::ANSIColor.bold(sprintf '%s %15s | ', Time.now.strftime('%H:%M:%S'), sender) + line)
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alt-foreman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2013-01-10 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: term-ansicolor
|
@@ -70,4 +70,3 @@ signing_key:
|
|
70
70
|
specification_version: 3
|
71
71
|
summary: rubbish dev version of foreman
|
72
72
|
test_files: []
|
73
|
-
has_rdoc:
|