capricorn 0.2.00
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/app_generators/engine/engine_generator.rb +39 -0
- data/app_generators/engine/templates/Gmfile +20 -0
- data/app_generators/engine/templates/MIT-LICENSE.txt +20 -0
- data/app_generators/engine/templates/README.rdoc +7 -0
- data/app_generators/engine/templates/config/routes.rb +2 -0
- data/app_generators/engine/templates/gitignore +3 -0
- data/app_generators/engine/templates/init.rb +1 -0
- data/app_generators/engine/templates/lib/engine.rb +1 -0
- data/app_generators/engine/templates/rails/init.rb +1 -0
- data/app_generators/engine/templates/tasks/engine_tasks.rake +4 -0
- data/bin/capricorn +20 -0
- data/lib/capricorn.rb +100 -0
- data/lib/capricorn/actor.rb +23 -0
- data/lib/capricorn/actor/actions.rb +76 -0
- data/lib/capricorn/actors/apache_actor.rb +56 -0
- data/lib/capricorn/actors/base_actor.rb +276 -0
- data/lib/capricorn/actors/mysql_actor.rb +20 -0
- data/lib/capricorn/actors/passenger_actor.rb +19 -0
- data/lib/capricorn/actors/plesk_actor.rb +210 -0
- data/lib/capricorn/actors/sqlite3_actor.rb +44 -0
- data/lib/capricorn/app_runner.rb +119 -0
- data/lib/capricorn/apps/dev.rb +15 -0
- data/lib/capricorn/apps/engines.rb +33 -0
- data/lib/capricorn/apps/jobs.rb +35 -0
- data/lib/capricorn/apps/satellite.rb +32 -0
- data/lib/capricorn/apps/server.rb +67 -0
- data/lib/capricorn/client.rb +48 -0
- data/lib/capricorn/client/auth_token.rb +98 -0
- data/lib/capricorn/daemon.rb +71 -0
- data/lib/capricorn/exception_handler.rb +79 -0
- data/lib/capricorn/extentions/rubygems_plugin.rb +27 -0
- data/lib/capricorn/extentions/thor_extentions.rb +32 -0
- data/lib/capricorn/job_queue.rb +199 -0
- data/lib/capricorn/satellite.rb +50 -0
- data/lib/capricorn/satellite/actions.rb +35 -0
- data/lib/capricorn/satellite/dependency_loader.rb +78 -0
- data/lib/capricorn/satellite/persistence.rb +50 -0
- data/lib/capricorn/server.rb +122 -0
- data/lib/capricorn/server/daemon.rb +88 -0
- data/lib/capricorn/server/proxy.rb +25 -0
- data/lib/capricorn/server/security.rb +113 -0
- data/lib/capricorn/system.rb +184 -0
- data/lib/capricorn/system/config.rb +49 -0
- data/lib/capricorn/system/helper.rb +21 -0
- data/lib/capricorn/system/options.rb +79 -0
- data/lib/capricorn/system/process_user.rb +73 -0
- data/lib/capricorn/system/satellites.rb +44 -0
- data/lib/capricorn/system/shell.rb +80 -0
- data/lib/rubygems_plugin.rb +1 -0
- data/spec/actor/actions_spec.rb +13 -0
- data/spec/spec_helper.rb +1 -0
- metadata +108 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
module Capricorn
|
3
|
+
class System
|
4
|
+
module Config
|
5
|
+
|
6
|
+
def use_development!
|
7
|
+
environment { 'development' }
|
8
|
+
end
|
9
|
+
|
10
|
+
def development?
|
11
|
+
environment == 'development'
|
12
|
+
end
|
13
|
+
|
14
|
+
def use_production!
|
15
|
+
environment { 'production' }
|
16
|
+
end
|
17
|
+
|
18
|
+
def production?
|
19
|
+
environment == 'production'
|
20
|
+
end
|
21
|
+
|
22
|
+
def environment(&block)
|
23
|
+
option(:environment, block) { |s,v| v or 'production' }
|
24
|
+
end
|
25
|
+
|
26
|
+
def use_ssl!
|
27
|
+
option(:use_ssl, lambda { true })
|
28
|
+
end
|
29
|
+
|
30
|
+
def use_ssl?
|
31
|
+
option(:use_ssl, nil)
|
32
|
+
end
|
33
|
+
|
34
|
+
def bind(hostname=nil, port=nil)
|
35
|
+
server_hostname { hostname }
|
36
|
+
server_port { port }
|
37
|
+
end
|
38
|
+
|
39
|
+
def server_hostname(&block)
|
40
|
+
option(:server_hostname, block) { |v| v or 'localhost' }
|
41
|
+
end
|
42
|
+
|
43
|
+
def server_port(&block)
|
44
|
+
option(:server_port, block) { |v| v or 5000 }
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
module Capricorn
|
3
|
+
class System
|
4
|
+
module Helper
|
5
|
+
|
6
|
+
def use(actor)
|
7
|
+
actor_klass = (Capricorn::Actors.const_get(actor) rescue nil)
|
8
|
+
raise "Actor not found! (#{actor})" unless actor_klass
|
9
|
+
|
10
|
+
actor_helper = (actor_klass.const_get('Helper') rescue nil)
|
11
|
+
extend actor_helper if actor_helper
|
12
|
+
|
13
|
+
actor_config = (actor_klass.const_get('Config') rescue nil)
|
14
|
+
extend actor_config if actor_config
|
15
|
+
|
16
|
+
@actors.push(actor_klass)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
|
2
|
+
module Capricorn
|
3
|
+
class System
|
4
|
+
module Options
|
5
|
+
|
6
|
+
def option(name, proc, &handler)
|
7
|
+
if proc
|
8
|
+
@option_descriptors.push({
|
9
|
+
:name => name.to_sym,
|
10
|
+
:proc => proc,
|
11
|
+
:handler => handler
|
12
|
+
})
|
13
|
+
else
|
14
|
+
if handler && !@options.key?(name.to_sym)
|
15
|
+
@options[name.to_sym] = handler.call(nil)
|
16
|
+
end
|
17
|
+
@options[name.to_sym]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def satellite_option(name, proc, &handler)
|
22
|
+
if proc
|
23
|
+
@satellite_option_descriptors.push({
|
24
|
+
:name => name.to_sym,
|
25
|
+
:proc => proc,
|
26
|
+
:handler => handler
|
27
|
+
})
|
28
|
+
else
|
29
|
+
if handler && !@satellite_options.key?(name.to_sym)
|
30
|
+
@satellite_options[name.to_sym] = handler.call(@current_satellite, nil)
|
31
|
+
end
|
32
|
+
@satellite_options[name.to_sym]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def set_satellite_option(name, value)
|
37
|
+
@satellite_options[name.to_sym] = value
|
38
|
+
end
|
39
|
+
|
40
|
+
def resolve_options_with(satellite)
|
41
|
+
@current_satellite = satellite
|
42
|
+
resolve_options!
|
43
|
+
|
44
|
+
result = yield
|
45
|
+
|
46
|
+
@current_satellite = nil
|
47
|
+
resolve_options!
|
48
|
+
|
49
|
+
result
|
50
|
+
end
|
51
|
+
|
52
|
+
def resolve_options!
|
53
|
+
resolve_options_for_system!
|
54
|
+
resolve_options_for_satellite!
|
55
|
+
end
|
56
|
+
|
57
|
+
def resolve_options_for_system!
|
58
|
+
@options = {}
|
59
|
+
@option_descriptors.each do |option|
|
60
|
+
value = option[:proc].call if option[:proc]
|
61
|
+
value = option[:handler].call(value) if option[:handler]
|
62
|
+
@options[option[:name]] = value
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def resolve_options_for_satellite!
|
67
|
+
@satellite_options = {}
|
68
|
+
if @current_satellite
|
69
|
+
@satellite_option_descriptors.each do |option|
|
70
|
+
value = option[:proc].call(@current_satellite) if option[:proc]
|
71
|
+
value = option[:handler].call(@current_satellite, value) if option[:handler]
|
72
|
+
@satellite_options[option[:name]] = value
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
|
2
|
+
module Capricorn
|
3
|
+
class System
|
4
|
+
module ProcessUser
|
5
|
+
|
6
|
+
# get the uid for a user name
|
7
|
+
def get_uid(username)
|
8
|
+
return username if Numeric === username
|
9
|
+
Etc.getpwnam(username).uid
|
10
|
+
end
|
11
|
+
|
12
|
+
# get the gid for a group name
|
13
|
+
def get_gid(groupname)
|
14
|
+
return groupname if Numeric === groupname
|
15
|
+
Etc.getgrnam(groupname).gid
|
16
|
+
end
|
17
|
+
|
18
|
+
# get the user name for a uid (or the current process user)
|
19
|
+
def get_user_name(uid=Process.uid)
|
20
|
+
return uid if String === uid
|
21
|
+
Etc.getpwuid(uid).name
|
22
|
+
end
|
23
|
+
|
24
|
+
# get the group name for a gid (or the current process group)
|
25
|
+
def get_group_name(gid=Process.gid)
|
26
|
+
return gid if String === gid
|
27
|
+
Etc.getgrgid(gid).name
|
28
|
+
end
|
29
|
+
|
30
|
+
# is this process running as this user?
|
31
|
+
def is_user(username)
|
32
|
+
uid = get_uid(username)
|
33
|
+
Process.euid == uid and Process.uid == uid
|
34
|
+
end
|
35
|
+
|
36
|
+
# is this process running as this group?
|
37
|
+
def is_group(groupname)
|
38
|
+
gid = get_gid(groupname)
|
39
|
+
Process.egid == gid and Process.gid == gid
|
40
|
+
end
|
41
|
+
|
42
|
+
# switch this user to the specified user and group
|
43
|
+
def switch_to_user(username, groupname=nil)
|
44
|
+
different_uid = (Process.euid != get_uid(username))
|
45
|
+
different_gid = (Process.egid != get_gid(groupname)) if groupname
|
46
|
+
|
47
|
+
if groupname and different_gid
|
48
|
+
Process.gid = Process.egid = get_gid(groupname)
|
49
|
+
end
|
50
|
+
|
51
|
+
if different_uid
|
52
|
+
Process.uid = Process.euid = get_uid(username)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# run the passed block as the specified user and group
|
57
|
+
def as_user(username, groupname=nil, &block)
|
58
|
+
euid = Process.euid
|
59
|
+
egid = Process.egid
|
60
|
+
|
61
|
+
value = nil
|
62
|
+
begin
|
63
|
+
switch_to_user(username, groupname)
|
64
|
+
value = block.call
|
65
|
+
ensure
|
66
|
+
switch_to_user(euid, egid)
|
67
|
+
end
|
68
|
+
value
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
module Capricorn
|
3
|
+
class System
|
4
|
+
module Satellites
|
5
|
+
|
6
|
+
def satellites_hash
|
7
|
+
@satellites || load_satellites
|
8
|
+
end
|
9
|
+
|
10
|
+
def satellites
|
11
|
+
satellites_hash.values
|
12
|
+
end
|
13
|
+
|
14
|
+
def find_satellite(domain)
|
15
|
+
satellites_hash[domain]
|
16
|
+
end
|
17
|
+
|
18
|
+
def save_satellite!(satellite)
|
19
|
+
satellites_hash[satellite.domain] = satellite
|
20
|
+
satellite.dump_file(self.path('satellites', "#{satellite.domain}.yml"))
|
21
|
+
end
|
22
|
+
|
23
|
+
def destroy_satellite!(satellite)
|
24
|
+
satellites_hash.delete(satellite.domain)
|
25
|
+
FileUtils.rm_f(self.path('satellites', "#{satellite.domain}.yml"))
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def load_satellites
|
31
|
+
@satellites = {}
|
32
|
+
|
33
|
+
FileUtils.mkdir_p(self.path('satellites'))
|
34
|
+
Dir.glob(self.path('satellites', '*.yml')).each do |yml|
|
35
|
+
satellite = Capricorn::Satellite.load_file(yml)
|
36
|
+
@satellites[satellite.domain] = satellite
|
37
|
+
end
|
38
|
+
|
39
|
+
@satellites
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
|
2
|
+
module Capricorn
|
3
|
+
class System
|
4
|
+
module Shell
|
5
|
+
|
6
|
+
def run(cmd)
|
7
|
+
as_user 'root', 'wheel' do
|
8
|
+
Capricorn.log "[#{get_user_name}]> "+cmd
|
9
|
+
cmd = "bash -l -c #{cmd.inspect}"
|
10
|
+
output = %x[#{cmd} 2>&1]
|
11
|
+
Capricorn.log output if development?
|
12
|
+
output
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def user_run(username, cmd)
|
17
|
+
as_user 'root', 'wheel' do
|
18
|
+
Capricorn.log "[#{username}]> "+cmd
|
19
|
+
cmd = "su #{username} -l -c #{cmd.inspect}"
|
20
|
+
output = %x[#{cmd} 2>&1]
|
21
|
+
Capricorn.log output if development?
|
22
|
+
output
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def popen(cmd, *args, &block)
|
27
|
+
as_user 'root', 'wheel' do
|
28
|
+
Capricorn.log cmd
|
29
|
+
cmd = "bash -l -c #{cmd.inspect}"
|
30
|
+
IO.popen(cmd, *args, &block)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def user_popen(username, cmd, *args, &block)
|
35
|
+
as_user 'root', 'wheel' do
|
36
|
+
Capricorn.log cmd
|
37
|
+
cmd = "su #{username} -l -c #{cmd.inspect}"
|
38
|
+
IO.popen(cmd, *args, &block)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def find_bin(*names)
|
43
|
+
names = names.flatten.compact.uniq
|
44
|
+
unless names.empty?
|
45
|
+
names = names.join(' ')
|
46
|
+
popen("which #{names}", 'r') do |f|
|
47
|
+
|
48
|
+
until f.eof?
|
49
|
+
path = f.readline
|
50
|
+
next unless path
|
51
|
+
path = path.strip
|
52
|
+
next if path =~ /(Last login)|(You have new)|(Using ruby)/
|
53
|
+
return path
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def user_find_bin(username, *names)
|
61
|
+
names = names.flatten.compact.uniq
|
62
|
+
unless names.empty?
|
63
|
+
names = names.join(' ')
|
64
|
+
user_popen(username, "which #{names}", 'r') do |f|
|
65
|
+
|
66
|
+
until f.eof?
|
67
|
+
path = f.readline
|
68
|
+
next unless path
|
69
|
+
path = path.strip
|
70
|
+
next if path =~ /(Last login)|(You have new)|(Using ruby)/
|
71
|
+
return path
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'capricorn/extentions/rubygems_plugin'
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__)+'/../lib/capricorn'
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capricorn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.00
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Simon Menke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-08-20 00:00:00 +02:00
|
13
|
+
default_executable: capricorn
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Manage satellites
|
17
|
+
email: simon.menke@gmail.com
|
18
|
+
engine_dependencies: {}
|
19
|
+
|
20
|
+
executables:
|
21
|
+
- capricorn
|
22
|
+
extensions: []
|
23
|
+
|
24
|
+
extra_rdoc_files: []
|
25
|
+
|
26
|
+
files:
|
27
|
+
- spec/actor/actions_spec.rb
|
28
|
+
- spec/spec_helper.rb
|
29
|
+
- bin/capricorn
|
30
|
+
- lib/capricorn/actor/actions.rb
|
31
|
+
- lib/capricorn/actor.rb
|
32
|
+
- lib/capricorn/actors/apache_actor.rb
|
33
|
+
- lib/capricorn/actors/base_actor.rb
|
34
|
+
- lib/capricorn/actors/mysql_actor.rb
|
35
|
+
- lib/capricorn/actors/passenger_actor.rb
|
36
|
+
- lib/capricorn/actors/plesk_actor.rb
|
37
|
+
- lib/capricorn/actors/sqlite3_actor.rb
|
38
|
+
- lib/capricorn/app_runner.rb
|
39
|
+
- lib/capricorn/apps/dev.rb
|
40
|
+
- lib/capricorn/apps/engines.rb
|
41
|
+
- lib/capricorn/apps/jobs.rb
|
42
|
+
- lib/capricorn/apps/satellite.rb
|
43
|
+
- lib/capricorn/apps/server.rb
|
44
|
+
- lib/capricorn/client/auth_token.rb
|
45
|
+
- lib/capricorn/client.rb
|
46
|
+
- lib/capricorn/daemon.rb
|
47
|
+
- lib/capricorn/exception_handler.rb
|
48
|
+
- lib/capricorn/extentions/rubygems_plugin.rb
|
49
|
+
- lib/capricorn/extentions/thor_extentions.rb
|
50
|
+
- lib/capricorn/job_queue.rb
|
51
|
+
- lib/capricorn/satellite/actions.rb
|
52
|
+
- lib/capricorn/satellite/dependency_loader.rb
|
53
|
+
- lib/capricorn/satellite/persistence.rb
|
54
|
+
- lib/capricorn/satellite.rb
|
55
|
+
- lib/capricorn/server/daemon.rb
|
56
|
+
- lib/capricorn/server/proxy.rb
|
57
|
+
- lib/capricorn/server/security.rb
|
58
|
+
- lib/capricorn/server.rb
|
59
|
+
- lib/capricorn/system/config.rb
|
60
|
+
- lib/capricorn/system/helper.rb
|
61
|
+
- lib/capricorn/system/options.rb
|
62
|
+
- lib/capricorn/system/process_user.rb
|
63
|
+
- lib/capricorn/system/satellites.rb
|
64
|
+
- lib/capricorn/system/shell.rb
|
65
|
+
- lib/capricorn/system.rb
|
66
|
+
- lib/capricorn.rb
|
67
|
+
- lib/rubygems_plugin.rb
|
68
|
+
- app_generators/engine/engine_generator.rb
|
69
|
+
- app_generators/engine/templates/Gmfile
|
70
|
+
- app_generators/engine/templates/MIT-LICENSE.txt
|
71
|
+
- app_generators/engine/templates/README.rdoc
|
72
|
+
- app_generators/engine/templates/config/routes.rb
|
73
|
+
- app_generators/engine/templates/gitignore
|
74
|
+
- app_generators/engine/templates/init.rb
|
75
|
+
- app_generators/engine/templates/lib/engine.rb
|
76
|
+
- app_generators/engine/templates/rails/init.rb
|
77
|
+
- app_generators/engine/templates/tasks/engine_tasks.rake
|
78
|
+
has_rdoc: true
|
79
|
+
homepage: http://github.com/simonmenke/capricorn
|
80
|
+
licenses: []
|
81
|
+
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
|
85
|
+
require_paths:
|
86
|
+
- lib
|
87
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: "0"
|
92
|
+
version:
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: "0"
|
98
|
+
version:
|
99
|
+
requirements: []
|
100
|
+
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 1.3.5
|
103
|
+
signing_key:
|
104
|
+
specification_version: 3
|
105
|
+
summary: Manage satellites
|
106
|
+
test_files:
|
107
|
+
- spec/actor/actions_spec.rb
|
108
|
+
- spec/spec_helper.rb
|