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