156 lines
4.7 KiB
Python
156 lines
4.7 KiB
Python
# Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; version 2 of the License.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
""" Tools for parsing and extracting information from cluster config.ini files. """
|
|
import StringIO
|
|
import ConfigParser
|
|
|
|
def parse_cluster_config_ini(path):
|
|
"""Unused"""
|
|
with open(path) as ini:
|
|
return parse_cluster_config_ini_(ini)
|
|
|
|
def parse_cluster_config_ini_(ini):
|
|
"""Unused"""
|
|
c = []
|
|
s = None
|
|
for l in map(str.rstrip, ini):
|
|
if l == '' or l.startswith('#'):
|
|
continue
|
|
if l.startswith('['):
|
|
s = {'name': l[1:-1], 'options': {}}
|
|
c.append(s)
|
|
continue
|
|
(k, v) = l.split('=', 1)
|
|
s['options'][k] = v
|
|
return c
|
|
|
|
def write_cluster_config_ini(c):
|
|
"""-"""
|
|
return '\n'.join(['[{0}]\n{1}\n'.format(s['name'], '\n'.join(['{0}={1}'.\
|
|
format(k, s['options'][k]) for k in s['options'].keys()])) for s in c])
|
|
|
|
def parse_cluster_config_ini_x(path):
|
|
"""-"""
|
|
c = {}
|
|
with open(path) as ini:
|
|
key = None
|
|
opts = {}
|
|
for l in map(str.rstrip, ini):
|
|
if l == '' or l.startswith('#'):
|
|
continue
|
|
if l.startswith('['):
|
|
if key is not None:
|
|
c[key] = opts
|
|
key = l
|
|
continue
|
|
(k, v) = l.split('=', 1)
|
|
opts[k] = v
|
|
if k == 'NodeId':
|
|
key = (key, v)
|
|
return c
|
|
|
|
def parse_config_ini(path):
|
|
"""Deprecated"""
|
|
ini = open(path)
|
|
buf = StringIO.StringIO()
|
|
sections = {}
|
|
|
|
for l in map(str.rstrip, ini):
|
|
if not 'DEFAULT' in l and len(l) > 2 and l[0] == '[' and l[-1] == ']':
|
|
section = l[1:-1]
|
|
n = 0
|
|
if sections.has_key(section):
|
|
n = sections[section] + 1
|
|
sections[section] = n
|
|
buf.write('[' + section + '_' + repr(n) + ']\n')
|
|
else:
|
|
buf.write(l+'\n')
|
|
ini.close()
|
|
buf.seek(0)
|
|
|
|
cp = ConfigParser.ConfigParser()
|
|
cp.optionxform = str
|
|
cp.readfp(buf)
|
|
buf.close()
|
|
return cp
|
|
|
|
def get_option_value_set(cp, option):
|
|
"""-"""
|
|
return set([cp.get(s, option) for s in filter(lambda s: cp.has_option(s, option), \
|
|
cp.sections())])
|
|
|
|
def get_node_dicts(cp, portbase):
|
|
"""-"""
|
|
node_sections = filter(lambda s: cp.has_option(s, 'NodeId') and not 'API' in s, \
|
|
cp.sections())
|
|
ndicts = []
|
|
for ns in node_sections:
|
|
t = '_'.join(ns.split('_')[:-1])
|
|
nalist = [('_NodeType', t.lower())]
|
|
if t == 'MYSQLD':
|
|
nalist += [('_MysqlPort', portbase)]
|
|
portbase += 1
|
|
if cp.has_section(t+' DEFAULT'):
|
|
nalist += cp.items(t+' DEFAULT')
|
|
|
|
nalist += cp.items(ns)
|
|
ndicts.append(dict(nalist))
|
|
return ndicts
|
|
|
|
def get_actual_section(s):
|
|
"""-"""
|
|
if 'DEFAULT' in s:
|
|
return s
|
|
return '_'.join(s.split('_')[:-1])
|
|
|
|
def get_proct1(s):
|
|
"""-"""
|
|
if 'DEFAULT' in s:
|
|
s = s.rstrip(' DEFAULT')
|
|
else:
|
|
s = '_'.join(s.split('_')[:-1])
|
|
return s.lower()
|
|
|
|
def get_pid1(cp, s):
|
|
"""-"""
|
|
if cp.has_option(s, 'NodeId'):
|
|
return cp.get(s, 'NodeId')
|
|
return None
|
|
|
|
def get_ndbconnecturl(cp):
|
|
"""Returns data node connection string"""
|
|
return ','.join(["{0}:{1}".format(cp.get(s, 'HostName'), cp.get(s, 'PortNumber')) \
|
|
for s in filter(lambda se: 'NDB_MGMD_' in se, cp.sections())])
|
|
|
|
def get_configvalues(cp):
|
|
"""-"""
|
|
return [{'section': get_actual_section(s), 'key': k, 'proct1': get_proct1(s), \
|
|
'pid1': get_pid1(cp, s), 'proct2':None, 'pid2':None, 'val': v} for s in cp.sections() \
|
|
for (k, v) in cp.items(s)]
|
|
|
|
def get_processes(cp):
|
|
"""-"""
|
|
return [{'desired_process_status': 0,
|
|
'restartlevel': 0,
|
|
'xtraoptions': 0,
|
|
'processname': get_proct1(s),
|
|
'internalid': get_pid1(cp, s),
|
|
'package': {},
|
|
'hostaddress': cp.get(s, 'HostName'),
|
|
'configfilepath':None,
|
|
'ndbconnecturl': get_ndbconnecturl(cp)} for s in filter(\
|
|
lambda s: cp.has_option(s, 'NodeId') and not 'API' in s, cp.sections())]
|