forked from stove/risotto
get_ip_domain
This commit is contained in:
parent
76a99dc532
commit
23adccacb3
3 changed files with 75 additions and 39 deletions
89
bootstrap.py
89
bootstrap.py
|
@ -17,7 +17,7 @@ from tiramisu.error import ValueWarning
|
||||||
from rougail import RougailConfig, RougailConvert, RougailSystemdTemplate
|
from rougail import RougailConfig, RougailConvert, RougailSystemdTemplate
|
||||||
from rougail.utils import normalize_family
|
from rougail.utils import normalize_family
|
||||||
|
|
||||||
from risotto.utils import MULTI_FUNCTIONS, CONFIGS
|
from risotto.utils import MULTI_FUNCTIONS, CONFIGS, DOMAINS
|
||||||
|
|
||||||
|
|
||||||
with open(environ.get('CONFIG_FILE', 'risotto.conf'), 'r') as fh:
|
with open(environ.get('CONFIG_FILE', 'risotto.conf'), 'r') as fh:
|
||||||
|
@ -39,13 +39,14 @@ with open('servers.json', 'r') as server_fh:
|
||||||
|
|
||||||
async def set_linked_multi_variables(value: str,
|
async def set_linked_multi_variables(value: str,
|
||||||
linked_server: str=None,
|
linked_server: str=None,
|
||||||
|
variable_index: int=None,
|
||||||
**kwargs: dict,
|
**kwargs: dict,
|
||||||
) -> None:
|
) -> None:
|
||||||
if value is not None and linked_server is not None and 'linked_value_0' not in kwargs:
|
if value is not None and linked_server is not None and 'linked_value_0' not in kwargs:
|
||||||
kwargs['linked_value_0'] = value
|
kwargs['linked_value_0'] = value
|
||||||
elif linked_server is None:
|
elif not linked_server:
|
||||||
linked_server = value
|
linked_server = value
|
||||||
if linked_server is None:
|
if not linked_server:
|
||||||
return
|
return
|
||||||
if linked_server not in CONFIGS:
|
if linked_server not in CONFIGS:
|
||||||
warn_explicit(ValueWarning(f'cannot find linked server "{linked_server}"'),
|
warn_explicit(ValueWarning(f'cannot find linked server "{linked_server}"'),
|
||||||
|
@ -66,51 +67,76 @@ async def set_linked_multi_variables(value: str,
|
||||||
if not path:
|
if not path:
|
||||||
return
|
return
|
||||||
if index not in variables:
|
if index not in variables:
|
||||||
variables[index] = {'path': None, 'value': None}
|
variables[index] = {'path': None, 'value': None, 'variable_index': False}
|
||||||
variables[index]['path'] = path
|
variables[index]['path'] = path
|
||||||
elif key.startswith('linked_value_'):
|
elif key.startswith('linked_value_'):
|
||||||
index = int(key[13])
|
index = int(key[13])
|
||||||
if index not in variables:
|
if index not in variables:
|
||||||
variables[index] = {'path': None, 'value': None}
|
variables[index] = {'path': None, 'value': None, 'variable_index': False}
|
||||||
variables[index]['value'] = value
|
variables[index]['value'] = value
|
||||||
|
elif key.startswith('variable_index_'):
|
||||||
|
index = int(key[15])
|
||||||
|
if index not in variables:
|
||||||
|
variables[index] = {'path': None, 'value': None, 'variable_index': False}
|
||||||
|
variables[index]['variable_index'] = True
|
||||||
else:
|
else:
|
||||||
raise AttributeError(f'unknown parameter {key}')
|
raise AttributeError(f'unknown parameter {key}')
|
||||||
dynamic = None
|
|
||||||
slave_idx = None
|
|
||||||
await config.property.read_write()
|
await config.property.read_write()
|
||||||
first_variable = variables[0]['value']
|
# print('=====================================')
|
||||||
|
# pprint(variables)
|
||||||
if not isinstance(variables[0]['value'], list):
|
if not isinstance(variables[0]['value'], list):
|
||||||
variables[0]['value'] = [variables[0]['value']]
|
variables[0]['value'] = [variables[0]['value']]
|
||||||
|
dynamic = None
|
||||||
try:
|
try:
|
||||||
for var_index in range(len(variables[0]['value'])):
|
if variables[0]['value']:
|
||||||
pass
|
for first_idx, first_value in enumerate(variables[0]['value']):
|
||||||
|
slave_idxes = []
|
||||||
|
dynamic = normalize_family(first_value)
|
||||||
for index in sorted(list(variables)):
|
for index in sorted(list(variables)):
|
||||||
path = variables[index]['path']
|
path = variables[index]['path']
|
||||||
if index == 0:
|
if '{suffix}' in path:
|
||||||
value = variables[index]['value'][var_index]
|
|
||||||
dynamic = normalize_family(value)
|
|
||||||
else:
|
|
||||||
value = variables[index]['value']
|
|
||||||
path = path.replace('{suffix}', dynamic)
|
path = path.replace('{suffix}', dynamic)
|
||||||
option = config.forcepermissive.option(path, slave_idx)
|
elif first_idx != 0:
|
||||||
|
continue
|
||||||
|
value = variables[index]['value']
|
||||||
|
option = config.forcepermissive.option(path)
|
||||||
|
if not await option.option.isfollower():
|
||||||
|
#print('===>', path, value, await option.option.ismulti(), await option.option.issubmulti())
|
||||||
multi = await option.option.ismulti()
|
multi = await option.option.ismulti()
|
||||||
if multi and await option.option.isfollower():
|
|
||||||
multi = await option.option.issubmulti()
|
|
||||||
if multi:
|
if multi:
|
||||||
|
isleader = await option.option.isleader()
|
||||||
|
if not isinstance(value, list):
|
||||||
|
value = [value]
|
||||||
|
# elif isleader:
|
||||||
|
# raise Exception('leader must not be a multi from now ...')
|
||||||
values = await option.value.get()
|
values = await option.value.get()
|
||||||
if value not in values:
|
for val in value:
|
||||||
values.append(value)
|
if val not in values:
|
||||||
|
if isleader:
|
||||||
|
slave_idxes.append(len(values))
|
||||||
|
values.append(val)
|
||||||
|
elif isleader:
|
||||||
|
slave_idxes.append(values.index(val))
|
||||||
await option.value.set(values)
|
await option.value.set(values)
|
||||||
if await option.option.isleader():
|
|
||||||
slave_idx = values.index(value)
|
|
||||||
else:
|
else:
|
||||||
if isinstance(value, list):
|
|
||||||
value = value[var_index]
|
|
||||||
await option.value.set(value)
|
await option.value.set(value)
|
||||||
|
else:
|
||||||
|
#print('===<', path, value, await option.option.ismulti(), await option.option.issubmulti())
|
||||||
|
if not slave_idxes:
|
||||||
|
raise Exception('please declare the leader variable before the follower')
|
||||||
|
if variables[index]['variable_index']:
|
||||||
|
value = value[variable_index]
|
||||||
|
if not isinstance(value, list):
|
||||||
|
value = [value] * len(slave_idxes)
|
||||||
|
# if isinstance(value, list) and not await option.option.issubmulti():
|
||||||
|
for idx, val in enumerate(value):
|
||||||
|
option = config.forcepermissive.option(path, slave_idxes[idx])
|
||||||
|
await option.value.set(val)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
await config.property.read_only()
|
await config.property.read_only()
|
||||||
raise err from err
|
raise err from err
|
||||||
await config.property.read_only()
|
await config.property.read_only()
|
||||||
|
return get_ip_from_domain(linked_server)
|
||||||
|
|
||||||
|
|
||||||
async def set_linked(linked_server: str,
|
async def set_linked(linked_server: str,
|
||||||
|
@ -364,7 +390,7 @@ def build_module(module_name, datas, module_infos):
|
||||||
for filename in listdir(manual_dir):
|
for filename in listdir(manual_dir):
|
||||||
src_file = join(manual_dir, filename)
|
src_file = join(manual_dir, filename)
|
||||||
if type == 'image':
|
if type == 'image':
|
||||||
dst_file = join(install_dir, filename)
|
dst_file = join(install_dir, 'manual', filename)
|
||||||
verify = False
|
verify = False
|
||||||
else:
|
else:
|
||||||
dst_file= join(INSTALL_DIR, filename)
|
dst_file= join(INSTALL_DIR, filename)
|
||||||
|
@ -398,6 +424,13 @@ def build_module(module_name, datas, module_infos):
|
||||||
calc_depends(applicationservice, added)
|
calc_depends(applicationservice, added)
|
||||||
|
|
||||||
|
|
||||||
|
def get_ip_from_domain(domain):
|
||||||
|
if not domain:
|
||||||
|
return
|
||||||
|
hostname, domainname = domain.split('.', 1)
|
||||||
|
return DOMAINS[domainname][1][DOMAINS[domainname][0].index(hostname)]
|
||||||
|
|
||||||
|
|
||||||
async def build(server_name, datas, module_infos):
|
async def build(server_name, datas, module_infos):
|
||||||
if server_name in CONFIGS:
|
if server_name in CONFIGS:
|
||||||
raise Exception(f'server "{server_name}" is duplicate')
|
raise Exception(f'server "{server_name}" is duplicate')
|
||||||
|
@ -416,6 +449,7 @@ async def build(server_name, datas, module_infos):
|
||||||
'set_linked_multi_variables': set_linked_multi_variables,
|
'set_linked_multi_variables': set_linked_multi_variables,
|
||||||
'get_linked_configuration': get_linked_configuration,
|
'get_linked_configuration': get_linked_configuration,
|
||||||
'set_linked_configuration': set_linked_configuration,
|
'set_linked_configuration': set_linked_configuration,
|
||||||
|
'get_ip_from_domain': get_ip_from_domain,
|
||||||
}
|
}
|
||||||
cfg['internal_functions'] = list(optiondescription.keys())
|
cfg['internal_functions'] = list(optiondescription.keys())
|
||||||
try:
|
try:
|
||||||
|
@ -535,11 +569,14 @@ async def main():
|
||||||
for server_name in SERVERS:
|
for server_name in SERVERS:
|
||||||
config = CONFIGS[server_name][0]
|
config = CONFIGS[server_name][0]
|
||||||
await config.property.pop('mandatory')
|
await config.property.pop('mandatory')
|
||||||
|
try:
|
||||||
await config.value.dict()
|
await config.value.dict()
|
||||||
|
except Exception as err:
|
||||||
|
raise Exception(f'cannot display config for "{server_name}": {err}')
|
||||||
await config.property.add('mandatory')
|
await config.property.add('mandatory')
|
||||||
for server_name in SERVERS:
|
for server_name in SERVERS:
|
||||||
await valid_mandatories(server_name, CONFIGS[server_name][0])
|
await valid_mandatories(server_name, CONFIGS[server_name][0])
|
||||||
# print(await CONFIGS['revprox.in.gnunux.info'][0].option('nginx.reverse_proxy_for_netbox_in_gnunux_info.reverse_proxy_netbox_in_gnunux_info.revprox_url_netbox_in_gnunux_info', 0).value.get())
|
# print(await CONFIGS['dovecot.in.silique.fr'][0].value.dict())
|
||||||
for server_name in SERVERS:
|
for server_name in SERVERS:
|
||||||
await templates(server_name, *CONFIGS[server_name])
|
await templates(server_name, *CONFIGS[server_name])
|
||||||
|
|
||||||
|
|
6
funcs.py
6
funcs.py
|
@ -7,7 +7,7 @@ from secrets import token_urlsafe as _token_urlsafe
|
||||||
|
|
||||||
from rougail.utils import normalize_family
|
from rougail.utils import normalize_family
|
||||||
|
|
||||||
from risotto.utils import multi_function, CONFIGS
|
from risotto.utils import multi_function, CONFIGS, DOMAINS
|
||||||
from risotto.x509 import gen_cert as _x509_gen_cert, gen_ca as _x509_gen_ca, gen_pub as _x509_gen_pub, has_pub as _x509_has_pub
|
from risotto.x509 import gen_cert as _x509_gen_cert, gen_ca as _x509_gen_ca, gen_pub as _x509_gen_pub, has_pub as _x509_has_pub
|
||||||
# =============================================================
|
# =============================================================
|
||||||
# fork of risotto-setting/src/risotto_setting/config/config.py
|
# fork of risotto-setting/src/risotto_setting/config/config.py
|
||||||
|
@ -17,7 +17,6 @@ with open('servers.json', 'r') as server_fh:
|
||||||
|
|
||||||
|
|
||||||
ZONES = None
|
ZONES = None
|
||||||
DOMAINS = None
|
|
||||||
HERE = dirname(abspath(__file__))
|
HERE = dirname(abspath(__file__))
|
||||||
|
|
||||||
|
|
||||||
|
@ -49,9 +48,8 @@ def load_zones():
|
||||||
def load_domains():
|
def load_domains():
|
||||||
load_zones()
|
load_zones()
|
||||||
global DOMAINS
|
global DOMAINS
|
||||||
if DOMAINS is not None:
|
if DOMAINS:
|
||||||
return
|
return
|
||||||
DOMAINS = {}
|
|
||||||
for zone_name, zone in ZONES_SERVER['zones'].items():
|
for zone_name, zone in ZONES_SERVER['zones'].items():
|
||||||
if 'domain_name' in zone:
|
if 'domain_name' in zone:
|
||||||
hosts = []
|
hosts = []
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
MULTI_FUNCTIONS = []
|
MULTI_FUNCTIONS = []
|
||||||
CONFIGS = {}
|
CONFIGS = {}
|
||||||
|
DOMAINS = {}
|
||||||
|
|
||||||
|
|
||||||
def _(s):
|
def _(s):
|
||||||
|
|
Loading…
Reference in a new issue