rconf 0.6.5 → 0.6.10

Sign up to get free protection for your applications and to get access to all the features.
data/bin/rconf CHANGED
@@ -86,14 +86,20 @@ where [options] are:
86
86
  end
87
87
  exit 0
88
88
  end
89
+ Profile.reset if options[:force]
89
90
  ProgressReporter.report_to_stdout
90
91
  ProgressReporter.report_to_file(options[:output]) if options[:output]
91
92
  Command.set_verbose if options[:verbose]
92
93
  begin
93
94
  lang = Language.load(options[:config])
94
95
  report_fatal("Validation of configuration file failed:\n -#{lang.validation_errors.join("\n -").map(&:red)}") unless lang.validation_errors.empty?
95
- Profile.reset if options[:force]
96
- Dir.chdir(File.dirname(options[:config])) { lang.configurators.each(&:run) }
96
+ Dir.chdir(File.dirname(options[:config])) do
97
+ lang.configurators.each do |c|
98
+ c.run
99
+ break if c.aborting
100
+ c.post_process
101
+ end
102
+ end
97
103
  report("Successfully configured #{File.basename(options[:config], '.rc').blue} for #{Platform.family.to_s.blue}")
98
104
  rescue Exception => e
99
105
  raise if e.is_a?(SystemExit)
@@ -121,13 +121,23 @@ module RightConf
121
121
  def run(*args)
122
122
  init
123
123
  sha = Profile.configurator_signature(self.class.key)
124
- if sha != signature
124
+ sig = signature
125
+ if sha != sig
125
126
  Platform.dispatch(*args) { :run }
126
- Profile.set_configurator_signature(self.class.key, signature)
127
+ Profile.set_configurator_signature(self.class.key, sig)
127
128
  end
128
129
  true
129
130
  end
130
131
 
132
+ # Called even if configuration is already done for steps that must
133
+ # always happen, do nothing by default
134
+ #
135
+ # === Return
136
+ # true:: Always return true
137
+ def post_process
138
+ true
139
+ end
140
+
131
141
  # Calculate unique SHA for current settings
132
142
  #
133
143
  # === Return
@@ -49,7 +49,7 @@ module RightConf
49
49
  end
50
50
  alias :run_darwin :run_linux
51
51
 
52
- # Not implemented on windows (no bundler gem there)
52
+ # Not implemented on windows
53
53
  #
54
54
  # === Raise
55
55
  # (Exception):: Always raise
@@ -0,0 +1,320 @@
1
+ # Copyright (C) 2011 RightScale, Inc, All Rights Reserved Worldwide.
2
+ #
3
+ # THIS PROGRAM IS CONFIDENTIAL AND PROPRIETARY TO RIGHTSCALE
4
+ # AND CONSTITUTES A VALUABLE TRADE SECRET. Any unauthorized use,
5
+ # reproduction, modification, or disclosure of this program is
6
+ # strictly prohibited. Any use of this program by an authorized
7
+ # licensee is strictly subject to the terms and conditions,
8
+ # including confidentiality obligations, set forth in the applicable
9
+ # License Agreement between RightScale.com, Inc. and
10
+ # the licensee
11
+
12
+ require 'fileutils'
13
+
14
+ module RightConf
15
+
16
+ class PassengerConfigurator
17
+
18
+ PASSENGER_GEM_VERSION = '2.2.15'
19
+
20
+ DEFAULT_NGINX_INSTALL = ['/opt/nginx', File.join(ENV['HOME'], 'nginx')]
21
+
22
+ include Configurator
23
+
24
+ register :passenger
25
+
26
+ description "Installs and configure passenger with nginx\nNOTE: If the " +
27
+ 'configuration file includes a ruby section before the ' +
28
+ 'passenger section then that ruby will be used, otherwise ' +
29
+ 'the default ruby will.'
30
+
31
+ settings :library_src_path => "Path to library sources, #{File.expand_path(File.join(Dir.getwd, '..', 'library'))} by default",
32
+ :gem_version => "Passenger gem version #{PASSENGER_GEM_VERSION} by default",
33
+ :install_path => 'Path to nginx installation directory, uses /opt/nginx if it ' +
34
+ 'is writable by the current user or ~/nginx otherwise by default'
35
+
36
+ # Install passenger gem in given ruby then run nginx install script
37
+ #
38
+ # === Return
39
+ # true:: Always return true
40
+ def run_linux
41
+ set_defaults
42
+ report_check("Checking for passenger gem #{gem_version}")
43
+ res = Command.execute('gem', 'list', 'passenger')
44
+ success = (res.output =~ /^passenger \(#{gem_version}\)$/)
45
+ report_result(success)
46
+ install_gem unless success
47
+ report_check('Checking for passenger+nginx')
48
+ res = Command.execute('which', 'nginx').success?
49
+ res = File.exists?(File.join(install_path, 'sbin', 'nginx')) unless res
50
+ report_result(res)
51
+ install_passenger unless res
52
+ true
53
+ end
54
+ alias :run_darwin :run_linux
55
+
56
+ # Not implemented on windows
57
+ #
58
+ # === Raise
59
+ # (Exception):: Always raise
60
+ def run_windows
61
+ raise "Passenger is not supported on Windows!"
62
+ end
63
+
64
+ protected
65
+
66
+ # Set default values for settings
67
+ #
68
+ # === Return
69
+ # true:: Always return true
70
+ def set_defaults
71
+ right_site_src_path(Dir.getwd)
72
+ library_src_path(File.expand_path(File.join(Dir.getwd, '..', 'library'))) if library_src_path.nil?
73
+ gem_version(PASSENGER_GEM_VERSION) if gem_version.nil?
74
+ install_path(default_install_path) if install_path.nil?
75
+ user(ENV['USER']) if user.nil?
76
+ true
77
+ end
78
+
79
+ # Retrieve default install path
80
+ # Try /opt/nginx and revert to ~/nginx if not writable
81
+ #
82
+ # === Return
83
+ # path:: Default passenger+nginx install path
84
+ def default_install_path
85
+ path = if File.exist?('/opt')
86
+ if File.exist?('/opt/nginx')
87
+ pick_default_path(File.writable?('/opt/nginx'))
88
+ else
89
+ res = Command.execute('mkdir', '/opt/nginx')
90
+ pick_default_path(res.success?)
91
+ end
92
+ else
93
+ res = Command.execute('mkdir', '-p', '/opt/nginx')
94
+ pick_default_path(res.success?)
95
+ end
96
+ end
97
+
98
+ # First or second choice nginx install path
99
+ #
100
+ # === Parameter
101
+ # first_choice(TrueClass|FalseClass):: Whether to use first or second choice path
102
+ #
103
+ # === Return
104
+ # path(String):: Path
105
+ def pick_default_path(first_choice)
106
+ path = first_choice ? DEFAULT_NGINX_INSTALL[0] : DEFAULT_NGINX_INSTALL[1]
107
+ end
108
+
109
+ # Install passenger gem
110
+ #
111
+ # === Return
112
+ # true:: Always return true
113
+ def install_gem
114
+ report_check('Installing passenger gem')
115
+ Command.execute('gem', 'install', 'passenger', '-v', gem_version,
116
+ :abort_on_failure => "Failed to install passenger gem version #{gem_version}")
117
+ report_success
118
+ end
119
+
120
+ # Install passenger+nginx
121
+ #
122
+ # === Return
123
+ # true:: Always return true
124
+ def install_passenger
125
+ report_check('Installing passenger+nginx')
126
+ # Grrrrr passenger installer expect rake where it's not... HACK
127
+ ruby_dir = File.dirname(`which ruby`.chomp)
128
+ FileUtils.cp(`which rake`.chomp, ruby_dir) unless rake_exist = File.exist?(File.join(ruby_dir, 'rake'))
129
+ Command.execute('passenger-install-nginx-module', '--auto',
130
+ '--auto-download', '--prefix', install_path,
131
+ :abort_on_failure => "Failed to install nginx into #{install_path}")
132
+ FileUtils.mkdir_p(File.join(install_path, 'sites-enabled'))
133
+ FileUtils.mkdir_p(File.join(install_path, 'logs'))
134
+ File.open(File.join(install_path, 'conf', 'nginx.conf'), 'w') { |f| f.puts(nginx_config) }
135
+ File.open(File.join(install_path, 'sites-enabled', 'right_site'), 'w') { |f| f.puts(right_site_config) }
136
+ File.open(File.join(install_path, 'sites-enabled', 'library'), 'w') { |f| f.puts(library_config) }
137
+ if File.writable?('/etc/hosts') && IO.read('/etc/hosts') !~ /hosts_entry/
138
+ File.open('/etc/hosts', 'a') { |f| f.puts hosts_entry }
139
+ else
140
+ post_note "Please add the following line to your /etc/hosts file:\n#{hosts_entry}\n" +
141
+ "\nThe following aliases may help too:\n" +
142
+ "alias nrestart='kill -HUP `cat #{pid_path}/nginx.pid`'\n" +
143
+ "alias nstart='#{install_path}/sbin/nginx'\n" +
144
+ "alias nstop='#{install_path}/sbin/nginx -s stop'"
145
+ end
146
+ File.delete(File.join(ruby_dir, 'rake')) unless rake_exist
147
+ report_success
148
+ end
149
+
150
+ # Hosts entry in /etc/hosts
151
+ #
152
+ # === Return
153
+ # entry(String):: Hosts entry required to run local dev
154
+ def hosts_entry
155
+ '127.0.0.1 right-site.rightscale.local library.rightscale.local rightscale.local'
156
+ end
157
+
158
+ # Nginx error log path
159
+ def log_path
160
+ File.join(install_path, 'logs', 'nginx-error.log')
161
+ end
162
+
163
+ # Nginx pid file path
164
+ def pid_path
165
+ File.join(install_path, 'logs', 'nginx.pid')
166
+ end
167
+
168
+ # Nginx config
169
+ #
170
+ # === Parameters
171
+ # username(String):: Username used to run nginx
172
+ #
173
+ # === Return
174
+ # config(String):: Nginx config
175
+ def nginx_config
176
+ ruby_bin = Command.execute('which', 'ruby').output.chomp
177
+ res = Command.execute('ruby', '-e', "require 'rubygems';puts Gem.source_index.find_name('passenger').detect { |g| g.version.to_s == '#{PASSENGER_GEM_VERSION}' }.full_gem_path",
178
+ :abort_on_failure => 'Could not find passenger gem to build passenger_root')
179
+ passenger_root = res.output.chomp
180
+ report_fatal('Could not find passenger gem') if passenger_root.empty?
181
+ <<-EOS
182
+ worker_processes 1;
183
+
184
+ error_log #{log_path} debug;
185
+ pid #{pid_path};
186
+
187
+ events {
188
+ worker_connections 256;
189
+ }
190
+
191
+ http {
192
+ passenger_root #{passenger_root};
193
+ passenger_ruby #{ruby_bin};
194
+ passenger_max_pool_size 2;
195
+ passenger_pool_idle_time 0;
196
+ passenger_max_instances_per_app 1;
197
+
198
+ include mime.types;
199
+ default_type application/octet-stream;
200
+
201
+
202
+ sendfile on;
203
+ keepalive_timeout 65;
204
+
205
+ gzip on;
206
+ gzip_buffers 16 8k;
207
+ gzip_disable "MSIE [1-6]\.";
208
+ gzip_proxied any;
209
+ gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
210
+
211
+ server {
212
+ ssi on;
213
+ listen 8080;
214
+ server_name right-site.rightscale.local;
215
+ root /Users/raphael/src/right_site/public;
216
+ passenger_enabled on;
217
+ rails_env development;
218
+
219
+ # POST and AJAX requests need to proxied directly to the library app
220
+ #####################################################################
221
+ set $is_library_direct "";
222
+
223
+ # provisioning routes to the library
224
+ if ($request_uri ~ ^/provisioning)
225
+ {
226
+ rewrite ^/provisioning(.*)$ /direct_library/provisioning$1 last;
227
+ }
228
+
229
+ if ($request_uri ~ ^/aria_provisioning_callbacks)
230
+ {
231
+ rewrite ^/aria_provisioning_callbacks(.*)$ /direct_library/aria_provisioning_callbacks$1 last;
232
+ }
233
+
234
+ # request is for a library related action
235
+ if ($request_uri ~ ^/library/)
236
+ {
237
+ set $is_library_direct L;
238
+ }
239
+
240
+ # request is a POST
241
+ if ($request_method = POST)
242
+ {
243
+ set $is_library_direct "${is_library_direct}P";
244
+ }
245
+
246
+ # request is an AJAX
247
+ if ($http_x_requested_with = XMLHttpRequest)
248
+ {
249
+ set $is_library_direct "${is_library_direct}A";
250
+ }
251
+
252
+ # library post request should be directly proxied
253
+ if ($is_library_direct = LP)
254
+ {
255
+ rewrite ^/library/(.*)$ /direct_library/$1 last;
256
+ }
257
+
258
+ # library post ajax request should be directly proxied
259
+ if ($is_library_direct = LPA)
260
+ {
261
+ rewrite ^/library/(.*)$ /direct_library/$1 last;
262
+ }
263
+
264
+ # library ajax request should be directly proxied
265
+ if ($is_library_direct = LA)
266
+ {
267
+ rewrite ^/library/(.*)$ /direct_library/$1 last;
268
+ }
269
+ #####################################################################
270
+
271
+ location /direct_library/
272
+ {
273
+ proxy_pass http://library.rightscale.local:8081/;
274
+ proxy_set_header X-Relative-Root library;
275
+ proxy_set_header X-Embedded on;
276
+ proxy_set_header X-Core-Site-Domain right-site.rightscale.local;
277
+ }
278
+
279
+ location ~ ^/library/users/(.+)/openid_consume
280
+ {
281
+ proxy_pass http://library.rightscale.local:8081/users/$1/openid_consume?$args;
282
+ proxy_set_header X-Relative-Root library;
283
+ proxy_set_header X-Embedded on;
284
+ }
285
+
286
+
287
+ location ~ ^/library/(.*).(css|js)
288
+ {
289
+ # library assets get proxied directly to the library app
290
+ proxy_pass http://library.rightscale.local:8081/$1.$2;
291
+ }
292
+
293
+ location /library_images/
294
+ {
295
+ proxy_pass http://library.rightscale.local:8081/library_images/;
296
+ }
297
+
298
+
299
+ location /library_rest/
300
+ {
301
+ proxy_pass http://127.0.0.1:87/;
302
+ proxy_set_header X-Relative-Root library;
303
+ proxy_set_header X-Core-Site-Domain right-site.rightscale.local;
304
+ }
305
+ }
306
+ server {
307
+ ssi on;
308
+ listen 8081;
309
+ server_name library.rightscale.local;
310
+ root #{library_src_path}/public;
311
+ passenger_enabled on;
312
+ rails_env development;
313
+ }
314
+ }
315
+ EOS
316
+ end
317
+
318
+ end
319
+ end
320
+
@@ -23,9 +23,9 @@ module RightConf
23
23
  description "Installs ruby interpreter and rubygems.\n" +
24
24
  'Installs and uses rvm on supported (i.e. non-Windows) platforms'
25
25
 
26
- settings :version => 'Ruby version using rvm notation (see "rvm list known")',
27
- :rubygems => 'Rubygems version, e.g. "1.3.7"',
28
- :gemset => 'Gemset to be used for platforms supporting rvm'
26
+ settings :version => 'Ruby version using rvm notation (see "rvm list known")',
27
+ :rubygems => 'Rubygems version, e.g. "1.3.7"',
28
+ :gemset => 'Gemset to be used for platforms supporting rvm'
29
29
 
30
30
  validate_has_settings :version, :rubygems
31
31
 
@@ -54,7 +54,8 @@ module RightConf
54
54
  when /^Using /
55
55
  report_success
56
56
  check_rvmrc
57
- post_note "Configuration required switching the active ruby\nPlease 'cd' into the project directory again to activate it"
57
+ post_note "Configuration required switching the active ruby\nPlease run " + 'cd ..;cd -'.blue + ' to activate it and re-run rconf'
58
+ aborting(true)
58
59
  else
59
60
  report_fatal("Failed to use #{version}:\n#{out}")
60
61
  end
@@ -78,7 +79,6 @@ module RightConf
78
79
  :abort_on_failure => "Failed to switch to gemset '#{gemset}'")
79
80
  report_success
80
81
  end
81
- Command.set_prefix("rvm #{version}@#{gemset} exec --")
82
82
  true
83
83
  end
84
84
  alias :run_darwin :run_linux
@@ -91,6 +91,15 @@ module RightConf
91
91
  def run_windows
92
92
  end
93
93
 
94
+ # Set command prefix when already configured
95
+ #
96
+ # === Return
97
+ # true:: Always return true
98
+ def post_process
99
+ Command.set_prefix("rvm #{version}@#{gemset} exec --")
100
+ true
101
+ end
102
+
94
103
  protected
95
104
 
96
105
  # Check whether the right version of RVM is installed and install it if not
@@ -215,6 +224,7 @@ module RightConf
215
224
  FileUtils.mv(bashrc_path, bashrc_path + '.old')
216
225
  File.open(bashrc_path, 'w') { |f| f.puts content }
217
226
  post_note 'rvm was installed, please reload your shell to activate it and re-run rconf'
227
+ aborting(true)
218
228
  end
219
229
  else
220
230
  report_error("Failed to update bashrc to activate rvm, no bashrc found")
data/lib/rconf/profile.rb CHANGED
@@ -57,6 +57,7 @@ module RightConf
57
57
  # true:: Always return true
58
58
  def reset
59
59
  File.delete(profile_path) if File.file?(profile_path)
60
+ @profile = {}
60
61
  true
61
62
  end
62
63
 
data/lib/rconf/version.rb CHANGED
@@ -13,7 +13,7 @@ module RightConf
13
13
 
14
14
  MAJOR = 0
15
15
  MINOR = 6
16
- BUILD = 5
16
+ BUILD = 10
17
17
 
18
18
  VERSION = [MAJOR, MINOR, BUILD].map(&:to_s).join('.')
19
19
 
@@ -29,7 +29,7 @@ describe RightConf::BundlerConfigurator do
29
29
  flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
30
30
  'bundle', '--version').and_return(success_result('0'))
31
31
  flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
32
- 'bundle', 'install', {:abort_on_failure=>"Failed to install gems"}).and_return(success_result)
32
+ 'bundle', 'install', '_0_', {:abort_on_failure=>"Failed to install gems"}).and_return(success_result)
33
33
  @configurator.run_linux
34
34
  end
35
35
 
@@ -37,7 +37,7 @@ describe RightConf::BundlerConfigurator do
37
37
  flexmock(RightConf::Command.instance).should_receive(:execute).twice.with(
38
38
  'bundle', '--version').and_return(success_result('1'))
39
39
  flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
40
- 'bundle', 'install', {:abort_on_failure=>"Failed to install gems"}).and_return(success_result)
40
+ 'bundle', 'install', '_0_', {:abort_on_failure=>"Failed to install gems"}).and_return(success_result)
41
41
  flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
42
42
  'gem', 'uninstall', 'bundler', '-a', '-x').and_return(success_result)
43
43
  flexmock(RightConf::Command.instance).should_receive(:execute).once.with(
@@ -0,0 +1,44 @@
1
+ # Copyright (C) 2011 RightScale, Inc, All Rights Reserved Worldwide.
2
+ #
3
+ # THIS PROGRAM IS CONFIDENTIAL AND PROPRIETARY TO RIGHTSCALE
4
+ # AND CONSTITUTES A VALUABLE TRADE SECRET. Any unauthorized use,
5
+ # reproduction, modification, or disclosure of this program is
6
+ # strictly prohibited. Any use of this program by an authorized
7
+ # licensee is strictly subject to the terms and conditions,
8
+ # including confidentiality obligations, set forth in the applicable
9
+ # License Agreement between RightScale.com, Inc. and
10
+ # the licensee
11
+
12
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
13
+
14
+ describe RightConf::PassengerConfigurator do
15
+
16
+ before(:each) do
17
+ lang = RightConf::Language.parse('passenger {}')
18
+ @configurator = lang.configurators.first
19
+ [:report_check, :report_result, :report_fatal, :report_success].each do |meth|
20
+ flexmock(@configurator).should_receive(meth)
21
+ end
22
+ end
23
+
24
+ it 'should set defaults' do
25
+ @configurator.__send__(:set_defaults)
26
+ @configurator.right_site_src_path.should == Dir.getwd
27
+ @configurator.library_src_path.should == File.expand_path(File.join(Dir.getwd, '..', 'library'))
28
+ @configurator.gem_version.should == RightConf::PassengerConfigurator::PASSENGER_GEM_VERSION
29
+ @configurator.install_path.should == @configurator.__send__(:default_install_path)
30
+ @configurator.user.should == ENV['USER']
31
+ end
32
+
33
+ it 'should default to /opt/nginx when possible' do
34
+ to_check = File.exist?('/opt/nginx') ? '/opt/nginx' :
35
+ (File.exist?('/opt') ? '/opt' : '/')
36
+ if File.writable?(to_check)
37
+ @configurator.__send__(:default_install_path).should == '/opt/nginx'
38
+ else
39
+ pending '/opt/nginx not writable'
40
+ end
41
+ end
42
+
43
+ end
44
+
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rconf
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.6.5
5
+ version: 0.6.10
6
6
  platform: ruby
7
7
  authors:
8
8
  - Raphael Simon
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-08 00:00:00 -08:00
13
+ date: 2011-03-11 00:00:00 -08:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -64,6 +64,7 @@ files:
64
64
  - lib/rconf/configurator_registry.rb
65
65
  - lib/rconf/configurators/bundler_configurator.rb
66
66
  - lib/rconf/configurators/packages_configurator.rb
67
+ - lib/rconf/configurators/passenger_configurator.rb
67
68
  - lib/rconf/configurators/ruby_configurator.rb
68
69
  - lib/rconf/language.rb
69
70
  - lib/rconf/platform.rb
@@ -84,6 +85,7 @@ files:
84
85
  - spec/configurator_spec.rb
85
86
  - spec/configurators/bundler_configurator_spec.rb
86
87
  - spec/configurators/packages_configurator_spec.rb
88
+ - spec/configurators/passenger_configurator_spec.rb
87
89
  - spec/configurators/ruby_configurator_spec.rb
88
90
  - spec/language_spec.rb
89
91
  - spec/platform_spec.rb
@@ -126,6 +128,7 @@ test_files:
126
128
  - spec/configurator_spec.rb
127
129
  - spec/configurators/bundler_configurator_spec.rb
128
130
  - spec/configurators/packages_configurator_spec.rb
131
+ - spec/configurators/passenger_configurator_spec.rb
129
132
  - spec/configurators/ruby_configurator_spec.rb
130
133
  - spec/language_spec.rb
131
134
  - spec/platform_spec.rb