mirror of
https://github.com/xcat2/confluent.git
synced 2026-05-08 09:40:13 +00:00
d99689f84b
Rather than writing from scratch each time, parse the existing file if present and merge new content without perturbing existing.
95 lines
3.0 KiB
Python
95 lines
3.0 KiB
Python
#!/usr/bin/python3
|
|
import optparse
|
|
import signal
|
|
import sys
|
|
import os
|
|
|
|
try:
|
|
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
|
|
except AttributeError:
|
|
pass
|
|
|
|
path = os.path.dirname(os.path.realpath(__file__))
|
|
path = os.path.realpath(os.path.join(path, '..', 'lib', 'python'))
|
|
if path.startswith('/opt'):
|
|
sys.path.append(path)
|
|
|
|
import confluent.client as client
|
|
import confluent.sortutil as sortutil
|
|
|
|
|
|
def lookupdata(data, key):
|
|
ret = data.get(key, {}).get('value', '')
|
|
if ret is None:
|
|
ret = ''
|
|
return ret
|
|
|
|
|
|
def main():
|
|
argparser = optparse.OptionParser(
|
|
usage='''\n %prog noderange -o ansible.hosts -a
|
|
''')
|
|
argparser.add_option('-o', '--output',
|
|
help='Writes an Ansible hosts file')
|
|
argparser.add_option('-a', '--append', action='store_true',
|
|
help='Appends to existing hosts file')
|
|
(options, args) = argparser.parse_args()
|
|
try:
|
|
noderange = args[0]
|
|
except IndexError:
|
|
argparser.print_help()
|
|
sys.exit(1)
|
|
if not options.output:
|
|
sys.stderr.write('Output file must be specified by -o\n')
|
|
sys.exit(1)
|
|
sess = client.Command()
|
|
databynode = {}
|
|
for res in sess.read('/noderange/{0}/attributes/all'.format(noderange)):
|
|
for node in res.get('databynode', {}):
|
|
if node not in databynode:
|
|
databynode[node] = {}
|
|
databynode[node].update(res['databynode'][node])
|
|
|
|
nodesbygroup = {}
|
|
for node in sortutil.natural_sort(databynode):
|
|
data = databynode[node]
|
|
groups = data.get('groups', [])
|
|
if not groups:
|
|
nodesbygroup.setdefault('', set()).add(node.strip().lower())
|
|
else:
|
|
for g in groups:
|
|
nodesbygroup.setdefault(g, set()).add(node.strip().lower())
|
|
|
|
existing_data = {}
|
|
if options.append and os.path.exists(options.output):
|
|
current_group = ''
|
|
with open(options.output, 'r') as f:
|
|
for line in f:
|
|
line = line.strip().lower()
|
|
if not line:
|
|
continue
|
|
if line.startswith('[') and line.endswith(']'):
|
|
current_group = line[1:-1]
|
|
existing_data.setdefault(current_group, set())
|
|
else:
|
|
existing_data.setdefault(current_group, set()).add(line)
|
|
|
|
for group, nodes in nodesbygroup.items():
|
|
nodes = {n.strip().lower() for n in nodes}
|
|
current_nodes = existing_data.get(group, set())
|
|
new_nodes = nodes - current_nodes
|
|
if new_nodes:
|
|
existing_data.setdefault(group, set()).update(nodes)
|
|
|
|
with open(options.output, 'w') as importfile:
|
|
for group in sortutil.natural_sort(existing_data.keys()):
|
|
if group:
|
|
importfile.write('[{0}]\n'.format(group))
|
|
for node in sortutil.natural_sort(existing_data[group]):
|
|
importfile.write('{0}\n'.format(node))
|
|
importfile.write('\n')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|