dhill-sprinkle 0.3.3.1
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/.gitignore +3 -0
- data/CREDITS +33 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +242 -0
- data/Rakefile +2 -0
- data/VERSION +1 -0
- data/bin/sprinkle +95 -0
- data/examples/packages/build_essential.rb +9 -0
- data/examples/packages/databases/mysql.rb +13 -0
- data/examples/packages/databases/sqlite3.rb +16 -0
- data/examples/packages/phusion.rb +55 -0
- data/examples/packages/ruby/rails.rb +9 -0
- data/examples/packages/ruby/ruby.rb +17 -0
- data/examples/packages/ruby/rubygems.rb +17 -0
- data/examples/packages/scm/git.rb +11 -0
- data/examples/packages/scm/subversion.rb +4 -0
- data/examples/packages/servers/apache.rb +15 -0
- data/examples/rails/README +15 -0
- data/examples/rails/deploy.rb +2 -0
- data/examples/rails/packages/database.rb +9 -0
- data/examples/rails/packages/essential.rb +9 -0
- data/examples/rails/packages/rails.rb +29 -0
- data/examples/rails/packages/scm.rb +11 -0
- data/examples/rails/packages/search.rb +11 -0
- data/examples/rails/packages/server.rb +28 -0
- data/examples/rails/rails.rb +73 -0
- data/examples/sprinkle/sprinkle.rb +38 -0
- data/lib/sprinkle.rb +3 -0
- data/lib/sprinkle/actors/actors.rb +17 -0
- data/lib/sprinkle/actors/capistrano.rb +146 -0
- data/lib/sprinkle/actors/local.rb +37 -0
- data/lib/sprinkle/actors/ssh.rb +177 -0
- data/lib/sprinkle/actors/vlad.rb +83 -0
- data/lib/sprinkle/configurable.rb +31 -0
- data/lib/sprinkle/deployment.rb +73 -0
- data/lib/sprinkle/extensions/arbitrary_options.rb +10 -0
- data/lib/sprinkle/extensions/array.rb +5 -0
- data/lib/sprinkle/extensions/blank_slate.rb +5 -0
- data/lib/sprinkle/extensions/dsl_accessor.rb +15 -0
- data/lib/sprinkle/extensions/string.rb +10 -0
- data/lib/sprinkle/extensions/symbol.rb +7 -0
- data/lib/sprinkle/installers/apt.rb +52 -0
- data/lib/sprinkle/installers/binary.rb +46 -0
- data/lib/sprinkle/installers/bsd_port.rb +33 -0
- data/lib/sprinkle/installers/deb.rb +41 -0
- data/lib/sprinkle/installers/freebsd_pkg.rb +37 -0
- data/lib/sprinkle/installers/freebsd_portinstall.rb +36 -0
- data/lib/sprinkle/installers/gem.rb +64 -0
- data/lib/sprinkle/installers/install_package.rb +79 -0
- data/lib/sprinkle/installers/installer.rb +123 -0
- data/lib/sprinkle/installers/mac_port.rb +38 -0
- data/lib/sprinkle/installers/noop.rb +20 -0
- data/lib/sprinkle/installers/openbsd_pkg.rb +47 -0
- data/lib/sprinkle/installers/opensolaris_pkg.rb +43 -0
- data/lib/sprinkle/installers/push_text.rb +45 -0
- data/lib/sprinkle/installers/rake.rb +37 -0
- data/lib/sprinkle/installers/replace_text.rb +45 -0
- data/lib/sprinkle/installers/rpm.rb +37 -0
- data/lib/sprinkle/installers/runner.rb +18 -0
- data/lib/sprinkle/installers/smart.rb +29 -0
- data/lib/sprinkle/installers/source.rb +201 -0
- data/lib/sprinkle/installers/transfer.rb +178 -0
- data/lib/sprinkle/installers/user.rb +15 -0
- data/lib/sprinkle/installers/yum.rb +37 -0
- data/lib/sprinkle/installers/zypper.rb +43 -0
- data/lib/sprinkle/package.rb +326 -0
- data/lib/sprinkle/policy.rb +125 -0
- data/lib/sprinkle/script.rb +23 -0
- data/lib/sprinkle/verifiers/apt.rb +21 -0
- data/lib/sprinkle/verifiers/directory.rb +16 -0
- data/lib/sprinkle/verifiers/executable.rb +53 -0
- data/lib/sprinkle/verifiers/file.rb +34 -0
- data/lib/sprinkle/verifiers/package.rb +26 -0
- data/lib/sprinkle/verifiers/process.rb +21 -0
- data/lib/sprinkle/verifiers/rpm.rb +21 -0
- data/lib/sprinkle/verifiers/ruby.rb +25 -0
- data/lib/sprinkle/verifiers/symlink.rb +30 -0
- data/lib/sprinkle/verify.rb +114 -0
- data/lib/sprinkle/version.rb +3 -0
- data/script/console +8 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/sprinkle/actors/capistrano_spec.rb +265 -0
- data/spec/sprinkle/actors/local_spec.rb +29 -0
- data/spec/sprinkle/configurable_spec.rb +46 -0
- data/spec/sprinkle/deployment_spec.rb +80 -0
- data/spec/sprinkle/extensions/array_spec.rb +19 -0
- data/spec/sprinkle/extensions/string_spec.rb +21 -0
- data/spec/sprinkle/installers/apt_spec.rb +70 -0
- data/spec/sprinkle/installers/bsd_port_spec.rb +42 -0
- data/spec/sprinkle/installers/freebsd_pkg_spec.rb +49 -0
- data/spec/sprinkle/installers/freebsd_portinstall_spec.rb +42 -0
- data/spec/sprinkle/installers/gem_spec.rb +107 -0
- data/spec/sprinkle/installers/installer_spec.rb +151 -0
- data/spec/sprinkle/installers/mac_port_spec.rb +42 -0
- data/spec/sprinkle/installers/noop_spec.rb +23 -0
- data/spec/sprinkle/installers/openbsd_pkg_spec.rb +49 -0
- data/spec/sprinkle/installers/opensolaris_pkg_spec.rb +49 -0
- data/spec/sprinkle/installers/push_text_spec.rb +66 -0
- data/spec/sprinkle/installers/rake_spec.rb +29 -0
- data/spec/sprinkle/installers/replace_text_spec.rb +45 -0
- data/spec/sprinkle/installers/rpm_spec.rb +50 -0
- data/spec/sprinkle/installers/runner_spec.rb +31 -0
- data/spec/sprinkle/installers/source_spec.rb +371 -0
- data/spec/sprinkle/installers/transfer_spec.rb +98 -0
- data/spec/sprinkle/installers/yum_spec.rb +49 -0
- data/spec/sprinkle/installers/zypper_spec.rb +49 -0
- data/spec/sprinkle/package_spec.rb +474 -0
- data/spec/sprinkle/policy_spec.rb +126 -0
- data/spec/sprinkle/script_spec.rb +51 -0
- data/spec/sprinkle/sprinkle_spec.rb +25 -0
- data/spec/sprinkle/verify_spec.rb +173 -0
- data/sprinkle-0.3.3.1.gem +0 -0
- data/sprinkle.gemspec +26 -0
- metadata +281 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Sprinkle
|
|
2
|
+
module Installers
|
|
3
|
+
# = Mac OS X Port Installer (macports)
|
|
4
|
+
#
|
|
5
|
+
# The Port installer installs macports ports.
|
|
6
|
+
#
|
|
7
|
+
# == Example Usage
|
|
8
|
+
#
|
|
9
|
+
# Installing the magic_beans port.
|
|
10
|
+
#
|
|
11
|
+
# package :magic_beans do
|
|
12
|
+
# mac_port 'magic/magic_beans'
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# == Notes
|
|
16
|
+
# Before MacPorts packages can be installed, the PATH
|
|
17
|
+
# environment variable probably has to be changed so
|
|
18
|
+
# capistrano can find the /opt/local/bin/port executable
|
|
19
|
+
#
|
|
20
|
+
# You must set PATH in ~/.ssh/environment on the remote
|
|
21
|
+
# system and enable 'PermitUserEnvironment yes' in /etc/sshd_config
|
|
22
|
+
class MacPort < Installer
|
|
23
|
+
attr_accessor :port #:nodoc:
|
|
24
|
+
|
|
25
|
+
def initialize(parent, port, &block) #:nodoc:
|
|
26
|
+
super parent, &block
|
|
27
|
+
@port = port
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
protected
|
|
31
|
+
|
|
32
|
+
def install_commands #:nodoc:
|
|
33
|
+
"port install #{@port}"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Sprinkle
|
|
2
|
+
module Installers
|
|
3
|
+
# = Noop Installer
|
|
4
|
+
#
|
|
5
|
+
# This installer does nothing, it's simply useful for running pre / post hooks by themselves.
|
|
6
|
+
#
|
|
7
|
+
class Noop < Installer
|
|
8
|
+
def initialize(parent, name, options = {}, &block) #:nodoc:
|
|
9
|
+
super parent, options, &block
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
protected
|
|
13
|
+
|
|
14
|
+
def install_commands #:nodoc:
|
|
15
|
+
'echo noop'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Sprinkle
|
|
2
|
+
module Installers
|
|
3
|
+
# = OpenBSD Package Installer
|
|
4
|
+
#
|
|
5
|
+
# The Pkg package installer installs OpenBSD packages.
|
|
6
|
+
#
|
|
7
|
+
# == Example Usage
|
|
8
|
+
#
|
|
9
|
+
# Installing the magic_beans package.
|
|
10
|
+
#
|
|
11
|
+
# package :magic_beans do
|
|
12
|
+
# openbsd_pkg 'magic_beans'
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# You may also specify multiple packages as an array:
|
|
16
|
+
#
|
|
17
|
+
# package :magic_beans do
|
|
18
|
+
# openbsd_pkg %w(magic_beans magic_sauce)
|
|
19
|
+
# end
|
|
20
|
+
#
|
|
21
|
+
# == Notes
|
|
22
|
+
# Before OpenBSD packages can be installed, the PKG_PATH
|
|
23
|
+
# environment variable must be set.
|
|
24
|
+
#
|
|
25
|
+
# You must set PKG_PATH in ~/.ssh/environment on the remote
|
|
26
|
+
# system and enable 'PermitUserEnvironment yes' in /etc/ssh/sshd_config
|
|
27
|
+
#
|
|
28
|
+
# For help on PKG_PATH see section 15.2.2 of the OpenBSD FAQ
|
|
29
|
+
# (http://www.openbsd.org/faq/faq15.html)
|
|
30
|
+
class OpenbsdPkg < Installer
|
|
31
|
+
attr_accessor :packages #:nodoc:
|
|
32
|
+
|
|
33
|
+
def initialize(parent, packages, &block) #:nodoc:
|
|
34
|
+
super parent, &block
|
|
35
|
+
packages = [packages] unless packages.is_a? Array
|
|
36
|
+
@packages = packages
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
protected
|
|
40
|
+
|
|
41
|
+
def install_commands #:nodoc:
|
|
42
|
+
"pkg_add #{@packages.join(' ')}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module Sprinkle
|
|
2
|
+
module Installers
|
|
3
|
+
# = OpenSolaris Package Installer
|
|
4
|
+
#
|
|
5
|
+
# The Pkg package installer installs OpenSolaris packages.
|
|
6
|
+
#
|
|
7
|
+
# == Example Usage
|
|
8
|
+
#
|
|
9
|
+
# Installing the magic_beans package.
|
|
10
|
+
#
|
|
11
|
+
# package :magic_beans do
|
|
12
|
+
# opensolaris_pkg 'magic_beans'
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# You may also specify multiple packages as an array:
|
|
16
|
+
#
|
|
17
|
+
# package :magic_beans do
|
|
18
|
+
# opensolaris_pkg %w(magic_beans magic_sauce)
|
|
19
|
+
# end
|
|
20
|
+
#
|
|
21
|
+
# == Note
|
|
22
|
+
# If you are using capistrano as the deployment method
|
|
23
|
+
# you will need to add the following lines to your deploy.rb
|
|
24
|
+
# set :sudo, 'pfexec'
|
|
25
|
+
# set :sudo_prompt, ''
|
|
26
|
+
class OpensolarisPkg < Installer
|
|
27
|
+
attr_accessor :packages #:nodoc:
|
|
28
|
+
|
|
29
|
+
def initialize(parent, packages, &block) #:nodoc:
|
|
30
|
+
super parent, &block
|
|
31
|
+
packages = [packages] unless packages.is_a? Array
|
|
32
|
+
@packages = packages
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
protected
|
|
36
|
+
|
|
37
|
+
def install_commands #:nodoc:
|
|
38
|
+
"pkg install #{@packages.join(' ')}"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Sprinkle
|
|
2
|
+
module Installers
|
|
3
|
+
# Beware, strange "installer" coming your way.
|
|
4
|
+
#
|
|
5
|
+
# = Text configuration installer
|
|
6
|
+
#
|
|
7
|
+
# This installer pushes simple configuration into a file.
|
|
8
|
+
#
|
|
9
|
+
# == Example Usage
|
|
10
|
+
#
|
|
11
|
+
# Installing magic_beans into apache2.conf
|
|
12
|
+
#
|
|
13
|
+
# package :magic_beans do
|
|
14
|
+
# push_text 'magic_beans', '/etc/apache2/apache2.conf'
|
|
15
|
+
# end
|
|
16
|
+
#
|
|
17
|
+
# If you user has access to 'sudo' and theres a file that requires
|
|
18
|
+
# priveledges, you can pass :sudo => true
|
|
19
|
+
#
|
|
20
|
+
# package :magic_beans do
|
|
21
|
+
# push_text 'magic_beans', '/etc/apache2/apache2.conf', :sudo => true
|
|
22
|
+
# end
|
|
23
|
+
#
|
|
24
|
+
# A special verify step exists for this very installer
|
|
25
|
+
# its known as file_contains, it will test that a file indeed
|
|
26
|
+
# contains a substring that you send it.
|
|
27
|
+
#
|
|
28
|
+
class PushText < Installer
|
|
29
|
+
attr_accessor :text, :path #:nodoc:
|
|
30
|
+
|
|
31
|
+
def initialize(parent, text, path, options={}, &block) #:nodoc:
|
|
32
|
+
super parent, options, &block
|
|
33
|
+
@text = text
|
|
34
|
+
@path = path
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
protected
|
|
38
|
+
|
|
39
|
+
def install_commands #:nodoc:
|
|
40
|
+
"#{"#{'sudo ' if option?(:sudo)}grep \"^#{@text.gsub("'", "'\\\\''").gsub("\n", '\n')}$\" #{@path} ||" if option?(:idempotent) }/bin/echo -e '#{@text.gsub("'", "'\\\\''").gsub("\n", '\n')}' |#{'sudo ' if option?(:sudo)}tee -a #{@path}"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Sprinkle
|
|
2
|
+
module Installers
|
|
3
|
+
# = Rake Installer
|
|
4
|
+
#
|
|
5
|
+
# This installer runs a rake command.
|
|
6
|
+
#
|
|
7
|
+
# == Example Usage
|
|
8
|
+
#
|
|
9
|
+
# The following example runs the command "rake spec" on
|
|
10
|
+
# the remote server.
|
|
11
|
+
#
|
|
12
|
+
# package :spec do
|
|
13
|
+
# rake 'spec'
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# Specify a Rakefile with the :rakefile option.
|
|
17
|
+
#
|
|
18
|
+
# package :spec, :rakefile => "/var/setup/Rakefile" do
|
|
19
|
+
# rake 'spec'
|
|
20
|
+
# end
|
|
21
|
+
|
|
22
|
+
class Rake < Installer
|
|
23
|
+
def initialize(parent, commands, options = {}, &block) #:nodoc:
|
|
24
|
+
super parent, options, &block
|
|
25
|
+
@commands = commands.to_a
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
protected
|
|
29
|
+
|
|
30
|
+
def install_commands #:nodoc:
|
|
31
|
+
file = @options[:rakefile] ? "-f #{@options[:rakefile]} " : ""
|
|
32
|
+
"rake #{file}#{@commands.join(' ')}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Sprinkle
|
|
2
|
+
module Installers
|
|
3
|
+
# = Replace text installer
|
|
4
|
+
#
|
|
5
|
+
# This installer replaces a text with another one in a file.
|
|
6
|
+
#
|
|
7
|
+
# == Example Usage
|
|
8
|
+
#
|
|
9
|
+
# Change ssh port in /etc/ssh/sshd_config
|
|
10
|
+
#
|
|
11
|
+
# package :magic_beans do
|
|
12
|
+
# replace_text 'Port 22', 'Port 2500', '/etc/ssh/sshd_config'
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# If you user has access to 'sudo' and theres a file that requires
|
|
16
|
+
# priveledges, you can pass :sudo => true
|
|
17
|
+
#
|
|
18
|
+
# package :magic_beans do
|
|
19
|
+
# replace_text 'Port 22', 'Port 2500', '/etc/ssh/sshd_config', :sudo => true
|
|
20
|
+
# end
|
|
21
|
+
#
|
|
22
|
+
# A special verify step exists for this very installer
|
|
23
|
+
# its known as file_contains, it will test that a file indeed
|
|
24
|
+
# contains a substring that you send it.
|
|
25
|
+
#
|
|
26
|
+
class ReplaceText < Installer
|
|
27
|
+
attr_accessor :regex, :text, :path #:nodoc:
|
|
28
|
+
|
|
29
|
+
def initialize(parent, regex, text, path, options={}, &block) #:nodoc:
|
|
30
|
+
super parent, options, &block
|
|
31
|
+
@regex = regex
|
|
32
|
+
@text = text
|
|
33
|
+
@path = path
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
protected
|
|
37
|
+
|
|
38
|
+
def install_commands #:nodoc:
|
|
39
|
+
logger.info "--> Replace '#{@regex}' with '#{@text}' in file #{@path}"
|
|
40
|
+
"#{'sudo ' if option?(:sudo)}sed -i 's/#{@regex.gsub("'", "'\\\\''").gsub("/", "\\\\/").gsub("\n", '\n')}/#{@text.gsub("'", "'\\\\''").gsub("/", "\\\\/").gsub("\n", '\n')}/g' #{@path}"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Sprinkle
|
|
2
|
+
module Installers
|
|
3
|
+
# = RPM Package Installer
|
|
4
|
+
#
|
|
5
|
+
# The RPM package installer installs RPM packages.
|
|
6
|
+
#
|
|
7
|
+
# == Example Usage
|
|
8
|
+
#
|
|
9
|
+
# Installing the magic_beans RPM. Its all the craze these days.
|
|
10
|
+
#
|
|
11
|
+
# package :magic_beans do
|
|
12
|
+
# rpm 'magic_beans'
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# You may also specify multiple rpms as an array:
|
|
16
|
+
#
|
|
17
|
+
# package :magic_beans do
|
|
18
|
+
# rpm %w(magic_beans magic_sauce)
|
|
19
|
+
# end
|
|
20
|
+
class Rpm < Installer
|
|
21
|
+
attr_accessor :packages #:nodoc:
|
|
22
|
+
|
|
23
|
+
def initialize(parent, packages, &block) #:nodoc:
|
|
24
|
+
super parent, &block
|
|
25
|
+
packages = [packages] unless packages.is_a? Array
|
|
26
|
+
@packages = packages
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
protected
|
|
30
|
+
|
|
31
|
+
def install_commands #:nodoc:
|
|
32
|
+
"rpm -Uvh #{@packages.join(' ')}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Sprinkle
|
|
2
|
+
module Installers
|
|
3
|
+
class Runner < Installer
|
|
4
|
+
attr_accessor :cmd #:nodoc:
|
|
5
|
+
|
|
6
|
+
def initialize(parent, cmd) #:nodoc:
|
|
7
|
+
super parent
|
|
8
|
+
@cmd = cmd
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
protected
|
|
12
|
+
|
|
13
|
+
def install_commands #:nodoc:
|
|
14
|
+
@cmd
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Sprinkle
|
|
2
|
+
module Installers
|
|
3
|
+
class Smart < Installer
|
|
4
|
+
attr_accessor :packages #:nodoc:
|
|
5
|
+
|
|
6
|
+
def initialize(parent, packages, &block) #:nodoc:
|
|
7
|
+
super parent, &block
|
|
8
|
+
packages = [packages] unless packages.is_a? Array
|
|
9
|
+
@packages = packages
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
protected
|
|
13
|
+
|
|
14
|
+
def install_commands #:nodoc:
|
|
15
|
+
"smart install #{@packages.join(' ')} -y 2>&1 | tee -a /var/log/smart-sprinkle"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
module Sprinkle
|
|
22
|
+
module Package
|
|
23
|
+
class Package
|
|
24
|
+
def smart(*names, &block)
|
|
25
|
+
@installer = Sprinkle::Installers::Smart.new(self, *names, &block)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
module Sprinkle
|
|
2
|
+
module Installers
|
|
3
|
+
# = Source Package Installer
|
|
4
|
+
#
|
|
5
|
+
# The source package installer installs software from source.
|
|
6
|
+
# It handles downloading, extracting, configuring, building,
|
|
7
|
+
# and installing software.
|
|
8
|
+
#
|
|
9
|
+
# == Configuration Options
|
|
10
|
+
#
|
|
11
|
+
# The source installer has many configuration options:
|
|
12
|
+
# * <b>prefix</b> - The prefix directory that is configured to.
|
|
13
|
+
# * <b>archives</b> - The location all the files are downloaded to.
|
|
14
|
+
# * <b>builds</b> - The directory the package is extracted to to configure and install
|
|
15
|
+
#
|
|
16
|
+
# == Pre/Post Hooks
|
|
17
|
+
#
|
|
18
|
+
# The source installer defines a myriad of new stages which can be hooked into:
|
|
19
|
+
# * <b>prepare</b> - Prepare is the stage which all the prefix, archives, and build directories are made.
|
|
20
|
+
# * <b>download</b> - Download is the stage which the software package is downloaded.
|
|
21
|
+
# * <b>extract</b> - Extract is the stage which the software package is extracted.
|
|
22
|
+
# * <b>configure</b> - Configure is the stage which the ./configure script is run.
|
|
23
|
+
# * <b>build</b> - Build is the stage in which `make` is called.
|
|
24
|
+
# * <b>install</b> - Install is the stage which `make install` is called.
|
|
25
|
+
#
|
|
26
|
+
# == Example Usage
|
|
27
|
+
#
|
|
28
|
+
# First, a simple package, no configuration:
|
|
29
|
+
#
|
|
30
|
+
# package :magic_beans do
|
|
31
|
+
# source 'http://magicbeansland.com/latest-1.1.1.tar.gz'
|
|
32
|
+
# end
|
|
33
|
+
#
|
|
34
|
+
# Second, specifying exactly where I want my files:
|
|
35
|
+
#
|
|
36
|
+
# package :magic_beans do
|
|
37
|
+
# source 'http://magicbeansland.com/latest-1.1.1.tar.gz' do
|
|
38
|
+
# prefix '/usr/local'
|
|
39
|
+
# archives '/tmp'
|
|
40
|
+
# builds '/tmp/builds'
|
|
41
|
+
# end
|
|
42
|
+
# end
|
|
43
|
+
#
|
|
44
|
+
# Third, specifying some hooks:
|
|
45
|
+
#
|
|
46
|
+
# package :magic_beans do
|
|
47
|
+
# source 'http://magicbeansland.com/latest-1.1.1.tar.gz' do
|
|
48
|
+
# prefix '/usr/local'
|
|
49
|
+
#
|
|
50
|
+
# pre :prepare { 'echo "Here we go folks."' }
|
|
51
|
+
# post :extract { 'echo "I believe..."' }
|
|
52
|
+
# pre :build { 'echo "Cross your fingers!"' }
|
|
53
|
+
# end
|
|
54
|
+
# end
|
|
55
|
+
#
|
|
56
|
+
# Fourth, specifying a custom archive name because the downloaded file name
|
|
57
|
+
# differs from the source URL:
|
|
58
|
+
#
|
|
59
|
+
# package :gitosis do
|
|
60
|
+
# source 'http://github.com/crafterm/sprinkle/tarball/master' do
|
|
61
|
+
# custom_archive 'crafterm-sprinkle-518e33c835986c03ec7ae8ea88c657443b006f28.tar.gz'
|
|
62
|
+
# end
|
|
63
|
+
# end
|
|
64
|
+
#
|
|
65
|
+
# As you can see, setting options is as simple as creating a
|
|
66
|
+
# block and calling the option as a method with the value as
|
|
67
|
+
# its parameter.
|
|
68
|
+
|
|
69
|
+
class Source < Installer
|
|
70
|
+
attr_accessor :source #:nodoc:
|
|
71
|
+
|
|
72
|
+
def initialize(parent, source, options = {}, &block) #:nodoc:
|
|
73
|
+
@source = source
|
|
74
|
+
super parent, options, &block
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
protected
|
|
78
|
+
|
|
79
|
+
def install_sequence #:nodoc:
|
|
80
|
+
prepare + download + extract + configure + build + install
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
%w( prepare download extract configure build install ).each do |stage|
|
|
84
|
+
define_method stage do
|
|
85
|
+
pre_commands(stage.to_sym) + self.send("#{stage}_commands") + post_commands(stage.to_sym)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def prepare_commands #:nodoc:
|
|
90
|
+
raise 'No installation area defined' unless @options[:prefix]
|
|
91
|
+
raise 'No build area defined' unless @options[:builds]
|
|
92
|
+
raise 'No source download area defined' unless @options[:archives]
|
|
93
|
+
|
|
94
|
+
[ "mkdir -p #{@options[:prefix]}",
|
|
95
|
+
"mkdir -p #{@options[:builds]}",
|
|
96
|
+
"mkdir -p #{@options[:archives]}" ]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def download_commands #:nodoc:
|
|
100
|
+
if File.exist? @source
|
|
101
|
+
[ "cp #{@source} #{@options[:archives]}/#{archive_name}" ]
|
|
102
|
+
else
|
|
103
|
+
[ "wget -cq --directory-prefix='#{@options[:archives]}' #{@source}" ]
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def extract_commands #:nodoc:
|
|
108
|
+
[ "bash -c 'cd #{@options[:builds]} && #{extract_command} #{@options[:archives]}/#{archive_name}'" ]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def configure_commands #:nodoc:
|
|
112
|
+
return [] if custom_install?
|
|
113
|
+
|
|
114
|
+
command = "bash -c 'cd #{build_dir} && ./configure --prefix=#{@options[:prefix]} "
|
|
115
|
+
|
|
116
|
+
extras = {
|
|
117
|
+
:enable => '--enable', :disable => '--disable',
|
|
118
|
+
:with => '--with', :without => '--without',
|
|
119
|
+
:option => '-',
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
extras.inject(command) { |m, (k, v)| m << create_options(k, v) if options[k]; m }
|
|
123
|
+
|
|
124
|
+
[ command << " > #{@package.name}-configure.log 2>&1'" ]
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def build_commands #:nodoc:
|
|
128
|
+
return [] if custom_install?
|
|
129
|
+
[ "bash -c 'cd #{build_dir} && make > #{@package.name}-build.log 2>&1'" ]
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def install_commands #:nodoc:
|
|
133
|
+
return custom_install_commands if custom_install?
|
|
134
|
+
[ "bash -c 'cd #{build_dir} && make install > #{@package.name}-install.log 2>&1'" ]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def custom_install? #:nodoc:
|
|
138
|
+
!! @options[:custom_install]
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# REVISIT: must be better processing of custom install commands somehow? use splat operator?
|
|
142
|
+
def custom_install_commands #:nodoc:
|
|
143
|
+
# DWH 20110407 - Added stage parameter to match new arguments
|
|
144
|
+
dress @options[:custom_install], :custom, :install
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
protected
|
|
148
|
+
|
|
149
|
+
# dress is overriden from the base Sprinkle::Installers::Installer class so that the command changes
|
|
150
|
+
# directory to the build directory first. Also, the result of the command is logged.
|
|
151
|
+
def dress(commands, stage, type)
|
|
152
|
+
# DWH 20110407 - Bug fix as build directory and log don't yet exist in the prepare stage
|
|
153
|
+
commands.collect do |command|
|
|
154
|
+
cmd = "bash -c "
|
|
155
|
+
cmd += "'cd #{build_dir} && " unless stage == :prepare
|
|
156
|
+
cmd += "#{command}"
|
|
157
|
+
cmd += " >> #{@package.name}-#{type}.log 2>&1'" unless stage == :prepare
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
private
|
|
162
|
+
|
|
163
|
+
def create_options(key, prefix) #:nodoc:
|
|
164
|
+
@options[key].inject(' ') { |m, option| m << "#{prefix}-#{option} "; m }
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def extract_command #:nodoc:
|
|
168
|
+
case archive_name
|
|
169
|
+
when /(tar.gz)|(tgz)$/
|
|
170
|
+
'tar xzf'
|
|
171
|
+
when /(tar.bz2)|(tb2)$/
|
|
172
|
+
'tar xjf'
|
|
173
|
+
when /tar$/
|
|
174
|
+
'tar xf'
|
|
175
|
+
when /zip$/
|
|
176
|
+
'unzip -o'
|
|
177
|
+
else
|
|
178
|
+
raise "Unknown source archive format: #{archive_name}"
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def archive_name #:nodoc:
|
|
183
|
+
name = @options[:custom_archive] || @source.split('/').last
|
|
184
|
+
raise "Unable to determine archive name for source: #{source}, please update code knowledge" unless name
|
|
185
|
+
name
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def build_dir #:nodoc:
|
|
189
|
+
"#{@options[:builds]}/#{options[:custom_dir] || base_dir}"
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def base_dir #:nodoc:
|
|
193
|
+
if archive_name.split('/').last =~ /(.*)\.(tar\.gz|tgz|tar\.bz2|tar|tb2|zip)/
|
|
194
|
+
return $1
|
|
195
|
+
end
|
|
196
|
+
raise "Unknown base path for source archive: #{@source}, please update code knowledge"
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|