Catch empty data arrays at start of entropy_provider function
[mirror/dsa-puppet.git] / modules / puppetmaster / lib / puppet / parser / functions / entropy_provider.rb
index 52194cb..32c413f 100644 (file)
@@ -1,18 +1,18 @@
 module Puppet::Parser::Functions
   newfunction(:entropy_provider, :type => :rvalue) do |args|
     begin
-      require '/var/lib/puppet/lib/puppet/parser/functions/whohosts.rb'
+      require 'digest/sha1'
 
       fqdn = args[0]
       nodeinfo = args[1]
 
-      localinfo = lookupvar('localinfo')
-      allnodeinfo = lookupvar('allnodeinfo')
+      localinfo = lookupvar('deprecated::localinfo')
+      allnodeinfo = lookupvar('deprecated::allnodeinfo')
 
       raise Puppet::ParseError, "entropy_provider: Cannot learn fqdn" unless fqdn
-      raise Puppet::ParseError, "entropy_provider: Cannot learn nodeinfo" unless nodeinfo
-      raise Puppet::ParseError, "entropy_provider: Cannot learn localinfo" unless localinfo
-      raise Puppet::ParseError, "entropy_provider: Cannot learn allnodeinfo" unless allnodeinfo
+      raise Puppet::ParseError, "entropy_provider: Cannot learn nodeinfo" unless nodeinfo and nodeinfo.size > 0
+      raise Puppet::ParseError, "entropy_provider: Cannot learn localinfo" unless localinfo and localinfo.size > 0
+      raise Puppet::ParseError, "entropy_provider: Cannot learn allnodeinfo" unless allnodeinfo and allnodeinfo.size > 0
 
       # find where all the entropy keys are
       provider = []
@@ -21,7 +21,7 @@ module Puppet::Parser::Functions
         next unless  localinfo[node]['entropy_key']
 
         addresses = allnodeinfo[node]['ipHostNumber']
-        thishoster = function_whohosts(addresses, "/etc/puppet/modules/debian-org/misc/hoster.yaml")
+        thishoster = function_whohosts([addresses])
         name = thishoster['name']
 
         provider << node
@@ -29,6 +29,7 @@ module Puppet::Parser::Functions
         hoster[name] = [] unless hoster[name]
         hoster[name] << node
       end
+      raise Puppet::ParseError, "entropy_provider: no entropy providers" unless provider.size > 0
 
       # figure out which entropy provider to use
       consumer_hoster = nodeinfo['hoster']
@@ -44,15 +45,18 @@ module Puppet::Parser::Functions
         entropy_provider_hoster = nil
       end
 
+      hash = Digest::SHA1.digest(fqdn)
+      hashval = hash[0].ord + hash[1].ord*256
+
       if provider.include?(fqdn) # if the host has an ekeyd
         ans = 'local'
       elsif entropy_provider_hoster
         # if there are more than one ekeys at this hoster pick an arbitrary
         # one, but the same every time
-        index = fqdn.hash % hoster[entropy_provider_hoster].length
+        index = hashval % hoster[entropy_provider_hoster].length
         ans = hoster[entropy_provider_hoster][index]
       else # pick an arbitrary provider from all providers
-        index = fqdn.hash % provider.size
+        index = hashval % provider.size
         ans = provider[index]
       end