summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2007-12-11 00:24:11 -0600
committerLuke Kanies <luke@madstop.com>2007-12-11 00:24:11 -0600
commit117f005ab22ef90686f4eb19aee3ea5c8dc93865 (patch)
treec887d3419d20b47f68d7f0a1dc0f5f7ab33c4614 /lib/puppet
parent3248c93f2fddf9b17148273af5dd5e2af2cb537b (diff)
downloadpuppet-117f005ab22ef90686f4eb19aee3ea5c8dc93865.tar.gz
puppet-117f005ab22ef90686f4eb19aee3ea5c8dc93865.tar.xz
puppet-117f005ab22ef90686f4eb19aee3ea5c8dc93865.zip
Adding paludis package support as provided by KillerFox
in #741.
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/provider/package/paludis.rb106
1 files changed, 106 insertions, 0 deletions
diff --git a/lib/puppet/provider/package/paludis.rb b/lib/puppet/provider/package/paludis.rb
new file mode 100644
index 000000000..b6459b518
--- /dev/null
+++ b/lib/puppet/provider/package/paludis.rb
@@ -0,0 +1,106 @@
+require 'Paludis'
+require 'puppet/provider/package'
+
+Puppet::Type.type(:package).provide :paludis, :parent => Puppet::Provider::Package do
+ desc "Provides packaging support for Gentoo's alternative package system called paludis."
+
+ has_feature :versionable
+
+ commands :paludis => '/usr/bin/paludis'
+
+ #defaultfor :operatingsystem => :gentoo
+
+ Paludis::Log.instance.log_level = Paludis::LogLevel::Warning
+ @env = Paludis::EnvironmentMaker.instance.make_from_spec('')
+
+ def get_paludis_instance
+ return Paludis::EnvironmentMaker.instance.make_from_spec('')
+ end
+
+ def package_name
+ pkg = nil
+ begin
+ pkg = @env.package_database.fetch_unique_qualified_package_name(@resource[:name])
+ rescue Paludis::NoSuchPackageError
+ raise Puppet::PackageError.new('Package does not exists')
+ rescue Paludis::AmbiguousPackageNameError => e
+ if(!@resource[:category] && !@resource[:category].empty?)
+ pkg = Paludis::PackageDepSpec.new('%s/%s' % [:category, :name].collect{ |key| @resource[key]}, Paludis::PackageDepSpecParseMode::Permissive)
+ if(@env.package_database.query(Paludis::Query::Package.new(pkg), Paludis::QueryOrder::Whatever).empty?)
+ raise Puppet::PackageError.new("No package names '#{@resource[:name]}' in category '#{@resource[:category]}'")
+ end
+ else
+ raise Puppet::PackageError.new(e.message + "\nPlease specifiy a category")
+ end
+ end
+
+ if(!pkg.nil? && pkg.kind_of?(String))
+ pkg = Paludis::QualifiedPackageName.new(pkg)
+ end
+
+ return pkg
+ end
+
+ def self.instances
+ packages = Array.new
+ @env.package_database.query(Paludis::Query::RepositoryHasInstalledInterface.new, Paludis::QueryOrder::Whatever).each { |p|
+ next if(p.name.category == 'virtual')
+ pkg = Paludis::PackageDepSpec.new(p.name, Paludis::PackageDepSpecParseMode::Permissive)
+ package = {
+ :name => p.name.package,
+ :ensure => p.version.to_s,
+ :category => p.name.category,
+ :version_available => @env.package_database.query(Paludis::Query::RepositoryHasInstallableInterface.new & Paludis::Query::NotMasked.new & Paludis::Query::Package.new(p.name), Paludis::QueryOrder::GroupBySlot).last.version.to_s
+ }
+ packages << new(package)
+ }
+ return packages
+ end
+
+ #def initialize(resource = nil)
+ # super(resource)
+ #end
+
+ def install
+ should = @resource.should(:ensure)
+ name = package_name
+ unless should == :present or should == :latest
+ # We must install a specific version
+ name = "=%s-%s" % [name, should]
+ end
+ paludis '-i', name
+ end
+
+ def update
+ self.install
+ end
+
+ def query
+ @env = self.get_paludis_instance
+ pkg = package_name
+ package = {
+ :name => pkg.package,
+ :category => pkg.category,
+ :ensure => :absent,
+ :version_available => :absent
+ }
+ if(p = @env.package_database.query(Paludis::Query::Package.new(pkg) & Paludis::Query::RepositoryHasInstalledInterface.new, Paludis::QueryOrder::GroupBySlot))
+ package[:ensure] = (p.length > 0 ? p.last.version.to_s : :absent)
+ end
+ if(p = @env.package_database.query(Paludis::Query::RepositoryHasInstallableInterface.new & Paludis::Query::NotMasked.new & Paludis::Query::Package.new(pkg), Paludis::QueryOrder::GroupBySlot))
+ package[:version_available] = (p.length > 0 ? p.last.version.to_s : :absent)
+ end
+ return package
+ end
+
+ def uninstall
+ @env = self.get_paludis_instance
+ params = ['-u', package_name].compact
+ paludis *params
+ end
+
+ def latest
+ return self.query[:version_available]
+ end
+end
+