class Puppet::ModuleTool::Applications::Uninstaller

Public Class Methods

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

Public Instance Methods

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

Private Instance Methods

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