Class: Puppet::ModuleTool::Applications::Unpacker Private
- Inherits:
-
Application
- Object
- Application
- Puppet::ModuleTool::Applications::Unpacker
- Defined in:
- lib/puppet/module_tool/applications/unpacker.rb
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Constant Summary
Constants inherited from Application
Constants included from Util
Util::ALNUM, Util::ALPHA, Util::AbsolutePathPosix, Util::AbsolutePathWindows, Util::DEFAULT_POSIX_MODE, Util::DEFAULT_WINDOWS_MODE, Util::ESCAPED, Util::HEX, Util::HttpProxy, Util::PUPPET_STACK_INSERTION_FRAME, Util::RESERVED, Util::RFC_3986_URI_REGEX, Util::UNRESERVED, Util::UNSAFE
Constants included from Util::POSIX
Util::POSIX::LOCALE_ENV_VARS, Util::POSIX::USER_ENV_VARS
Constants included from Util::SymbolicFileMode
Util::SymbolicFileMode::SetGIDBit, Util::SymbolicFileMode::SetUIDBit, Util::SymbolicFileMode::StickyBit, Util::SymbolicFileMode::SymbolicMode, Util::SymbolicFileMode::SymbolicSpecialToBit
Instance Attribute Summary
Attributes inherited from Application
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(filename, options = {}) ⇒ Unpacker
constructor
private
A new instance of Unpacker.
- #module_name ⇒ Object private
- #move_into(dir) ⇒ Object private
- #root_dir ⇒ Object private
- #run ⇒ Object private
-
#sanity_check ⇒ Object
private
Error on symlinks and other junk.
-
#tmpdir ⇒ String
private
Obtain a suitable temporary path for unpacking tarballs.
- #unpack ⇒ Object private
Methods inherited from Application
[], #app_defaults, available_application_names, banner, clear!, clear?, clear_everything_for_tests, #configure_indirector_routes, controlled_run, #deprecate, #deprecated?, environment_mode, exit, find, get_environment_mode, #handle_logdest_arg, #handlearg, #help, #initialize_app_defaults, interrupted?, #log_runtime_environment, #main, #name, option, option_parser_commands, #parse_options, #preinit, restart!, restart_requested?, #run_command, run_mode, #set_log_level, #setup, #setup_logs, stop!, stop_requested?, #summary, try_load_class
Methods included from Util
absolute_path?, benchmark, chuser, clear_environment, create_erb, default_env, deterministic_rand, deterministic_rand_int, exit_on_fail, format_backtrace_array, format_puppetstack_frame, get_env, get_environment, logmethods, merge_environment, path_to_uri, pretty_backtrace, replace_file, resolve_stackframe, rfc2396_escape, safe_posix_fork, set_env, skip_external_facts, symbolizehash, thinmark, uri_encode, uri_query_encode, uri_to_path, uri_unescape, which, withenv, withumask
Methods included from Util::POSIX
#get_posix_field, #gid, groups_of, #idfield, #methodbyid, #methodbyname, #search_posix_field, #uid
Methods included from Util::SymbolicFileMode
#display_mode, #normalize_symbolic_mode, #symbolic_mode_to_int, #valid_symbolic_mode?
Constructor Details
#initialize(filename, options = {}) ⇒ Unpacker
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a new instance of Unpacker.
27 28 29 30 31 |
# File 'lib/puppet/module_tool/applications/unpacker.rb', line 27 def initialize(filename, = {}) @filename = Pathname.new(filename) super() @module_path = Pathname([:target_dir]) end |
Class Method Details
.harmonize_ownership(source, target) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
18 19 20 21 22 23 24 25 |
# File 'lib/puppet/module_tool/applications/unpacker.rb', line 18 def self.harmonize_ownership(source, target) unless Puppet::Util::Platform.windows? source = Pathname.new(source) unless source.respond_to?(:stat) target = Pathname.new(target) unless target.respond_to?(:stat) FileUtils.chown_R(source.stat.uid, source.stat.gid, target) end end |
.unpack(filename, target) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
11 12 13 14 15 16 |
# File 'lib/puppet/module_tool/applications/unpacker.rb', line 11 def self.unpack(filename, target) app = new(filename, :target_dir => target) app.unpack app.sanity_check app.move_into(target) end |
Instance Method Details
#module_name ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
77 78 79 80 |
# File 'lib/puppet/module_tool/applications/unpacker.rb', line 77 def module_name = Puppet::Util::Json.load((root_dir + 'metadata.json').read) ['name'][/-(.*)/, 1] end |
#move_into(dir) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
83 84 85 86 87 88 89 |
# File 'lib/puppet/module_tool/applications/unpacker.rb', line 83 def move_into(dir) dir = Pathname.new(dir) dir.rmtree if dir.exist? FileUtils.mv(root_dir, dir) ensure FileUtils.rmtree(tmpdir) end |
#root_dir ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/puppet/module_tool/applications/unpacker.rb', line 63 def root_dir return @root_dir if @root_dir # Grab the first directory containing a metadata.json file = Dir["#{tmpdir}/**/metadata.json"].min_by(&:length) if @root_dir = Pathname.new().dirname else raise _("No valid metadata.json found!") end end |
#run ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
33 34 35 36 37 38 39 40 41 42 |
# File 'lib/puppet/module_tool/applications/unpacker.rb', line 33 def run unpack sanity_check module_dir = @module_path + module_name move_into(module_dir) # Return the Pathname object representing the directory where the # module release archive was unpacked the to. module_dir end |
#sanity_check ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Error on symlinks and other junk
46 47 48 49 50 51 52 53 |
# File 'lib/puppet/module_tool/applications/unpacker.rb', line 46 def sanity_check symlinks = Dir.glob("#{tmpdir}/**/*", File::FNM_DOTMATCH).map { |f| Pathname.new(f) }.select { |p| Puppet::FileSystem.symlink? p } tmpdirpath = Pathname.new tmpdir symlinks.each do |s| Puppet.warning _("Symlinks in modules are unsupported. Please investigate symlink %{from}->%{to}.") % { from: s.relative_path_from(tmpdirpath), to: Puppet::FileSystem.readlink(s) } end end |
#tmpdir ⇒ String
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Obtain a suitable temporary path for unpacking tarballs
rubocop:disable Naming/MemoizedInstanceVariableName
96 97 98 |
# File 'lib/puppet/module_tool/applications/unpacker.rb', line 96 def tmpdir @dir ||= Dir.mktmpdir('tmp', Puppet::Forge::Cache.base_path) end |
#unpack ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
56 57 58 59 60 |
# File 'lib/puppet/module_tool/applications/unpacker.rb', line 56 def unpack Puppet::ModuleTool::Tar.instance.unpack(@filename.to_s, tmpdir, [@module_path.stat.uid, @module_path.stat.gid].join(':')) rescue Puppet::ExecutionFailure => e raise RuntimeError, _("Could not extract contents of module archive: %{message}") % { message: e. } end |