Puppet: System Administration Automated

Support

Ticket #741: paludis.rb

File paludis.rb, 3.9 kB (added by fpetran, 1 year ago)

the provider script from the first post, minus the extra parameter, minus default for gentoo

Line 
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