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')