| | 1 | require 'Paludis' |
|---|
| | 2 | require 'puppet/provider/package' |
|---|
| | 3 | |
|---|
| | 4 | Puppet::Type.type(:package).provide :paludis, :parent => Puppet::Provider::Package do |
|---|
| | 5 | desc "Provides packaging support for Gentoo's alternative package system called paludis." |
|---|
| | 6 | |
|---|
| | 7 | has_feature :versionable |
|---|
| | 8 | |
|---|
| | 9 | commands :paludis => '/usr/bin/paludis' |
|---|
| | 10 | |
|---|
| | 11 | defaultfor :operatingsystem => :gentoo |
|---|
| | 12 | |
|---|
| | 13 | Paludis::Log.instance.log_level = Paludis::LogLevel::Warning |
|---|
| | 14 | @env = Paludis::EnvironmentMaker.instance.make_from_spec('') |
|---|
| | 15 | |
|---|
| | 16 | def get_paludis_instance |
|---|
| | 17 | return Paludis::EnvironmentMaker.instance.make_from_spec('') |
|---|
| | 18 | end |
|---|
| | 19 | |
|---|
| | 20 | def package_name |
|---|
| | 21 | pkg = nil |
|---|
| | 22 | begin |
|---|
| | 23 | pkg = @env.package_database.fetch_unique_qualified_package_name(@resource[:name]) |
|---|
| | 24 | rescue Paludis::NoSuchPackageError |
|---|
| | 25 | raise Puppet::PackageError.new('Package does not exists') |
|---|
| | 26 | rescue Paludis::AmbiguousPackageNameError => e |
|---|
| | 27 | if(!@resource[:category] && !@resource[:category].empty?) |
|---|
| | 28 | pkg = Paludis::PackageDepSpec.new('%s/%s' % [:category, :name].collect{ |key| @resource[key]}, Paludis::PackageDepSpecParseMode::Permissive) |
|---|
| | 29 | if(@env.package_database.query(Paludis::Query::Package.new(pkg), Paludis::QueryOrder::Whatever).empty?) |
|---|
| | 30 | raise Puppet::PackageError.new("No package names '#{@resource[:name]}' in category '#{@resource[:category]}'") |
|---|
| | 31 | end |
|---|
| | 32 | else |
|---|
| | 33 | raise Puppet::PackageError.new(e.message + "\nPlease specifiy a category") |
|---|
| | 34 | end |
|---|
| | 35 | end |
|---|
| | 36 | |
|---|
| | 37 | if(!pkg.nil? && pkg.kind_of?(String)) |
|---|
| | 38 | pkg = Paludis::QualifiedPackageName.new(pkg) |
|---|
| | 39 | end |
|---|
| | 40 | |
|---|
| | 41 | return pkg |
|---|
| | 42 | end |
|---|
| | 43 | |
|---|
| | 44 | def self.instances |
|---|
| | 45 | packages = Array.new |
|---|
| | 46 | @env.package_database.query(Paludis::Query::RepositoryHasInstalledInterface.new, Paludis::QueryOrder::Whatever).each { |p| |
|---|
| | 47 | next if(p.name.category == 'virtual') |
|---|
| | 48 | pkg = Paludis::PackageDepSpec.new(p.name, Paludis::PackageDepSpecParseMode::Permissive) |
|---|
| | 49 | package = { |
|---|
| | 50 | :name => p.name.package, |
|---|
| | 51 | :ensure => p.version.to_s, |
|---|
| | 52 | :category => p.name.category, |
|---|
| | 53 | :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 |
|---|
| | 54 | } |
|---|
| | 55 | packages << new(package) |
|---|
| | 56 | } |
|---|
| | 57 | return packages |
|---|
| | 58 | end |
|---|
| | 59 | |
|---|
| | 60 | #def initialize(resource = nil) |
|---|
| | 61 | # super(resource) |
|---|
| | 62 | #end |
|---|
| | 63 | |
|---|
| | 64 | def install |
|---|
| | 65 | should = @resource.should(:ensure) |
|---|
| | 66 | name = package_name |
|---|
| | 67 | unless should == :present or should == :latest |
|---|
| | 68 | # We must install a specific version |
|---|
| | 69 | name = "=%s-%s" % [name, should] |
|---|
| | 70 | end |
|---|
| | 71 | paludis '-i', name |
|---|
| | 72 | end |
|---|
| | 73 | |
|---|
| | 74 | def update |
|---|
| | 75 | self.install |
|---|
| | 76 | end |
|---|
| | 77 | |
|---|
| | 78 | def query |
|---|
| | 79 | @env = self.get_paludis_instance |
|---|
| | 80 | pkg = package_name |
|---|
| | 81 | package = { |
|---|
| | 82 | :name => pkg.package, |
|---|
| | 83 | :category => pkg.category, |
|---|
| | 84 | :ensure => :absent, |
|---|
| | 85 | :version_available => :absent |
|---|
| | 86 | } |
|---|
| | 87 | if(p = @env.package_database.query(Paludis::Query::Package.new(pkg) & Paludis::Query::RepositoryHasInstalledInterface.new, Paludis::QueryOrder::GroupBySlot)) |
|---|
| | 88 | package[:ensure] = (p.length > 0 ? p.last.version.to_s : :absent) |
|---|
| | 89 | end |
|---|
| | 90 | if(p = @env.package_database.query(Paludis::Query::RepositoryHasInstallableInterface.new & Paludis::Query::NotMasked.new & Paludis::Query::Package.new(pkg), Paludis::QueryOrder::GroupBySlot)) |
|---|
| | 91 | package[:version_available] = (p.length > 0 ? p.last.version.to_s : :absent) |
|---|
| | 92 | end |
|---|
| | 93 | return package |
|---|
| | 94 | end |
|---|
| | 95 | |
|---|
| | 96 | def uninstall |
|---|
| | 97 | @env = self.get_paludis_instance |
|---|
| | 98 | params = ['-u', (@resource[:rmdepends] == :true ? '--with-unused-dependencies' : nil), package_name].compact |
|---|
| | 99 | paludis *params |
|---|
| | 100 | end |
|---|
| | 101 | |
|---|
| | 102 | def latest |
|---|
| | 103 | return self.query[:version_available] |
|---|
| | 104 | end |
|---|
| | 105 | end |