73: def query
74: result_format = /^(\S+)\s+(\S+)\s+\[(\S*)\]\s+\[(\S+)\]\s+(\S+)\s+(.*)$/
75: result_fields = [:category, :name, :ensure, :version_available, :vendor, :description]
76:
77: version_format = "{last}<version>{}"
78: search_format = "<category> <name> [<installedversions:LASTVERSION>] [<bestversion:LASTVERSION>] <homepage> <description>\n"
79:
80: search_field = package_name.count('/') > 0 ? "--category-name" : "--name"
81: search_value = package_name
82:
83: begin
84: update_eix if !FileUtils.uptodate?("/var/cache/eix", %w{/usr/bin/eix /usr/portage/metadata/timestamp})
85:
86: search_output = nil
87: Puppet::Util::Execution.withenv :LASTVERSION => version_format do
88: search_output = eix "--nocolor", "--pure-packages", "--stable", "--format", search_format, "--exact", search_field, search_value
89: end
90:
91: packages = []
92: search_output.each do |search_result|
93: match = result_format.match(search_result)
94:
95: if match
96: package = {}
97: result_fields.zip(match.captures) do |field, value|
98: package[field] = value unless !value or value.empty?
99: end
100: package[:ensure] = package[:ensure] ? package[:ensure] : :absent
101: packages << package
102: end
103: end
104:
105: case packages.size
106: when 0
107: not_found_value = "#{@resource[:category] ? @resource[:category] : "<unspecified category>"}/#{@resource[:name]}"
108: raise Puppet::Error.new("No package found with the specified name [#{not_found_value}]")
109: when 1
110: return packages[0]
111: else
112: raise Puppet::Error.new("More than one package with the specified name [#{search_value}], please use the category parameter to disambiguate")
113: end
114: rescue Puppet::ExecutionFailure => detail
115: raise Puppet::Error.new(detail)
116: end
117: end