simonmenke-shuttle 0.1.07
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/config/routes.rb +2 -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/bin/shuttle +20 -0
- data/lib/rubygems_plugin.rb +1 -0
- data/lib/shuttle/actor/actions.rb +76 -0
- data/lib/shuttle/actor.rb +23 -0
- data/lib/shuttle/actors/apache_actor.rb +56 -0
- data/lib/shuttle/actors/base_actor.rb +276 -0
- data/lib/shuttle/actors/mysql_actor.rb +20 -0
- data/lib/shuttle/actors/passenger_actor.rb +19 -0
- data/lib/shuttle/actors/plesk_actor.rb +210 -0
- data/lib/shuttle/actors/sqlite3_actor.rb +44 -0
- data/lib/shuttle/app_runner.rb +118 -0
- data/lib/shuttle/apps/dev.rb +27 -0
- data/lib/shuttle/apps/engines.rb +33 -0
- data/lib/shuttle/apps/jobs.rb +35 -0
- data/lib/shuttle/apps/satellite.rb +32 -0
- data/lib/shuttle/apps/server.rb +70 -0
- data/lib/shuttle/client/auth_token.rb +98 -0
- data/lib/shuttle/client.rb +48 -0
- data/lib/shuttle/exception_handler.rb +53 -0
- data/lib/shuttle/extentions/rubygems_plugin.rb +27 -0
- data/lib/shuttle/extentions/thor_extentions.rb +32 -0
- data/lib/shuttle/job_queue.rb +199 -0
- data/lib/shuttle/satellite/actions.rb +35 -0
- data/lib/shuttle/satellite/dependency_loader.rb +79 -0
- data/lib/shuttle/satellite/persistence.rb +50 -0
- data/lib/shuttle/satellite.rb +49 -0
- data/lib/shuttle/server/daemon.rb +85 -0
- data/lib/shuttle/server/proxy.rb +25 -0
- data/lib/shuttle/server/security.rb +113 -0
- data/lib/shuttle/server.rb +113 -0
- data/lib/shuttle/system/config.rb +36 -0
- data/lib/shuttle/system/helper.rb +21 -0
- data/lib/shuttle/system/options.rb +79 -0
- data/lib/shuttle/system/process_user.rb +75 -0
- data/lib/shuttle/system/satellites.rb +44 -0
- data/lib/shuttle/system/shell.rb +80 -0
- data/lib/shuttle/system.rb +159 -0
- data/lib/shuttle/systems/centos_plesk_system.rb +28 -0
- data/lib/shuttle/systems/macports_system.rb +14 -0
- data/lib/shuttle.rb +82 -0
- data/spec/actor/actions_spec.rb +13 -0
- data/spec/spec_helper.rb +1 -0
- metadata +129 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
class EngineGenerator < RubiGen::Base
|
2
|
+
attr_reader :engine_name
|
3
|
+
|
4
|
+
def initialize(runtime_args, runtime_options = {})
|
5
|
+
super
|
6
|
+
@destination_root = args.shift
|
7
|
+
@engine_name = File.basename(File.expand_path(@destination_root)).underscore
|
8
|
+
end
|
9
|
+
|
10
|
+
def manifest
|
11
|
+
record do |m|
|
12
|
+
|
13
|
+
m.directory "app/controllers"
|
14
|
+
m.directory "app/models"
|
15
|
+
m.directory "app/views"
|
16
|
+
m.directory "app/helpers"
|
17
|
+
m.directory "config"
|
18
|
+
m.directory "db/migrate"
|
19
|
+
m.directory "lib"
|
20
|
+
m.directory "public/images"
|
21
|
+
m.directory "public/javascripts"
|
22
|
+
m.directory "public/stylesheets"
|
23
|
+
m.directory "rails"
|
24
|
+
m.directory "tasks"
|
25
|
+
|
26
|
+
m.template('config/routes.rb', "config/routes.rb")
|
27
|
+
m.template('Gmfile', "Gmfile")
|
28
|
+
m.template('rails/init.rb', "rails/init.rb")
|
29
|
+
m.template('init.rb', "init.rb")
|
30
|
+
m.template('tasks/engine_tasks.rake', "tasks/#{engine_name}_tasks.rake")
|
31
|
+
m.template('README.rdoc', "README.rdoc")
|
32
|
+
m.template('MIT-LICENSE.txt', "MIT-LICENSE.txt")
|
33
|
+
m.template('lib/engine.rb', "lib/#{engine_name}.rb")
|
34
|
+
m.template('gitignore', ".gitignore")
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__)+'/rails/init'
|
@@ -0,0 +1 @@
|
|
1
|
+
# <%= engine_name.camelize %>
|
@@ -0,0 +1 @@
|
|
1
|
+
# Include hook code here
|
data/bin/shuttle
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
begin
|
3
|
+
require File.dirname(__FILE__)+'/../lib/shuttle'
|
4
|
+
rescue LoadError
|
5
|
+
require 'rubygems'
|
6
|
+
require 'shuttle'
|
7
|
+
end
|
8
|
+
|
9
|
+
module Shuttle
|
10
|
+
BIN_PATH = File.expand_path($PROGRAM_NAME)
|
11
|
+
ORIGINAL_ARGV = ARGV.dup
|
12
|
+
end
|
13
|
+
|
14
|
+
Shuttle::AppRunner.use :Server
|
15
|
+
Shuttle::AppRunner.use :Satellite
|
16
|
+
Shuttle::AppRunner.use :Engines
|
17
|
+
Shuttle::AppRunner.use :Jobs
|
18
|
+
Shuttle::AppRunner.use :Dev
|
19
|
+
Shuttle::AppRunner.namespace = 'shuttle:apps'
|
20
|
+
Shuttle::AppRunner.start
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'shuttle/extentions/rubygems_plugin'
|
@@ -0,0 +1,76 @@
|
|
1
|
+
|
2
|
+
module Shuttle
|
3
|
+
class Actor
|
4
|
+
module Actions
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.extend Shuttle::Actor::Actions::ClassMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
# run the callbacks registerd to <tt>action</tt>. the will run the <tt>before</tt>, <tt>on</tt> and <tt>after</tt> fases.
|
11
|
+
def run_callbacks!(action)
|
12
|
+
action = action.to_sym
|
13
|
+
run_callbacks_in_fase! action, :before
|
14
|
+
run_callbacks_in_fase! action, :on
|
15
|
+
run_callbacks_in_fase! action, :after
|
16
|
+
end
|
17
|
+
|
18
|
+
# run the callbacks registerd to <tt>action</tt> in the +fase+
|
19
|
+
def run_callbacks_in_fase!(action, fase)
|
20
|
+
action = action.to_sym
|
21
|
+
fase = fase.to_sym
|
22
|
+
self.class.methods_for(action, fase).each { |meth| self.send(meth) }
|
23
|
+
end
|
24
|
+
|
25
|
+
module ClassMethods
|
26
|
+
|
27
|
+
# register a callback to be run <tt>before</tt> the <tt>action</tt>.
|
28
|
+
def before(action, meth)
|
29
|
+
methods_for(action, :before).push(meth.to_sym)
|
30
|
+
end
|
31
|
+
|
32
|
+
# register a callback to be run <tt>on</tt> the <tt>action</tt>.
|
33
|
+
def on(action, meth)
|
34
|
+
methods_for(action, :on).push(meth.to_sym)
|
35
|
+
end
|
36
|
+
|
37
|
+
# register a callback to be run <tt>after</tt> the <tt>action</tt>.
|
38
|
+
def after(action, meth)
|
39
|
+
methods_for(action, :after).push(meth.to_sym)
|
40
|
+
end
|
41
|
+
|
42
|
+
# get the registered callbacks for the +action+ and +face+.
|
43
|
+
def methods_for(action, fase)
|
44
|
+
action = action.to_sym
|
45
|
+
fase = fase.to_sym
|
46
|
+
|
47
|
+
@actions ||= {}
|
48
|
+
@actions[action] ||= {}
|
49
|
+
@actions[action][fase] ||= []
|
50
|
+
@actions[action][fase]
|
51
|
+
end
|
52
|
+
|
53
|
+
# define one or more actions.
|
54
|
+
def action(*names)
|
55
|
+
names.each do |name|
|
56
|
+
module_eval %{
|
57
|
+
def self.before_#{name}(meth)
|
58
|
+
before(:#{name}, meth)
|
59
|
+
end
|
60
|
+
def self.on_#{name}(meth)
|
61
|
+
on(:#{name}, meth)
|
62
|
+
end
|
63
|
+
def self.after_#{name}(meth)
|
64
|
+
after(:#{name}, meth)
|
65
|
+
end
|
66
|
+
def run_#{name}_callbacks!
|
67
|
+
run_callbacks!(:#{name})
|
68
|
+
end
|
69
|
+
}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
module Shuttle
|
3
|
+
|
4
|
+
# The actor class provides the mechanisme for scheduling the execution of seperate tasks.
|
5
|
+
class Actor
|
6
|
+
|
7
|
+
autoload :Actions, File.dirname(__FILE__)+'/actor/actions'
|
8
|
+
|
9
|
+
include Shuttle::Actor::Actions
|
10
|
+
|
11
|
+
attr_reader :system, :satellite
|
12
|
+
|
13
|
+
action :install_satellite, :uninstall_satellite, :link_satellite
|
14
|
+
action :install_engine, :uninstall_engine, :update_engine
|
15
|
+
|
16
|
+
# create a new actor for the provided system and satellite
|
17
|
+
def initialize(system, satellite)
|
18
|
+
@system = system
|
19
|
+
@satellite = satellite
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
|
2
|
+
module Shuttle
|
3
|
+
module Actors # :nodoc:
|
4
|
+
class ApacheActor < Shuttle::Actor
|
5
|
+
|
6
|
+
on_install_satellite :write_config_file
|
7
|
+
after_install_satellite :restart
|
8
|
+
|
9
|
+
on_uninstall_satellite :remove_config_file
|
10
|
+
after_uninstall_satellite :restart
|
11
|
+
|
12
|
+
# restart the apache server
|
13
|
+
def restart
|
14
|
+
system.run "#{system.apachectl_path} -k restart"
|
15
|
+
end
|
16
|
+
|
17
|
+
# write the vhost config file (needs apache restart)
|
18
|
+
def write_config_file
|
19
|
+
config = %{<VirtualHost *>
|
20
|
+
ServerName #{satellite.domain}
|
21
|
+
|
22
|
+
ErrorLog logs/#{satellite.domain}.error.log
|
23
|
+
CustomLog logs/#{satellite.domain}.access.log common
|
24
|
+
DocumentRoot #{system.satellite_root}/public
|
25
|
+
<Directory "#{system.satellite_root}/public">
|
26
|
+
Options All
|
27
|
+
AllowOverride All
|
28
|
+
Order allow,deny
|
29
|
+
Allow from all
|
30
|
+
</Directory>
|
31
|
+
</VirtualHost>}
|
32
|
+
File.open(system.apache_conf_path, 'w+') { |f| f.write config }
|
33
|
+
end
|
34
|
+
|
35
|
+
# remove the vhost config file (needs apache restart)
|
36
|
+
def remove_config_file
|
37
|
+
File.unlink(system.apache_conf_path) if File.exist? system.apache_conf_path
|
38
|
+
end
|
39
|
+
|
40
|
+
module Config
|
41
|
+
|
42
|
+
# path to the apachectl tool
|
43
|
+
def apachectl_path(&block)
|
44
|
+
option(:apachectl_path, block) { |v| v or find_bin('apache2ctl', 'apachectl') }
|
45
|
+
end
|
46
|
+
|
47
|
+
# path to the vhost specific config files
|
48
|
+
def apache_conf_path(&block)
|
49
|
+
satellite_option(:apache_conf_path, block) { |s,v| v or "/opt/local/apache2/conf/apps/#{s.domain}.conf" }
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,276 @@
|
|
1
|
+
|
2
|
+
module Shuttle
|
3
|
+
module Actors # :nodoc:
|
4
|
+
class BaseActor < Shuttle::Actor
|
5
|
+
|
6
|
+
on_install_satellite :create_rails_app
|
7
|
+
on_link_satellite :link_engines
|
8
|
+
on_uninstall_satellite :destroy_rails_app
|
9
|
+
|
10
|
+
# create a new rails app for the current satellite
|
11
|
+
def create_rails_app
|
12
|
+
system.as_user(system.web_user, system.web_group) do
|
13
|
+
FileUtils.mkdir_p(File.dirname(system.satellite_root), :verbose => true)
|
14
|
+
FileUtils.mkdir_p(system.shared_root, :verbose => true)
|
15
|
+
end
|
16
|
+
|
17
|
+
Dir.chdir(File.dirname(system.satellite_root)) do
|
18
|
+
system.user_run system.web_user, "rails --force #{system.satellite_root}"
|
19
|
+
end
|
20
|
+
|
21
|
+
system.as_user(system.web_user, system.web_group) do
|
22
|
+
Dir.chdir(File.dirname(system.satellite_root)) do
|
23
|
+
link(File.join(system.shared_root, 'public'),
|
24
|
+
File.join(system.satellite_root, 'public', 'system'))
|
25
|
+
link(File.join(system.shared_root, 'private'),
|
26
|
+
File.join(system.satellite_root, 'db', 'system'))
|
27
|
+
link(File.join(system.shared_root, 'log'),
|
28
|
+
File.join(system.satellite_root, 'log'))
|
29
|
+
link(File.join(system.shared_root, 'settings'),
|
30
|
+
File.join(system.satellite_root, 'config', 'settings'))
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# destroy the rails app for the current satellite
|
37
|
+
def destroy_rails_app
|
38
|
+
FileUtils.rm_rf system.satellite_root, :verbose => true
|
39
|
+
end
|
40
|
+
|
41
|
+
# link the required engines for the current satellite
|
42
|
+
def link_engines
|
43
|
+
Dir.chdir(system.satellite_root) do
|
44
|
+
system.as_user(system.web_user, system.web_group) do
|
45
|
+
|
46
|
+
write_environment
|
47
|
+
clean_links
|
48
|
+
@dependecies.reverse_each do |spec|
|
49
|
+
link_engine(spec)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
run_migrations
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def link(src, dst)
|
60
|
+
FileUtils.mkdir_p(File.dirname(dst), :verbose => true)
|
61
|
+
FileUtils.mkdir_p(src, :verbose => true)
|
62
|
+
FileUtils.rm_rf dst, :verbose => true
|
63
|
+
FileUtils.symlink(src, dst, :verbose => true)
|
64
|
+
end
|
65
|
+
|
66
|
+
def write_environment
|
67
|
+
@dependecies = Shuttle::Satellite::DependencyLoader.load_for(satellite.engines)
|
68
|
+
@dependecies.engines
|
69
|
+
|
70
|
+
rails_header = "Rails::Initializer.run do |config|\n"
|
71
|
+
gems_header = " # Gems added by engine_manager:\n \n"
|
72
|
+
|
73
|
+
gsub_file('config/environment.rb') do |content|
|
74
|
+
content.gsub! /^\s*config.gem.+\n/, ''
|
75
|
+
content.gsub! %r{#{Regexp.escape(rails_header)}(#{Regexp.escape(gems_header)})?},
|
76
|
+
"#{rails_header}#{gems_header}"
|
77
|
+
|
78
|
+
@dependecies.reverse_each do |spec|
|
79
|
+
gem_options = @dependecies.engines[spec.name] || {}
|
80
|
+
content.gsub! "engine_manager:\n",
|
81
|
+
"engine_manager:\n config.gem #{spec.name.inspect}, #{gem_options.inspect}\n"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def link_engine(spec)
|
87
|
+
Shuttle.log "linking: #{spec.name}..."
|
88
|
+
path = File.join(spec.full_gem_path, 'public')
|
89
|
+
if File.directory?(path)
|
90
|
+
FileUtils.mkdir_p('public/vendor', :verbose => true)
|
91
|
+
FileUtils.ln_s(path, "public/vendor/#{spec.name}", :verbose => true)
|
92
|
+
end
|
93
|
+
|
94
|
+
path = File.join(spec.full_gem_path, 'tasks')
|
95
|
+
if File.directory?(path)
|
96
|
+
FileUtils.mkdir_p("lib/tasks/vendor/#{spec.name}", :verbose => true)
|
97
|
+
Dir.glob("#{path}/*.rake").each do |rake_file|
|
98
|
+
FileUtils.ln_s(rake_file,
|
99
|
+
"lib/tasks/vendor/#{spec.name}/#{File.basename(rake_file)}", :verbose => true)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
path = File.join(spec.full_gem_path, 'db', 'migrate')
|
104
|
+
if File.directory?(path)
|
105
|
+
FileUtils.mkdir_p("db/migrate", :verbose => true)
|
106
|
+
unlinked_migrations.concat(Dir.glob("#{path}/*.rb"))
|
107
|
+
linked_migrations.each do |migration, target|
|
108
|
+
if target.starts_with? spec.full_gem_path
|
109
|
+
unlinked_migrations.delete(target)
|
110
|
+
unused_migrations.delete(migration)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def clean_links
|
117
|
+
FileUtils.rm_rf("lib/tasks/vendor", :verbose => true)
|
118
|
+
FileUtils.rm_rf("public/vendor", :verbose => true)
|
119
|
+
end
|
120
|
+
|
121
|
+
def run_migrations
|
122
|
+
Shuttle.log "running your migrations..." unless unlinked_migrations.empty? and unused_migrations.empty?
|
123
|
+
|
124
|
+
unlinked_migration_targets = unlinked_migrations.collect{ |migration|
|
125
|
+
File.basename(migration) }
|
126
|
+
|
127
|
+
unused_migrations.each do |migration, target|
|
128
|
+
unless unlinked_migration_targets.include? File.basename(migration)
|
129
|
+
migration =~ /(\d+)_[^.]+\.rb/
|
130
|
+
system.user_run(system.web_user, "cd #{system.satellite_root} ; rake db:migrate:down RAILS_ENV=#{system.rails_environment} VERSION=#{$1}")
|
131
|
+
end
|
132
|
+
FileUtils.rm_rf(migration, :verbose => true)
|
133
|
+
end
|
134
|
+
system.as_user(system.web_user, system.web_group) do
|
135
|
+
unlinked_migrations.each do |migration|
|
136
|
+
FileUtils.ln_s(migration, "db/migrate/#{File.basename(migration)}", :verbose => true)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
unless unlinked_migrations.empty?
|
141
|
+
system.user_run(system.web_user, "cd #{system.satellite_root} ; rake db:migrate RAILS_ENV=#{system.rails_environment}")
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def gsub_file(path, pattern=nil, replace=nil, &block)
|
146
|
+
if File.exist? path
|
147
|
+
content = File.read(path)
|
148
|
+
if block
|
149
|
+
block.call(content)
|
150
|
+
else
|
151
|
+
return false unless content.gsub!(pattern, replace)
|
152
|
+
end
|
153
|
+
File.open(path, 'w+') { |f| f.write content }
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def linked_migrations
|
158
|
+
@linked_migrations ||= Dir.glob('db/migrate/*.rb').select { |migration| File.symlink?(migration) }.inject({}) { |m, migration| m[migration] = File.readlink(migration) ; m }
|
159
|
+
end
|
160
|
+
|
161
|
+
def unused_migrations
|
162
|
+
@unused_migrations ||= linked_migrations.dup
|
163
|
+
end
|
164
|
+
|
165
|
+
def unlinked_migrations
|
166
|
+
@unlinked_migrations ||= []
|
167
|
+
end
|
168
|
+
|
169
|
+
module Helper
|
170
|
+
|
171
|
+
# install a gem.
|
172
|
+
def gem_install(name, options={})
|
173
|
+
gem_cmd('install', name, options)
|
174
|
+
end
|
175
|
+
|
176
|
+
# check if a gem is installed
|
177
|
+
def gem_installed(name, options)
|
178
|
+
version = options[:version] || '0.0.0'
|
179
|
+
options = { :version => version, :installed => true }
|
180
|
+
(gem_cmd('list', name, options).strip == 'true')
|
181
|
+
end
|
182
|
+
|
183
|
+
# update a gem
|
184
|
+
def gem_update(name, options={})
|
185
|
+
!(gem_cmd('update', name, options) =~ /Nothing to update/)
|
186
|
+
end
|
187
|
+
|
188
|
+
# ensure the presence of a gem
|
189
|
+
def ensure_presence_of_gem(name, options={})
|
190
|
+
if !gem_installed(name, options)
|
191
|
+
gem_install(name, options)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
private
|
196
|
+
|
197
|
+
def gem_cmd(cmd, args, options={})
|
198
|
+
user = options.delete(:user)
|
199
|
+
user ||= (install_gems_with_web_user ? web_user : system_user)
|
200
|
+
|
201
|
+
args = [args].flatten.compact
|
202
|
+
args.collect! { |a| (a and a.inspect) || '' }
|
203
|
+
args += options.map do |k,v|
|
204
|
+
if TrueClass === v
|
205
|
+
"--#{k}"
|
206
|
+
else
|
207
|
+
"--#{k}=#{v.inspect}"
|
208
|
+
end
|
209
|
+
end
|
210
|
+
output = user_run(user, "#{gem_bin_path} #{cmd} #{args.join(' ')}")
|
211
|
+
Gem.refresh
|
212
|
+
output
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
216
|
+
|
217
|
+
module Config
|
218
|
+
|
219
|
+
# set the path to the ruby executable.
|
220
|
+
def ruby_path(&block)
|
221
|
+
option(:ruby_path, block) { |s, v| v or find_bin('ruby', 'ruby1.8', 'ruby18') }
|
222
|
+
end
|
223
|
+
|
224
|
+
# set the path to the gem executable.
|
225
|
+
def gem_bin_path(&block)
|
226
|
+
option(:gem_bin_path, block) { |s, v| v or find_bin('gem', 'gem1.8', 'gem18') }
|
227
|
+
end
|
228
|
+
|
229
|
+
# set the path to the rails executable.
|
230
|
+
def rails_path(&block)
|
231
|
+
option(:rails_path, block) do |v|
|
232
|
+
user = (install_gems_with_web_user ? web_user : system_user)
|
233
|
+
v or user_find_bin(user, 'rails')
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
# set the owner group of the current satellite.
|
238
|
+
def web_group(&block)
|
239
|
+
satellite_option(:web_group, block)
|
240
|
+
end
|
241
|
+
|
242
|
+
# set the owner of the current satellite.
|
243
|
+
def web_user(&block)
|
244
|
+
satellite_option(:web_user, block)
|
245
|
+
end
|
246
|
+
|
247
|
+
# set the system user (the user which runs the shuttle server).
|
248
|
+
def system_user(&block)
|
249
|
+
option(:system_user, block) { |v| v or 'root' }
|
250
|
+
end
|
251
|
+
|
252
|
+
# set whether gems should be installed with the web user.
|
253
|
+
def install_gems_with_web_user(&block)
|
254
|
+
option(:install_gems_with_web_user, block)
|
255
|
+
end
|
256
|
+
|
257
|
+
# set the path to the satellite's root path
|
258
|
+
def satellite_root(&block)
|
259
|
+
satellite_option(:satellite_root, block)
|
260
|
+
end
|
261
|
+
|
262
|
+
# set the path to the satellite's shared path
|
263
|
+
def shared_root(&block)
|
264
|
+
satellite_option(:shared_root, block)
|
265
|
+
end
|
266
|
+
|
267
|
+
# set the rails environment.
|
268
|
+
def rails_environment(&block)
|
269
|
+
satellite_option(:rails_environment, block) { |s,v| v or 'development' }
|
270
|
+
end
|
271
|
+
|
272
|
+
end
|
273
|
+
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
module Shuttle
|
3
|
+
module Actors # :nodoc:
|
4
|
+
class MysqlActor < Shuttle::Actor
|
5
|
+
|
6
|
+
on_install_satellite :create_database
|
7
|
+
before_uninstall_satellite :backup_database
|
8
|
+
on_uninstall_satellite :drop_database
|
9
|
+
|
10
|
+
def create_database
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
def drop_database
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
module Shuttle
|
3
|
+
module Actors # :nodoc:
|
4
|
+
class PassengerActor < Shuttle::Actor
|
5
|
+
|
6
|
+
after_install_satellite :restart
|
7
|
+
after_link_satellite :restart
|
8
|
+
|
9
|
+
# restart the current satellite.
|
10
|
+
def restart
|
11
|
+
system.as_user(system.web_user, system.web_group) do
|
12
|
+
tmp_restart = File.join(system.satellite_root, 'tmp', 'restart.txt')
|
13
|
+
FileUtils.touch tmp_restart, :verbose => true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|