Method: Chef::Provider::Package::Cab#parse_dism_get_package_info

Defined in:
lib/chef/provider/package/cab.rb

#parse_dism_get_package_info(text) ⇒ Object

returns a hash of package information given the output of dism /get-packageinfo



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/chef/provider/package/cab.rb', line 148

def parse_dism_get_package_info(text)
  package_data = {}
  errors = []
  in_section = false
  section_headers = [ "Package information", "Custom Properties", "Features" ]
  text.each_line do |line|
    if line =~ /Error: (.*)/
      errors << $1.strip
    elsif section_headers.any? { |header| line =~ /^(#{header})/ }
      in_section = $1.downcase.tr(" ", "_")
    elsif line =~ /(.*) ?: (.*)/
      v = $2 # has to be first or the gsub below replaces this variable
      k = $1.downcase.strip.tr(" ", "_")
      if in_section
        package_data[in_section] = {} unless package_data[in_section]
        package_data[in_section][k] = v
      else
        package_data[k] = v
      end
    end
  end
  unless errors.empty?
    if errors.include?("0x80070003") || errors.include?("0x80070002")
      raise Chef::Exceptions::Package, "DISM: The system cannot find the path or file specified."
    elsif errors.include?("740")
      raise Chef::Exceptions::Package, "DISM: Error 740: Elevated permissions are required to run DISM."
    else
      raise Chef::Exceptions::Package, "Unknown errors encountered parsing DISM output: #{errors}"
    end
  end
  package_data
end