hoof 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/hoof.gemspec +3 -2
- data/lib/hoof.rb +14 -4
- data/lib/hoof/application.rb +13 -15
- data/lib/hoof/application_pool.rb +5 -6
- data/lib/hoof/cli.rb +23 -6
- data/lib/hoof/control_server.rb +19 -0
- data/lib/hoof/http_server.rb +25 -20
- metadata +5 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/hoof.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{hoof}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["pyromaniac"]
|
12
|
-
s.date = %q{2011-05-
|
12
|
+
s.date = %q{2011-05-16}
|
13
13
|
s.default_executable = %q{hoof}
|
14
14
|
s.description = %q{Hoof is linux variant of pow. It's based on nss, eventmachine and unicorn}
|
15
15
|
s.email = %q{kinwizard@gmail.com}
|
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
|
|
35
35
|
"lib/hoof/application.rb",
|
36
36
|
"lib/hoof/application_pool.rb",
|
37
37
|
"lib/hoof/cli.rb",
|
38
|
+
"lib/hoof/control_server.rb",
|
38
39
|
"lib/hoof/http_server.rb",
|
39
40
|
"lib/hoof/unicorn_config.rb",
|
40
41
|
"test/helper.rb",
|
data/lib/hoof.rb
CHANGED
@@ -3,17 +3,22 @@ require 'unicorn/launcher'
|
|
3
3
|
require 'http/parser'
|
4
4
|
|
5
5
|
require 'hoof/http_server'
|
6
|
+
require 'hoof/control_server'
|
6
7
|
require 'hoof/application'
|
7
8
|
require 'hoof/application_pool'
|
8
9
|
|
9
10
|
module Hoof
|
10
11
|
|
11
12
|
def self.pool
|
12
|
-
@pool ||=
|
13
|
+
@pool ||= begin
|
14
|
+
app_pool = Hoof::ApplicationPool.new
|
15
|
+
app_pool.reload
|
16
|
+
app_pool
|
17
|
+
end
|
13
18
|
end
|
14
19
|
|
15
|
-
def self.
|
16
|
-
pool
|
20
|
+
def self.find name
|
21
|
+
pool[name]
|
17
22
|
end
|
18
23
|
|
19
24
|
def self.start
|
@@ -23,12 +28,17 @@ module Hoof
|
|
23
28
|
trap("INT") { stop }
|
24
29
|
|
25
30
|
EventMachine::start_server "127.0.0.1", 3001, Hoof::HttpServer
|
31
|
+
EventMachine::start_server sock, Hoof::ControlServer
|
26
32
|
end
|
27
33
|
end
|
28
34
|
|
29
35
|
def self.stop
|
30
|
-
EventMachine.stop
|
31
36
|
pool.stop
|
37
|
+
EventMachine.stop
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.sock
|
41
|
+
'/tmp/hoof.sock'
|
32
42
|
end
|
33
43
|
|
34
44
|
end
|
data/lib/hoof/application.rb
CHANGED
@@ -5,18 +5,13 @@ module Hoof
|
|
5
5
|
def initialize name
|
6
6
|
@name = name
|
7
7
|
@root = File.readlink(File.expand_path(File.join("~/.hoof/", name)))
|
8
|
-
|
9
|
-
load_rvm
|
10
|
-
load_bundler
|
11
|
-
start
|
12
8
|
end
|
13
9
|
|
14
10
|
def start
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
Process.kill "TERM", pid if File.exists? pid_file
|
11
|
+
unless running?
|
12
|
+
load_rvm
|
13
|
+
system "cd #{root} && bundle exec unicorn_rails -c #{File.join(File.dirname(__FILE__), 'unicorn_config.rb')} -l #{sock} -D"
|
14
|
+
end
|
20
15
|
end
|
21
16
|
|
22
17
|
def load_rvm
|
@@ -30,12 +25,15 @@ module Hoof
|
|
30
25
|
end
|
31
26
|
end
|
32
27
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
28
|
+
def running?
|
29
|
+
Daemons::Pid.running? pid
|
30
|
+
end
|
31
|
+
|
32
|
+
def stop
|
33
|
+
Process.kill 'TERM', pid if running?
|
36
34
|
end
|
37
35
|
|
38
|
-
def
|
36
|
+
def static_file? path
|
39
37
|
File.file? File.join(root, 'public', path)
|
40
38
|
end
|
41
39
|
|
@@ -51,7 +49,7 @@ module Hoof
|
|
51
49
|
end
|
52
50
|
|
53
51
|
def sock
|
54
|
-
@sock ||=
|
52
|
+
@sock ||= File.join(root, 'tmp/sockets/unicorn.sock')
|
55
53
|
end
|
56
54
|
|
57
55
|
def pid_file
|
@@ -59,7 +57,7 @@ module Hoof
|
|
59
57
|
end
|
60
58
|
|
61
59
|
def pid
|
62
|
-
File.read(pid_file).to_i
|
60
|
+
File.read(pid_file).to_i if File.exists? pid_file
|
63
61
|
end
|
64
62
|
|
65
63
|
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
module Hoof
|
2
2
|
class ApplicationPool < Hash
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
keys
|
4
|
+
def reload
|
5
|
+
Dir[File.expand_path('~/.hoof/*')].each do |dir|
|
6
|
+
name = File.basename dir
|
7
|
+
self[name] = Hoof::Application.new name if File.symlink? dir
|
8
|
+
end
|
10
9
|
end
|
11
10
|
|
12
11
|
def stop
|
data/lib/hoof/cli.rb
CHANGED
@@ -8,17 +8,22 @@ module Hoof
|
|
8
8
|
|
9
9
|
default_task :start
|
10
10
|
|
11
|
-
desc '
|
11
|
+
desc 'start', 'Starts hoof daemon'
|
12
12
|
def start
|
13
13
|
daemon 'start'
|
14
14
|
end
|
15
15
|
|
16
|
-
desc '
|
16
|
+
desc 'stop', 'Stops hoof daemon'
|
17
17
|
def stop
|
18
18
|
daemon 'stop'
|
19
19
|
end
|
20
20
|
|
21
|
-
desc '
|
21
|
+
desc 'restart', 'Restarts hoof daemon'
|
22
|
+
def restart
|
23
|
+
daemon 'restart'
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'init [NAME]', 'Initializes hoof for app in current directory'
|
22
27
|
long_desc <<-D
|
23
28
|
Initializes hoof for current directory application.
|
24
29
|
This task creates symlink in ~/.hoof and adds unicorn to
|
@@ -31,9 +36,10 @@ module Hoof
|
|
31
36
|
append_to_file 'Gemfile', "\ngem 'unicorn'"
|
32
37
|
end
|
33
38
|
|
34
|
-
|
35
|
-
|
36
|
-
|
39
|
+
desc "status", "Lists hoof applications"
|
40
|
+
def status
|
41
|
+
control 'status'
|
42
|
+
end
|
37
43
|
|
38
44
|
private
|
39
45
|
|
@@ -43,5 +49,16 @@ module Hoof
|
|
43
49
|
end
|
44
50
|
end
|
45
51
|
|
52
|
+
def control comand
|
53
|
+
begin
|
54
|
+
UNIXSocket.open(Hoof.sock) do |s|
|
55
|
+
s.write comand
|
56
|
+
puts s.read
|
57
|
+
end
|
58
|
+
rescue Errno::ECONNREFUSED
|
59
|
+
puts 'Hoof is not running'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
46
63
|
end
|
47
64
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Hoof
|
2
|
+
class ControlServer < EventMachine::Connection
|
3
|
+
|
4
|
+
def receive_data data
|
5
|
+
p "comand #{data}"
|
6
|
+
result = send data
|
7
|
+
send_data result
|
8
|
+
close_connection_after_writing
|
9
|
+
end
|
10
|
+
|
11
|
+
def status
|
12
|
+
Hoof.pool.map do |(name, app)|
|
13
|
+
status = app.running? ? "[\033[1;32mrunning\033[0m]" : "[\033[1;31mstopped\033[0m]"
|
14
|
+
" #{app.pid if app.running?}\t#{name}\t\t\t#{status}"
|
15
|
+
end.join("\n")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/lib/hoof/http_server.rb
CHANGED
@@ -1,34 +1,39 @@
|
|
1
1
|
module Hoof
|
2
2
|
class HttpServer < EventMachine::Connection
|
3
|
-
attr_accessor :applications
|
4
|
-
|
5
|
-
def initialize *args
|
6
|
-
super
|
7
|
-
@applications = {}
|
8
|
-
end
|
9
3
|
|
10
4
|
def receive_data data
|
11
5
|
parser = Http::Parser.new
|
12
6
|
parser.parse data
|
13
|
-
|
14
7
|
host = parser.headers["HOST"].gsub(/:\d+$/, '')
|
15
|
-
if host =~ /.dev$/
|
16
|
-
name = host.gsub(/.dev$/, '')
|
17
|
-
application = Hoof.application name
|
18
8
|
|
19
|
-
|
20
|
-
|
21
|
-
|
9
|
+
close_connection and return unless host =~ /.dev$/
|
10
|
+
|
11
|
+
name = host.gsub(/.dev$/, '')
|
12
|
+
path = parser.path.split('?', 2)[0]
|
13
|
+
|
14
|
+
application = Hoof.find name
|
15
|
+
|
16
|
+
if application
|
17
|
+
if application.static_file? path
|
18
|
+
puts "Serve static #{host}#{parser.path}"
|
19
|
+
send_data application.serve_static(path)
|
22
20
|
close_connection_after_writing
|
23
21
|
else
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
begin
|
23
|
+
application.start
|
24
|
+
puts "Serve #{host}#{parser.path}"
|
25
|
+
EventMachine.defer(proc {
|
26
|
+
application.serve data
|
27
|
+
}, proc { |result|
|
28
|
+
send_data result
|
29
|
+
close_connection_after_writing
|
30
|
+
})
|
31
|
+
rescue
|
32
|
+
puts "Failed to serve #{name}"
|
33
|
+
end
|
31
34
|
end
|
35
|
+
else
|
36
|
+
close_connection
|
32
37
|
end
|
33
38
|
end
|
34
39
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hoof
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- pyromaniac
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-05-
|
18
|
+
date: 2011-05-16 00:00:00 +04:00
|
19
19
|
default_executable: hoof
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -174,6 +174,7 @@ files:
|
|
174
174
|
- lib/hoof/application.rb
|
175
175
|
- lib/hoof/application_pool.rb
|
176
176
|
- lib/hoof/cli.rb
|
177
|
+
- lib/hoof/control_server.rb
|
177
178
|
- lib/hoof/http_server.rb
|
178
179
|
- lib/hoof/unicorn_config.rb
|
179
180
|
- test/helper.rb
|