summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/Server/Plugins/Metadata.py45
-rw-r--r--src/lib/Server/Plugins/SSHbase.py60
2 files changed, 51 insertions, 54 deletions
diff --git a/src/lib/Server/Plugins/Metadata.py b/src/lib/Server/Plugins/Metadata.py
index 88b5092c8..ae717eadf 100644
--- a/src/lib/Server/Plugins/Metadata.py
+++ b/src/lib/Server/Plugins/Metadata.py
@@ -19,10 +19,11 @@ class MetadataRuntimeError(Exception):
class ClientMetadata(object):
'''This object contains client metadata'''
def __init__(self, client, profile, groups, bundles,
- addresses, categories, uuid, password, query):
+ aliases, addresses, categories, uuid, password, query):
self.hostname = client
self.profile = profile
self.bundles = bundles
+ self.aliases = aliases
self.addresses = addresses
self.groups = groups
self.categories = categories
@@ -36,9 +37,9 @@ class ClientMetadata(object):
return group in self.groups
class MetadataQuery(object):
- def __init__(self, get_clients, by_groups, by_profiles, all_groups):
+ def __init__(self, by_name, get_clients, by_groups, by_profiles, all_groups):
# resolver is set later
- self.by_name = None
+ self.by_name = by_name
self.names_by_groups = by_groups
self.names_by_profiles = by_profiles
self.all_clients = get_clients
@@ -64,6 +65,7 @@ class Metadata(Bcfg2.Server.Plugin.Plugin,
def __init__(self, core, datastore, watch_clients=True):
Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore)
Bcfg2.Server.Plugin.Metadata.__init__(self)
+ Bcfg2.Server.Plugin.Statistics.__init__(self)
if watch_clients:
try:
core.fam.AddMonitor("%s/%s" % (self.data, "groups.xml"), self)
@@ -94,13 +96,14 @@ class Metadata(Bcfg2.Server.Plugin.Plugin,
self.pdirty = False
self.extra = {'groups.xml':[], 'clients.xml':[]}
self.password = core.password
- self.query = MetadataQuery(lambda:self.clients.keys(),
+ self.query = MetadataQuery(core.build_metadata,
+ lambda:self.clients.keys(),
self.get_client_names_by_groups,
self.get_client_names_by_profiles,
self.get_all_group_names)
@classmethod
- def init_repo(self, repo, groups, os_selection, clients):
+ def init_repo(cls, repo, groups, os_selection, clients):
Bcfg2.Server.Plugin.Plugin.init_repo(repo)
open("%s/Metadata/groups.xml" %
repo, "w").write(groups % os_selection)
@@ -328,10 +331,12 @@ class Metadata(Bcfg2.Server.Plugin.Plugin,
if dest == 'clients.xml':
self.clients = {}
self.aliases = {}
+ self.raliases = {}
self.bad_clients = {}
self.secure = []
self.floating = []
self.addresses = {}
+ self.raddresses = {}
self.clientdata_original = xdata_original
self.clientdata = xdata
for client in xdata.findall('.//Client'):
@@ -342,6 +347,9 @@ class Metadata(Bcfg2.Server.Plugin.Plugin,
self.addresses[caddr].append(clname)
else:
self.addresses[caddr] = [clname]
+ if clname not in self.raddresses:
+ self.raddresses[clname] = set()
+ self.raddresses[clname].add(caddr)
if 'auth' in client.attrib:
self.auth[client.get('name')] = client.get('auth',
'cert+password')
@@ -359,10 +367,15 @@ class Metadata(Bcfg2.Server.Plugin.Plugin,
self.addresses[alias.get('address')].append(clname)
else:
self.addresses[alias.get('address')] = [clname]
-
+ if clname not in self.raddresses:
+ self.raddresses[clname] = set()
+ self.raddresses[clname].add(alias.get('address'))
self.clients.update({clname: client.get('profile')})
[self.aliases.update({alias.get('name'): clname}) \
for alias in client.findall('Alias')]
+ self.raliases[clname] = set()
+ [self.raliases[clname].add(alias.get('name')) for alias \
+ in client.findall('Alias')]
elif dest == 'groups.xml':
self.public = []
self.profiles = []
@@ -510,20 +523,8 @@ class Metadata(Bcfg2.Server.Plugin.Plugin,
self.set_profile(client, self.default, (None, None))
profile = self.default
[bundles, groups, categories] = self.groups[self.default]
- '''
- Handle aliases listed in clients.xml
- addresses - contains address information for all aliases
- mapping is as follows:
- {alias: (ip, realname)}
- '''
- addresses = {}
- for alias, host in self.aliases.iteritems():
- for ip in self.addresses:
- for name in self.addresses[ip]:
- if name == host:
- addresses[alias] = (ip, host)
- if alias not in addresses:
- addresses[alias] = (None, host)
+ aliases = self.raliases.get(client, set())
+ addresses = self.raddresses.get(client, set())
newgroups = set(groups)
newbundles = set(bundles)
newcategories = {}
@@ -545,8 +546,8 @@ class Metadata(Bcfg2.Server.Plugin.Plugin,
[newbundles.add(b) for b in nbundles if b not in newbundles]
[newgroups.add(g) for g in ngroups if g not in newgroups]
newcategories.update(ncategories)
- return ClientMetadata(client, profile, newgroups, newbundles, addresses,
- newcategories, uuid, password, self.query)
+ return ClientMetadata(client, profile, newgroups, newbundles, aliases,
+ addresses, newcategories, uuid, password, self.query)
def get_all_group_names(self):
return self.groups.keys()
diff --git a/src/lib/Server/Plugins/SSHbase.py b/src/lib/Server/Plugins/SSHbase.py
index 242aaf580..250882790 100644
--- a/src/lib/Server/Plugins/SSHbase.py
+++ b/src/lib/Server/Plugins/SSHbase.py
@@ -44,6 +44,7 @@ class SSHbase(Bcfg2.Server.Plugin.Plugin,
def __init__(self, core, datastore):
Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore)
Bcfg2.Server.Plugin.Generator.__init__(self)
+ Bcfg2.Server.Plugin.PullTarget.__init__(self)
try:
Bcfg2.Server.Plugin.DirectoryBacked.__init__(self, self.data,
self.core.fam)
@@ -66,25 +67,33 @@ class SSHbase(Bcfg2.Server.Plugin.Plugin,
def get_skn(self):
'''build memory cache of the ssh known hosts file'''
if not self.__skn:
- static_entries = [key for key in self.entries \
- if key.endswith('.static')]
- if static_entries:
- self.__skn = "\n".join([self.entries[key].data for \
- key in static_entries])
- else:
- self.__skn = ''
+ self.__skn = "\n".join([value.data for key, value in \
+ self.entries.iteritems() if \
+ key.endswith('.static')])
+ names = dict()
+ # this next part is terrible
+ for cmeta in self.core.metadata.query.all():
+ names[cmeta.hostname] = set([cmeta.hostname])
+ names[cmeta.hostname].update(cmeta.aliases)
+ newnames = set()
+ for name in names[cmeta.hostname]:
+ newnames.add(name.split('.')[0])
+ try:
+ newnames.add(self.get_ipcache_entry(name)[0])
+ except:
+ continue
+ names[cmeta.hostname].update(newnames)
+ names[cmeta.hostname].update(cmeta.addresses)
+ # now we have our name cache
pubkeys = [pubk for pubk in self.entries.keys() \
if pubk.find('.pub.H_') != -1]
pubkeys.sort()
for pubkey in pubkeys:
hostname = pubkey.split('H_')[1]
- try:
- (ipaddr, fqdn) = self.get_ipcache_entry(hostname)
- except socket.gaierror:
+ if hostname not in names:
continue
- shortname = hostname.split('.')[0]
- self.__skn += "%s,%s,%s %s" % (shortname, fqdn, ipaddr,
- self.entries[pubkey].data)
+ self.__skn += "%s %s" % (','.join(names[hostname]),
+ self.entries[pubkey].data)
return self.__skn
def set_skn(self, value):
@@ -132,7 +141,8 @@ class SSHbase(Bcfg2.Server.Plugin.Plugin,
return (ipaddr, client)
except socket.gaierror:
cmd = "getent hosts %s" % client
- ipaddr = Popen(cmd, shell=True, stdout=PIPE).stdout.read().strip().split()
+ ipaddr = Popen(cmd, shell=True, \
+ stdout=PIPE).stdout.read().strip().split()
if ipaddr:
self.ipcache[client] = (ipaddr, client)
return (ipaddr, client)
@@ -143,7 +153,6 @@ class SSHbase(Bcfg2.Server.Plugin.Plugin,
def build_skn(self, entry, metadata):
'''This function builds builds a host specific known_hosts file'''
client = metadata.hostname
- addresses = metadata.addresses
entry.text = self.skn
hostkeys = [keytmpl % client for keytmpl in self.pubkeys \
if (keytmpl % client) in self.entries]
@@ -151,20 +160,6 @@ class SSHbase(Bcfg2.Server.Plugin.Plugin,
for hostkey in hostkeys:
entry.text += "localhost,localhost.localdomain,127.0.0.1 %s" % (
self.entries[hostkey].data)
- # add entries listed in clients.xml
- for addr, (ip, host) in addresses.iteritems():
- shortname = addr.split('.')[0]
- fqdn = addr
- if ip == None:
- ipaddr = self.get_ipcache_entry(addr)[0]
- else:
- ipaddr = ip
- for key in self.entries.keys():
- if key.find('.pub.H_%s' % host) != -1:
- entry.text += "%s,%s,%s %s" % (shortname,
- fqdn,
- ipaddr,
- self.entries[key].data)
permdata = {'owner':'root', 'group':'root', 'perms':'0644'}
[entry.attrib.__setitem__(key, permdata[key]) for key in permdata]
@@ -207,12 +202,13 @@ class SSHbase(Bcfg2.Server.Plugin.Plugin,
"H_%s" % client])
tempdir = tempfile.mkdtemp()
temploc = "%s/%s" % (tempdir, hostkey)
- os.system('ssh-keygen -q -f %s -N "" -t %s -C root@%s < /dev/null' %
- (temploc, keytype, client))
+ cmd = 'ssh-keygen -q -f %s -N "" -t %s -C root@%s < /dev/null'
+ os.system(cmd % (temploc, keytype, client))
open(fileloc, 'w').write(open(temploc).read())
open(publoc, 'w').write(open("%s.pub" % temploc).read())
self.AddEntry(hostkey)
- self.AddEntry(".".join([hostkey.split('.')[0]]+['pub', "H_%s" % client]))
+ self.AddEntry(".".join([hostkey.split('.')[0]]+['pub', "H_%s" \
+ % client]))
try:
os.unlink(temploc)
os.unlink("%s.pub" % temploc)