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