Empact-deprec 1.99.21
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/CHANGELOG +170 -0
- data/COPYING +19 -0
- data/LICENSE +339 -0
- data/README +136 -0
- data/THANKS +5 -0
- data/bin/depify +133 -0
- data/docs/ANNOUNCE.deprec2 +47 -0
- data/docs/README.install +88 -0
- data/docs/README.nagios +28 -0
- data/docs/README.rails +20 -0
- data/docs/README.svn +31 -0
- data/docs/ROADMAP.txt +74 -0
- data/docs/deprec-1.x/deprec-1.x.quickstart +50 -0
- data/docs/deprec-1.x/notes.txt +12 -0
- data/docs/deprec_banner.gif +0 -0
- data/lib/deprec.rb +8 -0
- data/lib/deprec/capistrano_extensions.rb +378 -0
- data/lib/deprec/recipes.rb +40 -0
- data/lib/deprec/recipes/aoe.rb +117 -0
- data/lib/deprec/recipes/apache.rb +179 -0
- data/lib/deprec/recipes/ar_sendmail.rb +65 -0
- data/lib/deprec/recipes/canonical.rb +57 -0
- data/lib/deprec/recipes/deprec.rb +155 -0
- data/lib/deprec/recipes/deprecated.rb +71 -0
- data/lib/deprec/recipes/example.rb +115 -0
- data/lib/deprec/recipes/git.rb +168 -0
- data/lib/deprec/recipes/gitosis.rb +47 -0
- data/lib/deprec/recipes/god.rb +107 -0
- data/lib/deprec/recipes/heartbeat.rb +138 -0
- data/lib/deprec/recipes/iptables.rb +53 -0
- data/lib/deprec/recipes/logrotate.rb +51 -0
- data/lib/deprec/recipes/lvm.rb +20 -0
- data/lib/deprec/recipes/memcached.rb +102 -0
- data/lib/deprec/recipes/mongrel.rb +209 -0
- data/lib/deprec/recipes/monit.rb +130 -0
- data/lib/deprec/recipes/mysql.rb +115 -0
- data/lib/deprec/recipes/nagios.rb +302 -0
- data/lib/deprec/recipes/network.rb +84 -0
- data/lib/deprec/recipes/nginx.rb +154 -0
- data/lib/deprec/recipes/ntp.rb +96 -0
- data/lib/deprec/recipes/php.rb +99 -0
- data/lib/deprec/recipes/postfix.rb +105 -0
- data/lib/deprec/recipes/rails.rb +302 -0
- data/lib/deprec/recipes/ruby.rb +66 -0
- data/lib/deprec/recipes/sphinx.rb +83 -0
- data/lib/deprec/recipes/ssh.rb +93 -0
- data/lib/deprec/recipes/svn.rb +169 -0
- data/lib/deprec/recipes/swiftiply.rb +108 -0
- data/lib/deprec/recipes/thin.rb +201 -0
- data/lib/deprec/recipes/trac.rb +277 -0
- data/lib/deprec/recipes/ubuntu.rb +20 -0
- data/lib/deprec/recipes/users.rb +90 -0
- data/lib/deprec/recipes/utils.rb +39 -0
- data/lib/deprec/recipes/xen.rb +259 -0
- data/lib/deprec/templates/aoe/aoe-init +55 -0
- data/lib/deprec/templates/aoe/fence_aoemask +351 -0
- data/lib/deprec/templates/apache/httpd-vhost-app.conf.erb +144 -0
- data/lib/deprec/templates/apache/httpd.conf +465 -0
- data/lib/deprec/templates/apache/index.html.erb +37 -0
- data/lib/deprec/templates/apache/master.css +72 -0
- data/lib/deprec/templates/ar_sendmail/logrotate.conf.erb +9 -0
- data/lib/deprec/templates/ar_sendmail/monit.conf.erb +5 -0
- data/lib/deprec/templates/coraid/aoe-init +55 -0
- data/lib/deprec/templates/deprec/caprc.erb +14 -0
- data/lib/deprec/templates/god/god-init-script +71 -0
- data/lib/deprec/templates/god/god-notifications +0 -0
- data/lib/deprec/templates/god/god_mongrel.erb +81 -0
- data/lib/deprec/templates/god/god_mysql.erb +50 -0
- data/lib/deprec/templates/god/god_nginx.erb +61 -0
- data/lib/deprec/templates/god/god_thin.erb +80 -0
- data/lib/deprec/templates/heartbeat/authkeys.erb +2 -0
- data/lib/deprec/templates/heartbeat/ha.cf.erb +15 -0
- data/lib/deprec/templates/heartbeat/haresources.erb +1 -0
- data/lib/deprec/templates/iptables/iptables.up.erb +41 -0
- data/lib/deprec/templates/logrotate/logrotate.conf.erb +32 -0
- data/lib/deprec/templates/memcached/memcached-init-script +65 -0
- data/lib/deprec/templates/memcached/memcached.conf.erb +46 -0
- data/lib/deprec/templates/mongrel/logrotate.conf.erb +11 -0
- data/lib/deprec/templates/mongrel/mongrel_cluster-init-script +54 -0
- data/lib/deprec/templates/mongrel/mongrel_cluster.logrotate.d +14 -0
- data/lib/deprec/templates/mongrel/mongrel_cluster.yml.erb +10 -0
- data/lib/deprec/templates/mongrel/monit.conf.erb +17 -0
- data/lib/deprec/templates/monit/monit-init-script +104 -0
- data/lib/deprec/templates/monit/monitrc.erb +227 -0
- data/lib/deprec/templates/monit/nothing +0 -0
- data/lib/deprec/templates/mysql/create_databases.sql +20 -0
- data/lib/deprec/templates/mysql/database.yml.prod +6 -0
- data/lib/deprec/templates/mysql/database.yml.stage +6 -0
- data/lib/deprec/templates/mysql/my.cnf.erb +140 -0
- data/lib/deprec/templates/mysql/sphinx.conf.prod +542 -0
- data/lib/deprec/templates/mysql/sphinx.conf.stage +542 -0
- data/lib/deprec/templates/nagios/cgi.cfg.erb +321 -0
- data/lib/deprec/templates/nagios/commands.cfg.erb +240 -0
- data/lib/deprec/templates/nagios/contacts.cfg.erb +75 -0
- data/lib/deprec/templates/nagios/hosts.cfg.erb +70 -0
- data/lib/deprec/templates/nagios/htpasswd.users +1 -0
- data/lib/deprec/templates/nagios/localhost.cfg.erb +157 -0
- data/lib/deprec/templates/nagios/nagios.cfg.erb +1274 -0
- data/lib/deprec/templates/nagios/nagios_apache_vhost.conf.erb +45 -0
- data/lib/deprec/templates/nagios/nrpe.cfg.erb +208 -0
- data/lib/deprec/templates/nagios/nrpe.xinetd.erb +16 -0
- data/lib/deprec/templates/nagios/resource.cfg.erb +34 -0
- data/lib/deprec/templates/nagios/services.cfg.erb +7 -0
- data/lib/deprec/templates/nagios/templates.cfg.erb +190 -0
- data/lib/deprec/templates/nagios/timeperiods.cfg.erb +94 -0
- data/lib/deprec/templates/network/hostname.erb +1 -0
- data/lib/deprec/templates/network/hosts.erb +2 -0
- data/lib/deprec/templates/network/interfaces.erb +18 -0
- data/lib/deprec/templates/nginx/logrotate.conf.erb +13 -0
- data/lib/deprec/templates/nginx/mime.types.erb +70 -0
- data/lib/deprec/templates/nginx/nginx-init-script +62 -0
- data/lib/deprec/templates/nginx/nginx.conf.erb +53 -0
- data/lib/deprec/templates/nginx/nginx.logrotate.d +12 -0
- data/lib/deprec/templates/nginx/nothing.conf +1 -0
- data/lib/deprec/templates/nginx/rails_nginx_vhost.conf.erb +45 -0
- data/lib/deprec/templates/ntp/ntp.conf.erb +42 -0
- data/lib/deprec/templates/postfix/aliases.erb +3 -0
- data/lib/deprec/templates/postfix/dynamicmaps.cf.erb +8 -0
- data/lib/deprec/templates/postfix/main.cf.erb +41 -0
- data/lib/deprec/templates/postfix/master.cf.erb +77 -0
- data/lib/deprec/templates/rails/database.yml.erb +6 -0
- data/lib/deprec/templates/sphinx/monit.conf.erb +5 -0
- data/lib/deprec/templates/ssh/ssh_config.erb +50 -0
- data/lib/deprec/templates/ssh/sshd_config.erb +78 -0
- data/lib/deprec/templates/subversion/svn.apache.vhost.erb +43 -0
- data/lib/deprec/templates/swiftiply/swiftiply-init-script +61 -0
- data/lib/deprec/templates/swiftiply/swiftiply.yml.erb +11 -0
- data/lib/deprec/templates/thin/thin-init-script +51 -0
- data/lib/deprec/templates/thin/thin.yml.erb +11 -0
- data/lib/deprec/templates/trac/apache_vhost.conf.erb +24 -0
- data/lib/deprec/templates/trac/nginx_vhost.conf.erb +26 -0
- data/lib/deprec/templates/trac/trac.ini.erb +169 -0
- data/lib/deprec/templates/trac/trac_deprec.png +0 -0
- data/lib/deprec/templates/trac/tracd-init.erb +43 -0
- data/lib/deprec/templates/trac/users.htdigest.erb +0 -0
- data/lib/deprec/templates/xen/15-disable-hwclock +40 -0
- data/lib/deprec/templates/xen/network-bridge-wrapper +3 -0
- data/lib/deprec/templates/xen/xen-tools.conf.erb +220 -0
- data/lib/deprec/templates/xen/xend-config.sxp.erb +195 -0
- data/lib/deprec/templates/xen/xend-init.erb +69 -0
- data/lib/deprec/templates/xen/xendomains.erb +137 -0
- data/lib/deprec/templates/xen/xm.tmpl.erb +85 -0
- data/lib/vmbuilder_plugins/all.rb +20 -0
- data/lib/vmbuilder_plugins/apt.rb +93 -0
- data/lib/vmbuilder_plugins/emerge.rb +76 -0
- data/lib/vmbuilder_plugins/gem.rb +90 -0
- data/lib/vmbuilder_plugins/std.rb +203 -0
- metadata +207 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# =all.rb: Load all the Capistrano Plugins in the directory.
|
|
2
|
+
#
|
|
3
|
+
# Require all other ruby files in the directory.
|
|
4
|
+
#
|
|
5
|
+
# ----
|
|
6
|
+
# Copyright (c) 2007 Neil Wilson, Aldur Systems Ltd
|
|
7
|
+
#
|
|
8
|
+
# Licensed under the GNU Public License v2. No warranty is provided.
|
|
9
|
+
# ----
|
|
10
|
+
# = Usage
|
|
11
|
+
#
|
|
12
|
+
# require 'vmbuilder_plugins/all'
|
|
13
|
+
|
|
14
|
+
# Splitting and joining __FILE__ deals with the current directory case
|
|
15
|
+
# properly
|
|
16
|
+
Dir[File.join( File.dirname(__FILE__), '*.rb')].each do |plugin_name|
|
|
17
|
+
unless plugin_name == File.join(File.dirname(__FILE__), File.basename(__FILE__))
|
|
18
|
+
require plugin_name
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# =apt.rb: Debian 'apt' Installer library
|
|
2
|
+
# Capistrano plugin module to install and manage apt packages
|
|
3
|
+
#
|
|
4
|
+
# ----
|
|
5
|
+
# Copyright (c) 2007 Neil Wilson, Aldur Systems Ltd
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the GNU Public License v2. No warranty is provided.
|
|
8
|
+
|
|
9
|
+
require 'capistrano'
|
|
10
|
+
|
|
11
|
+
# = Purpose
|
|
12
|
+
# Apt is a Capistrano plugin module providing a set of methods
|
|
13
|
+
# that invoke the *apt* package manager (as used in Debian and Ubuntu)
|
|
14
|
+
#
|
|
15
|
+
# Installs within Capistrano as the plugin _apt_.
|
|
16
|
+
#
|
|
17
|
+
# =Usage
|
|
18
|
+
#
|
|
19
|
+
# require 'vmbuilder_plugins/apt'
|
|
20
|
+
#
|
|
21
|
+
# Prefix all calls to the library with <tt>apt.</tt>
|
|
22
|
+
#
|
|
23
|
+
module Apt
|
|
24
|
+
|
|
25
|
+
# Default apt-get command - reduces any interactivity to the minimum.
|
|
26
|
+
APT_GET="DEBCONF_TERSE='yes' DEBIAN_PRIORITY='critical' DEBIAN_FRONTEND=noninteractive apt-get"
|
|
27
|
+
|
|
28
|
+
# Run the apt install program across the package list in 'packages'.
|
|
29
|
+
# Select those packages referenced by <tt>:base</tt> and the +version+
|
|
30
|
+
# of the distribution you want to use.
|
|
31
|
+
def install(packages, version, options={})
|
|
32
|
+
update
|
|
33
|
+
special_options="--allow-unauthenticated" if version != :stable
|
|
34
|
+
send(run_method, %{
|
|
35
|
+
sh -c "#{APT_GET} -qyu --force-yes #{special_options.to_s} install #{package_list(packages, version)}"
|
|
36
|
+
}, options)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Run an apt clean
|
|
40
|
+
def clean(options={})
|
|
41
|
+
send(run_method, %{sh -c "#{APT_GET} -qy clean"}, options)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Run an apt autoclean
|
|
45
|
+
def autoclean(options={})
|
|
46
|
+
send(run_method, %{sh -c "#{APT_GET} -qy autoclean"}, options)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Run an apt distribution upgrade
|
|
50
|
+
def dist_upgrade(options={})
|
|
51
|
+
update
|
|
52
|
+
send(run_method, %{sh -c "#{APT_GET} -qy dist-upgrade"}, options)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Run an apt upgrade. Use dist_upgrade instead if you want to upgrade
|
|
56
|
+
# the critical base packages.
|
|
57
|
+
def upgrade(options={})
|
|
58
|
+
update
|
|
59
|
+
send(run_method, %{sh -c "#{APT_GET} -qy upgrade"}, options)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Run an apt update.
|
|
63
|
+
def update(options={})
|
|
64
|
+
send(run_method, %{sh -c "#{APT_GET} -qy update"}, options)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# RPM package install via alien
|
|
68
|
+
def rpm_install(packages, options={})
|
|
69
|
+
install({:base => %w(wget alien) }, :base)
|
|
70
|
+
send(run_method, "wget -Ncq #{packages.join(' ')}", options)
|
|
71
|
+
files=packages.collect { |package| File.basename(package) }
|
|
72
|
+
send(run_method, "alien -i #{files.join(' ')}", options)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Clear the source list and package cache
|
|
76
|
+
def clear_cache(options={})
|
|
77
|
+
clean
|
|
78
|
+
cmd="rm -f /var/cache/apt/*.bin /var/lib/apt/lists/*_* /var/lib/apt/lists/partial/*"
|
|
79
|
+
send(run_method, cmd, options)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
private
|
|
83
|
+
|
|
84
|
+
# Provides a string containing all the package names in the base
|
|
85
|
+
#list plus those in +version+.
|
|
86
|
+
def package_list(packages, version)
|
|
87
|
+
packages[:base].to_a.join(' ') + ' ' + packages[version].to_a.join(' ')
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
Capistrano.plugin :apt, Apt
|
|
93
|
+
# vim: nowrap sw=2 sts=2 ts=8 ff=unix ft=ruby:
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# =emerge.rb: Gentoo 'emerge' Installer library
|
|
2
|
+
# Capistrano task library to install and manage portage packages
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2007 monki(Wesley Beary)
|
|
5
|
+
#
|
|
6
|
+
# inspiration: vmbuilder by Neil Wilson, Aldur Systems Ltd
|
|
7
|
+
#
|
|
8
|
+
# Licenced under the GNU Public License v2. No warranty is provided.
|
|
9
|
+
|
|
10
|
+
require 'capistrano'
|
|
11
|
+
|
|
12
|
+
# =Purpose
|
|
13
|
+
# emerge is a Capistrano plugin module providing a set of methods
|
|
14
|
+
# that invoke the portage package manage (as used in Gentoo)
|
|
15
|
+
#
|
|
16
|
+
# Installs within Capistrano as the plugin _emerge_.
|
|
17
|
+
#
|
|
18
|
+
# =Usage
|
|
19
|
+
#
|
|
20
|
+
# require 'marshall/plugins/emerge'
|
|
21
|
+
#
|
|
22
|
+
# Prefix all calls to the library with <tt>emerge.</tt>
|
|
23
|
+
#
|
|
24
|
+
module Emerge
|
|
25
|
+
# Default emerge command - reduce interactivity to the minimum
|
|
26
|
+
EMERGE="emerge -q"
|
|
27
|
+
|
|
28
|
+
# Emerge a new package or packages
|
|
29
|
+
def install(packages, options={})
|
|
30
|
+
cmd = <<-CMD
|
|
31
|
+
sh -c "#{EMERGE} #{packages.join(" ")}"
|
|
32
|
+
CMD
|
|
33
|
+
sudo(cmd, options)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Run clean old/unused packages
|
|
37
|
+
def clean(options={})
|
|
38
|
+
cmd = <<-CMD
|
|
39
|
+
sh -c "#{EMERGE} -clean"
|
|
40
|
+
CMD
|
|
41
|
+
sudo(cmd, options)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Upgrade installed package list
|
|
45
|
+
def upgrade(options={})
|
|
46
|
+
cmd = <<-CMD
|
|
47
|
+
sh -c "#{EMERGE} --sync"
|
|
48
|
+
CMD
|
|
49
|
+
sudo(cmd, options)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Update portage
|
|
53
|
+
def update_system(options={})
|
|
54
|
+
cmd = <<-CMD
|
|
55
|
+
sh -c "#{EMERGE} portage"
|
|
56
|
+
CMD
|
|
57
|
+
sudo(cmd, options)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Update all installed packages
|
|
61
|
+
def update(options={})
|
|
62
|
+
cmd = <<-CMD
|
|
63
|
+
sh -c "#{EMERGE} --update --deep --newuse world"
|
|
64
|
+
CMD
|
|
65
|
+
sudo(cmd, options)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Boot script manipulation command
|
|
69
|
+
def rc_update(packages, setting)
|
|
70
|
+
packages.each do |service|
|
|
71
|
+
sudo "rc_update add #{service} #{setting}"
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
Capistrano.plugin :emerge, Emerge
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# =gem.rb: Gem Installer library
|
|
2
|
+
# Capistrano library to install and manage Ruby Gems.
|
|
3
|
+
#
|
|
4
|
+
# ----
|
|
5
|
+
# Copyright (c) 2007 Neil Wilson, Aldur Systems Ltd
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the GNU Public License v2. No warranty is provided.
|
|
8
|
+
|
|
9
|
+
require 'capistrano'
|
|
10
|
+
|
|
11
|
+
# = Purpose
|
|
12
|
+
# Gem is a Capistrano plugin module providing a set of methods
|
|
13
|
+
# that invoke the *gem* package manager.
|
|
14
|
+
#
|
|
15
|
+
# Installs within Capistrano as the plugin _gem_.
|
|
16
|
+
#
|
|
17
|
+
# =Usage
|
|
18
|
+
#
|
|
19
|
+
# require 'vmbuilder_plugins/gem'
|
|
20
|
+
#
|
|
21
|
+
# Prefix all calls to the library with <tt>gem.</tt>
|
|
22
|
+
#
|
|
23
|
+
module Gem
|
|
24
|
+
|
|
25
|
+
# Default install command
|
|
26
|
+
#
|
|
27
|
+
# * doesn't install documentation
|
|
28
|
+
# * installs all required dependencies automatically.
|
|
29
|
+
#
|
|
30
|
+
GEM_INSTALL="gem install --no-rdoc --no-ri"
|
|
31
|
+
GEM_UPDATE=GEM_INSTALL.sub("install", "update")
|
|
32
|
+
|
|
33
|
+
# Upgrade the *gem* system to the latest version. Runs via *sudo*
|
|
34
|
+
def update_system
|
|
35
|
+
send(run_method, "#{GEM_UPDATE} --system")
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Updates all the installed gems to the latest version. Runs via *sudo*.
|
|
39
|
+
# Don't use this command if any of the gems require a version selection.
|
|
40
|
+
def upgrade
|
|
41
|
+
send(run_method, GEM_UPDATE)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Removes old versions of gems from installation area.
|
|
45
|
+
def cleanup
|
|
46
|
+
send(run_method, "gem cleanup")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Installs the gems detailed in +packages+, selecting version +version+ if
|
|
50
|
+
# specified.
|
|
51
|
+
#
|
|
52
|
+
# +packages+ can be a single string or an array of strings.
|
|
53
|
+
#
|
|
54
|
+
def install(packages, version=nil)
|
|
55
|
+
send(run_method,"#{GEM_INSTALL} #{if version then '-v '+version.to_s end} #{packages.to_a.join(' ')}")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Auto selects a gem from a list and installs it.
|
|
59
|
+
#
|
|
60
|
+
# *gem* has no mechanism on the command line of disambiguating builds for
|
|
61
|
+
# different platforms, and instead asks the user. This method has the necessary
|
|
62
|
+
# conversation to select the +version+ relevant to +platform+ (or the one nearest
|
|
63
|
+
# the top of the list if you don't specify +version+).
|
|
64
|
+
def select(package, version=nil, platform='ruby')
|
|
65
|
+
selections={}
|
|
66
|
+
cmd="#{GEM_INSTALL} #{if version then '-v '+version.to_s end} #{package}"
|
|
67
|
+
send run_method, cmd do |channel, stream, data|
|
|
68
|
+
data.each_line do | line |
|
|
69
|
+
case line
|
|
70
|
+
when /\s(\d+).*\(#{platform}\)/
|
|
71
|
+
if selections[channel[:host]].nil?
|
|
72
|
+
selections[channel[:host]]=$1.dup+"\n"
|
|
73
|
+
logger.info "Selecting #$&", "#{stream} :: #{channel[:host]}"
|
|
74
|
+
end
|
|
75
|
+
when /\s\d+\./
|
|
76
|
+
# Discard other selections from data stream
|
|
77
|
+
when /^>/
|
|
78
|
+
channel.send_data selections[channel[:host]]
|
|
79
|
+
logger.debug line, "#{stream} :: #{channel[:host]}"
|
|
80
|
+
else
|
|
81
|
+
logger.info line, "#{stream} :: #{channel[:host]}"
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
Capistrano.plugin :gem2, Gem
|
|
90
|
+
# vim: nowrap sw=2 sts=2 ts=8 ff=unix ft=ruby:
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# =std.rb: Capistrano Standard Methods
|
|
2
|
+
# Standard library of procedures and functions that you can use with Capistrano.
|
|
3
|
+
#
|
|
4
|
+
# ----
|
|
5
|
+
# Copyright (c) 2007 Neil Wilson, Aldur Systems Ltd
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the GNU Public License v2. No warranty is provided.
|
|
8
|
+
|
|
9
|
+
require 'capistrano'
|
|
10
|
+
|
|
11
|
+
# = Purpose
|
|
12
|
+
# Std is a Capistrano plugin that provides a set of standard methods refactored
|
|
13
|
+
# out of several Capistrano task libraries.
|
|
14
|
+
#
|
|
15
|
+
# Installs within Capistrano as the plugin _std_
|
|
16
|
+
#
|
|
17
|
+
# = Usage
|
|
18
|
+
#
|
|
19
|
+
# require 'vmbuilder_plugins/std'
|
|
20
|
+
#
|
|
21
|
+
# Prefix all calls to the library with <tt>std.</tt>
|
|
22
|
+
module Std
|
|
23
|
+
|
|
24
|
+
begin
|
|
25
|
+
# Use the Mmap class if it is available
|
|
26
|
+
# http://moulon.inra.fr/ruby/mmap.html
|
|
27
|
+
require 'mmap'
|
|
28
|
+
MMAP=true #:nodoc:
|
|
29
|
+
rescue LoadError
|
|
30
|
+
# no MMAP class, use normal reads instead
|
|
31
|
+
MMAP=false #:nodoc:
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Copies the files specified by +file_pattern+ to +destination+
|
|
35
|
+
#
|
|
36
|
+
# Error checking is minimal - a pattern onto a single file will result in +destination+
|
|
37
|
+
# containing the data from the last file only.
|
|
38
|
+
#
|
|
39
|
+
# Installs via *sudo*, +options+ are as for *put*.
|
|
40
|
+
def fput(file_pattern, destination, options={})
|
|
41
|
+
logger.info file_pattern
|
|
42
|
+
Dir.glob(file_pattern) do |fname|
|
|
43
|
+
if File.readable?(fname) then
|
|
44
|
+
if MMAP
|
|
45
|
+
logger.debug "Using Memory Mapped File Upload"
|
|
46
|
+
fdata=Mmap.new(fname,"r", Mmap::MAP_SHARED, :advice => Mmap::MADV_SEQUENTIAL)
|
|
47
|
+
else
|
|
48
|
+
fdata=File.open(fname).read
|
|
49
|
+
end
|
|
50
|
+
su_put(fdata, destination, File.join('/tmp',File.basename(fname)), options)
|
|
51
|
+
else
|
|
52
|
+
logger.error "Unable to read file #{fname}"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Upload +data+ to +temporary_area+ before installing it in
|
|
58
|
+
# +destination+ using sudo.
|
|
59
|
+
#
|
|
60
|
+
# +options+ are as for *put*
|
|
61
|
+
#
|
|
62
|
+
def su_put(data, destination, temporary_area='/tmp', options={})
|
|
63
|
+
temporary_area = File.join(temporary_area,File.basename(destination))
|
|
64
|
+
put(data, temporary_area, options)
|
|
65
|
+
send run_method, <<-CMD
|
|
66
|
+
sh -c "install -m#{sprintf("%3o",options[:mode]||0755)} #{temporary_area} #{destination} &&
|
|
67
|
+
rm -f #{temporary_area}"
|
|
68
|
+
CMD
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Copies the +file_pattern+, which is assumed to be a tar
|
|
72
|
+
# file of some description (gzipped or plain), and unpacks it into
|
|
73
|
+
# +destination+.
|
|
74
|
+
def unzip(file_pattern, destination, options={})
|
|
75
|
+
Dir.glob(file_pattern) do |fname|
|
|
76
|
+
if File.readable?(fname) then
|
|
77
|
+
target="/tmp/#{File.basename(fname)}"
|
|
78
|
+
if MMAP
|
|
79
|
+
logger.debug "Using Memory Mapped File Upload"
|
|
80
|
+
fdata=Mmap.new(fname,"r", Mmap::MAP_SHARED, :advice => Mmap::MADV_SEQUENTIAL)
|
|
81
|
+
else
|
|
82
|
+
fdata=File.open(fname).read
|
|
83
|
+
end
|
|
84
|
+
put(fdata, target, options)
|
|
85
|
+
send run_method, <<-CMD
|
|
86
|
+
sh -c "cd #{destination} &&
|
|
87
|
+
zcat -f #{target} | tar xvf - &&
|
|
88
|
+
rm -f #{target}"
|
|
89
|
+
CMD
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Wrap this around your task calls to catch the no servers error and
|
|
95
|
+
# ignore it
|
|
96
|
+
#
|
|
97
|
+
# std.ignore_no_servers_error do
|
|
98
|
+
# activate_mysql
|
|
99
|
+
# end
|
|
100
|
+
#
|
|
101
|
+
def ignore_no_servers_error (&block)
|
|
102
|
+
begin
|
|
103
|
+
yield
|
|
104
|
+
rescue RuntimeError => failure
|
|
105
|
+
if failure.message =~ /no servers matched/
|
|
106
|
+
logger.debug "Ignoring 'no servers matched' error in task #{current_task.name}"
|
|
107
|
+
else
|
|
108
|
+
raise
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Wrap this around your task to force a connection as root.
|
|
114
|
+
# Flushes the session cache before and after the connection.
|
|
115
|
+
#
|
|
116
|
+
# std.connect_as_root do
|
|
117
|
+
# install_sudo
|
|
118
|
+
# end
|
|
119
|
+
#
|
|
120
|
+
def connect_as_root (&block)
|
|
121
|
+
begin
|
|
122
|
+
tempuser = user
|
|
123
|
+
set :user, "root"
|
|
124
|
+
actor.sessions.delete_if { true }
|
|
125
|
+
yield tempuser
|
|
126
|
+
ensure
|
|
127
|
+
set :user, tempuser if tempuser
|
|
128
|
+
actor.sessions.delete_if { true }
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
#Returns a random string of alphanumeric characters of size +size+
|
|
133
|
+
#Useful for passwords, usernames and the like.
|
|
134
|
+
def random_string(size=10)
|
|
135
|
+
s = ""
|
|
136
|
+
size.times { s << (i = rand(62); i += ((i < 10) ? 48 : ((i < 36) ? 55 : 61 ))).chr }
|
|
137
|
+
s
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
# Return a relative path from the destination directory +from_str+
|
|
142
|
+
# to the target file/directory +to_str+. Used to create relative
|
|
143
|
+
# symbolic link paths.
|
|
144
|
+
def relative_path (from_str, to_str)
|
|
145
|
+
require 'pathname'
|
|
146
|
+
Pathname.new(to_str).relative_path_from(Pathname.new(from_str)).to_s
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Run a ruby command file on the servers
|
|
150
|
+
#
|
|
151
|
+
def ruby(cmd, options={}, &block)
|
|
152
|
+
temp_name = random_string + ".rb"
|
|
153
|
+
begin
|
|
154
|
+
put(cmd, temp_name, :mode => 0700)
|
|
155
|
+
send(run_method, "ruby #{temp_name}", options, &block)
|
|
156
|
+
ensure
|
|
157
|
+
delete temp_name
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Run a patchfile on the servers
|
|
162
|
+
# Ignores reverses and rejects.
|
|
163
|
+
#
|
|
164
|
+
def patch(patchfile, level = '0', where = '/')
|
|
165
|
+
temp_name = random_string
|
|
166
|
+
begin
|
|
167
|
+
fput(patchfile, temp_name, :mode => 0600)
|
|
168
|
+
send(run_method, %{
|
|
169
|
+
patch -p#{level} -tNd #{where} -r /dev/null < #{temp_name} || true
|
|
170
|
+
})
|
|
171
|
+
ensure
|
|
172
|
+
delete temp_name
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Deletes the given file(s) from all servers targetted by the current
|
|
177
|
+
# task, but runs the +delete+ command according to the current setting
|
|
178
|
+
# of <tt>:use_sudo</tt>.
|
|
179
|
+
#
|
|
180
|
+
# If <tt>:recursive => true</tt> is specified, it may be used to remove
|
|
181
|
+
# directories.
|
|
182
|
+
def su_delete(path, options={})
|
|
183
|
+
cmd = "rm -%sf #{path}" % (options[:recursive] ? "r" : "")
|
|
184
|
+
send(run_method, cmd, options)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# Render a template file and upload it to the servers
|
|
188
|
+
#
|
|
189
|
+
def put_template(template, destination, options={})
|
|
190
|
+
if MMAP
|
|
191
|
+
logger.debug "Using Memory Mapped File Upload"
|
|
192
|
+
fdata=Mmap.new(template,"r", Mmap::MAP_SHARED, :advice => Mmap::MADV_SEQUENTIAL)
|
|
193
|
+
else
|
|
194
|
+
fdata=File.read(template)
|
|
195
|
+
end
|
|
196
|
+
put(render(:template => fdata), destination, options)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
Capistrano.plugin :std, Std
|
|
202
|
+
#
|
|
203
|
+
# vim: nowrap sw=2 sts=2 ts=8 ff=unix ft=ruby:
|