|
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
|