rconf 0.6.5 → 0.6.10

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/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