crazycode-cap-recipes 0.3.37
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/LICENSE +20 -0
- data/README.textile +586 -0
- data/Rakefile +57 -0
- data/VERSION.yml +5 -0
- data/bin/cap-recipes +4 -0
- data/cap-recipes.gemspec +128 -0
- data/examples/advanced/deploy.rb +39 -0
- data/examples/advanced/deploy/experimental.rb +14 -0
- data/examples/advanced/deploy/production.rb +20 -0
- data/examples/simple/deploy.rb +36 -0
- data/lib/cap_recipes.rb +1 -0
- data/lib/cap_recipes/tasks/apache.rb +1 -0
- data/lib/cap_recipes/tasks/apache/install.rb +16 -0
- data/lib/cap_recipes/tasks/apache/manage.rb +26 -0
- data/lib/cap_recipes/tasks/aptitude.rb +1 -0
- data/lib/cap_recipes/tasks/aptitude/manage.rb +32 -0
- data/lib/cap_recipes/tasks/backgroundrb.rb +1 -0
- data/lib/cap_recipes/tasks/backgroundrb/hooks.rb +5 -0
- data/lib/cap_recipes/tasks/backgroundrb/manage.rb +64 -0
- data/lib/cap_recipes/tasks/bundler.rb +1 -0
- data/lib/cap_recipes/tasks/bundler/manage.rb +31 -0
- data/lib/cap_recipes/tasks/delayed_job.rb +1 -0
- data/lib/cap_recipes/tasks/delayed_job/hooks.rb +5 -0
- data/lib/cap_recipes/tasks/delayed_job/manage.rb +34 -0
- data/lib/cap_recipes/tasks/ec2/install.rb +32 -0
- data/lib/cap_recipes/tasks/ec2/manage.rb +32 -0
- data/lib/cap_recipes/tasks/gitosis.rb +1 -0
- data/lib/cap_recipes/tasks/gitosis/install.rb +58 -0
- data/lib/cap_recipes/tasks/gitosis/manage.rb +3 -0
- data/lib/cap_recipes/tasks/hudson.rb +1 -0
- data/lib/cap_recipes/tasks/hudson/manage.rb +33 -0
- data/lib/cap_recipes/tasks/jetty.rb +1 -0
- data/lib/cap_recipes/tasks/jetty/install.rb +33 -0
- data/lib/cap_recipes/tasks/jetty/manage.rb +34 -0
- data/lib/cap_recipes/tasks/jetty/web.rb +98 -0
- data/lib/cap_recipes/tasks/juggernaut.rb +3 -0
- data/lib/cap_recipes/tasks/juggernaut/hooks.rb +4 -0
- data/lib/cap_recipes/tasks/juggernaut/manage.rb +56 -0
- data/lib/cap_recipes/tasks/maven.rb +85 -0
- data/lib/cap_recipes/tasks/memcache.rb +3 -0
- data/lib/cap_recipes/tasks/memcache/hooks.rb +5 -0
- data/lib/cap_recipes/tasks/memcache/install.rb +15 -0
- data/lib/cap_recipes/tasks/memcache/manage.rb +37 -0
- data/lib/cap_recipes/tasks/mongodb.rb +1 -0
- data/lib/cap_recipes/tasks/mongodb/install.rb +137 -0
- data/lib/cap_recipes/tasks/mongodb/manage.rb +27 -0
- data/lib/cap_recipes/tasks/passenger.rb +1 -0
- data/lib/cap_recipes/tasks/passenger/install.rb +72 -0
- data/lib/cap_recipes/tasks/passenger/manage.rb +23 -0
- data/lib/cap_recipes/tasks/rails.rb +1 -0
- data/lib/cap_recipes/tasks/rails/hooks.rb +6 -0
- data/lib/cap_recipes/tasks/rails/manage.rb +51 -0
- data/lib/cap_recipes/tasks/ruby.rb +1 -0
- data/lib/cap_recipes/tasks/ruby/install.rb +16 -0
- data/lib/cap_recipes/tasks/rubygems.rb +1 -0
- data/lib/cap_recipes/tasks/rubygems/install.rb +22 -0
- data/lib/cap_recipes/tasks/rubygems/manage.rb +43 -0
- data/lib/cap_recipes/tasks/templates/hudson.erb +85 -0
- data/lib/cap_recipes/tasks/templates/mongod.conf.erb +89 -0
- data/lib/cap_recipes/tasks/templates/mongodb.init.erb +73 -0
- data/lib/cap_recipes/tasks/templates/mongodb.repo.erb +4 -0
- data/lib/cap_recipes/tasks/templates/mongos.init.erb +69 -0
- data/lib/cap_recipes/tasks/templates/tomcat.erb +95 -0
- data/lib/cap_recipes/tasks/thinking_sphinx.rb +1 -0
- data/lib/cap_recipes/tasks/thinking_sphinx/hooks.rb +4 -0
- data/lib/cap_recipes/tasks/thinking_sphinx/install.rb +17 -0
- data/lib/cap_recipes/tasks/thinking_sphinx/manage.rb +65 -0
- data/lib/cap_recipes/tasks/tomcat.rb +1 -0
- data/lib/cap_recipes/tasks/tomcat/install.rb +43 -0
- data/lib/cap_recipes/tasks/tomcat/manage.rb +34 -0
- data/lib/cap_recipes/tasks/tomcat/war.rb +98 -0
- data/lib/cap_recipes/tasks/utilities.rb +172 -0
- data/lib/cap_recipes/tasks/whenever.rb +1 -0
- data/lib/cap_recipes/tasks/whenever/hooks.rb +5 -0
- data/lib/cap_recipes/tasks/whenever/manage.rb +8 -0
- data/lib/cap_recipes/tasks/yum.rb +1 -0
- data/lib/cap_recipes/tasks/yum/manage.rb +30 -0
- data/lib/capify.rb +35 -0
- data/lib/templates/Capfile.tt +4 -0
- data/lib/templates/deploy.rb.tt +30 -0
- data/spec/cap/all/Capfile +2 -0
- data/spec/cap/helper.rb +3 -0
- data/spec/cap_recipes_spec.rb +56 -0
- data/spec/spec_helper.rb +37 -0
- data/specs.watchr +35 -0
- metadata +155 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Dir[File.join(File.dirname(__FILE__), 'thinking_sphinx/*.rb')].sort.each { |lib| require lib }
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../utilities')
|
|
2
|
+
|
|
3
|
+
Capistrano::Configuration.instance(true).load do
|
|
4
|
+
namespace :thinking_sphinx do
|
|
5
|
+
desc 'Installs sphinx and thinking_sphinx'
|
|
6
|
+
task :install, :roles => :app do
|
|
7
|
+
puts 'Installing thinking_sphinx'
|
|
8
|
+
utilities.apt_upgrade
|
|
9
|
+
utilities.apt_install 'build-essential libmysqlclient15-dev libmysql++-dev'
|
|
10
|
+
run "cd /tmp; #{sudo} wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz"
|
|
11
|
+
run "cd /tmp; #{sudo} tar xvzf sphinx-0.9.8.1.tar.gz"
|
|
12
|
+
run "cd /tmp/sphinx-0.9.8.1/; #{sudo} ./configure --with-mysql-includes=/usr/include/mysql --with-mysql-libs=/usr/lib/mysql"
|
|
13
|
+
run "cd /tmp/sphinx-0.9.8.1/; #{sudo} make; #{sudo} make install"
|
|
14
|
+
sudo "gem install thinking-sphinx --source http://gemcutter.org --no-ri --no-rdoc"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
Capistrano::Configuration.instance(true).load do
|
|
2
|
+
set :sphinx_role, :app
|
|
3
|
+
|
|
4
|
+
namespace :thinking_sphinx do
|
|
5
|
+
# ===============================================================
|
|
6
|
+
# PROCESS MANAGEMENT
|
|
7
|
+
# ===============================================================
|
|
8
|
+
|
|
9
|
+
desc "Starts the thinking sphinx searchd server"
|
|
10
|
+
task :start, :roles => sphinx_role do
|
|
11
|
+
utilities.with_role(sphinx_role) do
|
|
12
|
+
puts "Starting thinking sphinx searchd server"
|
|
13
|
+
rake = fetch(:rake, "rake")
|
|
14
|
+
rails_env = fetch(:rails_env, "production")
|
|
15
|
+
|
|
16
|
+
run "cd #{current_path}; #{rake} RAILS_ENV=#{rails_env} thinking_sphinx:configure"
|
|
17
|
+
run "cd #{current_path}; #{rake} RAILS_ENV=#{rails_env} ts:start"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
desc "Stops the thinking sphinx searchd server"
|
|
22
|
+
task :stop, :roles => sphinx_role do
|
|
23
|
+
utilities.with_role(sphinx_role) do
|
|
24
|
+
puts "Stopping thinking sphinx searchd server"
|
|
25
|
+
rake = fetch(:rake, "rake")
|
|
26
|
+
rails_env = fetch(:rails_env, "production")
|
|
27
|
+
|
|
28
|
+
run "cd #{current_path}; #{rake} RAILS_ENV=#{rails_env} thinking_sphinx:configure"
|
|
29
|
+
run "cd #{current_path}; #{rake} RAILS_ENV=#{rails_env} ts:stop"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
desc "Restarts the thinking sphinx searchd server"
|
|
34
|
+
task :restart, :roles => sphinx_role do
|
|
35
|
+
utilities.with_role(sphinx_role) do
|
|
36
|
+
thinking_sphinx.stop
|
|
37
|
+
thinking_sphinx.index
|
|
38
|
+
thinking_sphinx.start
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# ===============================================================
|
|
43
|
+
# FILE MANAGEMENT
|
|
44
|
+
# ===============================================================
|
|
45
|
+
|
|
46
|
+
desc "Copies the shared/config/sphinx yaml to release/config/"
|
|
47
|
+
task :symlink_config, :roles => :app do
|
|
48
|
+
run "ln -s #{shared_path}/config/sphinx.yml #{release_path}/config/sphinx.yml"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
desc "Displays the thinking sphinx log from the server"
|
|
52
|
+
task :tail, :roles => :app do
|
|
53
|
+
stream "tail -f #{shared_path}/log/searchd.log"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
desc "Runs Thinking Sphinx indexer"
|
|
57
|
+
task :index, :roles => sphinx_role do
|
|
58
|
+
rake = fetch(:rake, "rake")
|
|
59
|
+
rails_env = fetch(:rails_env, "production")
|
|
60
|
+
puts "Updating search index"
|
|
61
|
+
|
|
62
|
+
run "cd #{current_path}; #{rake} RAILS_ENV=#{rails_env} ts:index"
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Dir[File.join(File.dirname(__FILE__), 'tomcat/*.rb')].sort.each { |lib| require lib }
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../utilities')
|
|
3
|
+
|
|
4
|
+
Capistrano::Configuration.instance(true).load do
|
|
5
|
+
default_run_options[:pty] = true
|
|
6
|
+
set :use_sudo, true
|
|
7
|
+
|
|
8
|
+
# TOMCAT SERVERS
|
|
9
|
+
_cset :tomcat_home, "/usr/local/apache-tomcat-6.0.29"
|
|
10
|
+
_cset :tomcat_ctrl, "/etc/init.d/tomcat"
|
|
11
|
+
_cset :java_home, "/usr/lib/jvm/java"
|
|
12
|
+
|
|
13
|
+
set :tomcat_user, do
|
|
14
|
+
user # default use current user.
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
#
|
|
18
|
+
# simple interactions with the tomcat server
|
|
19
|
+
#
|
|
20
|
+
namespace :tomcat do
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
desc "install tomcat"
|
|
24
|
+
task :install, :role => :app do
|
|
25
|
+
dir = File.dirname(tomcat_home)
|
|
26
|
+
basename = File.basename(tomcat_file)
|
|
27
|
+
basectl = File.basename(tomcat_ctrl)
|
|
28
|
+
utilities.sudo_upload "#{tomcat_file}", "#{dir}/#{basename}"
|
|
29
|
+
run "cd /tmp"
|
|
30
|
+
sudo "mkdir -p #{dir}"
|
|
31
|
+
sudo "tar -zvxf #{dir}/#{basename} -C #{dir}"
|
|
32
|
+
sudo "chown #{tomcat_user}:root #{tomcat_home} -R"
|
|
33
|
+
|
|
34
|
+
put utilities.render("tomcat", binding), "/tmp/tomcat.tmp"
|
|
35
|
+
sudo "cp /tmp/tomcat.tmp #{tomcat_ctrl}"
|
|
36
|
+
sudo "chmod a+x #{tomcat_ctrl}"
|
|
37
|
+
sudo "/sbin/chkconfig --add #{basectl}"
|
|
38
|
+
run "rm /tmp/tomcat.tmp"
|
|
39
|
+
sudo "rm #{dir}/#{basename}"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
Capistrano::Configuration.instance(true).load do
|
|
2
|
+
#
|
|
3
|
+
# simple interactions with the tomcat server
|
|
4
|
+
#
|
|
5
|
+
namespace :tomcat do
|
|
6
|
+
|
|
7
|
+
desc "start tomcat"
|
|
8
|
+
task :start do
|
|
9
|
+
sudo "#{tomcat_ctrl} start"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
desc "stop tomcat"
|
|
13
|
+
task :stop do
|
|
14
|
+
sudo "#{tomcat_ctrl} stop"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
desc "stop and start tomcat"
|
|
18
|
+
task :restart do
|
|
19
|
+
tomcat.stop
|
|
20
|
+
tomcat.start
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
desc "list tomcat process"
|
|
24
|
+
task :ps do
|
|
25
|
+
run "ps aux | grep tomcat | grep -v grep"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
desc "tail :tomcat_home/logs/*.log and logs/catalina.out"
|
|
29
|
+
task :tail do
|
|
30
|
+
stream "tail -f #{tomcat_home}/logs/*.log #{tomcat_home}/logs/catalina.out"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../utilities')
|
|
2
|
+
|
|
3
|
+
Capistrano::Configuration.instance(true).load do
|
|
4
|
+
# DEPLOYMENT SCHEME
|
|
5
|
+
set :scm, :none
|
|
6
|
+
set :deploy_via, :copy
|
|
7
|
+
set :use_sudo, true
|
|
8
|
+
|
|
9
|
+
_cset :deploy_to_parent, "/srv/applications"
|
|
10
|
+
|
|
11
|
+
default_run_options[:pty] = true
|
|
12
|
+
|
|
13
|
+
set :keep_releases, 5
|
|
14
|
+
|
|
15
|
+
set :repository do
|
|
16
|
+
fetch(:deploy_from)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
set :deploy_from do
|
|
20
|
+
dir = "/tmp/prep_#{release_name}"
|
|
21
|
+
system("mkdir -p #{dir}")
|
|
22
|
+
dir
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# this is capistrano's default location.
|
|
26
|
+
# depending on the permissions of the server
|
|
27
|
+
# you may need to create it and chown it over
|
|
28
|
+
# to :user (e.g. chown -R robotuser:robotuser /u)
|
|
29
|
+
set :deploy_to do
|
|
30
|
+
dir = "#{deploy_to_parent}/#{application}"
|
|
31
|
+
sudo "mkdir -p #{dir}"
|
|
32
|
+
sudo "chown #{user} #{dir}"
|
|
33
|
+
dir
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# link the current/whatever.war into our webapps/whatever.war
|
|
38
|
+
#
|
|
39
|
+
#after 'deploy:setup' do
|
|
40
|
+
# cmd = "ln -s #{deploy_to}/current/`basename #{war}` #{tomcat_home}/webapps/`basename #{war}`"
|
|
41
|
+
# puts cmd
|
|
42
|
+
# sudo cmd
|
|
43
|
+
#end
|
|
44
|
+
|
|
45
|
+
# collect up our war into the deploy_from folder
|
|
46
|
+
# notice that all we're doing is a copy here,
|
|
47
|
+
# so it is pretty easy to swap this out for
|
|
48
|
+
# a wget command, which makes sense if you're
|
|
49
|
+
# using a continuous integration server like
|
|
50
|
+
# bamboo. (more on this later).
|
|
51
|
+
before 'deploy:update_code' do
|
|
52
|
+
unless(war.nil?)
|
|
53
|
+
puts "get war"
|
|
54
|
+
system("mkdir #{deploy_from}/webapp")
|
|
55
|
+
system("cp #{war} #{deploy_from}/webapp")
|
|
56
|
+
system("cd #{deploy_from}/webapp && jar xf `basename #{war}`")
|
|
57
|
+
system("rm -Rf #{deploy_from}/webapp/META-INF")
|
|
58
|
+
system("rm #{deploy_from}/webapp/`basename #{war}`")
|
|
59
|
+
puts system("ls -l #{deploy_from}")
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
#
|
|
64
|
+
# Disable all the default tasks that
|
|
65
|
+
# either don't apply, or I haven't made work.
|
|
66
|
+
#
|
|
67
|
+
namespace :deploy do
|
|
68
|
+
# restart tomcat
|
|
69
|
+
task :restart do
|
|
70
|
+
tomcat.restart
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
[ :upload, :cold, :start, :stop, :migrate, :migrations, :finalize_update ].each do |default_task|
|
|
74
|
+
desc "[internal] disabled"
|
|
75
|
+
task default_task do
|
|
76
|
+
# disabled
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
namespace :web do
|
|
81
|
+
[ :disable, :enable ].each do |default_task|
|
|
82
|
+
desc "[internal] disabled"
|
|
83
|
+
task default_task do
|
|
84
|
+
# disabled
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
namespace :pending do
|
|
90
|
+
[ :default, :diff ].each do |default_task|
|
|
91
|
+
desc "[internal] disabled"
|
|
92
|
+
task default_task do
|
|
93
|
+
# disabled
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
module Utilities
|
|
4
|
+
# set var
|
|
5
|
+
def _cset(name, *args, &block)
|
|
6
|
+
unless exists?(name)
|
|
7
|
+
set(name, *args, &block)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# render a template
|
|
12
|
+
def render(file, binding)
|
|
13
|
+
template = File.read("#{File.dirname(__FILE__)}/templates/#{file}.erb")
|
|
14
|
+
result = ERB.new(template).result(binding)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# utilities.config_gsub('/etc/example', /(.*)/im, "\\1")
|
|
18
|
+
def config_gsub(file, find, replace)
|
|
19
|
+
tmp="/tmp/#{File.basename(file)}"
|
|
20
|
+
get file, tmp
|
|
21
|
+
content=File.open(tmp).read
|
|
22
|
+
content.gsub!(find,replace)
|
|
23
|
+
put content, tmp
|
|
24
|
+
sudo "mv #{tmp} #{file}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# utilities.ask('What is your name?', 'John')
|
|
29
|
+
def ask(question, default='')
|
|
30
|
+
question = "\n" + question.join("\n") if question.respond_to?(:uniq)
|
|
31
|
+
answer = Capistrano::CLI.ui.ask(space(question)).strip
|
|
32
|
+
answer.empty? ? default : answer
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# utilities.yes?('Proceed with install?')
|
|
36
|
+
def yes?(question)
|
|
37
|
+
question = "\n" + question.join("\n") if question.respond_to?(:uniq)
|
|
38
|
+
question += ' (y/n)'
|
|
39
|
+
ask(question).downcase.include? 'y'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# utilities.apt_install %w[package1 package2]
|
|
43
|
+
# utilities.apt_install "package1 package2"
|
|
44
|
+
def apt_install(packages)
|
|
45
|
+
packages = packages.split(/\s+/) if packages.respond_to?(:split)
|
|
46
|
+
packages = Array(packages)
|
|
47
|
+
apt_get="DEBCONF_TERSE='yes' DEBIAN_PRIORITY='critical' DEBIAN_FRONTEND=noninteractive apt-get"
|
|
48
|
+
sudo "#{apt_get} -qyu --force-yes install #{packages.join(" ")}"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def apt_upgrade
|
|
52
|
+
apt_get="DEBCONF_TERSE='yes' DEBIAN_PRIORITY='critical' DEBIAN_FRONTEND=noninteractive apt-get"
|
|
53
|
+
sudo "#{apt_get} -qy update"
|
|
54
|
+
sudo "#{apt_get} -qyu --force-yes upgrade"
|
|
55
|
+
end
|
|
56
|
+
# utilities.yum_install %w[package1 package2]
|
|
57
|
+
# utilities.yum_install "package1 package2"
|
|
58
|
+
def yum_install(packages)
|
|
59
|
+
packages = packages.split(/\s+/) if packages.respond_to?(:split)
|
|
60
|
+
packages = Array(packages)
|
|
61
|
+
sudo "yum -y install #{packages.join(" ")}"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def yum_update
|
|
65
|
+
apt_get="DEBCONF_TERSE='yes' DEBIAN_PRIORITY='critical' DEBIAN_FRONTEND=noninteractive apt-get"
|
|
66
|
+
sudo "yum -y update"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# utilities.sudo_upload('/local/path/to/file', '/remote/path/to/destination', options)
|
|
72
|
+
def sudo_upload(from, to, options={}, &block)
|
|
73
|
+
top.upload from, "/tmp/#{File.basename(to)}", options, &block
|
|
74
|
+
sudo "mv /tmp/#{File.basename(to)} #{to}"
|
|
75
|
+
sudo "chmod #{options[:mode]} #{to}" if options[:mode]
|
|
76
|
+
sudo "chown #{options[:owner]} #{to}" if options[:owner]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# utilities.adduser('deploy')
|
|
80
|
+
def adduser(user, options={})
|
|
81
|
+
options[:shell] ||= '/bin/bash' # new accounts on ubuntu 6.06.1 have been getting /bin/sh
|
|
82
|
+
switches = '--disabled-password --gecos ""'
|
|
83
|
+
switches += " --shell=#{options[:shell]} " if options[:shell]
|
|
84
|
+
switches += ' --no-create-home ' if options[:nohome]
|
|
85
|
+
switches += " --ingroup #{options[:group]} " unless options[:group].nil?
|
|
86
|
+
invoke_command "grep '^#{user}:' /etc/passwd || sudo /usr/sbin/adduser #{user} #{switches}",
|
|
87
|
+
:via => run_method
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# role = :app
|
|
91
|
+
def with_role(role, &block)
|
|
92
|
+
original, ENV['HOSTS'] = ENV['HOSTS'], find_servers(:roles => role).map{|d| d.host}.join(",")
|
|
93
|
+
begin
|
|
94
|
+
yield
|
|
95
|
+
ensure
|
|
96
|
+
ENV['HOSTS'] = original
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# utilities.with_credentials(:user => 'xxxx', :password => 'secret')
|
|
101
|
+
# options = { :user => 'xxxxx', :password => 'xxxxx' }
|
|
102
|
+
def with_credentials(options={}, &block)
|
|
103
|
+
original_username, original_password = user, password
|
|
104
|
+
begin
|
|
105
|
+
set :user, options[:user] || original_username
|
|
106
|
+
set :password, options[:password] || original_password
|
|
107
|
+
yield
|
|
108
|
+
ensure
|
|
109
|
+
set :user, original_username
|
|
110
|
+
set :password, original_password
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def space(str)
|
|
115
|
+
"\n#{'=' * 80}\n#{str}"
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
##
|
|
119
|
+
# Run a command and ask for input when input_query is seen.
|
|
120
|
+
# Sends the response back to the server.
|
|
121
|
+
#
|
|
122
|
+
# +input_query+ is a regular expression that defaults to /^Password/.
|
|
123
|
+
# Can be used where +run+ would otherwise be used.
|
|
124
|
+
# run_with_input 'ssh-keygen ...', /^Are you sure you want to overwrite\?/
|
|
125
|
+
def run_with_input(shell_command, input_query=/^Password/, response=nil)
|
|
126
|
+
handle_command_with_input(:run, shell_command, input_query, response)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
##
|
|
130
|
+
# Run a command using sudo and ask for input when a regular expression is seen.
|
|
131
|
+
# Sends the response back to the server.
|
|
132
|
+
#
|
|
133
|
+
# See also +run_with_input+
|
|
134
|
+
# +input_query+ is a regular expression
|
|
135
|
+
def sudo_with_input(shell_command, input_query=/^Password/, response=nil)
|
|
136
|
+
handle_command_with_input(:sudo, shell_command, input_query, response)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def invoke_with_input(shell_command, input_query=/^Password/, response=nil)
|
|
140
|
+
handle_command_with_input(run_method, shell_command, input_query, response)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
private
|
|
144
|
+
|
|
145
|
+
##
|
|
146
|
+
# Does the actual capturing of the input and streaming of the output.
|
|
147
|
+
#
|
|
148
|
+
# local_run_method: run or sudo
|
|
149
|
+
# shell_command: The command to run
|
|
150
|
+
# input_query: A regular expression matching a request for input: /^Please enter your password/
|
|
151
|
+
def handle_command_with_input(local_run_method, shell_command, input_query, response=nil)
|
|
152
|
+
send(local_run_method, shell_command, {:pty => true}) do |channel, stream, data|
|
|
153
|
+
|
|
154
|
+
if data =~ input_query
|
|
155
|
+
if response
|
|
156
|
+
logger.info "#{data} #{"*"*(rand(10)+5)}", channel[:host]
|
|
157
|
+
channel.send_data "#{response}\n"
|
|
158
|
+
else
|
|
159
|
+
logger.info data, channel[:host]
|
|
160
|
+
response = ::Capistrano::CLI.password_prompt "#{data}"
|
|
161
|
+
channel.send_data "#{response}\n"
|
|
162
|
+
end
|
|
163
|
+
else
|
|
164
|
+
logger.info data, channel[:host]
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
Capistrano.plugin :utilities, Utilities
|