Don't truncate to short keys in the type
[puppet-modules/puppetlabs-apt.git] / lib / puppet / provider / apt_key / apt_key.rb
index 7e221dded5ae8f07bd751d4587edfa3b611fb7d5..3ef94315089634cb75eb5f8cefa8886be20e09cc 100644 (file)
@@ -1,7 +1,16 @@
 require 'date'
 require 'open-uri'
+require 'net/ftp'
 require 'tempfile'
 
+if RUBY_VERSION == '1.8.7'
+  # Mothers cry, puppies die and Ruby 1.8.7's open-uri needs to be
+  # monkeypatched to support passing in :ftp_passive_mode.
+  require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..',
+                                    'puppet_x', 'apt_key', 'patch_openuri.rb'))
+  OpenURI::Options.merge!({:ftp_active_mode => false,})
+end
+
 Puppet::Type.type(:apt_key).provide(:apt_key) do
 
   KEY_LINE = {
@@ -17,7 +26,12 @@ Puppet::Type.type(:apt_key).provide(:apt_key) do
   commands   :apt_key  => 'apt-key'
 
   def self.instances
-    key_array = apt_key('list').split("\n").collect do |line|
+    if RUBY_VERSION > '1.8.7'
+      key_output = apt_key('list').encode('UTF-8', 'binary', :invalid => :replace, :undef => :replace, :replace => '')
+    else
+      key_output = apt_key('list')
+    end
+    key_array = key_output.split("\n").collect do |line|
       line_hash = key_line_hash(line)
       next unless line_hash
       expired = false
@@ -43,7 +57,12 @@ Puppet::Type.type(:apt_key).provide(:apt_key) do
   def self.prefetch(resources)
     apt_keys = instances
     resources.keys.each do |name|
-      if provider = apt_keys.find{ |key| key.name == name }
+      if name.length == 16
+        shortname=name[8..-1]
+      else
+        shortname=name
+      end
+      if provider = apt_keys.find{ |key| key.name == shortname }
         resources[name].provider = provider
       end
     end
@@ -99,8 +118,8 @@ Puppet::Type.type(:apt_key).provide(:apt_key) do
       value
     else
       begin
-        key = open(value).read
-      rescue OpenURI::HTTPError => e
+        key = open(value, :ftp_active_mode => false).read
+      rescue OpenURI::HTTPError, Net::FTPPermError => e
         fail("#{e.message} for #{resource[:source]}")
       rescue SocketError
         fail("could not resolve #{resource[:source]}")