1 module Puppet::Parser::Functions
2 newfunction(:entropy_provider, :type => :rvalue) do |args|
4 require '/var/lib/puppet/lib/puppet/parser/functions/whohosts.rb'
10 localinfo = lookupvar('site::localinfo')
11 allnodeinfo = lookupvar('site::allnodeinfo')
13 raise Puppet::ParseError, "entropy_provider: Cannot learn fqdn" unless fqdn
14 raise Puppet::ParseError, "entropy_provider: Cannot learn nodeinfo" unless nodeinfo
15 raise Puppet::ParseError, "entropy_provider: Cannot learn localinfo" unless localinfo
16 raise Puppet::ParseError, "entropy_provider: Cannot learn allnodeinfo" unless allnodeinfo
18 # find where all the entropy keys are
21 localinfo.keys.sort.each do |node|
22 next unless localinfo[node]['entropy_key']
24 addresses = allnodeinfo[node]['ipHostNumber']
25 thishoster = function_whohosts([addresses, "/etc/puppet/modules/debian-org/misc/hoster.yaml"])
26 name = thishoster['name']
30 hoster[name] = [] unless hoster[name]
33 raise Puppet::ParseError, "entropy_provider: no entropy providers" unless provider.size > 0
35 # figure out which entropy provider to use
36 consumer_hoster = nodeinfo['hoster']
37 consumer_hoster_name = nodeinfo['hoster']['name']
39 if consumer_hoster['entropy_provider_hoster'] and hoster[consumer_hoster['entropy_provider_hoster']]
40 # if we have a preferred entropy provider hoster for hosts at this one.
41 entropy_provider_hoster = consumer_hoster['entropy_provider_hoster']
42 elsif hoster[consumer_hoster_name]
43 # if there are any at the same hoster, use one of them
44 entropy_provider_hoster = consumer_hoster_name
46 entropy_provider_hoster = nil
49 hash = Digest::SHA1.digest(fqdn)
50 hashval = hash[0].ord + hash[1].ord*256
52 if provider.include?(fqdn) # if the host has an ekeyd
54 elsif entropy_provider_hoster
55 # if there are more than one ekeys at this hoster pick an arbitrary
56 # one, but the same every time
57 index = hashval % hoster[entropy_provider_hoster].length
58 ans = hoster[entropy_provider_hoster][index]
59 else # pick an arbitrary provider from all providers
60 index = hashval % provider.size
66 raise Puppet::ParseError, "Error in entropy_provider: #{e.message}\n#{e.backtrace}"
72 # vim:set shiftwidth=2: