---
func/minion/server.py | 19 ++++++++++---------
func/overlord/client.py | 18 +++++++++---------
func/utils.py | 29 +++++++++++++++++++++++++----
3 files changed, 44 insertions(+), 22 deletions(-)
diff --git a/func/minion/server.py b/func/minion/server.py
index 5f217d7..28d6fa1 100644
--- a/func/minion/server.py
+++ b/func/minion/server.py
@@ -29,14 +29,13 @@ from certmaster.commonconfig import CMConfig
from func import logger
from certmaster import certs
import func.jobthing as jobthing
-from func import utils as func_utils
# our modules
import AuthedXMLRPCServer
import codes
import func.module_loader as module_loader
import func.minion.acls as acls_mod
-from func import utils as futils
+from func import utils as func_utils
from certmaster import utils
@@ -89,6 +88,8 @@ class XmlRpcInterface(object):
self.handlers["system.list_modules"] = self.list_modules
self.handlers["system.inventory"] = self.inventory
self.handlers["system.grep"] = self.grep
+ # ultimately need to add a method here to force the server to reload
itself so all NEW connections
+ # get a new RequestHandler
def list_modules(self):
modules = self.modules.keys()
@@ -100,9 +101,6 @@ class XmlRpcInterface(object):
methods.sort()
return methods
- def load_module(self, name):
- """FIXME load a module and set it up on the running xmlrpc instance"""
- pass
import func.minion.modules.func_module as fm
def grep(self,word):
@@ -192,7 +190,7 @@ class FuncApiMethod:
self.logger.debug("(X) -------------------------------------------")
try:
- self.__method = futils.get_fresh_method_instance(self.__method)
+ self.__method = func_utils.get_fresh_method_instance(self.__method)
rc = self.__method(*args)
except codes.FuncException, e:
self.__log_exc()
@@ -250,12 +248,15 @@ class
FuncSSLXMLRPCServer(AuthedXMLRPCServer.AuthedSSLXMLRPCServer,
if self.config.key_file != '':
self.key = self.config.key_file
else:
- self.key = "%s/%s.pem" % (self.cm_config.cert_dir, hn)
+ # search case-insensitively to find the right key - take the first
one - if there are
+ # more than one differing only by case then the user is going to
get 'unique' behavior :)
+ self.key = func_utils.find_files_by_hostname(hn,
self.cm_config.cert_dir, '.pem')[0]
if self.config.cert_file != '':
self.cert = self.config.cert_file
else:
- self.cert = "%s/%s.cert" % (self.cm_config.cert_dir, hn)
+ self.cert = func_utils.find_files_by_hostname(hn,
self.cm_config.cert_dir, '.cert')[0]
+
if self.config.ca_file != '':
self.ca = self.config.ca_file
else:
@@ -373,7 +374,7 @@ def main(argv):
try:
config = read_config("/etc/func/minion.conf", FuncdConfig)
if config.use_certmaster:
- hn = futils.get_hostname_by_route()
+ hn = func_utils.get_hostname_by_route()
requester.request_cert(hn)
serve()
except codes.FuncException, e:
diff --git a/func/overlord/client.py b/func/overlord/client.py
index 0931172..12deb49 100644
--- a/func/overlord/client.py
+++ b/func/overlord/client.py
@@ -15,7 +15,6 @@
from func.jobthing import RETAIN_INTERVAL
import sys
-import glob
import os
import time
import shlex
@@ -158,13 +157,14 @@ class Minions(object):
else:
each_gloob = shortest_path[0]
- actual_gloob = "%s/%s.%s" % (self.cm_config.certroot, each_gloob,
self.cm_config.cert_extension)
- certs = glob.glob(actual_gloob)
+ #actual_gloob = "%s/%s.%s" % (self.cm_config.certroot, each_gloob,
self.cm_config.cert_extension)
+ certs = func_utils.find_files_by_hostname(each_gloob,
self.cm_config.certroot, self.cm_config.cert_extension)
# pull in peers if enabled for minion-to-minion
if self.cm_config.peering:
- peer_gloob = "%s/%s.%s" % (self.cm_config.peerroot, each_gloob,
self.cm_config.cert_extension)
- certs += glob.glob(peer_gloob)
+ #peer_gloob = "%s/%s.%s" % (self.cm_config.peerroot, each_gloob,
self.cm_config.cert_extension)
+ certs += func_utils.find_files_by_hostname(each_gloob,
self.cm_config.peeroot, self.cm_config.cert_extension)
+
# if we can't match this gloob and the gloob is not REALLY a glob
# let the gloob be the hostname we try to connect to.
@@ -173,11 +173,11 @@ class Minions(object):
aliases = func_utils.get_all_host_aliases(each_gloob)
for name in aliases:
- actual_gloob = "%s/%s.%s" % (self.cm_config.certroot, name,
self.cm_config.cert_extension)
- certs += glob.glob(actual_gloob)
+ #actual_gloob = "%s/%s.%s" % (self.cm_config.certroot, name,
self.cm_config.cert_extension)
+ certs += func_utils.find_files_by_hostname(name,
self.cm_config.certroot, self.cm_config.cert_extension)
if self.cm_config.peering:
- peer_gloob = "%s/%s.%s" % (self.cm_config.peerroot, name,
self.cm_config.cert_extension)
- certs += glob.glob(peer_gloob)
+ #peer_gloob = "%s/%s.%s" % (self.cm_config.peerroot, name,
self.cm_config.cert_extension)
+ certs += func_utils.find_files_by_hostname(name,
self.cm_config.peeroot, self.cm_config.cert_extension)
break
if self.overlord_config.allow_unknown_minions and not certs:
diff --git a/func/utils.py b/func/utils.py
index fcc5cdc..fe0c9da 100644
--- a/func/utils.py
+++ b/func/utils.py
@@ -16,6 +16,7 @@ import socket
import string
import sys
import re
+import fnmatch
from certmaster.config import read_config
from certmaster.commonconfig import MinionConfig
@@ -86,7 +87,7 @@ def get_hostname_by_route():
# don't bother guessing a hostname if they specify it in the config file
if minion_config.minion_name:
- return minion_config.minion_name
+ return minion_config.minion_name.lower()
# try to find the hostname attached to the ip of the interface that we use
# to talk to the certmaster
@@ -107,7 +108,7 @@ def get_hostname_by_route():
# not talking via localhost? good enough...
if ip != '127.0.0.1':
s.close()
- return intf_hostname
+ return intf_hostname.lower()
except:
s.close()
# something failed, reverse dns, etc
@@ -133,13 +134,33 @@ def get_hostname_by_route():
# non loopback is about as good as we can do for a guess
if ip != "127.0.0.1" and hostname is not None:
- return hostname
+ return hostname.lower()
# all else has failed to get a good hostname, so just return
# an ip address
- return socket.gethostbyname(socket.gethostname())
+ return socket.gethostbyname(socket.gethostname()).lower() # yes I know
it's an ip but I don't trust anything
+
+def find_files_by_hostname(hostglob, filepath, fileext=''):
+ """look for files in the given filepath with the given extension that
+ match our hostname, but case insensitively. This handles the
+ craziness that is dns names that have mixed case :("""
+
+ # this is a little like a case insensitive glob, except it's just one
+ # layer deep - not multiple layers
+
+ if fileext and fileext[0] != '.':
+ fileext = '.' + fileext
+ thisregex = fnmatch.translate('%s%s' % (hostglob, fileext))
+ recomp = re.compile(thisregex, re.I) # case insensitive match
+ files = []
+ for potfile in os.listdir(filepath):
+ if recomp.match(potfile):
+ files.append(potfile)
+
+ return [os.path.normpath(filepath + '/' + file) for file in files]
+
def get_all_host_aliases(hostname):
try:
--
1.7.2
_______________________________________________
Func-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/func-list