]> git.donarmstrong.com Git - dsa-puppet.git/commitdiff
More ekeyd work
authorPeter Palfrader <peter@palfrader.org>
Mon, 21 Mar 2011 10:34:54 +0000 (11:34 +0100)
committerPeter Palfrader <peter@palfrader.org>
Mon, 21 Mar 2011 10:34:54 +0000 (11:34 +0100)
manifests/site.pp
modules/entropykey/manifests/init.pp
modules/puppetmaster/lib/puppet/parser/functions/entropy_provider.rb [new file with mode: 0644]
modules/puppetmaster/lib/puppet/parser/functions/whohosts.rb

index 398da0ab9f244aa57170560ea4dea3105e8987b6..ce473bfb89ce27d3ff4de83c4ef02baa5ac571ba 100644 (file)
@@ -36,12 +36,7 @@ node default {
     }
 
     case $hostname {
-        heininen:    {
-            include "entropykey::provider"
-        }
-        unger:    {
-            include "entropykey::remote_consumer"
-        }
+        heininen,unger: { include entropykey }
     }
 
     case $smartarraycontroller {
index e9a2bbec6df0666bbe9073350c5c0f5be5e463d2..13de3e4ea915e9c1006a825c4f9f1eb704839c33 100644 (file)
@@ -55,12 +55,26 @@ class entropykey::remote_consumer inherits entropykey::local_consumer {
     stunnel4::stunnel_client {
         "ekeyd":
             accept => "127.0.0.1:8888",
-            connecthost => "heininen.debian.org",
+            connecthost => "${entropy_provider}",
             connectport => 18888,
             ;
     }
 }
 
+class entropykey {
+    case getfromhash($nodeinfo, 'entropy_key') {
+        true:  { include entropykey::provider }
+    }
+
+    $entropy_provider  = entropy_provider($fqdn, $nodeinfo)
+    case $entropy_provider {
+        false: {}
+        local: { include entropykey::local_consumer }
+        default: { include entropykey::remote_consumer }
+    }
+
+}
+
 # vim:set et:
 # vim:set sts=4 ts=4:
 # vim:set shiftwidth=4:
diff --git a/modules/puppetmaster/lib/puppet/parser/functions/entropy_provider.rb b/modules/puppetmaster/lib/puppet/parser/functions/entropy_provider.rb
new file mode 100644 (file)
index 0000000..1a0f8e9
--- /dev/null
@@ -0,0 +1,55 @@
+module Puppet::Parser::Functions
+  newfunction(:entropy_provider, :type => :rvalue) do |args|
+    begin
+      require '/var/lib/puppet/lib/puppet/parser/functions/whohosts.rb'
+
+      fqdn = args[0]
+      nodeinfo = args[1]
+
+      localinfo = lookupvar('localinfo')
+      allnodeinfo = lookupvar('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
+
+      # find where all the entropy keys are
+      provider = []
+      hoster = {}
+      localinfo.keys.sort.each do |node|
+        next unless  localinfo[node]['entropy_key']
+
+        addresses = allnodeinfo[node]['ipHostNumber']
+        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
+
+      # figure out which entropy provider to use
+      consumer_hoster = nodeinfo['hoster']['name']
+      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
+        # 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]
+      else # pick an arbitrary provider from all providers
+        index = fqdn.hash % provider.size
+        ans = provider[index]
+      end
+
+      return ans
+    rescue => e
+      raise Puppet::ParseError, "Error in entropy_provider: #{e.message}\n#{e.backtrace}"
+    end
+  end
+end
+# vim:set ts=2:
+# vim:set et:
+# vim:set shiftwidth=2:
index 20f83d367851f75ad07ad9ba6f957eaaff82038b..ed2a0c0436aac40151f28c7d8f8cc538017bd825 100644 (file)
@@ -14,11 +14,8 @@ module Puppet::Parser::Functions
 
     ipAddrs.each do |addr|
       yaml.keys.each do |hoster|
-        if yaml[hoster].kind_of?(Hash) and yaml[hoster].has_key?('netrange')
-          netrange = yaml[hoster]['netrange']
-        else
-          next
-        end
+        next unless yaml[hoster].kind_of?(Hash) and yaml[hoster].has_key?('netrange')
+        netrange = yaml[hoster]['netrange']
 
         netrange.each do |net|
           begin