|
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', package_name].compact
|
|
99
|
paludis *params
|
|
100
|
end
|
|
101
|
|
|
102
|
def latest
|
|
103
|
return self.query[:version_available]
|
|
104
|
end
|
|
105
|
end
|
|
106
|
|