Hello list,

I think there is something wrong with the OpenBSD package provider
in Puppet 2.6.3 (4.9) and 2.7.1 (snapshot of 17/08):

If a 'package' resource is given a 'source' attribute that does not
point to a particular package but to a repository instead and the
PKG_PATH parameter in Puppet's environment is unset, an error is
misleadingly raised.  For instance,

        package { 'wget':
                ensure  => 'present',
                source  => 'ftp://<mirror>/pub/OpenBSD/4.9/packages/i386/:',
        }

with PKG_PATH unset fails with

        err: /Stage[main]//Node[haumea]/Package[wget]/ensure: change
        from absent to present failed: Could not set 'present on
        ensure: undefined local variable or method `version' for
        #<Puppet::Type::Package::ProviderOpenbsd:0x214f7d760> at
        /etc/puppet/manifests/site.pp:147

This is due to 'pkg_info' being called on 'wget' in the provider
without PKG_PATH being set to 'source'.  Even if PKG_PATH was set
in the environment, the current implementation would be incorrect,
since it then checks for 'wget's version in PKG_PATH, but installs
it from 'source' afterwards.

The patch below solves this issue, although someone with real Ruby
experience may likely provide a better fix:

Nils

--- lib/puppet/provider/package/openbsd.rb.orig Sun Sep  4 00:48:08 2011
+++ lib/puppet/provider/package/openbsd.rb      Sun Sep  4 02:00:37 2011
@@ -62,7 +62,7 @@
 
     if @resource[:source][-1,1] == ::File::PATH_SEPARATOR
       e_vars = { :PKG_PATH => @resource[:source] }
-      full_name = [ @resource[:name], get_version || @resource[:ensure], 
@resource[:flavor] ].join('-').chomp('-')
+      full_name = [ @resource[:name], get_version(e_vars) || 
@resource[:ensure], @resource[:flavor] ].join('-').chomp('-')
     else
       e_vars = {}
       full_name = @resource[:source]
@@ -71,26 +71,28 @@
      Puppet::Util::Execution::withenv(e_vars) { pkgadd full_name }
   end
 
-  def get_version
-      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
+  def get_version(e_vars)
+      Puppet::Util::Execution::withenv(e_vars) { 
+        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
-        end
-
-        return master_version unless master_version == 0
-        raise Puppet::Error, "#{version} is not available for this package"
-      end
+  
+          return master_version unless master_version == 0
+          raise Puppet::Error, "No version available for this package."
+        end 
+      }
   rescue Puppet::ExecutionFailure
       return nil
   end

Reply via email to