]> git.donarmstrong.com Git - dsa-puppet.git/blob - modules/puppetmaster/lib/puppet/parser/functions/entropy_provider.rb
Always remove acpi packages from jessie hosts
[dsa-puppet.git] / modules / puppetmaster / lib / puppet / parser / functions / entropy_provider.rb
1 module Puppet::Parser::Functions
2   newfunction(:entropy_provider, :type => :rvalue) do |args|
3     begin
4       require '/var/lib/puppet/lib/puppet/parser/functions/whohosts.rb'
5       require 'digest/sha1'
6
7       fqdn = args[0]
8       nodeinfo = args[1]
9
10       localinfo = lookupvar('site::localinfo')
11       allnodeinfo = lookupvar('site::allnodeinfo')
12
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
17
18       # find where all the entropy keys are
19       provider = []
20       hoster = {}
21       localinfo.keys.sort.each do |node|
22         next unless  localinfo[node]['entropy_key']
23
24         addresses = allnodeinfo[node]['ipHostNumber']
25         thishoster = function_whohosts([addresses, "/etc/puppet/modules/debian-org/misc/hoster.yaml"])
26         name = thishoster['name']
27
28         provider << node
29
30         hoster[name] = [] unless hoster[name]
31         hoster[name] << node
32       end
33       raise Puppet::ParseError, "entropy_provider: no entropy providers" unless provider.size > 0
34
35       # figure out which entropy provider to use
36       consumer_hoster = nodeinfo['hoster']
37       consumer_hoster_name = nodeinfo['hoster']['name']
38
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
45       else
46         entropy_provider_hoster = nil
47       end
48
49       hash = Digest::SHA1.digest(fqdn)
50       hashval = hash[0].ord + hash[1].ord*256
51
52       if provider.include?(fqdn) # if the host has an ekeyd
53         ans = 'local'
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
61         ans = provider[index]
62       end
63
64       return ans
65     rescue => e
66       raise Puppet::ParseError, "Error in entropy_provider: #{e.message}\n#{e.backtrace}"
67     end
68   end
69 end
70 # vim:set ts=2:
71 # vim:set et:
72 # vim:set shiftwidth=2: