puppet_transplant 0.0.2 → 0.0.3

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/README.md CHANGED
@@ -6,6 +6,14 @@ the puppet gem to relocate the default confdir and vardir. This behaviors
6
6
  allows multiple versions of puppet to exist in different gemsets with distinct
7
7
  default base directories.
8
8
 
9
+ The relocation directory is based on the Ruby PREFIX. For example, if the
10
+ puppet gem is installed using a ruby with a prefix of `/opt/operations` then
11
+ `operations` will be used to construct a default system confdir of
12
+ `/etc/operations/puppet` and a default system vardir of
13
+ `/var/lib/operations/puppet`. Similarly,
14
+ `/opt/crossfader/versions/ruby/1.9.3-p448` will result in
15
+ `/etc/crossfader/puppet` and `/var/lib/crossfader/puppet`.
16
+
9
17
  The design of modifying the default confdir and vardir has been chosen to
10
18
  support Puppet operating as a library in addition to Puppet operating as an
11
19
  application. This approach has the goal of keeping behavior consistent between
@@ -15,26 +23,42 @@ inconsistency between application and library use cases.
15
23
 
16
24
  ## Installation
17
25
 
18
- Add this line to your application's Gemfile:
26
+ Install this gem before installing Puppet to ensure puppet will be relocated
27
+ upon installation.
28
+
29
+ $ gem install puppet_transplant
19
30
 
20
- gem 'puppet_transplant'
31
+ If you do not have permission to write to `$GEM_HOME`, try preserving your
32
+ environment in sudo:
21
33
 
22
- And then execute:
34
+ $ sudo -E gem install puppet_transplant
23
35
 
24
- $ bundle
36
+ ## Usage
25
37
 
26
- Or install it yourself as:
38
+ Simply install the gem into the current gemset then install a puppet gem
39
+ afterwards. For example:
27
40
 
28
- $ gem install puppet_transplant
41
+ $ which gem
42
+ /opt/operations/bin/gem
29
43
 
30
- ## Usage
44
+ $ sudo -E gem install puppet_transplant
45
+ Fetching: puppet_transplant-0.0.2.gem (100%)
46
+ Successfully installed puppet_transplant-0.0.2
47
+ 1 gem installed
48
+ Installing ri documentation for puppet_transplant-0.0.2...
49
+ Installing RDoc documentation for puppet_transplant-0.0.2...
31
50
 
32
- Simply install the gem into the current gemset. If Puppet already exists in
33
- this gemset then the default confdir and vardir will be modified to use
34
- `/etc/operations/puppet` and `/var/lib/operations/puppet` respectively.
51
+ $ sudo -E gem install puppet --no-ri --no-rdoc
52
+ Fetching: puppet-3.4.2.gem (100%)
53
+ Transplanted confdir: /etc/operations/puppet
54
+ Transplanted vardir: /var/lib/operations/puppet
55
+ Successfully installed puppet-3.4.2
56
+ 1 gem installed
35
57
 
36
- The relocation target directories are not currently configurable but this
37
- should be a future improvement.
58
+ $ sudo -E puppet agent --configprint confdir
59
+ /etc/operations/puppet
60
+ $ sudo -E puppet agent --configprint vardir
61
+ /var/lib/operations/puppet
38
62
 
39
63
  ## Contributing
40
64
 
@@ -3,7 +3,24 @@ require 'rbconfig'
3
3
  require 'rubygems/installer'
4
4
 
5
5
  module PuppetTransplant
6
+ ##
7
+ # The Installer class contains all of the data and behavior required to
8
+ # relocate Puppet's default system confdir and vardir settings. The behavior
9
+ # is intended to be implemented as a [rubygems
10
+ # plugin](http://rubygems.rubyforge.org/rubygems-update/Gem.html#method-c-post_install),
11
+ # called using something like the following example.
12
+ #
13
+ # module Gem
14
+ # post_install do |gem_installer|
15
+ # PuppetTransplant::Installer.post_install(gem_installer)
16
+ # end
17
+ # end
18
+ #
19
+ # @author Jeff McCune <jeff@puppetlabs.com>
6
20
  class Installer
21
+ ##
22
+ # RelocationError instances are raised when modification of Puppet's
23
+ # behavior fails for some reason. The message should indicate why.
7
24
  class RelocationError < Exception; end
8
25
 
9
26
  ##
@@ -14,31 +31,24 @@ module PuppetTransplant
14
31
  #
15
32
  # @param [Gem::Installer] gem_installer The gem installer instance of the
16
33
  # gem just installed, passed from the Gem.post_install callback.
34
+ #
35
+ # @return [Boolean] true if relocation succeeded, false if it did not
36
+ # succeed.
17
37
  def self.post_install(gem_installer)
18
38
  # Do nothing unless we're dealing with Puppet.
19
39
  return unless gem_installer.spec.name == 'puppet'
20
40
  # Perform the relocation
21
41
  installer = new(gem_installer)
22
- installer.relocate_puppet!
42
+ begin
43
+ installer.relocate_puppet!
44
+ rescue RelocationError => detail
45
+ gem_installer.ui.alert_error "PuppetTransplant relocation failed: #{detail}"
46
+ return false
47
+ end
23
48
  # Let the user know what happened
24
49
  gem_installer.ui.debug "Transplanted confdir: #{installer.confdir}"
25
50
  gem_installer.ui.debug "Transplanted vardir: #{installer.vardir}"
26
- end
27
-
28
- ##
29
- # pre_install takes a {Gem::Installer} instance expected to be passed from
30
- # a Gem.pre_install callback and overrides the
31
- # {Gem::Installer#app_script_text} method if the puppet gem is about to be
32
- # installed.
33
- #
34
- # @deprecated in favor of {.post_install}
35
- #
36
- # @param [Gem::Installer] gem_installer The gem installer instance of the
37
- # gem just installed, passed from the Gem.pre_install callback.
38
- def self.pre_install(gem_installer)
39
- return unless gem_installer.spec.name == 'puppet'
40
- installer = new(gem_installer)
41
- installer.modify_app_script_text!
51
+ return true
42
52
  end
43
53
 
44
54
  attr_reader :gem_installer
@@ -50,53 +60,6 @@ module PuppetTransplant
50
60
  @gem_installer = gem_installer
51
61
  end
52
62
 
53
- ##
54
- # modify_app_script_text! monkey patches the
55
- # {Gem::Installer#app_script_text}
56
- # method to implement the following behavior for the `puppet` binstub:
57
- #
58
- # 1. If `--confdir` or `--vardir` are specified via ARGV then use the
59
- # provided values.
60
- # 2. Otherwise modify ARGV to include `--confdir=/etc/#{org}/puppet` and
61
- # `--vardir=/var/lib/#{org}/puppet`
62
- #
63
- # @deprecated in favor of overriding the default and confdir in a manner
64
- # that supports consistency between puppet as a library and puppet as an
65
- # application. Implementing a wrapper script that sets --confdir and
66
- # --vardir creates inconsistent behavior between puppet as a library and
67
- # puppet as an application.
68
- #
69
- # @see {#relocate_puppet!}
70
- #
71
- # @see #org
72
- #
73
- # @api private
74
- #
75
- # @return [String] the text of the modified app script.
76
- def modify_app_script_text!
77
- custom_app_script_text = method(:app_script_text)
78
- bindir = bindir()
79
- confdir = confdir()
80
- vardir = vardir()
81
-
82
- gem_installer.instance_eval do
83
- orig_app_script_text = method(:app_script_text)
84
- define_singleton_method(:app_script_text) do |bin_file_name|
85
- case bin_file_name
86
- when 'puppet'
87
- ui.say "***************************************************"
88
- ui.say "* PuppetTransplant produced #{bindir}/puppet"
89
- ui.say "* confdir: #{confdir}"
90
- ui.say "* vardir: #{vardir}"
91
- ui.say "***************************************************"
92
- custom_app_script_text.call(bin_file_name)
93
- else
94
- orig_app_script_text.call(bin_file_name)
95
- end
96
- end
97
- end
98
- end
99
-
100
63
  ##
101
64
  # relocate_puppet! overrides the default confdir and vardir using one of
102
65
  # two methods. First, if the version of Puppet being relocated provides
@@ -115,12 +78,7 @@ module PuppetTransplant
115
78
  if puppet_override_api?
116
79
  rval = write_override_files
117
80
  else
118
- begin
119
- rval = modify_run_mode_in_place
120
- rescue RelocationError => detail
121
- gem_installer.ui.alert_error "Modification of run_mode.rb failed: #{detail}"
122
- return false
123
- end
81
+ rval = modify_run_mode_in_place
124
82
  end
125
83
  !!rval
126
84
  end
@@ -144,9 +102,9 @@ module PuppetTransplant
144
102
  def modify_run_mode_in_place
145
103
  # Locate the run_mode.rb file
146
104
  dir = gem_installer.dir
147
- spec = gem_installer.spec
105
+ files = spec.files
148
106
 
149
- if run_mode_file = spec.files.find() {|p| p.match(/\/run_mode.rb$/)}
107
+ if run_mode_file = files.find() {|p| p.match(/\/run_mode.rb$/)}
150
108
  run_mode_path = Pathname.new(File.join(dir, run_mode_file))
151
109
  else
152
110
  raise RelocationError, "Could not find run_mode.rb in the file list."
@@ -217,34 +175,6 @@ module PuppetTransplant
217
175
  Puppet::Util::RunMode.respond_to?(:override_path)
218
176
  end
219
177
 
220
- ##
221
- # @deprecated in favor of overriding the default and confdir in a manner
222
- # that supports consistency between puppet as a library and puppet as an
223
- # application. Implementing a wrapper script that sets --confdir and
224
- # --vardir creates inconsistent behavior between puppet as a library and
225
- # puppet as an application.
226
- #
227
- # @see {#relocate_puppet!}
228
- #
229
- # @api private
230
- #
231
- # @return [String] the binstub contents
232
- def app_script_text(bin_file_name)
233
- return <<-TEXT
234
- #{shebang bin_file_name}
235
- #
236
- # This file was generated by PuppetTransplant in order to override the default
237
- # confdir and vardir in a generic way without patching.
238
-
239
- require 'rubygems'
240
-
241
- version = "#{Gem::Requirement.default}"
242
-
243
- gem '#{spec.name}', version
244
- load Gem.bin_path('#{spec.name}', '#{bin_file_name}', version)
245
- TEXT
246
- end
247
-
248
178
  ##
249
179
  # org parses the filesystem path of the location of the ruby prefix path to
250
180
  # determine the organization name. For example, if Ruby is installed with
@@ -285,11 +215,6 @@ TEXT
285
215
  end
286
216
  private :spec
287
217
 
288
- def shebang(bin_file_name)
289
- gem_installer.shebang(bin_file_name)
290
- end
291
- private :shebang
292
-
293
218
  ##
294
219
  # is_windows returns true if the ruby interpreter is currently running on a
295
220
  # windows platform.
@@ -323,17 +248,5 @@ TEXT
323
248
  def vardir
324
249
  @vardir ||= "/var/lib/#{org}/puppet"
325
250
  end
326
-
327
- ##
328
- # bindir returns the bin directory where binstub scripts will be written.
329
- def bindir
330
- bindir = gem_installer.bin_dir || Gem.bindir(gem_home)
331
- end
332
- private :bindir
333
-
334
- def gem_home
335
- gem_installer.gem_home
336
- end
337
- private :gem_home
338
251
  end
339
252
  end
@@ -1,3 +1,3 @@
1
1
  module PuppetTransplant
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -2,13 +2,6 @@
2
2
  require 'puppet_transplant/installer'
3
3
 
4
4
  module Gem
5
- ## We're no longer going the route of patching the binstub. Instead, we're
6
- # going to override the default confdir and vardir in an effort to keep the
7
- # behavior of puppet as a library and puppet as an application consistent.
8
- # pre_install do |gem_installer|
9
- # PuppetTransplant::Installer.pre_install(gem_installer)
10
- # end
11
-
12
5
  # Register a callback to override the default puppet confdir and vardir
13
6
  post_install do |gem_installer|
14
7
  PuppetTransplant::Installer.post_install(gem_installer)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet_transplant
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-21 00:00:00.000000000 Z
12
+ date: 2014-01-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -111,7 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
111
  version: '0'
112
112
  segments:
113
113
  - 0
114
- hash: -134858611691268826
114
+ hash: 4590383034694438716
115
115
  required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
120
  version: '0'
121
121
  segments:
122
122
  - 0
123
- hash: -134858611691268826
123
+ hash: 4590383034694438716
124
124
  requirements: []
125
125
  rubyforge_project:
126
126
  rubygems_version: 1.8.23