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
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
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