class RailsPwnerer::App::ClusterConfig

Public Instance Methods

control_all(action) click to toggle source
    # File lib/rails_pwnerer/app/cluster_config.rb
135 def control_all(action)
136   RailsPwnerer::Config.all_applications.each do |ai|
137     case action
138     when :start
139       RailsPwnerer::App::ClusterConfig.new.start ai[0], ai[1]
140     when :stop
141       RailsPwnerer::App::ClusterConfig.new.stop ai[0], ai[1]        
142     end
143   end 
144 end
fix_permissions(app_name, instance_name) click to toggle source
   # File lib/rails_pwnerer/app/cluster_config.rb
 8 def fix_permissions(app_name, instance_name)
 9   app_config = RailsPwnerer::Config[app_name, instance_name]    
10   pwnerer_user = app_config[:pwnerer_user]
11   pwnerer_uid = uid_for_username(pwnerer_user)
12   pwnerer_group = group_for_username(pwnerer_user)
13   
14   writable_dirs = %w(log tmp public)
15   if app_config[:writable_dirs]      
16     writable_dirs += app_config[:writable_dirs].split ','
17   end
18   
19   return unless File.exist?(app_config[:app_path])
20   Dir.chdir app_config[:app_path] do
21     writable_dirs.each do |writable_dir|
22       FileUtils.mkpath writable_dir unless File.exists? writable_dir
23       FileUtils.chown_R(pwnerer_uid, pwnerer_group, writable_dir)
24     end
25   end
26 end
manage(app_name, instance_name, action) click to toggle source
    # File lib/rails_pwnerer/app/cluster_config.rb
126 def manage(app_name, instance_name, action)
127   case action
128   when :checkpoint
129     # nothing to do here
130   when :rollback
131     fix_permissions app_name, instance_name
132   end
133 end
manage_ports(app_name, instance_name, action) click to toggle source
   # File lib/rails_pwnerer/app/cluster_config.rb
28 def manage_ports(app_name, instance_name, action)
29   app_config = RailsPwnerer::Config[app_name, instance_name]
30   return unless frontends = RailsPwnerer::Config.app_frontends(app_name, instance_name)
31   
32   case action
33   when :alloc
34     app_config[:port0] = RailsPwnerer::Config.alloc_ports frontends
35   when :free
36     RailsPwnerer::Config.free_ports app_config[:port0], frontends
37     return if app_config[:port0] == 0 # do not release if ports have already been released
38     app_config[:port0] = 0
39   end
40   RailsPwnerer::Config.flush_db RailsPwnerer::Config.app_db_name(app_name, instance_name)
41 end
post_update(app_name, instance_name) click to toggle source
    # File lib/rails_pwnerer/app/cluster_config.rb
117 def post_update(app_name, instance_name)
118   manage_ports app_name, instance_name, :alloc
119   fix_permissions app_name, instance_name
120 end
pre_update(app_name, instance_name, &update_proc) click to toggle source
    # File lib/rails_pwnerer/app/cluster_config.rb
114 def pre_update(app_name, instance_name, &update_proc)
115   manage_ports app_name, instance_name, :free
116 end
remove(app_name, instance_name) click to toggle source
    # File lib/rails_pwnerer/app/cluster_config.rb
122 def remove(app_name, instance_name)
123   manage_ports app_name, instance_name, :free
124 end
setup(app_name, instance_name) click to toggle source
    # File lib/rails_pwnerer/app/cluster_config.rb
108 def setup(app_name, instance_name)
109   manage_ports app_name, instance_name, :alloc
110   fix_permissions app_name, instance_name
111   # no need to configure nginx here, it'll be done by the executor
112 end
start(app_name, instance_name) click to toggle source
    # File lib/rails_pwnerer/app/cluster_config.rb
 68 def start(app_name, instance_name)
 69   app_config = RailsPwnerer::Config[app_name, instance_name]
 70   # silently die if the app was completely busted
 71   return unless app_config and File.exists? app_config[:app_path]
 72 
 73   app_path, pwnerer_user = app_config[:app_path], app_config[:pwnerer_user]
 74   pwnerer_group = group_for_username(pwnerer_user)    
 75   frontends = RailsPwnerer::Config.app_frontends(app_name, instance_name)
 76   first_port, environment = app_config[:port0], app_config[:environment]
 77 
 78   stop app_name, instance_name
 79   
 80   # alloc a port if somehow that slipped through the cracks
 81   if first_port == 0
 82     manage_ports app_name, instance_name, :alloc
 83     first_port = app_config[:port0]
 84     RailsPwnerer::App::NginxConfig.new.update app_name, instance_name
 85   end
 86   
 87   static_cmd = "thin start -a 127.0.0.1 -c #{app_path} -u #{pwnerer_user} " +
 88                "-g #{pwnerer_group} -e #{environment} -d " +
 89                " --tag rpwn_#{app_name}.#{instance_name} "
 90   
 91   # TODO: start the servers simultaneously
 92   Dir.chdir app_path do
 93     if File.exist? 'config.ru'
 94       static_cmd << '-R config.ru '
 95     else    
 96       static_cmd << '-A rails '
 97     end
 98     static_cmd = 'bundle exec ' + static_cmd if File.exist?('Gemfile')
 99     
100     frontends.times do |f|
101       fe_port = first_port + f
102       cmd = static_cmd + "-p #{fe_port} -l log/fe.#{fe_port}.log -P tmp/pids/fe.#{fe_port}.pid"
103       Kernel.system cmd
104     end
105   end
106 end
stop(app_name, instance_name) click to toggle source
   # File lib/rails_pwnerer/app/cluster_config.rb
43 def stop(app_name, instance_name)
44   app_config = RailsPwnerer::Config[app_name, instance_name]
45   # silently die if the app was completely busted
46   return unless app_config and File.exists? app_config[:app_path]
47       
48   app_path, first_port = app_config[:app_path], app_config[:port0]
49   frontends = RailsPwnerer::Config.app_frontends(app_name, instance_name)
50 
51   cmdline_patterns = ['thin', nil]
52   
53   Dir.chdir app_path do
54     # TODO: stop processes in parallel
55     frontends.times do |f|
56       fe_port = first_port + f
57       cmdline = "thin stop -a 127.0.0.1 -p #{fe_port} -d " +
58                 "-P tmp/pids/fe.#{fe_port}.pid"
59       cmdline = 'bundle exec ' + cmdline if File.exist?('Gemfile')
60       cmdline_patterns[1] = "(127.0.0.1:#{fe_port})"
61       RailsPwnerer::Util.kill_process_set(cmdline, "tmp/pids/fe.#{fe_port}.pid",
62                          cmdline_patterns, :verbose => false, :sleep_delay => 0.2)
63     end
64     
65   end
66 end