diff options
author | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-09-04 16:30:42 +0000 |
---|---|---|
committer | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-09-04 16:30:42 +0000 |
commit | 639ed3d75380dc59e05bb38c920f18836fd12913 (patch) | |
tree | 9af1bab680f340396c291e0d2434085c3f89f725 /lib | |
parent | 655881c0d3ff87727a396ee8304a5c4369117580 (diff) | |
download | puppet-639ed3d75380dc59e05bb38c920f18836fd12913.tar.gz puppet-639ed3d75380dc59e05bb38c920f18836fd12913.tar.xz puppet-639ed3d75380dc59e05bb38c920f18836fd12913.zip |
Adding first version of the portage provider, as contributed by Jose Gonzalez Gomez
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@1551 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib')
-rw-r--r-- | lib/puppet/provider/package/portage.rb | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/lib/puppet/provider/package/portage.rb b/lib/puppet/provider/package/portage.rb new file mode 100644 index 000000000..873f63f68 --- /dev/null +++ b/lib/puppet/provider/package/portage.rb @@ -0,0 +1,124 @@ +Puppet::Type.type(:package).provide :portage do + desc "Provides packaging support for Gentoo's portage system." + + commands :emerge => "emerge", :eix => "eix" + + defaultfor :operatingsystem => :gentoo + + def self.list + search_format = /(\S+) (\S+) \[(.*)\] \[(\S*)\] ([\S]*) (.*)/ + result_fields = [:category, :name, :version, :version_available, + :vendor, :description] + command = "#{command(:eix)} --format \"{<installedversions>}<category> <name> [<installedversions>] [<best>] <homepage> <description>{}\"" + + begin + search_output = execute( command ) + + packages = [] + search_output.each do |search_result| + match = search_format.match( search_result ) + + if( match ) + package = {:ensure => :present} + result_fields.zip( match.captures ) { |field, value| package[field] = value } + if self.is_a? Puppet::Type and type = @model[:type] + package[:type] = type + elsif self.is_a? Module and self.respond_to? :name + package[:type] = self.name + else + raise Puppet::DevError, "Cannot determine package type" + end + if package[:version] + package[:version] = package[:version].split.last + end + + packages.push( Puppet.type(:package).installedpkg(package) ) + end + end + + return packages + rescue Puppet::ExecutionFailure => detail + raise Puppet::PackageError.new(detail) + end + end + + def install + if @model[:version] + # We must install a specific version + package_name = "=#{@model[:name]}-#{@model[:version]}" + else + package_name = @model[:name] + end + command = "EMERGE_DEFAULT_OPTS=\"\" #{command(:emerge)} #{package_name}" + begin + output = execute( command ) + rescue Puppet::ExecutionFailure => detail + raise Puppet::PackageError.new(detail) + end + end + + def uninstall + if @model[:version] + # We must uninstall a specific version + package_name = "=#{@model[:name]}-#{@model[:version]}" + else + package_name = @model[:name] + end + command ="EMERGE_DEFAULT_OPTS=\"\" #{command(:emerge)} --unmerge #{package_name}" + begin + output = execute( command ) + rescue Puppet::ExecutionFailure => detail + raise Puppet::PackageError.new(detail) + end + end + + def update + self.install + end + + def query + search_format = /(\S+) (\S+) \[(.*)\] \[(\S*)\] ([\S]*) (.*)/ + result_fields = [:category, :name, :version, :version_available, :vendor, :description] + + search_field = @model[:name].include?( '/' ) ? "--category-name" : "--name" + command = "#{command(:eix)} --format \"<category> <name> [<installedversions>] [<best>] <homepage> <description>\" --exact #{search_field} #{@model[:name]}" + + begin + search_output = execute( command ) + + packages = [] + search_output.each do |search_result| + match = search_format.match( search_result ) + + if( match ) + package = {} + result_fields.zip( match.captures ) { |field, value| package[field] = value unless value.empty? } + package[:ensure] = package[:version] ? :present : :absent + package[:version] = package[:version].split.last if package[:version] + packages << package + end + end + + case packages.size + when 0 + return nil + when 1 + return packages[0] + else + self.fail "More than one package with the specified name [#{@model[:name]}], please use category/name to disambiguate" + end + rescue Puppet::ExecutionFailure => detail + raise Puppet::PackageError.new(detail) + end + end + + def latest + return self.query[:version_available] + end + + def versionable? + true + end +end + +# $Id$ |