slingshot 1.0.0

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/History.txt ADDED
@@ -0,0 +1,10 @@
1
+ == 0.0.1 2007-05-25
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
5
+ * Includes all server setup tasks
6
+
7
+ == 1.0.0 2007-06-30
8
+
9
+ * Version 1.0.0 Release!
10
+ * New! Improved! Better than Ever!
data/License.txt ADDED
@@ -0,0 +1,34 @@
1
+ Copyright (c) 2007 Charles Brian Quinn, Highgroove Studios
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+
23
+
24
+ Includes Capistrano extensions and Gem Plugin to capistrano to allow
25
+ gem installation and selection
26
+
27
+ Specifically makes use of the Gem plugin with modifications.
28
+
29
+ ---
30
+ Capistrano library to install and manage Ruby Gems
31
+
32
+ Copyright (c) 2006 Neil Wilson, Aldur Systems Ltd
33
+
34
+ Licensed under the GNU Public License v2. No warranty is provided.
data/Manifest.txt ADDED
@@ -0,0 +1,19 @@
1
+ History.txt
2
+ License.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ lib/slingshot.rb
7
+ lib/slingshot/version.rb
8
+ lib/slingshot/recipes.rb
9
+ lib/slingshot/server_setup.rb
10
+ lib/slingshot/gem_cap_plugin.rb
11
+ scripts/txt2html
12
+ setup.rb
13
+ test/test_helper.rb
14
+ test/test_slingshot.rb
15
+ website/index.html
16
+ website/index.txt
17
+ website/javascripts/rounded_corners_lite.inc.js
18
+ website/stylesheets/screen.css
19
+ website/template.rhtml
data/README.txt ADDED
@@ -0,0 +1,17 @@
1
+ README for slingshot
2
+ ====================
3
+
4
+ Slingshot is a set of server tasks for setting up a Slingshot Server.
5
+
6
+ Created by the good folks at Highgroove Studios and Slingshot Hosting.
7
+
8
+ For the latest, see: http://slingshot.rubyforge.org/
9
+
10
+
11
+ Contributors
12
+ ====================
13
+ Charles Brian Quinn <cbq@highgroove.com>
14
+ Derek Haynes <derek.haynes@highgroove.com>
15
+ James Edward Gray II <james@highgroove.com>
16
+ Andre Lewis <andre@earthcode.com> - testing, improvements, bugfixes
17
+ Neil Wilson - original capistrano "Gem" plugin to install default gems
data/Rakefile ADDED
@@ -0,0 +1,123 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+ require 'rake/testtask'
5
+ require 'rake/packagetask'
6
+ require 'rake/gempackagetask'
7
+ require 'rake/rdoctask'
8
+ require 'rake/contrib/rubyforgepublisher'
9
+ require 'fileutils'
10
+ require 'hoe'
11
+
12
+ include FileUtils
13
+ require File.join(File.dirname(__FILE__), 'lib', 'slingshot', 'version')
14
+
15
+ AUTHOR = 'Charles Brian Quinn'
16
+ EMAIL = "cbq@slingshothosting.com"
17
+ DESCRIPTION = "Set of server setup tasks for use with Slingshot Hosting"
18
+ GEM_NAME = 'slingshot'
19
+
20
+ @config_file = "~/.rubyforge/user-config.yml"
21
+ @config = nil
22
+ def rubyforge_username
23
+ unless @config
24
+ begin
25
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
26
+ rescue
27
+ puts <<-EOS
28
+ ERROR: No rubyforge config file found: #{@config_file}"
29
+ Run 'rubyforge setup' to prepare your env for access to Rubyforge
30
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
31
+ EOS
32
+ exit
33
+ end
34
+ end
35
+ @rubyforge_username ||= @config["username"]
36
+ end
37
+
38
+ RUBYFORGE_PROJECT = 'slingshot' # The unix name for your project
39
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
40
+ DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
41
+
42
+ NAME = "slingshot"
43
+ REV = nil
44
+ # UNCOMMENT IF REQUIRED:
45
+ # REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
46
+ VERS = Slingshot::VERSION::STRING + (REV ? ".#{REV}" : "")
47
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store']
48
+ RDOC_OPTS = ['--quiet', '--title', 'slingshot documentation',
49
+ "--opname", "index.html",
50
+ "--line-numbers",
51
+ "--main", "README",
52
+ "--inline-source"]
53
+
54
+ class Hoe
55
+ def extra_deps
56
+ @extra_deps.reject { |x| Array(x).first == 'hoe' }
57
+ end
58
+ end
59
+
60
+ # Generate all the Rake tasks
61
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
62
+ hoe = Hoe.new(GEM_NAME, VERS) do |p|
63
+ p.author = AUTHOR
64
+ p.description = DESCRIPTION
65
+ p.email = EMAIL
66
+ p.summary = DESCRIPTION
67
+ p.url = HOMEPATH
68
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
69
+ p.test_globs = ["test/**/test_*.rb"]
70
+ p.clean_globs = CLEAN #An array of file patterns to delete on clean.
71
+
72
+ # == Optional
73
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
74
+ #p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
75
+ #p.spec_extras = {} # A hash of extra values to set in the gemspec.
76
+ end
77
+
78
+ CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\n\n")
79
+ PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
80
+ hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
81
+
82
+ desc 'Generate website files'
83
+ task :website_generate do
84
+ Dir['website/**/*.txt'].each do |txt|
85
+ sh %{ ruby scripts/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
86
+ end
87
+ end
88
+
89
+ desc 'Upload website files to rubyforge'
90
+ task :website_upload do
91
+ host = "#{rubyforge_username}@rubyforge.org"
92
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
93
+ local_dir = 'website'
94
+ sh %{rsync -av #{local_dir}/ #{host}:#{remote_dir}}
95
+ end
96
+
97
+ desc 'Generate and upload website files'
98
+ task :website => [:website_generate, :website_upload]
99
+
100
+ desc 'Release the website and new gem version'
101
+ task :deploy => [:check_version, :website, :release] do
102
+ puts "Remember to create SVN tag:"
103
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
104
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
105
+ puts "Suggested comment:"
106
+ puts "Tagging release #{CHANGES}"
107
+ end
108
+
109
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
110
+ task :local_deploy => [:website_generate, :install_gem]
111
+
112
+ task :check_version do
113
+ unless ENV['VERSION']
114
+ puts 'Must pass a VERSION=x.y.z release version'
115
+ exit
116
+ end
117
+ unless ENV['VERSION'] == VERS
118
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
119
+ exit
120
+ end
121
+ end
122
+
123
+
@@ -0,0 +1,97 @@
1
+ # Capistrano library to install and manage Ruby Gems.
2
+ #
3
+ # ----
4
+ # Copyright (c) 2006 Neil Wilson, Aldur Systems Ltd
5
+ #
6
+ # Licensed under the GNU Public License v2. No warranty is provided.
7
+ #
8
+ # Modified by Charles Brian Quinn cbq@highgroove.com
9
+ #
10
+ require 'rubygems'
11
+ require 'capistrano'
12
+ # Installs within Capistrano as the plugin _gem_.
13
+ # Prefix all calls to the library with <tt>gem.</tt>
14
+ # Manages installing gems and versioned gems.
15
+ module Gem
16
+
17
+ # Default install command
18
+ #
19
+ # * doesn't install documentation
20
+ # * installs all required dependencies automatically.
21
+ #
22
+ GEM_INSTALL="gem install -y --no-rdoc"
23
+
24
+ # Upgrade the *gem* system to the latest version. Runs via *sudo*
25
+ def update_system
26
+ sudo "gem update --system"
27
+ end
28
+
29
+ # Updates all the installed gems to the latest version. Runs via *sudo*.
30
+ # Don't use this command if any of the gems require a version selection.
31
+ def upgrade
32
+ sudo "gem update --no-rdoc"
33
+ end
34
+
35
+ # Removes old versions of gems from installation area.
36
+ def cleanup
37
+ sudo "gem cleanup"
38
+ end
39
+
40
+ # Installs the gems detailed in +packages+, selecting version +version+ if
41
+ # specified.
42
+ #
43
+ # +packages+ can be a single string or an array of strings.
44
+ #
45
+ # def install(packages, source=nil, version=nil)
46
+ def install(packages, options={})
47
+ sudo "#{GEM_INSTALL} #{options[:version] ? '-v '+options[:version].to_s : nil} " +
48
+ "#{options[:source] ? '--source='+options[:source] : nil } " +
49
+ "#{packages.to_a.join(' ')}"
50
+ end
51
+
52
+ def uninstall(package)
53
+ sudo "gem uninstall #{package}" do |channel, stream, data|
54
+ data.each_line do |line|
55
+ if line =~ /\[Yn\]/
56
+ channel.send_data "Y\n"
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ # Auto selects a gem from a list and installs it.
63
+ #
64
+ # *gem* has no mechanism on the command line of disambiguating builds for
65
+ # different platforms, and instead asks the user. This method has the necessary
66
+ # conversation to select the +version+ relevant to +platform+ (or the one nearest
67
+ # the top of the list if you don't specify +version+).
68
+ # def select(package, source=nil, version=nil, platform='ruby')
69
+ def select(package, options={})
70
+ selections={}
71
+ cmd="#{GEM_INSTALL} #{options[:version] ? '-v '+options[:version].to_s : nil} " +
72
+ "#{package} " +
73
+ "#{options[:source] ? '--source='+options[:source] : nil} " +
74
+ "#{options[:extra_params] ? options[:extra_params] : nil}"
75
+ sudo cmd do |channel, stream, data|
76
+ data.each_line do | line |
77
+ case line
78
+ when /\s(\d+).*\(#{options[:platform]}\)/
79
+ if selections[channel[:host]].nil?
80
+ selections[channel[:host]]=$1.dup+"\n"
81
+ logger.info "Selecting #$&", "#{stream} :: #{channel[:host]}"
82
+ end
83
+ when /\s\d+\./
84
+ # Discard other selections from data stream
85
+ when /^>/
86
+ channel.send_data selections[channel[:host]]
87
+ logger.debug line, "#{stream} :: #{channel[:host]}"
88
+ else
89
+ logger.info line, "#{stream} :: #{channel[:host]}"
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ end
96
+
97
+ Capistrano.plugin :gem, Gem
@@ -0,0 +1,230 @@
1
+ # This library file includes tasks for configuring a Rails application.
2
+ #
3
+ # TODO:
4
+ # * use rails pids dir construct (relinks and change mongrel config)
5
+ #
6
+ Capistrano.configuration(:must_exist).load do
7
+
8
+ # =============================================================================
9
+ # DEFAULT VARIABLES
10
+ # =============================================================================
11
+
12
+ set :user, "deploy"
13
+ set :password, "password"
14
+ set :group, "users"
15
+
16
+ set :deploy_to, "/var/www/apps"
17
+
18
+ set :server_name, 'daytona.slingshothosting.com'
19
+ set :server_ip, '1.2.3.4'
20
+ set :server_fqdn, 'daytona.slingshothosting.com'
21
+
22
+ set :domain_name, 'yourdomain.com'
23
+
24
+ # your svn username and password
25
+ set :svn_username, user
26
+ set :svn_password, password
27
+
28
+ # your database username and password
29
+ set :database_username, user
30
+ set :database_password, password
31
+
32
+ set :deploy_username, user
33
+ set :deploy_password, password
34
+
35
+ # timezone can be any valid zoneinfo: EST, MST, PST8PDT, GMT
36
+ set :server_timezone, "GMT"
37
+
38
+ # =============================================================================
39
+ # SOME SEMI-OPTIONAL SLINGSHOT VARIABLES
40
+ # =============================================================================
41
+
42
+ # set this to the correct web start script
43
+ set :web_server, "apache2"
44
+ set :path_to_web_server, "/usr/local/apache2/"
45
+
46
+ # set this to true to add an apache redirect rule to ensure domain requests to
47
+ # http://yourdomain.com/ are redirected to http://www.yourdomain.com/
48
+ set :redirect_www_requests, true
49
+
50
+ # ssl certificates must live in the /path/to/apache/conf/ssl directory
51
+ set :configure_ssl, false # set this to true to use SSL
52
+ set :ssl_certificate_file, "#{server_name}.pem"
53
+ set :ssl_certificate_key_file, "#{server_name}.key"
54
+ set :ssl_ca_certificate_file, 'sf_issuing.crt'
55
+
56
+ # set this to the correct db adapter and settings
57
+ set :database, "mysql"
58
+ set :database_host, "localhost"
59
+
60
+ # saves space by only keeping last 3 when running cleanup
61
+ set :keep_releases, 3
62
+
63
+ # issues svn export instead of checkout
64
+ set :checkout, "export"
65
+
66
+ # mongrel configuration:
67
+ set :mongrel_conf, "#{current_path}/config/mongrel_cluster.yml"
68
+
69
+ # number of mongrel servers to start
70
+ set :mongrel_servers, 3
71
+
72
+ # mongrel starting port
73
+ set :mongrel_start_port, 8000
74
+
75
+ # set this to true to manage your crontab through capistrano
76
+ set :overwrite_crontab, false
77
+ set :crontab_email, "root@localhost"
78
+
79
+ set :mongrel_cluster_configuration_dir, "/etc/mongrel_cluster"
80
+ set :rails_apache_configuration_dir, "/etc/rails"
81
+
82
+ # =============================================================================
83
+ # RAILS APPLICATION CONFIGURATION TASKS
84
+ # =============================================================================
85
+
86
+ desc "Tasks to execute before initial setup"
87
+ task :before_setup do
88
+ sudo "mkdir -p #{File.dirname(deploy_to)}"
89
+ sudo "chown -R #{user}:#{group} #{File.dirname(deploy_to)}"
90
+
91
+ sudo "mkdir -p #{mongrel_cluster_configuration_dir}"
92
+ sudo "mkdir -p #{rails_apache_configuration_dir}"
93
+ end
94
+
95
+ desc "Tasks to execute after initial setup"
96
+ task :after_setup do
97
+
98
+ # make shared config dir to hold config files
99
+ run "mkdir -p #{deploy_to}/#{shared_dir}/config"
100
+
101
+ # make a shared tmp dir for sessions
102
+ run "mkdir -p #{deploy_to}/#{shared_dir}/tmp"
103
+ run "mkdir -p #{deploy_to}/#{shared_dir}/tmp/cache"
104
+ run "mkdir -p #{deploy_to}/#{shared_dir}/tmp/sessions"
105
+ run "mkdir -p #{deploy_to}/#{shared_dir}/tmp/sockets"
106
+ run "mkdir -p #{deploy_to}/#{shared_dir}/tmp/pids"
107
+
108
+ # create any other shared dirs
109
+ # run "mkdir -p #{deploy_to}/#{shared_dir}/db"
110
+ # run "mkdir -p #{deploy_to}/#{shared_dir}/db/ferret_index"
111
+
112
+ mongrel_configuration_setup
113
+ database_configuration_setup
114
+ apache_configuration_setup
115
+ apache_redirects_setup
116
+ crontab_configuration_setup
117
+
118
+ end
119
+
120
+ desc "Tasks to execute after code update"
121
+ task :after_update_code, :roles => [:app, :db] do
122
+ # relink shared deployment database configuration
123
+ run "ln -nfs #{deploy_to}/#{shared_dir}/config/database.yml #{release_path}/config/database.yml"
124
+
125
+ # relink shared deployment mongrel_cluster configuration
126
+ run "ln -nfs #{deploy_to}/#{shared_dir}/config/mongrel_cluster.yml #{release_path}/config/mongrel_cluster.yml"
127
+
128
+ # relink shared tmp dir (for session and cache data)
129
+ sudo "rm -rf #{release_path}/tmp" # technically shouldn't be in svn
130
+ run "ln -nfs #{deploy_to}/#{shared_dir}/tmp #{release_path}/tmp"
131
+
132
+ # relink file storage dir
133
+ sudo "rm -rf #{release_path}/file_storage" # technically shouldn't be in svn
134
+ run "ln -nfs #{deploy_to}/#{shared_dir}/file_storage #{release_path}/file_storage"
135
+
136
+ # rebuild ferret index
137
+ # run "cd #{release_path} && RAILS_ENV=production rake search:build_index"
138
+ end
139
+
140
+ desc "Setup mongrel Configuration"
141
+ task :mongrel_configuration_setup do
142
+
143
+ # generate a mongrel configuration file
144
+ mongrel_configuration = render :template => <<-EOF
145
+ ---
146
+ cwd: #{deploy_to}/current
147
+ port: "#{mongrel_start_port}"
148
+ environment: production
149
+ address: 127.0.0.1
150
+ pid_file: #{deploy_to}/current/log/mongrel.pid
151
+ log_file: #{deploy_to}/current/log/mongrel.log
152
+ servers: #{mongrel_servers}
153
+ user: #{user}
154
+ group: #{group}
155
+
156
+ EOF
157
+
158
+ # put mongrel configuration in shared config dir and link in /etc/mongrel_cluster
159
+ put mongrel_configuration, "#{deploy_to}/#{shared_dir}/config/mongrel_cluster.yml"
160
+ sudo "ln -nfs #{deploy_to}/#{shared_dir}/config/mongrel_cluster.yml /etc/mongrel_cluster/#{application}.yml"
161
+
162
+ end
163
+
164
+ desc "Setup Database Configuration"
165
+ task :database_configuration_setup do
166
+
167
+ # generate database configuration
168
+ database_configuration = render :template => <<-EOF
169
+ # Deployment database.yml
170
+ login: &login
171
+ adapter: #{database}
172
+ username: #{database_username}
173
+ password: #{database_password}
174
+
175
+ development:
176
+ database: #{application}_development
177
+ <<: *login
178
+
179
+ test:
180
+ database: #{application}_test
181
+ <<: *login
182
+
183
+ production:
184
+ database: #{application}_production
185
+ <<: *login
186
+
187
+ EOF
188
+
189
+ # put database configuration in shared config dir
190
+ put database_configuration, "#{deploy_to}/#{shared_dir}/config/database.yml"
191
+ end
192
+
193
+ # =============================================================================
194
+ # SLINGSHOT TASKS
195
+ # =============================================================================
196
+
197
+ desc "Restart the web server"
198
+ task :restart_web, :roles => [:web] do
199
+ sudo "/etc/init.d/#{web_server} restart"
200
+ end
201
+
202
+ # =============================================================================
203
+ # APPLICATION SPECIFIC TASKS
204
+ # =============================================================================
205
+
206
+ desc "Rebuild Ferret search index"
207
+ task :ferret_index, :roles => [:app, :db] do
208
+ run("cd #{current_path} && RAILS_ENV=production rake search:build_index")
209
+ # run("chmod -R ugo+w #{current_path}/db/ferret_index")
210
+ # run("chmod -R ugo+r #{current_path}/db/ferret_index")
211
+ end
212
+
213
+ # =============================================================================
214
+ # USEFUL TASKS
215
+ # =============================================================================
216
+
217
+ desc "Disables web site while deploying and in errors - used for long-running deploys"
218
+ task :long_deploy do
219
+ transaction do
220
+ update_code
221
+ disable_web
222
+ symlink
223
+ migrate
224
+ end
225
+
226
+ restart
227
+ enable_web
228
+ end
229
+
230
+ end # end capistrano extensions