sprinkle 0.7.1 → 0.7.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +3 -1
- data/bad.rb +16 -0
- data/config/deploy.rb +25 -0
- data/examples/rails/rails.rb +6 -6
- data/inner.rb +45 -0
- data/lib/sprinkle/errors/template_error.rb +46 -0
- data/lib/sprinkle/installers/brew.rb +1 -1
- data/lib/sprinkle/installers/file.rb +98 -0
- data/lib/sprinkle/installers/gem.rb +1 -1
- data/lib/sprinkle/installers/installer.rb +2 -0
- data/lib/sprinkle/installers/source.rb +1 -1
- data/lib/sprinkle/installers/transfer.rb +8 -73
- data/lib/sprinkle/package/package_repository.rb +2 -1
- data/lib/sprinkle/package/rendering.rb +41 -0
- data/lib/sprinkle/package.rb +2 -0
- data/lib/sprinkle/policy.rb +1 -1
- data/lib/sprinkle/verifiers/file.rb +4 -1
- data/lib/sprinkle/verifiers/package.rb +1 -0
- data/lib/sprinkle/verify.rb +1 -0
- data/lib/sprinkle/version.rb +1 -1
- data/spec/sprinkle/extensions/rendering_spec.rb +33 -0
- data/spec/sprinkle/installers/file_spec.rb +109 -0
- data/sprinkle.gemspec +1 -0
- data/test.rb +102 -0
- data/work/inner.rb +24 -0
- metadata +30 -2
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
* Officially depreciate transfer :render and the ability to render just by passing
|
2
|
+
a multi-line string as the transfer source. If you want to render templates see the
|
3
|
+
new `render()` and `template()` (rendering.rb) helpers and the `file` installer.
|
4
|
+
|
5
|
+
*Josh Goebel*
|
6
|
+
|
1
7
|
* A users own post :install hooks should happen after a file has completely been moved
|
2
8
|
(when using sudo this was not the case)
|
3
9
|
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sprinkle (0.
|
4
|
+
sprinkle (0.7)
|
5
5
|
activesupport (>= 2.0.2)
|
6
6
|
capistrano (>= 2.5.5)
|
7
|
+
erubis (>= 2.7.0)
|
7
8
|
highline (>= 1.4.0)
|
8
9
|
open4 (>= 1.1.0)
|
9
10
|
|
@@ -21,6 +22,7 @@ GEM
|
|
21
22
|
net-ssh-gateway (>= 1.1.0)
|
22
23
|
coderay (1.0.9)
|
23
24
|
diff-lcs (1.2.4)
|
25
|
+
erubis (2.7.0)
|
24
26
|
highline (1.6.19)
|
25
27
|
i18n (0.6.1)
|
26
28
|
interception (0.3)
|
data/bad.rb
ADDED
data/config/deploy.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
set :application, "set your application name here"
|
2
|
+
set :repository, "set your repository location here"
|
3
|
+
|
4
|
+
# set :scm, :git # You can set :scm explicitly or Capistrano will make an intelligent guess based on known version control directory names
|
5
|
+
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`
|
6
|
+
|
7
|
+
role :web, "pastie.org" # Your HTTP server, Apache/etc
|
8
|
+
role :app, "pastie.org" # This may be the same as your `Web` server
|
9
|
+
role :db, "pastie.org", :primary => true # This is where Rails migrations will run
|
10
|
+
role :db, "pastie.org"
|
11
|
+
|
12
|
+
# if you want to clean up old releases on each deploy uncomment this:
|
13
|
+
# after "deploy:restart", "deploy:cleanup"
|
14
|
+
|
15
|
+
# if you're still using the script/reaper helper you will need
|
16
|
+
# these http://github.com/rails/irs_process_scripts
|
17
|
+
|
18
|
+
# If you are using Passenger mod_rails uncomment this:
|
19
|
+
namespace :deploy do
|
20
|
+
task :start do ; end
|
21
|
+
# task :stop do ; end
|
22
|
+
# task :restart, :roles => :app, :except => { :no_release => true } do
|
23
|
+
# run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
|
24
|
+
# end
|
25
|
+
end
|
data/examples/rails/rails.rb
CHANGED
@@ -17,12 +17,12 @@
|
|
17
17
|
# set of metadata including its installer type (eg. apt, source, gem, etc). Packages can have
|
18
18
|
# relationships to each other via dependencies.
|
19
19
|
|
20
|
-
require 'packages/essential'
|
21
|
-
require 'packages/rails'
|
22
|
-
require 'packages/database'
|
23
|
-
require 'packages/server'
|
24
|
-
require 'packages/search'
|
25
|
-
require 'packages/scm'
|
20
|
+
require './packages/essential'
|
21
|
+
require './packages/rails'
|
22
|
+
require './packages/database'
|
23
|
+
require './packages/server'
|
24
|
+
require './packages/search'
|
25
|
+
require './packages/scm'
|
26
26
|
|
27
27
|
|
28
28
|
# Policies
|
data/inner.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
policy :twice, :roles => :app do
|
2
|
+
requires :hostname
|
3
|
+
# requires :db
|
4
|
+
# requires :web, :name => "bob"
|
5
|
+
# requires :web, :name => "suzy"
|
6
|
+
# requires :web, :name => "nick"
|
7
|
+
end
|
8
|
+
|
9
|
+
package :hostname do
|
10
|
+
apt "test" do
|
11
|
+
pre :install do
|
12
|
+
runner "BEFORE"
|
13
|
+
runner "BEFORE 2"
|
14
|
+
end
|
15
|
+
post :install do
|
16
|
+
runner "AFTER" do
|
17
|
+
pre(:install) { runner "before after" }
|
18
|
+
post(:install) { runner "after after" }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
deployment do
|
25
|
+
|
26
|
+
# delivery :dummy do
|
27
|
+
# role :app, 'beta1.pastie.org'
|
28
|
+
# role :app, 'beta2.pastie.org'
|
29
|
+
# end
|
30
|
+
|
31
|
+
# use vlad for deployment
|
32
|
+
# delivery :ssh do
|
33
|
+
# role :app, 'beta1.pastie.org'
|
34
|
+
# user "appz"
|
35
|
+
# end
|
36
|
+
|
37
|
+
# delivery :capistrano
|
38
|
+
delivery :capistrano do
|
39
|
+
role :app, 'beta1.pastie.org'
|
40
|
+
# role :app, 'beta2.pastie.org'
|
41
|
+
set :user, "appz"
|
42
|
+
set :use_sudo, true
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Sprinkle::Errors
|
2
|
+
# Blatantly stole this from Chef
|
3
|
+
class TemplateError < RuntimeError
|
4
|
+
attr_reader :original_exception, :context
|
5
|
+
SOURCE_CONTEXT_WINDOW = 2 unless defined? SOURCE_CONTEXT_WINDOW
|
6
|
+
|
7
|
+
def initialize(original_exception, template, context)
|
8
|
+
@original_exception, @template, @context = original_exception, template, context
|
9
|
+
end
|
10
|
+
|
11
|
+
def message
|
12
|
+
@original_exception.message
|
13
|
+
end
|
14
|
+
|
15
|
+
def line_number
|
16
|
+
@line_number ||= $1.to_i if original_exception.backtrace.find {|line| line =~ /\(erubis\):(\d+)/ }
|
17
|
+
end
|
18
|
+
|
19
|
+
def source_location
|
20
|
+
"on line ##{line_number}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def source_listing
|
24
|
+
return nil if line_number.nil?
|
25
|
+
|
26
|
+
@source_listing ||= begin
|
27
|
+
line_index = line_number - 1
|
28
|
+
beginning_line = line_index <= SOURCE_CONTEXT_WINDOW ? 0 : line_index - SOURCE_CONTEXT_WINDOW
|
29
|
+
source_size = SOURCE_CONTEXT_WINDOW * 2 + 1
|
30
|
+
lines = @template.split(/\n/)
|
31
|
+
contextual_lines = lines[beginning_line, source_size]
|
32
|
+
output = []
|
33
|
+
contextual_lines.each_with_index do |line, index|
|
34
|
+
line_number = (index+beginning_line+1).to_s.rjust(3)
|
35
|
+
output << "#{line_number}: #{line}"
|
36
|
+
end
|
37
|
+
output.join("\n")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_s
|
42
|
+
"\n\n#{self.class} (#{message}) #{source_location}:\n\n" +
|
43
|
+
"#{source_listing}\n\n #{original_exception.backtrace.join("\n ")}\n\n"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
module Sprinkle
|
4
|
+
module Installers
|
5
|
+
class FileInstaller < Installer
|
6
|
+
# = File installer
|
7
|
+
#
|
8
|
+
# This installer creates a file on the remote server.
|
9
|
+
#
|
10
|
+
# == Example Usage
|
11
|
+
#
|
12
|
+
# Installing a nginx.conf onto remote servers
|
13
|
+
#
|
14
|
+
# package :nginx_conf do
|
15
|
+
# file '/etc/nginx.conf', :content => File.read('files/nginx.conf')
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# If you user has access to 'sudo' and theres a file that requires
|
19
|
+
# priveledges to install, you can pass :sudo => true
|
20
|
+
#
|
21
|
+
# package :nginx_conf do
|
22
|
+
# file '/etc/nginx.conf', :sudo => true,
|
23
|
+
# :content => File.read('files/nginx.conf')
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# Should you need to run commands before or after the file transfer (making
|
27
|
+
# directories or changing permissions), you can use the pre/post :install directives.
|
28
|
+
#
|
29
|
+
# == Rendering templates
|
30
|
+
#
|
31
|
+
# Use the template render helper to render an ERB template to a remote file (you
|
32
|
+
# can use variables in your templates by setting them as instance variables inside
|
33
|
+
# your package. Templates have access to package methods such as opts, args, etc.
|
34
|
+
#
|
35
|
+
# package :nginx_conf do
|
36
|
+
# @nginx_port = 8080
|
37
|
+
# file '/etc/nginx.conf',
|
38
|
+
# :contents => render("nginx.conf")
|
39
|
+
# # ./templates/nginx.conf.erb or
|
40
|
+
# # ./templates/nginx.conf should contain the erb template
|
41
|
+
# end
|
42
|
+
attr_reader :sourcepath, :destination, :contents
|
43
|
+
|
44
|
+
api do
|
45
|
+
def file(destination, options = {}, &block)
|
46
|
+
# options.merge!(:binding => binding())
|
47
|
+
install FileInstaller.new(self, destination, options, &block)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def initialize(parent, destination, options={}, &block) #:nodoc:
|
52
|
+
@destination = destination
|
53
|
+
@contents = options[:content] || options[:contents]
|
54
|
+
raise "need :contents key for file" unless @contents
|
55
|
+
super parent, options, &block
|
56
|
+
|
57
|
+
post_move_if_sudo
|
58
|
+
setup_source
|
59
|
+
# setup file attributes
|
60
|
+
owner options[:owner] if options[:owner]
|
61
|
+
mode options[:mode] if options[:mode]
|
62
|
+
end
|
63
|
+
|
64
|
+
def install_commands
|
65
|
+
:TRANSFER
|
66
|
+
end
|
67
|
+
|
68
|
+
def owner(owner)
|
69
|
+
@owner = owner
|
70
|
+
post :install, "#{sudo_cmd}chown #{owner} #{@destination}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def mode(mode)
|
74
|
+
@mode = mode
|
75
|
+
post :install, "#{sudo_cmd}chmod #{mode} #{@destination}"
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def post_move_if_sudo
|
81
|
+
return unless sudo? # perform the file copy in two steps if we're using sudo
|
82
|
+
final = @destination
|
83
|
+
@destination = "/tmp/sprinkle_#{File.basename(@destination)}"
|
84
|
+
# make sure we push the move ahead of any other post install tasks
|
85
|
+
# a user may have requested
|
86
|
+
post(:install).unshift ["#{sudo_cmd}mv #{@destination} #{final}"]
|
87
|
+
end
|
88
|
+
|
89
|
+
def setup_source
|
90
|
+
file=Tempfile.new(@package.name.to_s)
|
91
|
+
file.print(@contents)
|
92
|
+
file.close
|
93
|
+
@sourcepath = file.path
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -1,48 +1,3 @@
|
|
1
|
-
# Blatantly stole this from Chef
|
2
|
-
class TemplateError < RuntimeError
|
3
|
-
attr_reader :original_exception, :context
|
4
|
-
SOURCE_CONTEXT_WINDOW = 2 unless defined? SOURCE_CONTEXT_WINDOW
|
5
|
-
|
6
|
-
def initialize(original_exception, template, context)
|
7
|
-
@original_exception, @template, @context = original_exception, template, context
|
8
|
-
end
|
9
|
-
|
10
|
-
def message
|
11
|
-
@original_exception.message
|
12
|
-
end
|
13
|
-
|
14
|
-
def line_number
|
15
|
-
@line_number ||= $1.to_i if original_exception.backtrace.find {|line| line =~ /\(erubis\):(\d+)/ }
|
16
|
-
end
|
17
|
-
|
18
|
-
def source_location
|
19
|
-
"on line ##{line_number}"
|
20
|
-
end
|
21
|
-
|
22
|
-
def source_listing
|
23
|
-
return nil if line_number.nil?
|
24
|
-
|
25
|
-
@source_listing ||= begin
|
26
|
-
line_index = line_number - 1
|
27
|
-
beginning_line = line_index <= SOURCE_CONTEXT_WINDOW ? 0 : line_index - SOURCE_CONTEXT_WINDOW
|
28
|
-
source_size = SOURCE_CONTEXT_WINDOW * 2 + 1
|
29
|
-
lines = @template.split(/\n/)
|
30
|
-
contextual_lines = lines[beginning_line, source_size]
|
31
|
-
output = []
|
32
|
-
contextual_lines.each_with_index do |line, index|
|
33
|
-
line_number = (index+beginning_line+1).to_s.rjust(3)
|
34
|
-
output << "#{line_number}: #{line}"
|
35
|
-
end
|
36
|
-
output.join("\n")
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def to_s
|
41
|
-
"\n\n#{self.class} (#{message}) #{source_location}:\n\n" +
|
42
|
-
"#{source_listing}\n\n #{original_exception.backtrace.join("\n ")}\n\n"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
1
|
module Sprinkle
|
47
2
|
module Installers
|
48
3
|
# = File transfer installer
|
@@ -76,21 +31,14 @@ module Sprinkle
|
|
76
31
|
#
|
77
32
|
# == Rendering templates
|
78
33
|
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
# variables in the package scope). When render is true, recursive is turned off. Note
|
82
|
-
# you can also explicitly pass locals in to render with the :locals option.
|
83
|
-
#
|
84
|
-
# package :nginx_conf do
|
85
|
-
# nginx_port = 8080
|
86
|
-
# transfer 'files/nginx.conf', '/etc/nginx.conf', :render => true
|
87
|
-
# end
|
34
|
+
# Rendering templates with transfer has been depreciated. Please see the file
|
35
|
+
# installer if you want to use templates.
|
88
36
|
class Transfer < Installer
|
89
37
|
attr_accessor :source, :destination, :sourcepath #:nodoc:
|
90
38
|
|
91
39
|
api do
|
92
40
|
def transfer(source, destination, options = {}, &block)
|
93
|
-
options.
|
41
|
+
options.reverse_merge!(:binding => binding())
|
94
42
|
install Transfer.new(self, source, destination, options, &block)
|
95
43
|
end
|
96
44
|
end
|
@@ -129,16 +77,11 @@ module Sprinkle
|
|
129
77
|
:TRANSFER
|
130
78
|
end
|
131
79
|
|
132
|
-
def
|
80
|
+
def render_template(template, context, prefix)
|
133
81
|
require 'tempfile'
|
134
82
|
require 'erubis'
|
135
83
|
|
136
|
-
|
137
|
-
eruby = Erubis::Eruby.new(template)
|
138
|
-
output = eruby.result(context)
|
139
|
-
rescue Object => e
|
140
|
-
raise TemplateError.new(e, template, context)
|
141
|
-
end
|
84
|
+
output = @package.template(template, context)
|
142
85
|
|
143
86
|
final_tempfile = Tempfile.new(prefix.to_s)
|
144
87
|
final_tempfile.print(output)
|
@@ -146,10 +89,6 @@ module Sprinkle
|
|
146
89
|
final_tempfile
|
147
90
|
end
|
148
91
|
|
149
|
-
def render_template(template, context, prefix)
|
150
|
-
self.class.render_template(template, context, prefix)
|
151
|
-
end
|
152
|
-
|
153
92
|
def render_template_file(path, context, prefix)
|
154
93
|
template = source_is_template? ? path : File.read(path)
|
155
94
|
tempfile = render_template(template, context, @package.name)
|
@@ -166,6 +105,8 @@ module Sprinkle
|
|
166
105
|
return if Sprinkle::OPTIONS[:testing]
|
167
106
|
|
168
107
|
if options[:render]
|
108
|
+
ActiveSupport::Deprecation.warn("transfer :render is depreciated, please use the `file` installer now.")
|
109
|
+
ActiveSupport::Deprecation.warn("transfer :render will be removed from Sprinkle v0.8")
|
169
110
|
if options[:locals]
|
170
111
|
context = {}
|
171
112
|
options[:locals].each_pair do |k,v|
|
@@ -176,18 +117,12 @@ module Sprinkle
|
|
176
117
|
end
|
177
118
|
end
|
178
119
|
else
|
179
|
-
# context = binding()
|
180
120
|
context = @binding
|
181
121
|
end
|
182
122
|
|
183
123
|
tempfile = render_template_file(@source, context, @package.name)
|
184
124
|
@sourcepath = tempfile.path
|
185
|
-
|
186
|
-
logger.debug "Rendering inline template to temporary file #{sourcepath}"
|
187
|
-
else
|
188
|
-
logger.debug "Rendering template #{@source} to temporary file #{sourcepath}"
|
189
|
-
end
|
190
|
-
recursive = false
|
125
|
+
@options[:recursive] = false
|
191
126
|
else
|
192
127
|
@sourcepath = @source
|
193
128
|
end
|
@@ -23,7 +23,8 @@ module Sprinkle::Package
|
|
23
23
|
|
24
24
|
# returns all packages matching the name and options given (including via provides)
|
25
25
|
def find_all(name, opts={})
|
26
|
-
|
26
|
+
# opts ||= {}
|
27
|
+
all = [@packages.select {|x| x.name.to_s == name.to_s },
|
27
28
|
find_all_by_provides(name, opts)].flatten.compact
|
28
29
|
filter(all, opts)
|
29
30
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'erubis'
|
2
|
+
require 'digest/md5'
|
3
|
+
|
4
|
+
module Sprinkle::Package
|
5
|
+
module Rendering
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
self.send :include, Helpers
|
10
|
+
end
|
11
|
+
|
12
|
+
def template(src, bound=binding)
|
13
|
+
eruby = Erubis::Eruby.new(src)
|
14
|
+
output = eruby.result(bound)
|
15
|
+
rescue Object => e
|
16
|
+
raise Sprinkle::Errors::TemplateError.new(e, src, bound)
|
17
|
+
end
|
18
|
+
|
19
|
+
def render(file)
|
20
|
+
contents=File.read(expand_filename(file))
|
21
|
+
template(contents)
|
22
|
+
end
|
23
|
+
|
24
|
+
module Helpers
|
25
|
+
def md5(s)
|
26
|
+
Digest::MD5.hexdigest(s)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def expand_filename(n)
|
33
|
+
return n.to_s if n.to_s.starts_with? "/"
|
34
|
+
["./templates/#{n}","./templates/#{n}.erb"].each do |f|
|
35
|
+
return f if File.exist?(f)
|
36
|
+
end
|
37
|
+
raise "template file not found"
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
data/lib/sprinkle/package.rb
CHANGED
data/lib/sprinkle/policy.rb
CHANGED
@@ -119,7 +119,7 @@ module Sprinkle
|
|
119
119
|
end
|
120
120
|
|
121
121
|
def normalize(all, &block)
|
122
|
-
all = all.flatten.uniq
|
122
|
+
all = all.flatten.uniq {|x| [x.name, x.version] }
|
123
123
|
cloud_info "--> Normalized installation order for all packages: #{all.collect(&:name).join(', ')}\n"
|
124
124
|
all.each &block
|
125
125
|
end
|
@@ -13,7 +13,6 @@ module Sprinkle
|
|
13
13
|
module File
|
14
14
|
Sprinkle::Verify.register(Sprinkle::Verifiers::File)
|
15
15
|
|
16
|
-
# Checks to make sure <tt>path</tt> is a file on the remote server.
|
17
16
|
def has_file(path)
|
18
17
|
test "-f #{path}"
|
19
18
|
end
|
@@ -29,9 +28,13 @@ module Sprinkle
|
|
29
28
|
def file_contains(path, text)
|
30
29
|
@commands << "grep '#{text}' #{path}"
|
31
30
|
end
|
31
|
+
|
32
|
+
# TODO: remove 0.9
|
32
33
|
def user_present(username)
|
34
|
+
ActiveSupport::Deprecation.warn("user_present is depreciated. Use has_user instead.")
|
33
35
|
has_user username
|
34
36
|
end
|
37
|
+
|
35
38
|
def matches_local(localfile, remotefile, mode=nil)
|
36
39
|
raise "Couldn't find local file #{localfile}" unless ::File.exists?(localfile)
|
37
40
|
require 'digest/md5'
|
data/lib/sprinkle/verify.rb
CHANGED
data/lib/sprinkle/version.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe Sprinkle::Package::Rendering, 'rendering' do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@package = package :something do
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should be able to calculate md5s" do
|
11
|
+
@package.md5("test").should == "098f6bcd4621d373cade4e832627b4f6"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should allow passing locals to template" do
|
15
|
+
t=@package.template("hello <%= world %>", :world => "world")
|
16
|
+
t.should == "hello world"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should be able to render a file from absolute path" do
|
20
|
+
path=File.join(__FILE__, "../../templates/test.erb")
|
21
|
+
t=@package.render("test")
|
22
|
+
t.should == "hello "
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be able to render a file from templates" do
|
26
|
+
@package = package :new do
|
27
|
+
@world = "world"
|
28
|
+
end
|
29
|
+
t=@package.render("test")
|
30
|
+
t.should == "hello world"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe Sprinkle::Installers::FileInstaller do
|
4
|
+
include Sprinkle::Deployment
|
5
|
+
|
6
|
+
before do
|
7
|
+
@package = mock(Sprinkle::Package, :name => 'package', :sudo? => false)
|
8
|
+
@empty = Proc.new { }
|
9
|
+
@delivery = mock(Sprinkle::Deployment, :install => true)
|
10
|
+
@source = 'source'
|
11
|
+
@destination = 'destination'
|
12
|
+
@contents = "hi"
|
13
|
+
@installer = create_file_installer(@destination, :contents => @contents)
|
14
|
+
@roles = []
|
15
|
+
@deployment = deployment do
|
16
|
+
delivery :capistrano
|
17
|
+
installer do; prefix '/usr/bin'; end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_file_installer(dest, options={}, &block)
|
22
|
+
i = Sprinkle::Installers::FileInstaller.new(@package, dest, options, &block)
|
23
|
+
i.delivery = @delivery
|
24
|
+
i
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'when created' do
|
28
|
+
it 'should accept a source and destination to install' do
|
29
|
+
@installer.contents.should == @contents
|
30
|
+
@installer.destination.should == @destination
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'during installation' do
|
35
|
+
|
36
|
+
context "setting mode and owner" do
|
37
|
+
before do
|
38
|
+
@installer = create_file_installer @destination, :content => @contents do
|
39
|
+
mode "744"
|
40
|
+
owner "root"
|
41
|
+
end
|
42
|
+
@installer_commands = @installer.install_sequence
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should include command to set owner" do
|
46
|
+
@installer_commands.should include("chmod 744 #{@destination}")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should include command to set mode" do
|
50
|
+
@installer_commands.should include("chown root #{@destination}")
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'single pre/post commands' do
|
56
|
+
before do
|
57
|
+
@installer = create_file_installer @destination, :content => @contents do
|
58
|
+
pre :install, 'op1'
|
59
|
+
post :install, 'op2'
|
60
|
+
end
|
61
|
+
@installer_commands = @installer.install_sequence
|
62
|
+
@delivery = @installer.delivery
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should call the pre and post install commands around the file transfer" do
|
66
|
+
@installer_commands.should == ["op1",:TRANSFER, "op2"]
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'pre/post with sudo' do
|
72
|
+
before do
|
73
|
+
@installer = create_file_installer @destination, :content => @contents do
|
74
|
+
@options[:sudo]= true
|
75
|
+
pre :install, 'op1'
|
76
|
+
post :install, 'op2'
|
77
|
+
end
|
78
|
+
@installer_commands = @installer.install_sequence
|
79
|
+
@delivery = @installer.delivery
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should call the pre and post install commands around the file transfer" do
|
83
|
+
@installer_commands.should == ["op1",:TRANSFER,
|
84
|
+
"sudo mv /tmp/sprinkle_destination destination", "op2"]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'multiple pre/post commands' do
|
89
|
+
before do
|
90
|
+
@installer = create_file_installer @destination, :content => @contents do
|
91
|
+
pre :install, 'op1', 'op1-1'
|
92
|
+
post :install, 'op2', 'op2-1'
|
93
|
+
end
|
94
|
+
@installer_commands = @installer.install_sequence
|
95
|
+
@delivery = @installer.delivery
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should call the pre and post install commands around the file transfer" do
|
99
|
+
@installer_commands.should == ["op1","op1-1",:TRANSFER, "op2","op2-1"]
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
after do
|
105
|
+
@installer.process @roles
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
data/sprinkle.gemspec
CHANGED
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
s.add_development_dependency(%q<rspec>, [">= 2.5"])
|
31
31
|
s.add_development_dependency(%q<rake>, [">= 0.8.7"])
|
32
32
|
s.add_development_dependency(%q<rdoc>, [">= 3.12"])
|
33
|
+
s.add_runtime_dependency(%q<erubis>, [">= 2.7.0"])
|
33
34
|
s.add_runtime_dependency(%q<open4>, [">= 1.1.0"])
|
34
35
|
s.add_runtime_dependency(%q<activesupport>, [">= 2.0.2"])
|
35
36
|
s.add_runtime_dependency(%q<highline>, [">= 1.4.0"])
|
data/test.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
# package :echo do
|
2
|
+
# runner "echo hello world"
|
3
|
+
# end
|
4
|
+
#
|
5
|
+
# package :version do
|
6
|
+
# runner "cat /etc/lsb-release"
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
# policy :once, :roles => :app do
|
10
|
+
# requires :echo
|
11
|
+
# requires :version
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
package :db do
|
15
|
+
# go do
|
16
|
+
# puts "<eval db>"
|
17
|
+
# runner "installing the db"
|
18
|
+
# end
|
19
|
+
verify do
|
20
|
+
has_file "/etc/db"
|
21
|
+
end
|
22
|
+
# runner "finalized"
|
23
|
+
end
|
24
|
+
|
25
|
+
package :hostname do
|
26
|
+
# go do
|
27
|
+
# # puts "<eval hostname : #{hostname}>"
|
28
|
+
# runner "echo #{hostname} > /etc/hostname", :sudo => true
|
29
|
+
# end
|
30
|
+
# push_text "now", "/etc/stupid_file"
|
31
|
+
# details "using name: front.pastie.org"
|
32
|
+
|
33
|
+
# runner "echo 'hostname'"
|
34
|
+
# runner "cat /etc/hostname"
|
35
|
+
|
36
|
+
version "5"
|
37
|
+
|
38
|
+
@what = "secret"
|
39
|
+
@something = "else"
|
40
|
+
file "/Users/jgoebel/notnow#{version}", :contents => c=render(:first)
|
41
|
+
# transfer "<%= @what %>\n<%= @what + something %>", "/Users/jgoebel/notnow2", :render => true,
|
42
|
+
# :binding => binding
|
43
|
+
|
44
|
+
verify do
|
45
|
+
has_file "/Users/jgoebel/notnow#{version}"
|
46
|
+
# md5_of_file "/Users/jgoebel/notnow", md5(c)
|
47
|
+
end
|
48
|
+
# verify do
|
49
|
+
# has_executable "/bin/ccc"
|
50
|
+
# end
|
51
|
+
end
|
52
|
+
|
53
|
+
package :web do
|
54
|
+
requires :db
|
55
|
+
|
56
|
+
# go do
|
57
|
+
# # puts "<eval web>"
|
58
|
+
# runner "installing web #{opts[:name]}"
|
59
|
+
# end
|
60
|
+
# runner "finalized"
|
61
|
+
|
62
|
+
verify do
|
63
|
+
# has_file "/etc/web/#{opts[:name]}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
policy :twice, :roles => :app do
|
68
|
+
requires :hostname
|
69
|
+
# requires :db
|
70
|
+
# requires :web, :name => "bob"
|
71
|
+
# requires :web, :name => "suzy"
|
72
|
+
# requires :web, :name => "nick"
|
73
|
+
end
|
74
|
+
|
75
|
+
deployment do
|
76
|
+
|
77
|
+
# delivery :dummy do
|
78
|
+
# role :app, 'beta1.pastie.org'
|
79
|
+
# role :app, 'beta2.pastie.org'
|
80
|
+
# end
|
81
|
+
|
82
|
+
delivery :local
|
83
|
+
|
84
|
+
# delivery :vlad do
|
85
|
+
# script "vlad"
|
86
|
+
# end
|
87
|
+
|
88
|
+
# use ssh for deployment
|
89
|
+
# delivery :ssh do
|
90
|
+
# role :app, 'front.pastie.org'
|
91
|
+
# user "appz"
|
92
|
+
# end
|
93
|
+
|
94
|
+
# delivery :capistrano
|
95
|
+
# delivery :capistrano do
|
96
|
+
# role :app, 'beta1.pastie.org'
|
97
|
+
# role :app, 'beta2.pastie.org'
|
98
|
+
# set :user, "appz"
|
99
|
+
# set :use_sudo, true
|
100
|
+
# end
|
101
|
+
|
102
|
+
end
|
data/work/inner.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
policy :sprinkle, :roles => :app do
|
2
|
+
requires :sprinkle
|
3
|
+
end
|
4
|
+
|
5
|
+
package :sprinkle do
|
6
|
+
i=runner "test" do
|
7
|
+
# pre(:install) { install Installers::Runner.new(self,"before") }
|
8
|
+
# pre(:install) { runner "pre" }
|
9
|
+
# post(:install) { runner "after" }
|
10
|
+
post(:install) { noop }
|
11
|
+
end
|
12
|
+
# puts runner("blah")
|
13
|
+
# puts i.inspect
|
14
|
+
runner "next"
|
15
|
+
end
|
16
|
+
|
17
|
+
deployment do
|
18
|
+
|
19
|
+
# use vlad for deployment
|
20
|
+
delivery :dummy do
|
21
|
+
# role :app, 'yourhost.com'
|
22
|
+
end
|
23
|
+
|
24
|
+
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.1
|
4
|
+
version: 0.7.1.1
|
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-06-
|
13
|
+
date: 2013-06-20 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
@@ -60,6 +60,22 @@ dependencies:
|
|
60
60
|
- - ! '>='
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '3.12'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: erubis
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 2.7.0
|
71
|
+
type: :runtime
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 2.7.0
|
63
79
|
- !ruby/object:Gem::Dependency
|
64
80
|
name: open4
|
65
81
|
requirement: !ruby/object:Gem::Requirement
|
@@ -141,7 +157,9 @@ files:
|
|
141
157
|
- MIT-LICENSE
|
142
158
|
- README.md
|
143
159
|
- Rakefile
|
160
|
+
- bad.rb
|
144
161
|
- bin/sprinkle
|
162
|
+
- config/deploy.rb
|
145
163
|
- examples/packages/build_essential.rb
|
146
164
|
- examples/packages/databases/mysql.rb
|
147
165
|
- examples/packages/databases/mysql_source.rb
|
@@ -163,6 +181,7 @@ files:
|
|
163
181
|
- examples/rails/packages/server.rb
|
164
182
|
- examples/rails/rails.rb
|
165
183
|
- examples/sprinkle/sprinkle.rb
|
184
|
+
- inner.rb
|
166
185
|
- lib/sprinkle.rb
|
167
186
|
- lib/sprinkle/actors/actor.rb
|
168
187
|
- lib/sprinkle/actors/capistrano.rb
|
@@ -173,6 +192,7 @@ files:
|
|
173
192
|
- lib/sprinkle/deployment.rb
|
174
193
|
- lib/sprinkle/errors/pretty_failure.rb
|
175
194
|
- lib/sprinkle/errors/remote_command_failure.rb
|
195
|
+
- lib/sprinkle/errors/template_error.rb
|
176
196
|
- lib/sprinkle/errors/transfer_failure.rb
|
177
197
|
- lib/sprinkle/extensions/array.rb
|
178
198
|
- lib/sprinkle/extensions/attributes.rb
|
@@ -184,6 +204,7 @@ files:
|
|
184
204
|
- lib/sprinkle/installers/brew.rb
|
185
205
|
- lib/sprinkle/installers/bsd_port.rb
|
186
206
|
- lib/sprinkle/installers/deb.rb
|
207
|
+
- lib/sprinkle/installers/file.rb
|
187
208
|
- lib/sprinkle/installers/freebsd_pkg.rb
|
188
209
|
- lib/sprinkle/installers/freebsd_portinstall.rb
|
189
210
|
- lib/sprinkle/installers/gem.rb
|
@@ -213,6 +234,7 @@ files:
|
|
213
234
|
- lib/sprinkle/package.rb
|
214
235
|
- lib/sprinkle/package/chooser.rb
|
215
236
|
- lib/sprinkle/package/package_repository.rb
|
237
|
+
- lib/sprinkle/package/rendering.rb
|
216
238
|
- lib/sprinkle/policy.rb
|
217
239
|
- lib/sprinkle/script.rb
|
218
240
|
- lib/sprinkle/utility/log_recorder.rb
|
@@ -238,11 +260,13 @@ files:
|
|
238
260
|
- spec/sprinkle/actors/ssh_spec.rb
|
239
261
|
- spec/sprinkle/deployment_spec.rb
|
240
262
|
- spec/sprinkle/extensions/array_spec.rb
|
263
|
+
- spec/sprinkle/extensions/rendering_spec.rb
|
241
264
|
- spec/sprinkle/extensions/string_spec.rb
|
242
265
|
- spec/sprinkle/installers/apt_spec.rb
|
243
266
|
- spec/sprinkle/installers/binary_spec.rb
|
244
267
|
- spec/sprinkle/installers/brew_spec.rb
|
245
268
|
- spec/sprinkle/installers/bsd_port_spec.rb
|
269
|
+
- spec/sprinkle/installers/file_spec.rb
|
246
270
|
- spec/sprinkle/installers/freebsd_pkg_spec.rb
|
247
271
|
- spec/sprinkle/installers/freebsd_portinstall_spec.rb
|
248
272
|
- spec/sprinkle/installers/gem_spec.rb
|
@@ -271,6 +295,8 @@ files:
|
|
271
295
|
- spec/sprinkle/sprinkle_spec.rb
|
272
296
|
- spec/sprinkle/verify_spec.rb
|
273
297
|
- sprinkle.gemspec
|
298
|
+
- test.rb
|
299
|
+
- work/inner.rb
|
274
300
|
homepage: https://github.com/sprinkle-tool/sprinkle
|
275
301
|
licenses:
|
276
302
|
- MIT
|
@@ -305,11 +331,13 @@ test_files:
|
|
305
331
|
- spec/sprinkle/actors/ssh_spec.rb
|
306
332
|
- spec/sprinkle/deployment_spec.rb
|
307
333
|
- spec/sprinkle/extensions/array_spec.rb
|
334
|
+
- spec/sprinkle/extensions/rendering_spec.rb
|
308
335
|
- spec/sprinkle/extensions/string_spec.rb
|
309
336
|
- spec/sprinkle/installers/apt_spec.rb
|
310
337
|
- spec/sprinkle/installers/binary_spec.rb
|
311
338
|
- spec/sprinkle/installers/brew_spec.rb
|
312
339
|
- spec/sprinkle/installers/bsd_port_spec.rb
|
340
|
+
- spec/sprinkle/installers/file_spec.rb
|
313
341
|
- spec/sprinkle/installers/freebsd_pkg_spec.rb
|
314
342
|
- spec/sprinkle/installers/freebsd_portinstall_spec.rb
|
315
343
|
- spec/sprinkle/installers/gem_spec.rb
|