class Puppet::ModuleTool::Applications::Uninstaller

Public Class Methods

new(name, options) click to toggle source
   # File lib/puppet/module_tool/applications/uninstaller.rb
 6 def initialize(name, options)
 7   @name        = name
 8   @options     = options
 9   @errors      = Hash.new {|h, k| h[k] = {}}
10   @unfiltered  = []
11   @installed   = []
12   @suggestions = []
13   @environment = options[:environment_instance]
14   @ignore_changes = options[:force] || options[:ignore_changes]
15 end

Public Instance Methods

run() click to toggle source
   # File lib/puppet/module_tool/applications/uninstaller.rb
17 def run
18   results = {
19     :module_name       => @name,
20     :requested_version => @version,
21   }
22 
23   begin
24     find_installed_module
25     validate_module
26 
27     FileUtils.rm_rf(@installed.first.path, :secure => true)
28 
29     results[:affected_modules] = @installed
30     results[:result] = :success
31   rescue ModuleToolError => err
32     results[:error] = {
33       :oneline   => err.message,
34       :multiline => err.multiline,
35     }
36   rescue => e
37     results[:error] = {
38       :oneline => e.message,
39       :multiline => e.respond_to?(:multiline) ? e.multiline : [e.to_s, e.backtrace].join("\n")
40     }
41   ensure
42     results[:result] ||= :failure
43   end
44 
45   results
46 end

Private Instance Methods

find_installed_module() click to toggle source
   # File lib/puppet/module_tool/applications/uninstaller.rb
50 def find_installed_module
51   @environment.modules_by_path.values.flatten.each do |mod|
52     mod_name = (mod.forge_name || mod.name).tr('/', '-')
53     if mod_name == @name
54       @unfiltered << {
55         :name    => mod_name,
56         :version => mod.version,
57         :path    => mod.modulepath,
58       }
59       if @options[:version] && mod.version
60         next unless Puppet::Module.parse_range(@options[:version]).include?(SemanticPuppet::Version.parse(mod.version))
61       end
62       @installed << mod
63     elsif mod_name =~ /#{@name}/
64       @suggestions << mod_name
65     end
66   end
67 
68   if @installed.length > 1
69     raise MultipleInstalledError,
70       :action            => :uninstall,
71       :module_name       => @name,
72       :installed_modules => @installed.sort_by { |mod| @environment.modulepath.index(mod.modulepath) }
73   elsif @installed.empty?
74     if @unfiltered.empty?
75       raise NotInstalledError,
76         :action      => :uninstall,
77         :suggestions => @suggestions,
78         :module_name => @name
79     else
80       raise NoVersionMatchesError,
81         :installed_modules => @unfiltered.sort_by { |mod| @environment.modulepath.index(mod[:path]) },
82         :version_range     => @options[:version],
83         :module_name       => @name
84     end
85   end
86 end
validate_module() click to toggle source
    # File lib/puppet/module_tool/applications/uninstaller.rb
 88 def validate_module
 89   mod = @installed.first
 90 
 91   unless @ignore_changes
 92     raise _("Either the `--ignore_changes` or `--force` argument must be specified to uninstall modules when running in FIPS mode.") if Facter.value(:fips_enabled)
 93 
 94     changes = begin
 95       Puppet::ModuleTool::Applications::Checksummer.run(mod.path)
 96     rescue ArgumentError
 97       []
 98     end
 99 
100     if mod.has_metadata? && !changes.empty?
101       raise LocalChangesError,
102         :action            => :uninstall,
103         :module_name       => (mod.forge_name || mod.name).tr('/', '-'),
104         :requested_version => @options[:version],
105         :installed_version => mod.version
106     end
107   end
108 
109   if !@options[:force] && !mod.required_by.empty?
110     raise ModuleIsRequiredError,
111       :module_name       => (mod.forge_name || mod.name).tr('/', '-'),
112       :required_by       => mod.required_by,
113       :requested_version => @options[:version],
114       :installed_version => mod.version
115   end
116 end