diff options
| author | Paul Boyd <boyd.paul2@gmail.com> | 2011-05-11 21:21:38 -0400 |
|---|---|---|
| committer | Max Martin <max@puppetlabs.com> | 2011-05-16 10:21:34 -0700 |
| commit | 6bb2a85a2d1bfdf0fd3fb09339c4b98c627610bf (patch) | |
| tree | d6b6002f5b1dd37c835363395f6ff0d28cbb09ba /lib | |
| parent | a8e4df735abcbb61915c28378f2fd045bdcdeb42 (diff) | |
| download | puppet-6bb2a85a2d1bfdf0fd3fb09339c4b98c627610bf.tar.gz puppet-6bb2a85a2d1bfdf0fd3fb09339c4b98c627610bf.tar.xz puppet-6bb2a85a2d1bfdf0fd3fb09339c4b98c627610bf.zip | |
(#1853) Pacman package provider
Adds support for use Archlinux's pacman package manager in Puppet.
Originally written by Miah Johnson, with bug fixes from Thomas Hatch and
myself.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/puppet/provider/package/pacman.rb | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/puppet/provider/package/pacman.rb b/lib/puppet/provider/package/pacman.rb new file mode 100644 index 000000000..6eb7dbe3d --- /dev/null +++ b/lib/puppet/provider/package/pacman.rb @@ -0,0 +1,94 @@ +require 'puppet/provider/package' + +Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Package do + desc "Support for the Package Manager Utility (pacman) used in Archlinux." + + commands :pacman => "/usr/bin/pacman" + defaultfor :operatingsystem => :archlinux + confine :operatingsystem => :archlinux + has_feature :upgradeable + + # Install a package using 'pacman'. + # Installs quietly, without confirmation or progressbar, updates package + # list from servers defined in pacman.conf. + def install + pacman "--noconfirm", "--noprogressbar", "-Sy", @resource[:name] + + unless self.query + raise Puppet::ExecutionFailure.new("Could not find package %s" % self.name) + end + end + + def self.listcmd + [command(:pacman), " -Q"] + end + + # Fetch the list of packages currently installed on the system. + def self.instances + packages = [] + begin + execpipe(listcmd()) do |process| + # pacman -Q output is 'packagename version-rel' + regex = %r{^(\S+)\s(\S+)} + fields = [:name, :ensure] + hash = {} + + process.each { |line| + if match = regex.match(line) + fields.zip(match.captures) { |field,value| + hash[field] = value + } + + name = hash[:name] + hash[:provider] = self.name + + packages << new(hash) + hash = {} + else + warning("Failed to match line %s" % line) + end + } + end + rescue Puppet::ExecutionFailure + return nil + end + packages + end + + # Because Archlinux is a rolling release based distro, installing a package + # should always result in the newest release. + def update + # Install in pacman can be used for update, too + self.install + end + + def latest + pacman "-Sy" + output = pacman "-Sp", "--print-format", "%v", @resource[:name] + output.chomp + end + + # Querys the pacman master list for information about the package. + def query + begin + output = pacman("-Qi", @resource[:name]) + + if output =~ /Version.*:\s(.+)/ + return { :ensure => $1 } + end + rescue Puppet::ExecutionFailure + return { + :ensure => :purged, + :status => 'missing', + :name => @resource[:name], + :error => 'ok', + } + end + nil + end + + # Removes a package from the system. + def uninstall + pacman "--noconfirm", "--noprogressbar", "-R", @resource[:name] + end +end |
