sprinkle 0.7.5 → 0.7.6
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/Gemfile.lock +1 -1
- data/examples/rails/rails.rb +5 -2
- data/lib/sprinkle.rb +2 -0
- data/lib/sprinkle/actors/capistrano.rb +4 -5
- data/lib/sprinkle/actors/dummy.rb +10 -1
- data/lib/sprinkle/actors/local.rb +4 -4
- data/lib/sprinkle/actors/ssh.rb +4 -4
- data/lib/sprinkle/commands/command.rb +23 -0
- data/lib/sprinkle/commands/reconnect.rb +14 -0
- data/lib/sprinkle/commands/transfer.rb +29 -0
- data/lib/sprinkle/installers/file.rb +24 -5
- data/lib/sprinkle/installers/installer.rb +5 -0
- data/lib/sprinkle/installers/pecl.rb +82 -0
- data/lib/sprinkle/installers/reconnect.rb +1 -1
- data/lib/sprinkle/installers/source.rb +1 -1
- data/lib/sprinkle/installers/transfer.rb +126 -63
- data/lib/sprinkle/package.rb +1 -1
- data/lib/sprinkle/package/rendering.rb +47 -8
- data/lib/sprinkle/policy.rb +11 -1
- data/lib/sprinkle/version.rb +1 -1
- data/spec/sprinkle/extensions/rendering_spec.rb +27 -0
- data/spec/sprinkle/installers/file_spec.rb +38 -6
- data/spec/sprinkle/installers/pecl_spec.rb +78 -0
- data/spec/sprinkle/installers/source_spec.rb +12 -0
- data/spec/sprinkle/installers/transfer_spec.rb +75 -25
- metadata +8 -2
data/Gemfile.lock
CHANGED
data/examples/rails/rails.rb
CHANGED
@@ -56,8 +56,11 @@ end
|
|
56
56
|
deployment do
|
57
57
|
|
58
58
|
# mechanism for deployment
|
59
|
-
delivery :capistrano do
|
60
|
-
|
59
|
+
# delivery :capistrano do
|
60
|
+
# recipes 'deploy'
|
61
|
+
# end
|
62
|
+
delivery :dummy do
|
63
|
+
role :app, "test"
|
61
64
|
end
|
62
65
|
|
63
66
|
# source based package installer defaults
|
data/lib/sprinkle.rb
CHANGED
@@ -100,11 +100,10 @@ module Sprinkle
|
|
100
100
|
define_task(name, roles) do
|
101
101
|
via = fetch(:run_method, :run)
|
102
102
|
commands.each do |command|
|
103
|
-
if command
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
elsif command == :RECONNECT
|
103
|
+
if command.is_a? Commands::Transfer
|
104
|
+
upload command.source, command.destination, :via => :scp,
|
105
|
+
:recursive => command.recursive?
|
106
|
+
elsif command.is_a? Commands::Reconnect
|
108
107
|
teardown_connections_to(sessions.keys)
|
109
108
|
else
|
110
109
|
# this reset the log
|
@@ -4,6 +4,8 @@ require 'pp'
|
|
4
4
|
module Sprinkle
|
5
5
|
module Actors
|
6
6
|
class Dummy < Actor #:nodoc:
|
7
|
+
|
8
|
+
attr_accessor :per_host
|
7
9
|
|
8
10
|
def initialize(&block) #:nodoc:
|
9
11
|
# @config.set(:_sprinkle_actor, self)
|
@@ -23,6 +25,7 @@ module Sprinkle
|
|
23
25
|
end
|
24
26
|
|
25
27
|
def install(installer, roles, opts={})
|
28
|
+
@installer = installer
|
26
29
|
if self.per_host=opts.delete(:per_host)
|
27
30
|
servers_per_role(roles).each do |server|
|
28
31
|
installer.reconfigure_for(server)
|
@@ -45,10 +48,16 @@ module Sprinkle
|
|
45
48
|
def servers_per_role(role)
|
46
49
|
@roles[role]
|
47
50
|
end
|
51
|
+
|
52
|
+
def print_command(cmd)
|
53
|
+
puts cmd.inspect
|
54
|
+
end
|
48
55
|
|
49
56
|
def process(name, commands, roles, opts = {}) #:nodoc:
|
50
57
|
# puts "PROCESS: #{name} on #{roles}"
|
51
|
-
|
58
|
+
commands.each do |cmd|
|
59
|
+
print_command(cmd)
|
60
|
+
end
|
52
61
|
# return false if suppress_and_return_failures
|
53
62
|
true
|
54
63
|
end
|
@@ -53,11 +53,11 @@ module Sprinkle
|
|
53
53
|
def process(name, commands, roles, opts = {}) #:nodoc:
|
54
54
|
@log_recorder = Sprinkle::Utility::LogRecorder.new
|
55
55
|
commands.each do |command|
|
56
|
-
if command
|
56
|
+
if command.is_a?(Commands::Reconnect)
|
57
57
|
res = 0
|
58
|
-
elsif command
|
59
|
-
res = transfer(
|
60
|
-
:recursive =>
|
58
|
+
elsif command.is_a?(Commands::Transfer)
|
59
|
+
res = transfer(command.source, command.destination, roles,
|
60
|
+
:recursive => command.recursive?)
|
61
61
|
else
|
62
62
|
res = run_command command
|
63
63
|
end
|
data/lib/sprinkle/actors/ssh.rb
CHANGED
@@ -162,11 +162,11 @@ module Sprinkle
|
|
162
162
|
def execute_on_host(commands,host) #:nodoc:
|
163
163
|
prepare_commands(commands).each do |cmd|
|
164
164
|
case cmd
|
165
|
-
when
|
165
|
+
when cmd.is_a?(Commands::Reconnect) then
|
166
166
|
reconnect host
|
167
|
-
when
|
168
|
-
transfer_to_host(
|
169
|
-
:recursive =>
|
167
|
+
when cmd.is_a?(Commands::Transfer) then
|
168
|
+
transfer_to_host(cmd.source, cmd.destination, host,
|
169
|
+
:recursive => cmd.recursive?)
|
170
170
|
else
|
171
171
|
run_command cmd, host
|
172
172
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Sprinkle
|
2
|
+
module Commands
|
3
|
+
class Command
|
4
|
+
|
5
|
+
def initialize(str, opts = {})
|
6
|
+
@sudo = opts[:sudo]
|
7
|
+
@str = str
|
8
|
+
# this is a dummy class for now, not intended to be used directly
|
9
|
+
raise
|
10
|
+
end
|
11
|
+
|
12
|
+
def sudo?
|
13
|
+
@sudo
|
14
|
+
end
|
15
|
+
|
16
|
+
def string
|
17
|
+
# TODO: sudo
|
18
|
+
@str
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Sprinkle
|
2
|
+
module Commands
|
3
|
+
class Transfer < Command
|
4
|
+
|
5
|
+
attr_reader :source, :destination, :opts
|
6
|
+
|
7
|
+
def initialize(source, destination, opts={})
|
8
|
+
@source = source
|
9
|
+
@destination = destination
|
10
|
+
@opts = opts
|
11
|
+
end
|
12
|
+
|
13
|
+
def recursive?
|
14
|
+
!!@opts[:recursive]
|
15
|
+
end
|
16
|
+
|
17
|
+
def inspect
|
18
|
+
":TRANSFER, src: #{source}, dest: #{destination}, opts: #{@opts.inspect}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def eql?(a,b)
|
22
|
+
a.source == b.source &&
|
23
|
+
a.destionation == b.destination &&
|
24
|
+
a.opts == b.opts
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -32,8 +32,23 @@ module Sprinkle
|
|
32
32
|
# @nginx_port = 8080
|
33
33
|
# file '/etc/nginx.conf',
|
34
34
|
# :contents => render("nginx.conf")
|
35
|
-
# #
|
36
|
-
# #
|
35
|
+
# # where [cwd] is the current working dir you're running sprinkle from
|
36
|
+
# # [cwd]/templates/nginx.conf.erb or
|
37
|
+
# # [cwd]/templates/nginx.conf should contain the erb template
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# You can also tell the package where to look for templates, so that if you have
|
41
|
+
# a complex package hierarchy such as:
|
42
|
+
#
|
43
|
+
# .../packages/p/postfix.rb
|
44
|
+
# .../packages/p/postfix/templates/main.cf.erb
|
45
|
+
#
|
46
|
+
# package :postfix do
|
47
|
+
# template_search_path File.dirname(__FILE__)
|
48
|
+
# file '/etc/postfix/main.cf', :contents => render("main.cf")
|
49
|
+
# # searches for:
|
50
|
+
# # ../packages/p/main.cf[.erb]
|
51
|
+
# # ../packages/p/templates/main.cf[.erb]
|
37
52
|
# end
|
38
53
|
class FileInstaller < Installer
|
39
54
|
attr_reader :sourcepath, :destination, :contents #:nodoc:
|
@@ -60,7 +75,7 @@ module Sprinkle
|
|
60
75
|
end
|
61
76
|
|
62
77
|
def install_commands #:nodoc:
|
63
|
-
|
78
|
+
Commands::Transfer.new(sourcepath, destination)
|
64
79
|
end
|
65
80
|
|
66
81
|
# calls chown own to set the file ownership
|
@@ -87,12 +102,16 @@ module Sprinkle
|
|
87
102
|
end
|
88
103
|
|
89
104
|
def setup_source
|
90
|
-
@file=Tempfile.new(@package.name.to_s)
|
91
|
-
@file.print
|
105
|
+
@file = Tempfile.new(@package.name.to_s)
|
106
|
+
@file.print @contents
|
92
107
|
@file.close
|
93
108
|
@sourcepath = @file.path
|
94
109
|
end
|
95
110
|
|
111
|
+
def post_process
|
112
|
+
@file.unlink
|
113
|
+
end
|
114
|
+
|
96
115
|
end
|
97
116
|
end
|
98
117
|
end
|
@@ -130,6 +130,10 @@ module Sprinkle
|
|
130
130
|
return false
|
131
131
|
end
|
132
132
|
|
133
|
+
# Called right after processing, can be used for local cleanup such
|
134
|
+
# as removing any temporary files created on the local system, etc
|
135
|
+
def post_process; end
|
136
|
+
|
133
137
|
# Called right before an installer is exected, can be used for logging
|
134
138
|
# and announcing what is about to happen
|
135
139
|
def announce; end
|
@@ -144,6 +148,7 @@ module Sprinkle
|
|
144
148
|
logger.debug " --> Running #{self.class.name} for roles: #{roles}"
|
145
149
|
@delivery.install(self, roles, :per_host => per_host?)
|
146
150
|
end
|
151
|
+
post_process
|
147
152
|
end
|
148
153
|
|
149
154
|
# More complicated installers that have different stages, and require pre/post commands
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Sprinkle
|
2
|
+
module Installers
|
3
|
+
# = Pecl extension installed
|
4
|
+
#
|
5
|
+
# Installs the specified pecl extension
|
6
|
+
#
|
7
|
+
# == Example Usage
|
8
|
+
#
|
9
|
+
# package :php_stuff do
|
10
|
+
# pecl 'mongo'
|
11
|
+
# verify { has_pecl 'mongo' }
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# You can optionally pass a version number to both `pecl` and `has_pecl`:
|
15
|
+
#
|
16
|
+
# package :php_stuff do
|
17
|
+
# pecl 'mongo', :version => "1.4.3"
|
18
|
+
# verify { has_pecl 'mongo', :version => "1.4.3" }
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# Some extensions need an ini file. You can have that generated, by passing the `:ini_file` option:
|
22
|
+
#
|
23
|
+
# package :php_stuff do
|
24
|
+
# pecl 'mongo', :ini_file => true
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# If you need more fine grained control of the location or contents of the ini file, use:
|
28
|
+
#
|
29
|
+
# package :php_stuff do
|
30
|
+
# pecl 'mongo', :ini_file => { :path => "/etc/php5/apache2/php.ini",
|
31
|
+
# :content => "extension=mongo.so",
|
32
|
+
# :sudo => true }
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
class Pecl < Installer
|
36
|
+
attr_accessor :package_name, :package_version
|
37
|
+
|
38
|
+
api do
|
39
|
+
def pecl(package_name, options = {}, &block)
|
40
|
+
install Pecl.new(self, package_name, options, &block)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
verify_api do
|
45
|
+
def has_pecl(package_name, options = {})
|
46
|
+
@commands = "TERM= pecl list | grep '^#{package_name}\\\\s*" + (options[:version] ? options[:version].to_s : "") + "'"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def initialize(parent, package_name, options = {}, &block) #:nodoc:
|
51
|
+
super parent, &block
|
52
|
+
@package_name = package_name
|
53
|
+
@package_version = options[:version]
|
54
|
+
@ini_file = options[:ini_file]
|
55
|
+
setup_ini if @ini_file
|
56
|
+
end
|
57
|
+
|
58
|
+
def setup_ini
|
59
|
+
@ini_file = to_ini_file_hash(@ini_file)
|
60
|
+
text = @ini_file[:content] || "extension=#{@package_name}.so"
|
61
|
+
path = @ini_file[:path] || "/etc/php5/conf.d/#{@package_name}.ini"
|
62
|
+
use_sudo = @ini_file[:sudo]===false ? false : true
|
63
|
+
post(:install) do
|
64
|
+
file(path, :content => text, :sudo => use_sudo)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_ini_file_hash(s)
|
69
|
+
return {:content => s} if s.is_a? String
|
70
|
+
return {} if s===true
|
71
|
+
s
|
72
|
+
end
|
73
|
+
|
74
|
+
protected
|
75
|
+
def install_commands #:nodoc:
|
76
|
+
cmd = "TERM= pecl install --alldeps #{@package_name}"
|
77
|
+
cmd << "-#{@package_version}" if @package_version
|
78
|
+
cmd
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -103,7 +103,7 @@ module Sprinkle
|
|
103
103
|
|
104
104
|
multi_attributes :enable, :disable, :with, :without, :option,
|
105
105
|
:custom_install
|
106
|
-
attributes :configure_command, :build_command, :install_command, :custom_archive
|
106
|
+
attributes :configure_command, :build_command, :install_command, :custom_archive, :custom_dir
|
107
107
|
|
108
108
|
def install_sequence #:nodoc:
|
109
109
|
prepare + download + extract + configure + build + install
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
1
3
|
module Sprinkle
|
2
4
|
module Installers
|
3
5
|
# = File transfer installer
|
@@ -25,17 +27,34 @@ module Sprinkle
|
|
25
27
|
# via this method. If you wish to disable recursive transfers, you can pass
|
26
28
|
# :recursive => false, although it will not be obeyed when using the Vlad actor.
|
27
29
|
#
|
30
|
+
# As an alternative to :recursive, you can use the :tarball option. When this is
|
31
|
+
# supplied, the source file(s) are first packed in a tar.gz archive, then
|
32
|
+
# transferred to a temp dir and finally unpacked at the destination. This is usually
|
33
|
+
# much faster when transferring many small files (Such as a typical rails application)
|
34
|
+
# You can optionally supply :exclude, which is an array of glob-patterns to not
|
35
|
+
# include in the tarball
|
36
|
+
#
|
37
|
+
# package :webapp do
|
38
|
+
# transfer 'app/', '/var/www/' do
|
39
|
+
# tarball :exclude => %w(.git log/*)
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
#
|
28
43
|
# Should you need to run commands before or after the file transfer (making
|
29
44
|
# directories or changing permissions), you can use the pre/post :install directives
|
30
45
|
# and they will be run.
|
31
|
-
#
|
46
|
+
#
|
32
47
|
# == Rendering templates
|
33
48
|
#
|
34
49
|
# Rendering templates with transfer has been depreciated. Please see the file
|
35
50
|
# installer if you want to use templates.
|
36
51
|
class Transfer < Installer
|
37
52
|
attr_accessor :source, :destination, :sourcepath #:nodoc:
|
38
|
-
|
53
|
+
|
54
|
+
# Include deprecated code
|
55
|
+
# Mainly, this makes it easier to see where to cut, when next major version comes along
|
56
|
+
DEPRECATED = true #:nodoc:
|
57
|
+
|
39
58
|
api do
|
40
59
|
def transfer(source, destination, options = {}, &block)
|
41
60
|
options.reverse_merge!(:binding => binding())
|
@@ -43,92 +62,136 @@ module Sprinkle
|
|
43
62
|
end
|
44
63
|
end
|
45
64
|
|
46
|
-
def initialize(parent, source, destination, options={}, &block) #:nodoc:
|
47
|
-
|
48
|
-
|
49
|
-
@
|
50
|
-
|
51
|
-
@
|
52
|
-
|
53
|
-
|
54
|
-
@destination = "/tmp/sprinkle_#{File.basename(@destination)}"
|
55
|
-
# make sure we push the move ahead of any other post install tasks
|
56
|
-
# a user may have requested
|
57
|
-
post(:install).unshift ["#{sudo_cmd}mv #{@destination} #{final}"]
|
58
|
-
end
|
65
|
+
def initialize(parent, source, destination, options = {}, &block) #:nodoc:
|
66
|
+
options.reverse_merge! :recursive => true
|
67
|
+
|
68
|
+
@source = source # Original source
|
69
|
+
@sourcepath = source # What the actor will transfer (may be the same as @source)
|
70
|
+
@final_destination = destination # Final destination
|
71
|
+
@destination = destination # Where the actor will place the file (May be same as @final_destination)
|
72
|
+
|
59
73
|
owner(options[:owner]) if options[:owner]
|
60
74
|
mode(options[:mode]) if options[:mode]
|
75
|
+
tarball(options[:tarball]) if options[:tarball]
|
76
|
+
|
77
|
+
super parent, options, &block
|
78
|
+
|
79
|
+
if DEPRECATED
|
80
|
+
@binding = options[:binding]
|
81
|
+
options[:render] = true if source_is_template?
|
82
|
+
options[:recursive] = false if options[:render]
|
83
|
+
setup_rendering if options[:render]
|
84
|
+
end
|
85
|
+
setup_tarball if tarball?
|
86
|
+
setup_sudo if sudo?
|
87
|
+
end
|
61
88
|
|
62
|
-
|
63
|
-
|
89
|
+
def tarball(options = {})
|
90
|
+
@tarball = true
|
91
|
+
@exclude = options===true ? [] : options[:exclude]
|
64
92
|
end
|
65
|
-
|
93
|
+
|
66
94
|
def owner(owner)
|
67
95
|
@owner = owner
|
68
|
-
post
|
96
|
+
post(:install, "#{sudo_cmd}chown -R #{@owner} #{@final_destination}")
|
69
97
|
end
|
70
|
-
|
98
|
+
|
71
99
|
def mode(mode)
|
72
100
|
@mode = mode
|
73
|
-
post
|
101
|
+
post(:install, "#{sudo_cmd}chmod -R #{@mode} #{@final_destination}")
|
74
102
|
end
|
75
103
|
|
76
|
-
def
|
77
|
-
|
104
|
+
def tarball?
|
105
|
+
@tarball
|
78
106
|
end
|
79
107
|
|
80
|
-
def
|
81
|
-
|
82
|
-
|
83
|
-
output = @package.template(template, context)
|
84
|
-
|
85
|
-
final_tempfile = Tempfile.new(prefix.to_s)
|
86
|
-
final_tempfile.print(output)
|
87
|
-
final_tempfile.close
|
88
|
-
final_tempfile
|
89
|
-
end
|
90
|
-
|
91
|
-
def render_template_file(path, context, prefix)
|
92
|
-
template = source_is_template? ? path : File.read(path)
|
93
|
-
tempfile = render_template(template, context, @package.name)
|
94
|
-
tempfile
|
95
|
-
end
|
96
|
-
|
97
|
-
def source_is_template?
|
98
|
-
@source.split("\n").size>1
|
108
|
+
def install_commands
|
109
|
+
Commands::Transfer.new(sourcepath, destination,
|
110
|
+
:recursive => options[:recursive])
|
99
111
|
end
|
100
112
|
|
101
|
-
|
102
|
-
|
113
|
+
if DEPRECATED
|
114
|
+
def render_template(template, context, prefix)
|
115
|
+
output = @package.template(template, context)
|
116
|
+
final_tempfile = Tempfile.new(prefix.to_s)
|
117
|
+
final_tempfile.print(output)
|
118
|
+
final_tempfile.close
|
119
|
+
final_tempfile
|
120
|
+
end
|
103
121
|
|
104
|
-
|
122
|
+
def render_template_file(path, context, prefix)
|
123
|
+
template = source_is_template? ? path : File.read(path)
|
124
|
+
tempfile = render_template(template, context, @package.name)
|
125
|
+
tempfile
|
126
|
+
end
|
105
127
|
|
106
|
-
|
128
|
+
def source_is_template?
|
129
|
+
@source.split("\n").size > 1
|
130
|
+
end
|
131
|
+
|
132
|
+
def setup_rendering
|
107
133
|
ActiveSupport::Deprecation.warn("transfer :render is depreciated, please use the `file` installer now.")
|
108
134
|
ActiveSupport::Deprecation.warn("transfer :render will be removed from Sprinkle v0.8")
|
109
|
-
if options[:
|
110
|
-
|
111
|
-
options[:locals]
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
135
|
+
if @options[:render]
|
136
|
+
raise "Incompatible combination of options :render and :tarball" if tarball?
|
137
|
+
if @options[:locals]
|
138
|
+
context = {}
|
139
|
+
@options[:locals].each_pair do |k,v|
|
140
|
+
if v.respond_to?(:call)
|
141
|
+
context[k] = v.call
|
142
|
+
else
|
143
|
+
context[k] = v
|
144
|
+
end
|
116
145
|
end
|
146
|
+
else
|
147
|
+
context = @binding
|
117
148
|
end
|
118
|
-
|
119
|
-
|
149
|
+
|
150
|
+
@tempfile = render_template_file(@source, context, @package.name).path
|
151
|
+
@sourcepath = @tempfile
|
152
|
+
@options[:recursive] = false
|
120
153
|
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def setup_tarball
|
158
|
+
# tar files locally and scp to a temp location
|
159
|
+
# then untar after transfer
|
160
|
+
tar_options = @exclude.map {|glob| "--exclude \"#{glob}\" " }.join('')
|
161
|
+
@tempfile = make_tmpname
|
162
|
+
local_command = "cd '#{@source}' ; #{local_tar_bin} -zcf '#{@tempfile}' #{tar_options}."
|
163
|
+
logger.debug " --> Compressing #{@source} locally"
|
164
|
+
raise "Unable to tar #{@source}" unless system(local_command)
|
165
|
+
@sourcepath = @tempfile
|
166
|
+
@destination = "/tmp/#{File.basename(@tempfile)}"
|
167
|
+
post(:install).unshift [
|
168
|
+
"#{sudo_cmd}tar -zxf '#{@destination}' -C '#{@final_destination}'",
|
169
|
+
"#{sudo_cmd}rm '#{@destination}'"
|
170
|
+
]
|
171
|
+
end
|
172
|
+
|
173
|
+
def setup_sudo
|
174
|
+
@destination = "/tmp/sprinkle_#{File.basename(@destination)}"
|
175
|
+
# make sure we push the move ahead of any other post install tasks
|
176
|
+
# a user may have requested
|
177
|
+
post(:install).unshift "#{sudo_cmd}mv #{@destination} #{@final_destination}"
|
178
|
+
end
|
121
179
|
|
122
|
-
|
123
|
-
|
124
|
-
@
|
125
|
-
|
126
|
-
|
180
|
+
protected
|
181
|
+
def local_tar_bin
|
182
|
+
@local_tar_bin ||= (`uname` =~ /Darwin/ ? "COPYFILE_DISABLE=true /usr/bin/gnutar" : "tar")
|
183
|
+
end
|
184
|
+
|
185
|
+
def post_process
|
186
|
+
return unless @tempfile
|
187
|
+
logger.debug " --> Deleting local temp file"
|
188
|
+
File.delete @tempfile
|
189
|
+
end
|
190
|
+
|
191
|
+
def make_tmpname
|
192
|
+
Dir::Tmpname.make_tmpname(['/tmp/sprinkle-', '.tar.gz'], nil)
|
127
193
|
end
|
128
194
|
|
129
|
-
logger.debug " --> Transferring #{sourcepath} to #{@orig_destination} for roles: #{roles}"
|
130
|
-
@delivery.install(self, roles, :recursive => @options[:recursive])
|
131
|
-
end
|
132
195
|
end
|
133
196
|
end
|
134
197
|
end
|
data/lib/sprinkle/package.rb
CHANGED
@@ -317,7 +317,7 @@ module Sprinkle
|
|
317
317
|
tree = []
|
318
318
|
packages.each do |dep, config|
|
319
319
|
package = PACKAGES.find_all(dep, config)
|
320
|
-
raise
|
320
|
+
raise MissingPackageError.new(dep) if package.empty? and opts[:required]
|
321
321
|
next if package.empty? # skip missing recommended packages as they're allowed to not exist
|
322
322
|
package = Chooser.select_package(dep, package) #if package.size>1
|
323
323
|
package = package.instance(config)
|
@@ -1,7 +1,9 @@
|
|
1
|
+
require 'pp'
|
1
2
|
require 'erubis'
|
2
3
|
require 'digest/md5'
|
3
4
|
|
4
5
|
module Sprinkle::Package
|
6
|
+
# For help on rendering, see the Sprinkle::Installers::FileInstaller.
|
5
7
|
module Rendering
|
6
8
|
extend ActiveSupport::Concern
|
7
9
|
|
@@ -9,19 +11,21 @@ module Sprinkle::Package
|
|
9
11
|
self.send :include, Helpers
|
10
12
|
end
|
11
13
|
|
14
|
+
# render src as ERB
|
12
15
|
def template(src, context=binding)
|
13
16
|
eruby = Erubis::Eruby.new(src)
|
14
17
|
eruby.result(context)
|
15
18
|
rescue Object => e
|
16
19
|
raise Sprinkle::Errors::TemplateError.new(e, src, context)
|
17
20
|
end
|
18
|
-
|
21
|
+
|
22
|
+
# read in filename and render it as ERB
|
19
23
|
def render(filename, context=binding)
|
20
24
|
contents=File.read(expand_filename(filename))
|
21
25
|
template(contents, context)
|
22
26
|
end
|
23
|
-
|
24
|
-
# Helper methods can be called from inside your package and
|
27
|
+
|
28
|
+
# Helper methods can be called from inside your package and
|
25
29
|
# verification code
|
26
30
|
module Helpers
|
27
31
|
# return the md5 of a string (as a hex string)
|
@@ -30,14 +34,49 @@ module Sprinkle::Package
|
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
33
|
-
|
34
|
-
|
37
|
+
# sets the path a package should use to search for templates
|
38
|
+
def template_search_path(path)
|
39
|
+
@template_search_path = path
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def search_paths(n) #:nodoc:
|
45
|
+
# if we are given an absolute path, return just that path
|
46
|
+
return [File.dirname(n)] if n.starts_with? "/"
|
47
|
+
|
48
|
+
pwd = Dir.pwd
|
49
|
+
package_dir = @template_search_path
|
50
|
+
|
51
|
+
p = []
|
52
|
+
# if ./ is used assume the path is relative to the package
|
53
|
+
if package_dir
|
54
|
+
p << File.expand_path(File.join(package_dir,"templates"))
|
55
|
+
p << File.expand_path(package_dir)
|
56
|
+
else
|
57
|
+
# otherwise search template folders relate to cwd
|
58
|
+
p << File.expand_path(File.join(pwd,"templates"))
|
59
|
+
p << File.expand_path(pwd)
|
60
|
+
end
|
61
|
+
|
62
|
+
p.uniq
|
63
|
+
end
|
64
|
+
|
35
65
|
def expand_filename(n) #:nodoc:
|
36
|
-
|
37
|
-
|
66
|
+
name = File.basename(n)
|
67
|
+
paths = search_paths(n).map do |p|
|
68
|
+
[File.join(p,name), File.join(p,"#{name}.erb")]
|
69
|
+
end.flatten
|
70
|
+
|
71
|
+
paths.each do |f|
|
38
72
|
return f if File.exist?(f)
|
39
73
|
end
|
40
|
-
|
74
|
+
|
75
|
+
puts "RESOLVED SEARCH PATHS"
|
76
|
+
pp paths
|
77
|
+
|
78
|
+
raise "template not found: #{n}"
|
79
|
+
|
41
80
|
end
|
42
81
|
|
43
82
|
end
|
data/lib/sprinkle/policy.rb
CHANGED
@@ -12,6 +12,16 @@ module Sprinkle
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
class MissingPackageError < StandardError #:nodoc:
|
16
|
+
def initialize(name)
|
17
|
+
@name = name
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
"Package definition not found for key: #{@name}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
15
25
|
# = Policies
|
16
26
|
#
|
17
27
|
# Policies define a set of packages which are required for a certain
|
@@ -93,7 +103,7 @@ module Sprinkle
|
|
93
103
|
|
94
104
|
opts = args.clone.extract_options!
|
95
105
|
package = Sprinkle::Package::PACKAGES.find_all(p, opts)
|
96
|
-
raise
|
106
|
+
raise MissingPackageError.new(p) unless package.any?
|
97
107
|
package = Sprinkle::Package::Chooser.select_package(p, package) if package.is_a? Array # handle virtual package selection
|
98
108
|
# get an instance of the package and pass our config options
|
99
109
|
package = package.instance(*args)
|
data/lib/sprinkle/version.rb
CHANGED
@@ -7,6 +7,33 @@ describe Sprinkle::Package::Rendering, 'rendering' do
|
|
7
7
|
@package = package :something do
|
8
8
|
end
|
9
9
|
end
|
10
|
+
|
11
|
+
describe "path expansion" do
|
12
|
+
|
13
|
+
it "should know / is root" do
|
14
|
+
dirs = @package.send :search_paths, "/test/file"
|
15
|
+
dirs.should eq ["/test"]
|
16
|
+
end
|
17
|
+
|
18
|
+
it "./ is local to where we tell it to be" do
|
19
|
+
Dir.stub(:pwd).and_return("/path/is/")
|
20
|
+
@package.template_search_path "/my/super/package/"
|
21
|
+
dirs = @package.send :search_paths, "./test/file"
|
22
|
+
dirs.should include("/my/super/package")
|
23
|
+
dirs.should include("/my/super/package/templates")
|
24
|
+
dirs.should_not include("/path/is")
|
25
|
+
dirs.should_not include("/path/is/templates")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should search pwd when amgiguous" do
|
29
|
+
Dir.stub(:pwd).and_return("/path/is/")
|
30
|
+
dirs = @package.send :search_paths, "test/file"
|
31
|
+
dirs.should include("/path/is")
|
32
|
+
dirs.should include("/path/is/templates")
|
33
|
+
dirs.size.should eq 2
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
10
37
|
|
11
38
|
it "should be able to calculate md5s" do
|
12
39
|
@package.md5("test").should == "098f6bcd4621d373cade4e832627b4f6"
|
@@ -7,7 +7,6 @@ describe Sprinkle::Installers::FileInstaller do
|
|
7
7
|
@package = double(Sprinkle::Package, :name => 'package', :sudo? => false)
|
8
8
|
@empty = Proc.new { }
|
9
9
|
@delivery = double(Sprinkle::Deployment, :install => true)
|
10
|
-
@source = 'source'
|
11
10
|
@destination = 'destination'
|
12
11
|
@contents = "hi"
|
13
12
|
@installer = create_file_installer(@destination, :contents => @contents)
|
@@ -17,6 +16,12 @@ describe Sprinkle::Installers::FileInstaller do
|
|
17
16
|
source do; prefix '/usr/bin'; end
|
18
17
|
end
|
19
18
|
end
|
19
|
+
|
20
|
+
def simplify(seq)
|
21
|
+
seq.map do |cmd|
|
22
|
+
cmd.is_a?(Sprinkle::Commands::Transfer) ? :TRANSFER : cmd
|
23
|
+
end
|
24
|
+
end
|
20
25
|
|
21
26
|
def create_file_installer(dest, options={}, &block)
|
22
27
|
i = Sprinkle::Installers::FileInstaller.new(@package, dest, options, &block)
|
@@ -25,14 +30,41 @@ describe Sprinkle::Installers::FileInstaller do
|
|
25
30
|
end
|
26
31
|
|
27
32
|
describe 'when created' do
|
33
|
+
before do
|
34
|
+
@source = "/tmp/file"
|
35
|
+
Tempfile.any_instance.stub(:path).and_return(@source)
|
36
|
+
@installer = create_file_installer(@destination, :contents => @contents)
|
37
|
+
@transfer = @installer.install_sequence.detect {|x| x.is_a? Sprinkle::Commands::Transfer }
|
38
|
+
end
|
39
|
+
|
28
40
|
it 'should accept a source and destination to install' do
|
29
41
|
@installer.contents.should eq @contents
|
30
42
|
@installer.destination.should eq @destination
|
31
43
|
end
|
44
|
+
|
45
|
+
it 'should create a transfer command' do
|
46
|
+
@transfer.source.should eq @source
|
47
|
+
@transfer.destination.should eq @destination
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should not be using recursive' do
|
51
|
+
@transfer.recursive?.should eq false
|
52
|
+
end
|
32
53
|
end
|
33
54
|
|
34
55
|
describe 'during installation' do
|
35
56
|
|
57
|
+
context "post process hooks" do
|
58
|
+
|
59
|
+
it "should remove its temporary file" do
|
60
|
+
@tmp = double(:print => true, :close => true, :path => "/file")
|
61
|
+
Tempfile.stub(:new).and_return(@tmp)
|
62
|
+
@installer = create_file_installer(@destination, :contents => @contents)
|
63
|
+
@tmp.should_receive(:unlink)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
36
68
|
context "setting mode and owner" do
|
37
69
|
before do
|
38
70
|
@installer = create_file_installer @destination, :content => @contents do
|
@@ -59,7 +91,7 @@ describe Sprinkle::Installers::FileInstaller do
|
|
59
91
|
mode "744"
|
60
92
|
owner "root"
|
61
93
|
end
|
62
|
-
@installer_commands = @installer.install_sequence
|
94
|
+
@installer_commands = simplify @installer.install_sequence
|
63
95
|
end
|
64
96
|
|
65
97
|
it "should run commands in correct order" do
|
@@ -78,7 +110,7 @@ describe Sprinkle::Installers::FileInstaller do
|
|
78
110
|
:mode => "744", :owner => "root" do
|
79
111
|
@options[:sudo]= true
|
80
112
|
end
|
81
|
-
@installer_commands = @installer.install_sequence
|
113
|
+
@installer_commands = simplify @installer.install_sequence
|
82
114
|
end
|
83
115
|
|
84
116
|
it "should run commands in correct order" do
|
@@ -99,7 +131,7 @@ describe Sprinkle::Installers::FileInstaller do
|
|
99
131
|
pre :install, 'op1'
|
100
132
|
post :install, 'op2'
|
101
133
|
end
|
102
|
-
@installer_commands = @installer.install_sequence
|
134
|
+
@installer_commands = simplify @installer.install_sequence
|
103
135
|
@delivery = @installer.delivery
|
104
136
|
end
|
105
137
|
|
@@ -116,7 +148,7 @@ describe Sprinkle::Installers::FileInstaller do
|
|
116
148
|
pre :install, 'op1'
|
117
149
|
post :install, 'op2'
|
118
150
|
end
|
119
|
-
@installer_commands = @installer.install_sequence
|
151
|
+
@installer_commands = simplify @installer.install_sequence
|
120
152
|
@delivery = @installer.delivery
|
121
153
|
end
|
122
154
|
|
@@ -132,7 +164,7 @@ describe Sprinkle::Installers::FileInstaller do
|
|
132
164
|
pre :install, 'op1', 'op1-1'
|
133
165
|
post :install, 'op2', 'op2-1'
|
134
166
|
end
|
135
|
-
@installer_commands = @installer.install_sequence
|
167
|
+
@installer_commands = simplify @installer.install_sequence
|
136
168
|
@delivery = @installer.delivery
|
137
169
|
end
|
138
170
|
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe Sprinkle::Installers::Pecl do
|
4
|
+
before do
|
5
|
+
# @package = double(Sprinkle::Package, :name => 'spec', :class => double(Sprinkle::Package, :installer_methods => []))
|
6
|
+
@package = Package.new("test") {}
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'providing just package name' do
|
10
|
+
before do
|
11
|
+
@installer = Sprinkle::Installers::Pecl.new(@package, 'spec')
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'during installation' do
|
15
|
+
it 'should invoke the pecl installer' do
|
16
|
+
@install_commands = @installer.send :install_commands
|
17
|
+
@install_commands.should == "TERM= pecl install --alldeps spec"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'providing explicit version' do
|
23
|
+
before do
|
24
|
+
@installer = Sprinkle::Installers::Pecl.new(@package, 'spec', :version => '1.1.1')
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'during installation' do
|
28
|
+
it 'should invoke the pecl installer' do
|
29
|
+
@install_commands = @installer.send :install_commands
|
30
|
+
@install_commands.should == "TERM= pecl install --alldeps spec-1.1.1"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'providing ini_file option' do
|
36
|
+
describe 'during installation' do
|
37
|
+
it 'should transfer file with default arguments in post install' do
|
38
|
+
@installer = Sprinkle::Installers::Pecl.new(@package, 'spec', :ini_file => true) do
|
39
|
+
self.stub(:file) do |path,options|
|
40
|
+
path.should == "/etc/php5/conf.d/spec.ini"
|
41
|
+
options[:content].should == "extension=spec.so"
|
42
|
+
options[:sudo].should == true
|
43
|
+
"post install file transfer"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
@install_sequence = @installer.install_sequence
|
47
|
+
@install_sequence.should include("TERM= pecl install --alldeps spec")
|
48
|
+
@install_sequence.should include("post install file transfer")
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should use custom path and content if provided' do
|
52
|
+
@installer = Sprinkle::Installers::Pecl.new(@package, 'spec', :ini_file => {:path => "/custom/path", :content => "hello"}) do
|
53
|
+
self.stub(:file) do |path,options|
|
54
|
+
path.should == "/custom/path"
|
55
|
+
options[:content].should == "hello"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should use custom content if string passed' do
|
61
|
+
@installer = Sprinkle::Installers::Pecl.new(@package, 'spec', :ini_file => "hello") do
|
62
|
+
self.stub(:file) do |path,options|
|
63
|
+
options[:content].should == "hello"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should NOT use sudo if explicitly denied' do
|
69
|
+
@installer = Sprinkle::Installers::Pecl.new(@package, 'spec', :ini_file => {:sudo => false}) do
|
70
|
+
self.stub(:file) do |path,options|
|
71
|
+
options[:sudo].should == false
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
@@ -201,6 +201,18 @@ describe Sprinkle::Installers::Source do
|
|
201
201
|
@installer.send(:install_commands).first.should =~ /super-foo/
|
202
202
|
end
|
203
203
|
|
204
|
+
end
|
205
|
+
describe 'with a custom dir definition' do
|
206
|
+
before do
|
207
|
+
@installer.options[:custom_dir] = 'super-foo'
|
208
|
+
end
|
209
|
+
|
210
|
+
it 'should install the source from the custom archive' do
|
211
|
+
@installer.send(:configure_commands).first.should =~ /super-foo/
|
212
|
+
@installer.send(:build_commands).first.should =~ /super-foo/
|
213
|
+
@installer.send(:install_commands).first.should =~ /super-foo/
|
214
|
+
end
|
215
|
+
|
204
216
|
end
|
205
217
|
|
206
218
|
describe 'with default configure, build, and install commands' do
|
@@ -7,7 +7,7 @@ describe Sprinkle::Installers::Transfer do
|
|
7
7
|
before do
|
8
8
|
@package = double(Sprinkle::Package, :name => 'package', :sudo? => false)
|
9
9
|
@empty = Proc.new { }
|
10
|
-
@delivery = double(Sprinkle::Deployment, :install => true)
|
10
|
+
@delivery = double(Sprinkle::Deployment, :install => true, :sudo_command => "sudo", :sudo? => false)
|
11
11
|
@source = 'source'
|
12
12
|
@destination = 'destination'
|
13
13
|
@installer = create_transfer(@source, @destination)
|
@@ -18,6 +18,12 @@ describe Sprinkle::Installers::Transfer do
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
def simplify(seq)
|
22
|
+
seq.map do |cmd|
|
23
|
+
cmd.is_a?(Sprinkle::Commands::Transfer) ? :TRANSFER : cmd
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
21
27
|
def create_transfer(source, dest, options={}, &block)
|
22
28
|
i = Sprinkle::Installers::Transfer.new(@package, source, dest, options, &block)
|
23
29
|
i.delivery = @delivery
|
@@ -29,27 +35,39 @@ describe Sprinkle::Installers::Transfer do
|
|
29
35
|
@installer.source.should eq @source
|
30
36
|
@installer.destination.should eq @destination
|
31
37
|
end
|
38
|
+
|
39
|
+
it 'should create a transfer command with destination and source' do
|
40
|
+
transfer = @installer.install_sequence.detect {|x| x.is_a? Sprinkle::Commands::Transfer }
|
41
|
+
transfer.source.should eq @source
|
42
|
+
transfer.destination.should eq @destination
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should default to recursive true' do
|
46
|
+
transfer = @installer.install_sequence.detect {|x| x.is_a? Sprinkle::Commands::Transfer }
|
47
|
+
transfer.recursive?.should eq true
|
48
|
+
end
|
32
49
|
end
|
33
50
|
|
34
51
|
describe 'during installation' do
|
35
52
|
|
36
53
|
context "setting mode and owner" do
|
37
|
-
before do
|
54
|
+
before do
|
38
55
|
@installer = create_transfer @source, @destination do
|
39
56
|
mode "744"
|
40
57
|
owner "root"
|
41
58
|
end
|
59
|
+
@installer.process @roles
|
42
60
|
@installer_commands = @installer.install_sequence
|
43
61
|
end
|
44
|
-
|
62
|
+
|
45
63
|
it "should include command to set owner" do
|
46
|
-
@installer_commands.should include("chmod 744 #{@destination}")
|
64
|
+
@installer_commands.should include("chmod -R 744 #{@destination}")
|
47
65
|
end
|
48
|
-
|
66
|
+
|
49
67
|
it "should include command to set mode" do
|
50
|
-
@installer_commands.should include("chown root #{@destination}")
|
68
|
+
@installer_commands.should include("chown -R root #{@destination}")
|
51
69
|
end
|
52
|
-
|
70
|
+
|
53
71
|
end
|
54
72
|
|
55
73
|
context 'single pre/post commands' do
|
@@ -58,12 +76,12 @@ describe Sprinkle::Installers::Transfer do
|
|
58
76
|
pre :install, 'op1'
|
59
77
|
post :install, 'op2'
|
60
78
|
end
|
61
|
-
@installer_commands = @installer.install_sequence
|
79
|
+
@installer_commands = simplify @installer.install_sequence
|
62
80
|
@delivery = @installer.delivery
|
63
81
|
end
|
64
82
|
|
65
83
|
it "should call the pre and post install commands around the file transfer" do
|
66
|
-
@installer_commands.should eq ["op1"
|
84
|
+
@installer_commands.should eq ["op1", :TRANSFER, "op2"]
|
67
85
|
end
|
68
86
|
|
69
87
|
# it "should call transfer with recursive defaulted to nil" do
|
@@ -72,21 +90,21 @@ describe Sprinkle::Installers::Transfer do
|
|
72
90
|
# end
|
73
91
|
|
74
92
|
end
|
75
|
-
|
93
|
+
|
76
94
|
context 'pre/post with sudo' do
|
77
95
|
before do
|
78
|
-
@
|
79
|
-
|
96
|
+
@delivery = double(Sprinkle::Deployment, :install => true, :sudo_command => "sudo")
|
97
|
+
@installer = create_transfer @source, @destination, :sudo => true do
|
80
98
|
pre :install, 'op1'
|
81
99
|
post :install, 'op2'
|
82
100
|
end
|
83
|
-
@
|
101
|
+
@installer.process @roles
|
102
|
+
@installer_commands = simplify @installer.install_sequence
|
84
103
|
@delivery = @installer.delivery
|
85
104
|
end
|
86
105
|
|
87
106
|
it "should call the pre and post install commands around the file transfer" do
|
88
|
-
@installer_commands.should eq ["op1"
|
89
|
-
"sudo mv /tmp/sprinkle_destination destination", "op2"]
|
107
|
+
@installer_commands.should eq ["op1", :TRANSFER, "sudo mv /tmp/sprinkle_destination destination", "op2"]
|
90
108
|
end
|
91
109
|
end
|
92
110
|
|
@@ -96,7 +114,7 @@ describe Sprinkle::Installers::Transfer do
|
|
96
114
|
pre :install, 'op1', 'op1-1'
|
97
115
|
post :install, 'op2', 'op2-1'
|
98
116
|
end
|
99
|
-
@installer_commands = @installer.install_sequence
|
117
|
+
@installer_commands = simplify @installer.install_sequence
|
100
118
|
@delivery = @installer.delivery
|
101
119
|
end
|
102
120
|
|
@@ -114,19 +132,19 @@ describe Sprinkle::Installers::Transfer do
|
|
114
132
|
describe "if the :render flag is true" do
|
115
133
|
before do
|
116
134
|
allow(::ActiveSupport::Deprecation).to receive(:warn)
|
117
|
-
@installer = create_transfer @source, @destination, :render => true
|
118
|
-
@delivery = @installer.delivery
|
119
|
-
@delivery.stub(:render_template_file)
|
120
135
|
@tempfile = Tempfile.new("foo")
|
136
|
+
Sprinkle::Installers::Transfer.any_instance.
|
137
|
+
should_receive(:render_template_file).
|
138
|
+
with(@source, anything, @package.name).
|
139
|
+
and_return(@tempfile)
|
140
|
+
@installer = create_transfer @source, @destination, :render => true
|
121
141
|
end
|
122
142
|
|
123
143
|
it "should render the source file as a template to a tempfile" do
|
124
|
-
@installer.should_receive(:render_template_file).with(@source, anything, @package.name).and_return(@tempfile)
|
125
144
|
@delivery.stub(:transfer)
|
126
145
|
end
|
127
146
|
|
128
147
|
it "should call transfer with recursive set to false" do
|
129
|
-
@installer.should_receive(:render_template_file).with(@source, anything, @package.name).and_return(@tempfile)
|
130
148
|
@installer.options[:recursive].should eq false
|
131
149
|
end
|
132
150
|
|
@@ -140,13 +158,45 @@ describe Sprinkle::Installers::Transfer do
|
|
140
158
|
@installer = create_transfer @source, @destination, :recursive => false
|
141
159
|
end
|
142
160
|
|
143
|
-
it "should
|
144
|
-
@installer.
|
145
|
-
|
161
|
+
it "should created transfer command with recursive set to false" do
|
162
|
+
transfer = @installer.install_sequence.detect {|x| x.is_a? Sprinkle::Commands::Transfer }
|
163
|
+
transfer.recursive?.should eq false
|
146
164
|
end
|
165
|
+
end
|
147
166
|
|
148
|
-
|
167
|
+
describe "if the :tarball option is set" do
|
168
|
+
it "should tar locally, then transfer and extract, finally deleting local tempfile" do
|
169
|
+
@installer = create_transfer @source, @destination, :tarball => true do
|
170
|
+
self.stub(:local_tar_bin) { "tar" }
|
171
|
+
self.stub(:make_tmpname) { "/tmp/foo.tar.gz" }
|
172
|
+
self.should_receive(:system) do |command|
|
173
|
+
command.should == "cd 'source' ; tar -zcf '/tmp/foo.tar.gz' ."
|
174
|
+
true
|
175
|
+
end
|
176
|
+
File.should_receive(:delete) do |path|
|
177
|
+
path.should == "/tmp/foo.tar.gz"
|
178
|
+
end
|
179
|
+
end
|
149
180
|
@installer.process @roles
|
181
|
+
install_sequence = @installer.install_sequence
|
182
|
+
install_sequence.should include("tar -zxf '/tmp/foo.tar.gz' -C 'destination'")
|
183
|
+
install_sequence.should include("rm '/tmp/foo.tar.gz'")
|
184
|
+
end
|
185
|
+
|
186
|
+
describe "and the :exclude option is provided" do
|
187
|
+
it "should pass --exclude option to local tar command" do
|
188
|
+
@installer = create_transfer @source, @destination, :tarball => {:exclude => %w(.git log/*)} do
|
189
|
+
self.stub(:local_tar_bin) { "tar" }
|
190
|
+
self.stub(:make_tmpname) { "/tmp/foo.tar.gz" }
|
191
|
+
self.should_receive(:system) do |command|
|
192
|
+
command.should == "cd 'source' ; tar -zcf '/tmp/foo.tar.gz' --exclude \".git\" --exclude \"log/*\" ."
|
193
|
+
true
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
150
197
|
end
|
198
|
+
|
151
199
|
end
|
200
|
+
|
201
|
+
|
152
202
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sprinkle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-09-06 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
@@ -189,6 +189,9 @@ files:
|
|
189
189
|
- lib/sprinkle/actors/ssh.rb
|
190
190
|
- lib/sprinkle/actors/ssh/connection_cache.rb
|
191
191
|
- lib/sprinkle/actors/vlad.rb
|
192
|
+
- lib/sprinkle/commands/command.rb
|
193
|
+
- lib/sprinkle/commands/reconnect.rb
|
194
|
+
- lib/sprinkle/commands/transfer.rb
|
192
195
|
- lib/sprinkle/core.rb
|
193
196
|
- lib/sprinkle/deployment.rb
|
194
197
|
- lib/sprinkle/errors/pretty_failure.rb
|
@@ -220,6 +223,7 @@ files:
|
|
220
223
|
- lib/sprinkle/installers/package_installer.rb
|
221
224
|
- lib/sprinkle/installers/pacman.rb
|
222
225
|
- lib/sprinkle/installers/pear.rb
|
226
|
+
- lib/sprinkle/installers/pecl.rb
|
223
227
|
- lib/sprinkle/installers/push_text.rb
|
224
228
|
- lib/sprinkle/installers/rake.rb
|
225
229
|
- lib/sprinkle/installers/reconnect.rb
|
@@ -276,6 +280,7 @@ files:
|
|
276
280
|
- spec/sprinkle/installers/openbsd_pkg_spec.rb
|
277
281
|
- spec/sprinkle/installers/opensolaris_pkg_spec.rb
|
278
282
|
- spec/sprinkle/installers/pear_spec.rb
|
283
|
+
- spec/sprinkle/installers/pecl_spec.rb
|
279
284
|
- spec/sprinkle/installers/push_text_spec.rb
|
280
285
|
- spec/sprinkle/installers/rake_spec.rb
|
281
286
|
- spec/sprinkle/installers/replace_text_spec.rb
|
@@ -348,6 +353,7 @@ test_files:
|
|
348
353
|
- spec/sprinkle/installers/openbsd_pkg_spec.rb
|
349
354
|
- spec/sprinkle/installers/opensolaris_pkg_spec.rb
|
350
355
|
- spec/sprinkle/installers/pear_spec.rb
|
356
|
+
- spec/sprinkle/installers/pecl_spec.rb
|
351
357
|
- spec/sprinkle/installers/push_text_spec.rb
|
352
358
|
- spec/sprinkle/installers/rake_spec.rb
|
353
359
|
- spec/sprinkle/installers/replace_text_spec.rb
|