capigen 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/Capfile +22 -0
  2. data/History.txt +3 -0
  3. data/License.txt +20 -0
  4. data/Manifest.txt +83 -0
  5. data/README.txt +35 -0
  6. data/Rakefile +4 -0
  7. data/config/hoe.rb +70 -0
  8. data/config/requirements.rb +17 -0
  9. data/init.rb +3 -0
  10. data/lib/capigen/config.rb +84 -0
  11. data/lib/capigen/helper.rb +51 -0
  12. data/lib/capigen/helpers/gem_helper.rb +15 -0
  13. data/lib/capigen/helpers/package_helper.rb +40 -0
  14. data/lib/capigen/helpers/script_helper.rb +30 -0
  15. data/lib/capigen/helpers/wget_helper.rb +17 -0
  16. data/lib/capigen/packagers/yum.rb +46 -0
  17. data/lib/capigen/profiles.rb +19 -0
  18. data/lib/capigen/recipes.yml +14 -0
  19. data/lib/capigen/templates.rb +65 -0
  20. data/lib/capigen/version.rb +9 -0
  21. data/lib/capigen.rb +26 -0
  22. data/recipes/README +12 -0
  23. data/recipes/bootstrap/patch.rb +87 -0
  24. data/recipes/centos.rb +40 -0
  25. data/recipes/deploy.rb +17 -0
  26. data/recipes/gems.rb +8 -0
  27. data/recipes/imagemagick.rb +9 -0
  28. data/recipes/install.rb +13 -0
  29. data/recipes/memcached.rb +15 -0
  30. data/recipes/mongrel_cluster.rb +49 -0
  31. data/recipes/monit.rb +16 -0
  32. data/recipes/mysql.rb +24 -0
  33. data/recipes/nginx.rb +42 -0
  34. data/recipes/profiles/centos-sick.rb +65 -0
  35. data/recipes/rails.rb +14 -0
  36. data/recipes/ruby.rb +14 -0
  37. data/recipes/sphinx.rb +62 -0
  38. data/script/destroy +14 -0
  39. data/script/generate +14 -0
  40. data/script/txt2html +74 -0
  41. data/setup.rb +1585 -0
  42. data/tasks/capigen.rake +13 -0
  43. data/tasks/deployment.rake +34 -0
  44. data/tasks/environment.rake +7 -0
  45. data/tasks/website.rake +17 -0
  46. data/templates/capistrano/Capfile +22 -0
  47. data/templates/capistrano/deploy.rb.erb +61 -0
  48. data/templates/centos/setup.sh +17 -0
  49. data/templates/centos/sudoers +95 -0
  50. data/templates/imagemagick/install.sh +20 -0
  51. data/templates/memcached/install.sh +27 -0
  52. data/templates/memcached/memcached.initd.centos.erb +70 -0
  53. data/templates/memcached/memcached.monitrc.erb +4 -0
  54. data/templates/mongrel/mongrel_cluster.initd.erb +61 -0
  55. data/templates/mongrel/mongrel_cluster.monitrc.erb +15 -0
  56. data/templates/mongrel/mongrel_cluster.yml.erb +10 -0
  57. data/templates/monit/cert.sh +14 -0
  58. data/templates/monit/install.sh +29 -0
  59. data/templates/monit/monit.cnf +34 -0
  60. data/templates/monit/monit.initd.centos.erb +68 -0
  61. data/templates/monit/monitrc.erb +28 -0
  62. data/templates/monit/patch_inittab.sh +15 -0
  63. data/templates/mysql/install.sh.erb +10 -0
  64. data/templates/mysql/install_db.sql.erb +5 -0
  65. data/templates/mysql/mysql.monitrc.erb +6 -0
  66. data/templates/nginx/install.sh.erb +42 -0
  67. data/templates/nginx/nginx.conf.erb +76 -0
  68. data/templates/nginx/nginx.initd.erb +62 -0
  69. data/templates/nginx/nginx.monitrc.erb +4 -0
  70. data/templates/nginx/nginx_vhost.conf.erb +94 -0
  71. data/templates/rails/database.yml.erb +42 -0
  72. data/templates/ruby/ruby_install.sh +26 -0
  73. data/templates/ruby/rubygems_install.sh +13 -0
  74. data/templates/sphinx/install.sh.erb +22 -0
  75. data/templates/sphinx/sphinx.conf.erb +496 -0
  76. data/templates/sphinx/sphinx.monitrc.erb +4 -0
  77. data/templates/sphinx/sphinx_app.initd.centos.erb +67 -0
  78. data/templates/sphinx/sphinx_app.initd.erb +57 -0
  79. data/website/index.html +93 -0
  80. data/website/index.txt +39 -0
  81. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  82. data/website/stylesheets/screen.css +138 -0
  83. data/website/template.rhtml +48 -0
  84. metadata +141 -0
data/Capfile ADDED
@@ -0,0 +1,22 @@
1
+ #
2
+ # Capfile for running base install recipe
3
+ #
4
+
5
+ load 'deploy' if respond_to?(:namespace) # cap2 differentiator
6
+
7
+ # Patches for capistrano
8
+ load "recipes/bootstrap/patch.rb"
9
+
10
+ # Load recipes
11
+ Dir['recipes/*.rb'].each { |plugin| load(plugin) }
12
+
13
+ require 'erb'
14
+
15
+ # This should be overriden by project specific Capfile
16
+ set :user, Proc.new { Capistrano::CLI.ui.ask('Bootstrap user: ') }
17
+
18
+ # Roles
19
+ role :base, Capistrano::CLI.ui.ask('Server: ')
20
+
21
+
22
+ set :profile, Proc.new { load choose_profile }
data/History.txt ADDED
@@ -0,0 +1,3 @@
1
+ == 0.1.1 2008-02-06
2
+
3
+ * Initial import
data/License.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Gabriel Handford
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.
data/Manifest.txt ADDED
@@ -0,0 +1,83 @@
1
+ Capfile
2
+ History.txt
3
+ License.txt
4
+ Manifest.txt
5
+ README.txt
6
+ Rakefile
7
+ config/hoe.rb
8
+ config/requirements.rb
9
+ init.rb
10
+ lib/capigen.rb
11
+ lib/capigen/config.rb
12
+ lib/capigen/helper.rb
13
+ lib/capigen/helpers/gem_helper.rb
14
+ lib/capigen/helpers/package_helper.rb
15
+ lib/capigen/helpers/script_helper.rb
16
+ lib/capigen/helpers/wget_helper.rb
17
+ lib/capigen/packagers/yum.rb
18
+ lib/capigen/profiles.rb
19
+ lib/capigen/recipes.yml
20
+ lib/capigen/templates.rb
21
+ lib/capigen/version.rb
22
+ recipes/README
23
+ recipes/bootstrap/patch.rb
24
+ recipes/centos.rb
25
+ recipes/deploy.rb
26
+ recipes/gems.rb
27
+ recipes/imagemagick.rb
28
+ recipes/install.rb
29
+ recipes/memcached.rb
30
+ recipes/mongrel_cluster.rb
31
+ recipes/monit.rb
32
+ recipes/mysql.rb
33
+ recipes/nginx.rb
34
+ recipes/profiles/centos-sick.rb
35
+ recipes/rails.rb
36
+ recipes/ruby.rb
37
+ recipes/sphinx.rb
38
+ script/destroy
39
+ script/generate
40
+ script/txt2html
41
+ setup.rb
42
+ tasks/capigen.rake
43
+ tasks/deployment.rake
44
+ tasks/environment.rake
45
+ tasks/website.rake
46
+ templates/capistrano/Capfile
47
+ templates/capistrano/deploy.rb.erb
48
+ templates/centos/setup.sh
49
+ templates/centos/sudoers
50
+ templates/imagemagick/install.sh
51
+ templates/memcached/install.sh
52
+ templates/memcached/memcached.initd.centos.erb
53
+ templates/memcached/memcached.monitrc.erb
54
+ templates/mongrel/mongrel_cluster.initd.erb
55
+ templates/mongrel/mongrel_cluster.monitrc.erb
56
+ templates/mongrel/mongrel_cluster.yml.erb
57
+ templates/monit/cert.sh
58
+ templates/monit/install.sh
59
+ templates/monit/monit.cnf
60
+ templates/monit/monit.initd.centos.erb
61
+ templates/monit/monitrc.erb
62
+ templates/monit/patch_inittab.sh
63
+ templates/mysql/install.sh.erb
64
+ templates/mysql/install_db.sql.erb
65
+ templates/mysql/mysql.monitrc.erb
66
+ templates/nginx/install.sh.erb
67
+ templates/nginx/nginx.conf.erb
68
+ templates/nginx/nginx.initd.erb
69
+ templates/nginx/nginx.monitrc.erb
70
+ templates/nginx/nginx_vhost.conf.erb
71
+ templates/rails/database.yml.erb
72
+ templates/ruby/ruby_install.sh
73
+ templates/ruby/rubygems_install.sh
74
+ templates/sphinx/install.sh.erb
75
+ templates/sphinx/sphinx.conf.erb
76
+ templates/sphinx/sphinx.monitrc.erb
77
+ templates/sphinx/sphinx_app.initd.centos.erb
78
+ templates/sphinx/sphinx_app.initd.erb
79
+ website/index.html
80
+ website/index.txt
81
+ website/javascripts/rounded_corners_lite.inc.js
82
+ website/stylesheets/screen.css
83
+ website/template.rhtml
data/README.txt ADDED
@@ -0,0 +1,35 @@
1
+ = Capigen
2
+
3
+ Capistrano recipes and templates.
4
+
5
+ == Install recipes
6
+
7
+ To install an application, use the install recipes; cap nginx:install
8
+
9
+ To install a group of applications based on a "profile":
10
+
11
+ cap install
12
+
13
+ _You may need to comment out "Defaults requiretty" in /etc/sudoders on the image before capistrano recipes will work._
14
+
15
+
16
+ == Generating a Capfile
17
+
18
+ From a rails project:
19
+
20
+ rake capigen
21
+
22
+
23
+ == Deploying (application)
24
+
25
+ If this is the first time you've deployed you'll need to run:
26
+
27
+ cap deploy:setup
28
+
29
+ Otherwise, your deploy options:
30
+
31
+ cap deploy
32
+
33
+ cap deploy:migrations (deploys and does migration)
34
+
35
+ cap deploy:migrate (only does migration on existing deployment)
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'config/requirements'
2
+ require 'config/hoe' # setup Hoe + all gem configuration
3
+
4
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
data/config/hoe.rb ADDED
@@ -0,0 +1,70 @@
1
+ require 'capigen/version'
2
+
3
+ AUTHOR = 'Gabriel Handford' # can also be an array of Authors
4
+ EMAIL = "gabrielh@gmail.com"
5
+ DESCRIPTION = "Capistrano recipe library for all types of remote tasks."
6
+ GEM_NAME = 'capigen' # what ppl will type to install your gem
7
+ RUBYFORGE_PROJECT = 'capigen' # The unix name for your project
8
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
9
+ DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
10
+
11
+ @config_file = "~/.rubyforge/user-config.yml"
12
+ @config = nil
13
+ RUBYFORGE_USERNAME = "gabe"
14
+ def rubyforge_username
15
+ unless @config
16
+ begin
17
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
18
+ rescue
19
+ puts <<-EOS
20
+ ERROR: No rubyforge config file found: #{@config_file}
21
+ Run 'rubyforge setup' to prepare your env for access to Rubyforge
22
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
23
+ EOS
24
+ exit
25
+ end
26
+ end
27
+ RUBYFORGE_USERNAME.replace @config["username"]
28
+ end
29
+
30
+
31
+ REV = nil
32
+ # UNCOMMENT IF REQUIRED:
33
+ # REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
34
+ VERS = Capigen::VERSION::STRING + (REV ? ".#{REV}" : "")
35
+ RDOC_OPTS = ['--quiet', '--title', 'capigen documentation',
36
+ "--opname", "index.html",
37
+ "--line-numbers",
38
+ "--main", "README",
39
+ "--inline-source"]
40
+
41
+ class Hoe
42
+ def extra_deps
43
+ @extra_deps.reject! { |x| Array(x).first == 'hoe' }
44
+ @extra_deps
45
+ end
46
+ end
47
+
48
+ # Generate all the Rake tasks
49
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
50
+ hoe = Hoe.new(GEM_NAME, VERS) do |p|
51
+ p.developer(AUTHOR, EMAIL)
52
+ p.description = DESCRIPTION
53
+ p.summary = DESCRIPTION
54
+ p.url = HOMEPATH
55
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
56
+ p.test_globs = ["test/**/test_*.rb"]
57
+ p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
58
+
59
+ # == Optional
60
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
61
+ #p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
62
+
63
+ #p.spec_extras = {} # A hash of extra values to set in the gemspec.
64
+
65
+ end
66
+
67
+ CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
68
+ PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
69
+ hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
70
+ hoe.rsync_args = '-av --delete --ignore-errors'
@@ -0,0 +1,17 @@
1
+ require 'fileutils'
2
+ include FileUtils
3
+
4
+ require 'rubygems'
5
+ %w[rake hoe newgem rubigen].each do |req_gem|
6
+ begin
7
+ require req_gem
8
+ rescue LoadError
9
+ puts "This Rakefile requires the '#{req_gem}' RubyGem."
10
+ puts "Installation: gem install #{req_gem} -y"
11
+ exit
12
+ end
13
+ end
14
+
15
+ $:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
16
+
17
+ require 'capigen'
data/init.rb ADDED
@@ -0,0 +1,3 @@
1
+ require File.dirname(__FILE__) + '/lib/capigen'
2
+
3
+ #load File.dirname(__FILE__) + "/tasks/capigen.rake'
@@ -0,0 +1,84 @@
1
+ require 'yaml'
2
+ require 'highline'
3
+
4
+ # Configuration
5
+ class Capigen::Config
6
+
7
+ attr_accessor :application, :user, :deploy_to, :web_host
8
+ attr_accessor :db_host, :db_user, :db_pass, :db_name, :db_port
9
+ attr_accessor :sphinx_port, :sphinx_host
10
+ attr_accessor :repository, :recipes
11
+ attr_accessor :mongrel_port, :mongrel_size
12
+ attr_accessor :domain_name
13
+
14
+ def initialize
15
+ end
16
+
17
+ # Expose the binding
18
+ def get_binding
19
+ binding
20
+ end
21
+
22
+ def ask(message, property, options = {}, &block)
23
+ # Options
24
+ default = options[:default] || nil
25
+ answer_type = options[:answer_type] || String
26
+ auto_apply = options[:auto_apply]
27
+
28
+ # Default to existing or default if set
29
+ existing = send(property.to_sym)
30
+ default = existing || default
31
+
32
+ unless auto_apply and !existing.blank?
33
+ result = HighLine.new.ask(message, answer_type) { |q|
34
+ q.default = default unless default.blank?
35
+ yield q if block_given?
36
+ }
37
+
38
+ send("#{property}=", result)
39
+ end
40
+ end
41
+
42
+ def set_default(property, value)
43
+ v = send(property.to_sym)
44
+ send("#{property}=", value) if v.blank?
45
+ end
46
+
47
+ def save(path)
48
+ File.open(path, "w") { |f| f.puts self.to_yaml }
49
+ end
50
+
51
+ # Build config from asking
52
+ def ask_all(auto_apply = false)
53
+
54
+ options = { :auto_apply => auto_apply }
55
+
56
+ ask("Application name: ", "application", options)
57
+ ask("User (to run application as): ", "user", options.merge({ :default => application }))
58
+
59
+ ask("Deploy to: ", "deploy_to", options.merge({ :default => "/var/www/apps/#{application}" }))
60
+ ask("Web host: ", "web_host", options)
61
+
62
+ ask("Database host: ", "db_host", options.merge({ :default => web_host }))
63
+ ask("Database user: ", "db_user", options.merge({ :default => user }))
64
+ ask("Database password: ", "db_pass", options)
65
+ ask("Database name: ", "db_name", options.merge({ :default => application }))
66
+
67
+ ask("Database port: ", "db_port", options.merge({ :default => 3306, :answer_type => Integer }))
68
+
69
+ ask("Sphinx host: ", "sphinx_host", options.merge({ :default => "127.0.0.1" }))
70
+ ask("Sphinx port: ", "sphinx_port", options.merge({ :default => 3312, :answer_type => Integer }))
71
+
72
+ default_repos = YAML.load(`svn info`)["URL"] rescue nil
73
+ ask("Repository uri: ", "repository", options.merge({ :default => default_repos }))
74
+
75
+ ask("Mongrel starting port: ", "mongrel_port", options.merge({ :answer_type => Integer }))
76
+ ask("Number of mongrels: ", "mongrel_size", options.merge({ :answer_type => Integer }))
77
+
78
+ ask("Domain name (for nginx vhost; no www prefix): ", "domain_name", options)
79
+
80
+ # Load default recipes if not set
81
+ set_default("recipes", YAML.load_file(File.dirname(__FILE__) + "/recipes.yml"))
82
+ end
83
+
84
+ end
@@ -0,0 +1,51 @@
1
+ require 'erb'
2
+ require 'yaml'
3
+
4
+ # == Recipe helpers
5
+ #
6
+ # * Loads the configuration
7
+ # * Generates files from templates
8
+ #
9
+ module Capigen::Helper
10
+
11
+ include Capigen::Templates
12
+ include Capigen::Profiles
13
+
14
+ include Capigen::Helpers::PackageHelper
15
+ include Capigen::Helpers::WgetHelper
16
+ include Capigen::Helpers::ScriptHelper
17
+ include Capigen::Helpers::GemHelper
18
+
19
+ # Project root (for rails)
20
+ def root
21
+ if respond_to?(:fetch)
22
+ return fetch(:project_root)
23
+ else
24
+ RAILS_ROOT
25
+ end
26
+ end
27
+
28
+ # Path relative to project root
29
+ def relative_to_root(path = nil, check_exist = false)
30
+ if path
31
+ root_path = File.join(root, path)
32
+ else
33
+ root_path = root
34
+ end
35
+
36
+ # Check for file existance
37
+ if check_exist and !File.exist?(root_path)
38
+ raise <<-EOS
39
+
40
+ File not found: #{File.expand_path(root_path)}
41
+
42
+ This is loaded for the capigen plugin. View the README in:
43
+ #{File.expand_path(File.dirname(__FILE__) + "/../doc/README")}
44
+ EOS
45
+ end
46
+
47
+ root_path
48
+ end
49
+
50
+ end
51
+
@@ -0,0 +1,15 @@
1
+ # Gem capistrano helpers
2
+ module Capigen::Helpers::GemHelper
3
+
4
+ # gem_install("raspell") or gem_install([ "raspell", "foo" ])
5
+ def gem_install(gems)
6
+ # If a single object, wrap in array
7
+ gems = [ gems ] unless gems.is_a?(Array)
8
+
9
+ # Install one at a time because we may need to pass install args (e.g. mysql)
10
+ gems.each do |gem|
11
+ sudo "gem install --no-rdoc --no-ri --no-verbose #{gem}"
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,40 @@
1
+ # Package, Yum capistrano helpers
2
+ module Capigen::Helpers::PackageHelper
3
+
4
+ def setup_packager(packager)
5
+ @packager = case packager.to_sym
6
+ when :yum then Capigen::Packagers::Yum.new(self)
7
+ end
8
+ end
9
+
10
+ def ensure_packager
11
+ unless @packager
12
+ logger.important "No packager defined, defaulting to yum."
13
+
14
+ # Currently only have 1 packager, so
15
+ setup_packager(:yum)
16
+ end
17
+ end
18
+
19
+ def package_install(packages)
20
+ ensure_packager
21
+ @packager.install(packages)
22
+ end
23
+
24
+ def package_update(packages = [])
25
+ ensure_packager
26
+ @packager.update(packages)
27
+ end
28
+
29
+ def package_clean
30
+ ensure_packager
31
+ @packager.clean
32
+ end
33
+
34
+ def package_remove(packages)
35
+ ensure_packager
36
+ @packager.remove(packages)
37
+ end
38
+
39
+
40
+ end
@@ -0,0 +1,30 @@
1
+ # Installer capistrano helper
2
+ module Capigen::Helpers::ScriptHelper
3
+
4
+ def script_install(script, files_to_put = {})
5
+
6
+ files_to_put.each do |file, dest|
7
+ put load_file(file), dest
8
+ end
9
+
10
+ if File.extname(script) == ".erb"
11
+ name = script[0...script.length-4]
12
+ dest = "/tmp/#{name}"
13
+ run "mkdir -p #{File.dirname(dest)}"
14
+ put load_template(script, binding), dest
15
+
16
+ else
17
+ name = script
18
+ dest = "/tmp/#{name}"
19
+ run "mkdir -p #{File.dirname(dest)}"
20
+ put load_file(name), dest
21
+ end
22
+
23
+ # If want verbose, -v
24
+ sudo "sh #{dest}"
25
+
26
+ # Cleanup
27
+ sudo "rm -rf #{File.dirname(dest)}"
28
+ end
29
+
30
+ end
@@ -0,0 +1,17 @@
1
+ require 'open-uri'
2
+
3
+ # Wget capistrano helper
4
+ module Capigen::Helpers::WgetHelper
5
+
6
+ # Download the uri, then upload it into the remote destination directory
7
+ def wget(uri, remote_dest_dir = "/tmp")
8
+
9
+ uri = uri = URI.parse(uri)
10
+ name = uri.path.split("/").last
11
+ remote_dest_path = File.join(remote_dest_dir, name)
12
+
13
+ logger.info "Downloading #{name} from #{uri}..."
14
+ put open(uri).read, remote_dest_path
15
+ end
16
+
17
+ end
@@ -0,0 +1,46 @@
1
+ # Packages must respond to update, remove, install and clean
2
+ class Capigen::Packagers::Yum
3
+
4
+ def initialize(cap)
5
+ @cap = cap
6
+ end
7
+
8
+ # Update all installed packages
9
+ def update(packages = [])
10
+ @cap.sudo "yum -y update #{packages.join(" ")}"
11
+ end
12
+
13
+ # Remove via yum.
14
+ def remove(packages)
15
+ @cap.sudo "yum -y remove #{packages.join(" ")}"
16
+ end
17
+
18
+ # Install via yum.
19
+ # If package already exists, it will be updated (unless update_existing = false).
20
+ def install(packages, update_existing = true)
21
+
22
+ # If a single object, wrap in array
23
+ packages = [ packages ] unless packages.is_a?(Array)
24
+
25
+ if update_existing
26
+
27
+ installed_packages = []
28
+
29
+ @cap.sudo "yum -d 0 list installed #{packages.join(" ")}" do |channel, stream, data|
30
+ installed_packages += data.split("\n")[1..-1].collect { |line| line.split(".").first }
31
+ end
32
+
33
+ packages -= installed_packages
34
+
35
+ @cap.sudo "yum -y update #{installed_packages.join(" ")}" unless installed_packages.blank?
36
+ end
37
+
38
+ @cap.sudo "yum -y install #{packages.join(" ")}" unless packages.blank?
39
+ end
40
+
41
+ # Clean yum
42
+ def clean
43
+ @cap.sudo "yum -y clean all"
44
+ end
45
+
46
+ end
@@ -0,0 +1,19 @@
1
+ module Capigen::Profiles
2
+
3
+ ProfileDir = File.dirname(__FILE__) + "/../../recipes/profiles"
4
+
5
+ def recipe_profiles(prefix = "")
6
+ Dir[ProfileDir + "/#{prefix}*.rb"].collect { |file| File.basename(file)[0...-3] }
7
+ end
8
+
9
+ def choose_profile(prefix = "")
10
+ profile = HighLine.new.choose(*recipe_profiles(prefix)) do |menu|
11
+ menu.header = "Choose recipe profile"
12
+ end
13
+
14
+ "#{ProfileDir}/#{profile}.rb"
15
+ end
16
+
17
+ end
18
+
19
+
@@ -0,0 +1,14 @@
1
+ ---
2
+ before_setup:
3
+ - "centos:add_user_for_app"
4
+
5
+ after_setup:
6
+ - "mysql:setup"
7
+ - "rails:setup"
8
+ - "mongrel_cluster:setup"
9
+ - "nginx:setup"
10
+ - "sphinx:setup"
11
+
12
+ after_update_code:
13
+ - "rails:update_code"
14
+ - "sphinx:update_code"
@@ -0,0 +1,65 @@
1
+ module Capigen::Templates
2
+
3
+ # Root of templates path
4
+ def template_root
5
+ @template_root ||= File.expand_path(File.dirname(__FILE__) + "/../../templates")
6
+ end
7
+
8
+ # Get full template path
9
+ def full_template_path(template_path)
10
+ File.join(template_root, template_path)
11
+ end
12
+
13
+ # Load template at (full) path with binding.
14
+ # If options[:project] is true will load template relative to project root.
15
+ def load_template(path, binding, options = {})
16
+ template_path = options[:project] ? "#{root}/#{path}" : full_template_path(path)
17
+
18
+ unless File.exist?(template_path)
19
+ raise <<-EOS
20
+
21
+ Template not found: #{template_path}
22
+
23
+ EOS
24
+ end
25
+
26
+ template = ERB.new(IO.read(template_path))
27
+ template.result(binding)
28
+ end
29
+
30
+ def load_project_template(path, binding)
31
+ load_template(path, binding, { :project => true })
32
+ end
33
+
34
+ def load_file(path)
35
+ template_path = full_template_path(path)
36
+ IO.read(template_path)
37
+ end
38
+
39
+ # Write template at (relative path) with binding to destination path.
40
+ #
41
+ # template_path is relative <tt>"capistrano/deploy.rb.erb"</tt>
42
+ def write_template(template_path, binding, dest_path, overwrite = false, verbose = true)
43
+ # This is gnarly!
44
+ relative_dest_path = Pathname.new(File.expand_path(dest_path)).relative_path_from(Pathname.new(File.expand_path(".")))
45
+
46
+ if !overwrite && File.exist?(dest_path)
47
+ puts "%10s %-40s (skipped)" % [ "create", relative_dest_path ] if verbose
48
+ return
49
+ end
50
+
51
+ puts "%10s %-40s" % [ "create", relative_dest_path ] if verbose
52
+
53
+ File.open(dest_path, "w") { |file| file.puts(load_template(template_path, binding)) }
54
+ end
55
+
56
+ # Remove files from root
57
+ def clean(files, verbose = true)
58
+ rm_files = files.collect { |f| File.join(root, f) }
59
+ rm_files.each do |rm_file|
60
+ puts "%10s %-40s" % [ "delete", rm_file ] if verbose
61
+ FileUtils.rm_rf(rm_file)
62
+ end
63
+ end
64
+
65
+ end
@@ -0,0 +1,9 @@
1
+ module Capigen #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ TINY = 1
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end