source: branches/locker-dev/locker/deploy/bin/rails @ 2259

Last change on this file since 2259 was 2259, checked in by glasgall, 10 years ago
Depend on minitest to make 'rails console' work on ruby1.9
  • Property svn:executable set to *
File size: 7.2 KB
RevLine 
[1295]1#!/usr/bin/perl
2use strict;
3use FindBin qw($Bin);
4use lib $Bin;
5use onserver;
6use Tie::File;
[2149]7use Cwd;
[1295]8
9setup();
10
11sub make_db {
12    my($type) = @_;
13    print "\nCreating $type SQL database for $sname...\n";
14    open GETPWD, '-|', "/mit/scripts/sql/bin$scriptsdev/get-password";
15    ($sqlhost, $sqluser, $sqlpass) = split(/\s/, <GETPWD>);
16    close GETPWD;
17    open SQLDB, '-|', "/mit/scripts/sql/bin$scriptsdev/get-next-database", "${addrlast}_${type}";
18    $sqldb = <SQLDB>;
19    close SQLDB;
20    open SQLDB, '-|', "/mit/scripts/sql/bin$scriptsdev/create-database", $sqldb;
21    $sqldb = <SQLDB>;
22    close SQLDB;
23    if($sqldb eq "") {
24        print "\nERROR:\n";
25        print "Your SQL account failed to create a SQL database.\n";
26        print "You should log in at http://sql.mit.edu to check whether\n";
27        print "your SQL account is at its database limit or its storage limit.\n";
28        print "If you cannot determine the cause of the problem, please\n";
29        print "feel free to contact sql\@mit.edu for assistance.\n";
30        open FAILED, ">.failed";
31        close FAILED;
32        exit 1;
33    }
34    return $sqldb;
35}
36
37my $dev_db = make_db("development");
38my $test_db = make_db("test");
39my $prod_db = make_db("production");
40
[2149]41my $cwd = getcwd;
42system("rails", "new", $cwd ,"-d", "mysql");
43my $appdir = `basename $cwd`;
44chomp $appdir;
45my $appclass = ucfirst $appdir;
[1295]46
47open PUBLIC_HTACCESS, ">public/.htaccess";
48print PUBLIC_HTACCESS <<EOF;
49# General Apache options
50Options +FollowSymLinks +ExecCGI
51
52# If you don't want Rails to look in certain directories,
53# use the following rewrite rules so that Apache won't rewrite certain requests
54#
55# Example:
56#   RewriteCond %{REQUEST_URI} ^/notrails.*
57#   RewriteRule .* - [L]
58
59# Redirect all requests not available on the filesystem to Rails
60# By default the cgi dispatcher is used which is very slow
61#
62# For better performance replace the dispatcher with the fastcgi one
63#
64# Example:
65#   RewriteRule ^(.*)\$ dispatch.fcgi [QSA,L]
66RewriteEngine On
67
68# If your Rails application is accessed via an Alias directive,
69# then you MUST also set the RewriteBase in this htaccess file.
70#
71# Example:
72#   Alias /myrailsapp /path/to/myrailsapp/public
73#   RewriteBase /myrailsapp
74
75RewriteRule ^\$ index.html [QSA]
76RewriteRule ^([^.]+)\$ \$1.html [QSA]
77RewriteCond %{REQUEST_FILENAME} !-f
78RewriteRule ^(.*)\$ dispatch.fcgi [QSA,L]
79
80# In case Rails experiences terminal errors
81# Instead of displaying this message you can supply a file here which will be rendered instead
82#
83# Example:
84#   ErrorDocument 500 /500.html
85
86RewriteBase /$addrend/public/
87EOF
88
89open HTACCESS, ">.htaccess";
90print HTACCESS <<EOF;
91RewriteEngine On
92RewriteRule ^(.*)\$ public/\$1 [QSA,L]
93RewriteBase /$addrend/
94EOF
95
96tie my @railsenv, 'Tie::File', 'config/environment.rb';
[1407]97unshift @railsenv, "# ENV['RAILS_ENV'] ||= 'production'";
98unshift @railsenv, "# Uncomment below to put Rails into production mode";
99unshift @railsenv, "";
[1295]100unshift @railsenv, "ENV['RAILS_RELATIVE_URL_ROOT'] = \"/$addrend\"";
101untie @railsenv;
102
103tie my @railsdb, 'Tie::File', 'config/database.yml';
104for (@railsdb) {
105    s/username:.*$/username: $sqluser/;
106    s/password:.*$/password: $sqlpass/;
107    s/host:.*$/host: $sqlhost/;
108    s/database:.*_development.*/database: $dev_db/;
109    s/database:.*_test.*/database: $test_db/;
110    s/database:.*_production.*/database: $prod_db/;
111}
112untie @railsdb;
113
[1297]114tie my @railswelcome, 'Tie::File', 'public/index.html';
115for (@railswelcome) {
116    s/Create your database/Sync your database/;
117    s/to create your database\..*/to create tables in your database.<\/p>/;
118}
119untie @railswelcome;
120
[1408]121tie my @railsfcgi, 'Tie::File', 'public/dispatch.fcgi';
122for (@railsfcgi) {
123    s/^[^#]*RailsFCGIHandler/## Commented out by scripts.mit.edu autoinstaller\n## RailsFCGIHandler/;
124}
125untie @railsfcgi;
126open RAILSFCGI, ">>public/dispatch.fcgi";
[2149]127print RAILSFCGI "#!/usr/bin/ruby\n";
[1408]128print RAILSFCGI <<EOF;
[2149]129require File.join(File.dirname(__FILE__), '../config/environment')       
130require 'rack'
[1408]131
132## Added by scripts.mit.edu autoinstaller to reload when app code changes
133Thread.abort_on_exception = true
134
[2149]135class Rack::PathInfoRewriter
136  def initialize(app)
137    \@app = app
138  end
139
140  def call(env)
141    env["SCRIPT_NAME"] = ""
142    parts = env['REQUEST_URI'].split('?')
143    env['PATH_INFO'] = parts[0]
144    env['QUERY_STRING'] = parts[1].to_s
145    \@app.call(env)
146  end
147end
148
149
[1408]150t1 = Thread.new do
[2149]151  dispatch_logger = Logger.new(File.join(Rails.root,'log/dispatcher.log'))
152
153  begin
154    Rack::Handler::FastCGI.run Rack::PathInfoRewriter.new(Rack::URLMap.new("/$appdir" => ${appclass}::Application))
155  rescue => e
156   dispatch_logger.error(e)
157   raise e
158  end
[1408]159end
160t2 = Thread.new do
[1469]161   # List of directories to watch for changes before reload.
162   # You may want to also watch public or vendor, depending on your needs.
163   Thread.current[:watched_dirs] = ['app', 'config', 'db', 'lib']
[1484]164
165   # List of specific files to watch for changes.
166   Thread.current[:watched_files] = ['public/dispatch.fcgi',
167                                     'public/.htaccess']
[1411]168   # Sample filter: /(\.rb|\.erb)\$/.  Default filter: watch all files
[1408]169   Thread.current[:watched_extensions] = //
[1410]170   # Iterations since last reload
171   Thread.current[:iterations] = 0
[1408]172
173   def modified(file)
[1410]174     begin
175       mtime = File.stat(file).mtime
176     rescue
177       false
178     else
179       if Thread.current[:iterations] == 0
180         Thread.current[:modifications][file] = mtime
181       end
182       Thread.current[:modifications][file] != mtime
183     end
[1408]184   end
185
[1410]186   # Don't symlink yourself into a loop.  Please.  Things will still work
187   # (Linux limits your symlink depth) but you will be sad
[1408]188   def modified_dir(dir)
189     Dir.new(dir).each do |file|
190       absfile = File.join(dir, file)
191       if FileTest.directory? absfile
192         next if file == '.' or file == '..'
193         return true if modified_dir(absfile)
194       else
195         return true if Thread.current[:watched_extensions] =~ absfile &&
[1410]196           modified(absfile)
[1408]197       end
198     end
199     false
200   end
201
202   def reload
203     Thread.current[:modifications] = {}
[1410]204     Thread.current[:iterations] = 0
[1486]205     # This is a kludge, but at the same time it works.
206     # Will kill the current FCGI process so that it is reloaded
207     # at next request.
208     raise RuntimeError
[1408]209   end
210
211   Thread.current[:modifications] = {}
212   # Wait until the modify time changes, then reload.
213   while true
[1484]214     dir_modified = Thread.current[:watched_dirs].inject(false) {|z, dir| z || modified_dir(File.join(File.dirname(__FILE__), '..', dir))}
215     file_modified = Thread.current[:watched_files].inject(false) {|z, file| z || modified(File.join(File.dirname(__FILE__), '..', file))}
216     reload if dir_modified || file_modified
[1410]217     Thread.current[:iterations] += 1
[1408]218     sleep 1
219   end
220end
221
222t1.join
223t2.join
224## End of scripts.mit.edu autoinstaller additions
225EOF
[2149]226chmod 0755,'public/dispatch.fcgi';
[1408]227
[2149]228# have to explicitly take a dependency on fcgi
[2259]229# ruby1.9 means we need to take a dependency on minitest
230# for rails console to work
[2149]231open GEMFILE, ">>Gemfile";
232print GEMFILE "gem 'fcgi'\n";
[2259]233print GEMFILE "gem 'minitest'\n";
[2149]234close GEMFILE;
235
[1297]236print "Your application is located in:\n";
237print "  /mit/$USER/web_scripts/$addrend/\n";
238print "To run programs like rake or script/generate, run\n";
239print "  'ssh -k $USER\@scripts' and cd to the above directory.\n\n";
240press_enter;
241
[1295]242exit 0;
Note: See TracBrowser for help on using the repository browser.