X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=modules%2Fpuppetmaster%2Flib%2Fpuppet%2Fparser%2Ffunctions%2Fentropy_provider.rb;h=e16290ce6d5b655b19a1b22400c875bda5969962;hb=d32b5ca2040af0e861851c5519aa5ff5b7887768;hp=1a0f8e9b70d712a46326d2ce2e07cbabb6659d5e;hpb=7af611e0182886baa11ae172e741d5e8eb2d2ce4;p=dsa-puppet.git diff --git a/modules/puppetmaster/lib/puppet/parser/functions/entropy_provider.rb b/modules/puppetmaster/lib/puppet/parser/functions/entropy_provider.rb index 1a0f8e9b..e16290ce 100644 --- a/modules/puppetmaster/lib/puppet/parser/functions/entropy_provider.rb +++ b/modules/puppetmaster/lib/puppet/parser/functions/entropy_provider.rb @@ -2,12 +2,13 @@ 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('site::localinfo') + allnodeinfo = lookupvar('site::allnodeinfo') raise Puppet::ParseError, "entropy_provider: Cannot learn fqdn" unless fqdn raise Puppet::ParseError, "entropy_provider: Cannot learn nodeinfo" unless nodeinfo @@ -21,7 +22,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, "/etc/puppet/modules/debian-org/misc/hoster.yaml"]) name = thishoster['name'] provider << node @@ -29,18 +30,34 @@ 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']['name'] + consumer_hoster = nodeinfo['hoster'] + consumer_hoster_name = nodeinfo['hoster']['name'] + + if consumer_hoster['entropy_provider_hoster'] and hoster[consumer_hoster['entropy_provider_hoster']] + # if we have a preferred entropy provider hoster for hosts at this one. + entropy_provider_hoster = consumer_hoster['entropy_provider_hoster'] + elsif hoster[consumer_hoster_name] + # if there are any at the same hoster, use one of them + entropy_provider_hoster = consumer_hoster_name + else + 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 hoster[consumer_hoster] # if there are any at the same hoster, use one of them + 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[consumer_hoster].length - ans = hoster[consumer_hoster][index] + 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