require 'puppet/provider/package'
# RPM packaging. Should work anywhere that has rpm installed.
Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Provider::Package do
desc "RPM packaging support; should work anywhere with a working ``rpm``
binary."
# The query format by which we identify installed packages
NVRFORMAT = "%{NAME}-%{VERSION}-%{RELEASE}"
VERSIONSTRING = "%{VERSION}-%{RELEASE}"
commands :rpm => "rpm"
if command('rpm')
confine :true => begin
rpm('-ql', 'rpm')
rescue Puppet::ExecutionFailure
false
else
true
end
end
def self.instances
packages = []
# list out all of the packages
begin
execpipe("#{command(:rpm)} -qa --nosignature --nodigest --qf '%{NAME} #{VERSIONSTRING}\n'") { |process|
# our regex for matching dpkg output
regex = %r{^(\S+)\s+(\S+)}
fields = [:name, :ensure]
# now turn each returned line into a package object
process.each { |line|
if match = regex.match(line)
hash = {}
fields.zip(match.captures) { |field,value|
hash[field] = value
}
hash[:provider] = self.name
packages << new(hash)
else
raise "failed to match rpm line %s" % line
end
}
}
rescue Puppet::ExecutionFailure
raise Puppet::Error, "Failed to list packages"
end
return packages
end
# Find the fully versioned package name and the version alone. Returns
# a hash with entries :instance => fully versioned package name, and
# :ensure => version-release
def query
cmd = ["-q", @resource[:name], "--nosignature", "--nodigest", "--qf", "#{NVRFORMAT} #{VERSIONSTRING}\n"]
begin
output = rpm(*cmd)
rescue Puppet::ExecutionFailure
return nil
end
regex = %r{^(\S+)\s+(\S+)}
fields = [:instance, :ensure]
attrs = {}
if match = regex.match(output)
fields.zip(match.captures) { |field,value|
attrs[field] = value
}
else
raise Puppet::DevError,
"Failed to match rpm output '%s'" %
output
end
@nvr = attrs[:instance]
return attrs
end
# Here we just retrieve the version from the file specified in the source.
def latest
unless source = @resource[:source]
@resource.fail "RPMs must specify a package source"
end
cmd = [command(:rpm), "-q", "--qf", "#{VERSIONSTRING}", "-p", "#{@resource[:source]}"]
version = execfail(cmd, Puppet::Error)
return version
end
def install
source = nil
unless source = @resource[:source]
@resource.fail "RPMs must specify a package source"
end
# RPM gets pissy if you try to install an already
# installed package
if @resource.should(:ensure) == @property_hash[:ensure] or
@resource.should(:ensure) == :latest && @property_hash[:ensure] == latest
return
end
flag = "-i"
if @property_hash[:ensure] and @property_hash[:ensure] != :absent
flag = "-U"
end
rpm flag, "--oldpackage", source
end
def uninstall
rpm "-e", nvr
end
def update
self.install
end
def nvr
query unless @nvr
@nvr
end
end
# $Id: rpm.rb 2753 2007-08-07 02:38:45Z luke $
syntax highlighted by Code2HTML, v. 0.9.1