281 lines
14 KiB
Python
281 lines
14 KiB
Python
import hashlib
|
|
import os
|
|
import random
|
|
import shutil
|
|
|
|
from jinja2 import Template
|
|
|
|
from conpeek_setup import util
|
|
|
|
|
|
def generate_upstream_name():
|
|
# Define a helper function to generate a 7-character MD5 hash from a random number
|
|
def generate_part():
|
|
random_number = str(random.randint(0, 32767)) # Equivalent to $RANDOM in bash
|
|
md5_hash = hashlib.md5(random_number.encode()).hexdigest()
|
|
return md5_hash[:7]
|
|
|
|
# Generate the upstream name by concatenating four parts with hyphens
|
|
upstream_name = f"{generate_part()}-{generate_part()}-{generate_part()}-{generate_part()}"
|
|
return upstream_name
|
|
|
|
def generate_custom_settings(template_file_path, config_location, app_installation_domain):
|
|
util.print_black_light(f"Preparing custom settings")
|
|
|
|
file = open(template_file_path, 'r')
|
|
template_content = file.read()
|
|
template = Template(template_content)
|
|
|
|
data = {
|
|
"app_installation_domain": app_installation_domain[1:].replace(".", "\.")
|
|
}
|
|
|
|
output_text = template.render(data)
|
|
output_file = os.path.join(config_location, "custom_settings.conf")
|
|
|
|
with open(output_file, "w") as file:
|
|
file.write(output_text)
|
|
|
|
|
|
def generate_default_config(template_file_path, config_location, access_ip, cert_name):
|
|
util.print_black_light(f"Preparing default.conf")
|
|
|
|
file = open(template_file_path, 'r')
|
|
template_content = file.read()
|
|
template = Template(template_content)
|
|
|
|
data = {
|
|
"nginx_ip": access_ip,
|
|
"network_domain": cert_name,
|
|
}
|
|
|
|
output_text = template.render(data)
|
|
|
|
output_file = os.path.join(config_location, "default.conf")
|
|
|
|
with open(output_file, "w") as file:
|
|
file.write(output_text)
|
|
|
|
|
|
def generate_config(template_file_path, config_location, listening_port, internal_ip, access_ip, external_ip, server_name, cert_name, app_installation_domain):
|
|
util.print_black_light(f"Preparing {server_name}{app_installation_domain}")
|
|
|
|
file = open(template_file_path, 'r')
|
|
template_content = file.read()
|
|
template = Template(template_content)
|
|
|
|
data = {
|
|
"upstream_name": generate_upstream_name(),
|
|
"service_port": listening_port, # Example list of ports
|
|
"ip_v4": internal_ip,
|
|
"nginx_ip": access_ip,
|
|
"server_name": server_name + app_installation_domain,
|
|
"network_domain": cert_name,
|
|
"app_installation_domain": app_installation_domain[1:]
|
|
}
|
|
|
|
output_text = template.render(data)
|
|
|
|
output_file = os.path.join(config_location, server_name + app_installation_domain + ".conf")
|
|
|
|
with open(output_file, "w") as file:
|
|
file.write(output_text)
|
|
|
|
|
|
def generate_frontend_config(template_file_path, ready_config_location, internal_ip, server_name, app_name, app_installation_domain, service_port='brak_portu'):
|
|
util.print_black_light(f"Preparing {server_name}{app_installation_domain}")
|
|
file = open(template_file_path, 'r')
|
|
template_content = file.read()
|
|
template = Template(template_content)
|
|
|
|
data = {
|
|
"internal_ip": internal_ip,
|
|
"server_name": server_name + app_installation_domain,
|
|
"app_name": app_name,
|
|
"service_port": service_port,
|
|
"app_installation_domain": app_installation_domain[1:]
|
|
}
|
|
|
|
output_text = template.render(data)
|
|
output_file = os.path.join(ready_config_location, server_name + app_installation_domain + ".conf")
|
|
|
|
with open(output_file, "w") as file:
|
|
file.write(output_text)
|
|
|
|
|
|
def run(config, developer_mode=False):
|
|
util.print_black_light("Preparing nginx file")
|
|
|
|
output_directory = os.path.join(util.get_output_path(), "etc/nginx")
|
|
template_nginx_directory = os.path.join(util.get_templates_path(), "nginx")
|
|
|
|
shutil.rmtree(output_directory, ignore_errors=True)
|
|
os.makedirs(output_directory, exist_ok=True)
|
|
|
|
internal_ip = config["new_machine_network"]["internal_ip"]
|
|
external_ip = config["new_machine_network"]["internal_ip"] # listen IP same as redirectIP, due to NAT in universal inteface in ŁDZ cloud
|
|
|
|
access_ip = config["new_machine_network"]["internal_ip"]
|
|
if config.has_option('new_machine_network', 'access_ip'):
|
|
access_ip = config["new_machine_network"]["access_ip"]
|
|
|
|
app_installation_domain = "." + config["new_machine_network"]["app_installation_domain"] # code fault, it must be this dot here, for fix in the future
|
|
cert_name = "conpeek_ssl"
|
|
|
|
tenant_data = util.get_minimal_configuration()
|
|
|
|
reverse_proxy_directory = os.path.join(util.get_output_path(), "etc/nginx/reverse_proxy")
|
|
shutil.rmtree(reverse_proxy_directory, ignore_errors=True)
|
|
os.makedirs(reverse_proxy_directory, exist_ok=True)
|
|
|
|
frontend_directory = os.path.join(util.get_output_path(), "etc/nginx/frontend")
|
|
shutil.rmtree(frontend_directory, ignore_errors=True)
|
|
os.makedirs(frontend_directory, exist_ok=True)
|
|
|
|
reverse_proxy_replacements = {
|
|
# api tenant login
|
|
f"{tenant_data['tenant_login_api_server_name']}": tenant_data['tenant_login_api_server_port'],
|
|
# api tenant
|
|
f"api-{tenant_data['api_tenant_name']}": tenant_data['api_tenant_port'],
|
|
# api operator
|
|
f"api-{tenant_data['operator_api_server_response_name']}": tenant_data['operator_api_server_response_port'],
|
|
# session_server
|
|
f"{tenant_data['session_server_name']}": tenant_data['private_api_port'],
|
|
f"public-api-{tenant_data['session_server_name']}": tenant_data['public_api_port'],
|
|
f"api-monitoring-{tenant_data['session_server_name']}": tenant_data['monitoring_initial_api_port'],
|
|
# cdr_server
|
|
f"api-{tenant_data['cdr_server_name']}": tenant_data['cdr_server_api_port'],
|
|
# report server
|
|
f"api-{tenant_data['report_server_name']}": tenant_data['report_server_api_port'],
|
|
# local contact db server
|
|
f"api-{tenant_data['local_contact_db_name']}": tenant_data['local_contact_db_api_port'],
|
|
f"public-api-{tenant_data['local_contact_db_name']}": tenant_data['local_contact_db_public_api_port'],
|
|
# hubspot server
|
|
f"api-{tenant_data['hubspot_server_name']}": tenant_data['hubspot_server_api_port'],
|
|
f"public-api-{tenant_data['hubspot_server_name']}": tenant_data['hubspot_server_public_api_port'],
|
|
# ticketing server
|
|
f"api-{tenant_data['ticketing_server_name']}": tenant_data['ticketing_server_api_port'],
|
|
# gus server
|
|
f"api-{tenant_data['gus_server_name']}": tenant_data['gus_server_public_api_port'],
|
|
# meets
|
|
f"{tenant_data['meets_server_name']}": tenant_data['meets_server_port'],
|
|
# bss api server
|
|
f"api-{tenant_data['tenant_bss_api_server_name']}": tenant_data['tenant_bss_api_server_initial_application_port'],
|
|
# sms server
|
|
f"api-{tenant_data['sms_server_name']}": tenant_data['sms_server_api_port'],
|
|
f"public-api-{tenant_data['sms_server_name']}": tenant_data['sms_server_public_api_port'],
|
|
# mailbox server
|
|
f"api-{tenant_data['mailbox_server_name']}": tenant_data['mailbox_server_api_port'],
|
|
f"public-api-{tenant_data['mailbox_server_name']}": tenant_data['mailbox_server_public_api_port'],
|
|
# facebook server
|
|
f"api-{tenant_data['facebook_server_name']}": tenant_data['facebook_server_api_port'],
|
|
f"public-api-{tenant_data['facebook_server_name']}": tenant_data['facebook_server_public_api_port'],
|
|
# messagebird server
|
|
f"api-{tenant_data['messagebird_server_name']}": tenant_data['messagebird_server_api_port'],
|
|
# tenant_web_polling_server
|
|
f"{tenant_data['api_tenant_web_polling_name']}": tenant_data['api_tenant_web_polling_port'],
|
|
# bot server
|
|
f"api-{tenant_data['bot_server_name']}": tenant_data['bot_server_api_port'],
|
|
|
|
# verto
|
|
f"api-{tenant_data['freeswitch_name']}": 6900,
|
|
f"verto-routing-{tenant_data['freeswitch_name']}": 9800,
|
|
f"verto-stun-{tenant_data['freeswitch_name']}": 9801,
|
|
f"verto-no-stun-{tenant_data['freeswitch_name']}": 9802,
|
|
f"verto-ext-stun-{tenant_data['freeswitch_name']}": 9803,
|
|
f"verto-ext-no-stun-{tenant_data['freeswitch_name']}": 9804,
|
|
|
|
# metrics
|
|
"invitation": 3900,
|
|
"conpeek-exporter": 9850,
|
|
"statsd-exporter": 9851,
|
|
"statsd-api-exporter": 9852,
|
|
"ping-exporter": 9853,
|
|
"node-exporter": 9854,
|
|
"freeswitch-exporter": 9855,
|
|
"process-exporter": 9856,
|
|
"docker-exporter": 9857,
|
|
|
|
# frontend
|
|
"app": 81,
|
|
"wallboard": 81,
|
|
"device": 81,
|
|
"operator": 81,
|
|
"docs": 81,
|
|
"desk": 81
|
|
}
|
|
|
|
if developer_mode:
|
|
reverse_proxy_replacements["app-prod"] = 81
|
|
|
|
for name in reverse_proxy_replacements.keys():
|
|
generate_config(os.path.join(template_nginx_directory, "nginx-proxy.tmpl"), reverse_proxy_directory, reverse_proxy_replacements[name], internal_ip, access_ip, external_ip, name, cert_name, app_installation_domain)
|
|
|
|
generate_custom_settings(os.path.join(template_nginx_directory, "custom_settings.tmpl"), reverse_proxy_directory, app_installation_domain)
|
|
generate_custom_settings(os.path.join(template_nginx_directory, "custom_settings.tmpl"), frontend_directory, app_installation_domain)
|
|
generate_default_config(os.path.join(template_nginx_directory, "default.tmpl"), reverse_proxy_directory, access_ip, cert_name)
|
|
|
|
reverse_proxy_wss_replacements = {
|
|
f"wss-{tenant_data['session_server_name']}": tenant_data['wss_port'],
|
|
f"wss-monitoring-{tenant_data['session_server_name']}": tenant_data['monitoring_initial_wss_port'],
|
|
f"wss-monitoring-{tenant_data['messaging_server_name']}": tenant_data['messaging_server_wss_port'],
|
|
f"wss-{tenant_data['user_notification_server_name']}": tenant_data['user_notification_server_wss_port'],
|
|
f"wss-{tenant_data['messaging_server_name']}": tenant_data['messaging_server_wss_port'],
|
|
}
|
|
|
|
for name in reverse_proxy_wss_replacements.keys():
|
|
generate_config(os.path.join(template_nginx_directory, "nginx-web-socket.tmpl"), reverse_proxy_directory, reverse_proxy_wss_replacements[name], internal_ip, access_ip, external_ip, name, cert_name, app_installation_domain)
|
|
|
|
frontend_replacements = {
|
|
"app": "app_tenant",
|
|
"wallboard": "app_wallboard",
|
|
"device": "app_device",
|
|
"operator": "app_operator"
|
|
}
|
|
|
|
if developer_mode:
|
|
generate_frontend_config(os.path.join(template_nginx_directory, "docker_frontend_production_template.tmpl"), frontend_directory, internal_ip, "app-prod", "app_tenant", app_installation_domain)
|
|
|
|
for name in frontend_replacements.keys():
|
|
generate_frontend_config(os.path.join(template_nginx_directory, "docker_frontend_template.tmpl"), frontend_directory, internal_ip, name, frontend_replacements[name], app_installation_domain)
|
|
|
|
# server specific
|
|
|
|
# docs
|
|
generate_frontend_config(os.path.join(template_nginx_directory, "docker_docs_template.tmpl"), frontend_directory, internal_ip, "docs", "docs", app_installation_domain)
|
|
# desk
|
|
generate_frontend_config(os.path.join(template_nginx_directory, "docker_desk_template.tmpl"), frontend_directory, internal_ip, "desk", "app_desk", app_installation_domain)
|
|
# api tenant plugin frontend
|
|
generate_frontend_config(os.path.join(template_nginx_directory, "tenant_plugin_frontend_template.tmpl"), frontend_directory, internal_ip, tenant_data['tenant_plugin_api_server_name'], None, app_installation_domain, tenant_data['tenant_plugin_api_server_initial_application_port'])
|
|
# api tenant plugin reverse proxy
|
|
generate_config(os.path.join(template_nginx_directory, "tenant_plugin_reverse_proxy_template.tmpl"), reverse_proxy_directory, tenant_data['tenant_plugin_api_server_initial_application_port'], internal_ip, access_ip, external_ip, tenant_data['tenant_plugin_api_server_name'], cert_name, app_installation_domain)
|
|
# file server
|
|
generate_config(os.path.join(template_nginx_directory, "nginx-file-server.tmpl"), reverse_proxy_directory, tenant_data['file_server_api_port'], internal_ip, access_ip, external_ip, f"api-{tenant_data['file_server_name']}", cert_name, app_installation_domain)
|
|
# messaging server
|
|
generate_config(os.path.join(template_nginx_directory, "nginx-messaging-server.tmpl"), reverse_proxy_directory, tenant_data['messaging_server_public_api_port'], internal_ip, access_ip, external_ip, f"api-{tenant_data['messaging_server_name']}", cert_name, app_installation_domain)
|
|
# api tenant plugin frontend
|
|
generate_frontend_config(os.path.join(template_nginx_directory, "tenant_web_polling_frontend_template.tmpl"), frontend_directory, internal_ip, tenant_data['api_tenant_web_polling_name'], None, app_installation_domain, tenant_data['api_tenant_web_polling_port'])
|
|
# api tenant plugin reverse proxy
|
|
generate_config(os.path.join(template_nginx_directory, "tenant_web_polling_reverse_proxy_template.tmpl"), reverse_proxy_directory, tenant_data['api_tenant_web_polling_port'], internal_ip, access_ip, external_ip, tenant_data['api_tenant_web_polling_name'], cert_name, app_installation_domain)
|
|
|
|
files_to_copy = [
|
|
"nginx.conf",
|
|
"nginx.conf_frontend"
|
|
]
|
|
|
|
for file in files_to_copy:
|
|
util.copy_file(os.path.join(template_nginx_directory, file), output_directory)
|
|
|
|
# custom docker entrypoint scripts
|
|
|
|
frontend_custom_template_directory = os.path.join(util.get_templates_path(), "nginx")
|
|
frontend_custom_directory = os.path.join(util.get_output_path(), "custom/frontend")
|
|
os.makedirs(frontend_custom_directory, exist_ok=True)
|
|
util.copy_file(os.path.join(frontend_custom_template_directory, "custom.sh"), frontend_custom_directory)
|
|
|
|
if config.has_option("custom", "operator_name"):
|
|
util.basic_on_location_sed(os.path.join(frontend_custom_directory, "custom.sh"), 'OPERATOR_NAME', config["custom"]["operator_name"])
|
|
else:
|
|
util.basic_on_location_sed(os.path.join(frontend_custom_directory, "custom.sh"), 'OPERATOR_NAME', 'Conpeek')
|
|
|