From 6ac36eb42f0a505fd37d7e600bb0fd8837511b42 Mon Sep 17 00:00:00 2001 From: Matt Robinson Date: Tue, 6 Jul 2010 17:42:56 -0700 Subject: [#2370] Allow OpenBSD to add packages with versions and flavors This patch is from Joe McDonagh --- lib/puppet/provider/package/openbsd.rb | 47 +++++++++++++++++++++++++++------- lib/puppet/type/package.rb | 5 ++++ 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/lib/puppet/provider/package/openbsd.rb b/lib/puppet/provider/package/openbsd.rb index af590eb4d..1c873fdad 100755 --- a/lib/puppet/provider/package/openbsd.rb +++ b/lib/puppet/provider/package/openbsd.rb @@ -10,19 +10,21 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa defaultfor :operatingsystem => :openbsd confine :operatingsystem => :openbsd + has_feature :versionable + def self.instances packages = [] begin execpipe(listcmd()) do |process| # our regex for matching pkg_info output - regex = %r{^(\S+)-([^-\s]+)\s+(.+)} - fields = [:name, :ensure, :description] + regex = /^(.*)-(\d[^-]*)[-]?(\D*)(.*)$/ + fields = [:name, :ensure, :flavor ] hash = {} # now turn each returned line into a package object process.each { |line| - if match = regex.match(line) + if match = regex.match(line.split()[0]) fields.zip(match.captures) { |field,value| hash[field] = value } @@ -59,9 +61,15 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa "You must specify a package source for BSD packages" end + old_ensure = @resource[:ensure] + if @resource[:source] =~ /\/$/ withenv :PKG_PATH => @resource[:source] do - pkgadd @resource[:name] + if (@resource[:ensure] = get_version) == nil + @resource[:ensure] = old_ensure + end + full_name = [ @resource[:name], @resource[:ensure], @resource[:flavor] ] + pkgadd full_name.join('-').chomp('-') end else pkgadd @resource[:source] @@ -69,6 +77,32 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa end + def get_version + begin + execpipe([command(:pkginfo), " -I ", @resource[:name]]) do |process| + # our regex for matching pkg_info output + regex = /^(.*)-(\d[^-]*)[-]?(\D*)(.*)$/ + fields = [ :name, :version, :flavor ] + master_version = 0 + + process.each do |line| + if match = regex.match(line.split()[0]) + # now we return the first version, unless ensure is latest + version = match.captures[1] + return version unless @resource[:ensure] == "latest" + + master_version = version unless master_version > version + end + end + + return master_version unless master_version == 0 + raise Puppet::Error, "#{version} is not available for this package" + end + rescue Puppet::ExecutionFailure + return nil + end + end + def query hash = {} info = pkginfo @resource[:name] @@ -80,11 +114,6 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa return nil end - # And the description - if info =~ /Comment:\s*\n(.+)/ - hash[:description] = $1 - end - return hash end diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb index 827fee12b..237cefd46 100644 --- a/lib/puppet/type/package.rb +++ b/lib/puppet/type/package.rb @@ -287,6 +287,11 @@ module Puppet newvalues(:true, :false) end + newparam(:flavor) do + desc "Newer versions of OpenBSD support 'flavors', which are + further specifications for which type of package you want." + end + autorequire(:file) do autos = [] [:responsefile, :adminfile].each { |param| -- cgit