diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/base_api.py b/api/base_api.py new file mode 100644 index 0000000..5c6c621 --- /dev/null +++ b/api/base_api.py @@ -0,0 +1,78 @@ +import os +import time + +import requests + + +class BaseAPI: + CONNECTION_TEST_INTERVAL = 10 + CONNECTION_TEST_ATTEMPTS = 10 + + def __init__(self, app_domain, **kwargs): + self.app_domain = app_domain + self.token = None + self.api_tenant_login_url = f"https://tenant-login-api.{self.app_domain}" + self.url = None + self.params = {**kwargs} + + def __get_connection_test_url(self): + return f"{self.url}/check_connection" + + def wait_for_start(self, url=None): + i = 0 + if not url: + url = self.__get_connection_test_url() + for i in range(self.CONNECTION_TEST_ATTEMPTS): + try: + self._get(url) + except Exception: + time.sleep(self.CONNECTION_TEST_INTERVAL) + continue + break + if i == self.CONNECTION_TEST_ATTEMPTS - 1: + raise Exception(f"Connection to {url} failed.") + + def _headers(self, content_type='application/json'): + headers = {'Content-Type': content_type} + if self.token: + headers['Authorization'] = self.token + return headers + + def _get(self, endpoint): + try: + response = requests.get(endpoint, headers=self._headers()) + response.raise_for_status() + return response.json() + except requests.exceptions.HTTPError as e: + raise requests.exceptions.HTTPError(e.response.text) + + def _post(self, endpoint, payload): + try: + response = requests.post(endpoint, json=payload, headers=self._headers()) + response.raise_for_status() + return response.json() + except requests.exceptions.HTTPError as e: + raise requests.exceptions.HTTPError(e.response.text) + + def _put(self, endpoint, payload): + try: + response = requests.put(endpoint, json=payload, headers=self._headers()) + response.raise_for_status() + return response.json() + except requests.exceptions.HTTPError as e: + raise requests.exceptions.HTTPError(e.response.text) + + def _delete(self, endpoint): + response = requests.delete(endpoint, headers=self._headers()) + response.raise_for_status() + return response.status_code + + def _upload_file(self, endpoint, file_path, params=None): + try: + with open(file_path, 'rb') as file: + files = {'file': (os.path.basename(file_path), file, 'application/octet-stream')} + response = requests.post(endpoint, files=files, data=params, headers=self._headers(content_type=None)) + response.raise_for_status() + return response.json() + except requests.exceptions.HTTPError as e: + raise requests.exceptions.HTTPError(e.response.text) diff --git a/api/operator_api.py b/api/operator_api.py new file mode 100644 index 0000000..a2fa089 --- /dev/null +++ b/api/operator_api.py @@ -0,0 +1,115 @@ +import base64 +import hashlib +import json + +from .base_api import BaseAPI + + +class OperatorAPI(BaseAPI): + def login(self, operator_user, operator_password): + endpoint = f"{self.api_tenant_login_url}/operator/login" + nonce = self._post(endpoint, { + "login": operator_user + }).get('nonce') + + # get token + salted_password = str(hashlib.sha256(hashlib.sha256(operator_password.encode()).hexdigest().encode() + nonce.encode()).hexdigest()) + + self.token = self._post(endpoint, { + "login": operator_user, + "password": salted_password + }).get('token') + + aa = base64.b64decode(self.token.split(".")[1] + "===") + decoded_token = json.loads(aa.decode("utf-8")) + self.url = decoded_token["url"]["api"] + + def login_as_user(self, tenant_id, tenant_user_id): + endpoint = f"{self.api_tenant_login_url}/operator/tenant/{tenant_id}/user/{tenant_user_id}/login" + return self._get(endpoint) + + def create_user(self, tenant_id, params): + endpoint = f"{self.url}/tenant/{tenant_id}/user" + return self._post(endpoint, params).get('data') + + def get_user(self, tenant_id, tenant_user_id): + endpoint = f"{self.url}/tenant/{tenant_id}/user/{tenant_user_id}" + return self._get(endpoint).get('data') + + def get_users(self, tenant_id): + endpoint = f"{self.url}/tenant/{tenant_id}/user" + return self._get(endpoint).get('data') + + def get_license_packages(self, tenant_id): + endpoint = f"{self.url}/tenant/{tenant_id}/operator_license_package" + return self._get(endpoint).get('data') + + def get_package_agreements(self, tenant_id): + endpoint = f"{self.url}/tenant/{tenant_id}/tenant_package_agreement" + return self._get(endpoint).get('data') + + def create_package_activation_request(self, tenant_id, params): + endpoint = f"{self.url}/tenant/{tenant_id}/package_activation_request" + return self._post(endpoint, params).get('data') + + def create_tenant(self, params): + endpoint = f"{self.url}/tenant" + return self._post(endpoint, params).get('data')[0] + + def get_tenants(self): + endpoint = f"{self.url}/tenant" + return self._get(endpoint).get('data') + + def get_ddi(self, tenant_id): + endpoint = f"{self.url}/tenant/{tenant_id}/ddi" + return self._get(endpoint).get('data') + + def create_ddi(self, tenant_id, params): + endpoint = f"{self.url}/tenant/{tenant_id}/ddi" + return self._post(endpoint, params).get('data')[0] + + def get_tenant_telco_networks(self, tenant_id): + endpoint = f"{self.url}/tenant/{tenant_id}/telco_network" + return self._get(endpoint).get('data') + + def create_tenant_telco_network(self, tenant_id, params): + endpoint = f"{self.url}/tenant/{tenant_id}/telco_network" + return self._post(endpoint, params).get('data') + + def get_operator_routing(self): + endpoint = f"{self.url}/operator_routing" + return self._get(endpoint).get('data') + + def create_operator_routing(self, params): + endpoint = f"{self.url}/operator_routing" + return self._post(endpoint, params).get('data') + + def create_operator_gateway(self, params): + endpoint = f"{self.url}/operator_gateway" + return self._post(endpoint, params).get('data') + + def get_operator_gateways(self): + endpoint = f"{self.url}/operator_gateway" + return self._get(endpoint).get('data') + + def create_operator_gateway_normalization(self, operator_gateway_id, params): + endpoint = f"{self.url}/operator_gateway/{operator_gateway_id}/normalization" + return self._post(endpoint, params).get('data') + + def get_operator_gateway_normalization(self, operator_gateway_id): + endpoint = f"{self.url}/operator_gateway/{operator_gateway_id}/normalization" + return self._get(endpoint).get('data') + + def delete_operator_gateway_normalization(self, operator_gateway_id, normalization_id): + endpoint = f"{self.url}/operator_gateway/{operator_gateway_id}/normalization/{normalization_id}" + return self._delete(endpoint) + + def get_speech_integrations(self): + endpoint = f"{self.url}/text_to_speech/integration" + return self._get(endpoint).get('data') + + def add_speech_integration(self, params): + endpoint = f"{self.url}/tenant/speech/integration" + return self._post(endpoint, params).get('data') + + diff --git a/api/tenant_api.py b/api/tenant_api.py new file mode 100644 index 0000000..5b8e61a --- /dev/null +++ b/api/tenant_api.py @@ -0,0 +1,148 @@ +from .base_api import BaseAPI + + +class TenantAPI(BaseAPI): + + def initialize_user_login(self, params): + self.token = params.get('token') + self.url = params.get('urls').get('api') + self.file_server_url = params.get('urls').get('fileserver') + + # USER + + def update_feature_tenant_user_call(self, tenant_user_id, params): + endpoint = f"{self.url}/user/{tenant_user_id}/feature/call" + return self._put(endpoint, params).get('data') + + def update_feature_tenant_user_consultant(self, tenant_user_id, params): + endpoint = f"{self.url}/user/{tenant_user_id}/feature/consultant" + return self._put(endpoint, params).get('data') + + def update_feature_tenant_user_recording(self, tenant_user_id, params): + endpoint = f"{self.url}/user/{tenant_user_id}/feature/recording" + return self._put(endpoint, params).get('data') + + def update_feature_tenant_user_hotdesk(self, tenant_user_id, params): + endpoint = f"{self.url}/user/{tenant_user_id}/feature/hotdesk" + return self._put(endpoint, params).get('data') + + def create_web_link(self, params): + endpoint = f"{self.url}/weblink" + return self._post(endpoint, params).get('data') + + # PROJECT + + def create_project(self, params): + endpoint = f"{self.url}/project" + return self._post(endpoint, params).get('data') + + def get_projects(self): + endpoint = f"{self.url}/project" + return self._get(endpoint).get('data') + + def update_project(self, project_id, params): + endpoint = f"{self.url}/project/{project_id}" + return self._put(endpoint, params).get('data') + + def add_user_to_project(self, project_id, params): + endpoint = f"{self.url}/project/{project_id}/user" + return self._post(endpoint, params).get('data') + + def update_feature_project_recording(self, project_id, params): + endpoint = f"{self.url}/project/{project_id}/feature/recording" + return self._put(endpoint, params).get('data') + + def update_feature_project_aaa(self, project_id, params): + endpoint = f"{self.url}/project/{project_id}/feature/aaa" + return self._put(endpoint, params).get('data') + + def add_target_to_project(self, project_id, params): + endpoint = f"{self.url}/project/{project_id}/target" + return self._post(endpoint, params).get('data') + + def add_target_to_user(self, tenant_user_id, params): + endpoint = f"{self.url}/user/{tenant_user_id}/target" + return self._post(endpoint, params).get('data') + + # FILES + def get_announcements(self): + endpoint = f"{self.file_server_url}/announcement" + return self._get(endpoint).get('data') + + def add_announcement(self, file_path, params): + endpoint = f"{self.file_server_url}/announcement" + return self._upload_file(endpoint, file_path, params=params).get('data') + + # IVR + + def get_ivrs(self): + endpoint = f"{self.url}/ivr" + return self._get(endpoint).get('data') + + def create_ivr(self, params): + endpoint = f"{self.url}/ivr" + return self._post(endpoint, params).get('data') + + def update_ivr(self, ivr_id, params): + endpoint = f"{self.url}/ivr/{ivr_id}" + return self._put(endpoint, params).get('data') + + def add_target_to_ivr(self, ivr_id, params): + endpoint = f"{self.url}/ivr/{ivr_id}/target" + return self._post(endpoint, params).get('data') + + # IWRS + + def get_iwrss(self): + endpoint = f"{self.url}/iwrs" + return self._get(endpoint).get('data') + + def create_iwrs(self, params): + endpoint = f"{self.url}/iwrs" + return self._post(endpoint, params).get('data') + + def update_iwrs(self, iwrs_id, params): + endpoint = f"{self.url}/iwrs/{iwrs_id}" + return self._put(endpoint, params).get('data') + + # TENANT + + def update_feature_tenant_api(self, params): + endpoint = f"{self.url}/tenant/feature/api" + return self._put(endpoint, params).get('data') + + def update_feature_tenant_crm(self, params): + endpoint = f"{self.url}/tenant/feature/crm" + return self._put(endpoint, params).get('data') + + def update_feature_tenant_ticketing(self, params): + endpoint = f"{self.url}/tenant/feature/ticketing" + return self._put(endpoint, params).get('data') + + def get_bss_apis(self): + endpoint = f"{self.url}/tenant/bss_api" + return self._get(endpoint).get('data') + + def get_tenant_applications(self): + endpoint = f"{self.url}/tenant/application" + return self._get(endpoint).get('data') + + def create_tenant_application(self, params): + endpoint = f"{self.url}/tenant/application" + return self._post(endpoint, params).get('data') + + def get_plugin_templates(self): + endpoint = f"{self.url}/tenant/plugin/template" + return self._get(endpoint).get('data') + + def create_plugin_template(self, params): + endpoint = f"{self.url}/tenant/plugin/template" + return self._post(endpoint, params).get('data') + + def get_plugin_url_configurations(self): + endpoint = f"{self.url}/tenant/plugin/url_configuration" + return self._get(endpoint).get('data') + + def create_plugin_url_configuration(self, params): + endpoint = f"{self.url}/tenant/plugin/url_configuration" + return self._post(endpoint, params).get('data') \ No newline at end of file diff --git a/file_generator/__init__.py b/file_generator/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/file_generator/generate_bind9.py b/file_generator/generate_bind9.py new file mode 100644 index 0000000..e46ecbe --- /dev/null +++ b/file_generator/generate_bind9.py @@ -0,0 +1,124 @@ +import os +import shutil +from datetime import datetime + +from conpeek_setup import util +from jinja2 import Template + + +def get_serial(): + current_date = datetime.now() + bind_serial_number = int(current_date.timestamp()) + return bind_serial_number + + +def prepare_access_zone_config(external_ip, app_installation_domain, output_directory, template_file_dir, script_dir, internal_ip, developer_mode, kamailio_nat): + util.print_black_light(f"Preparing access zone (External IP:{external_ip}) (Core IP: {internal_ip})") + template_file_path = os.path.join(script_dir, template_file_dir) + + file = open(template_file_path, 'r') + template_content = file.read() + template = Template(template_content) + + data = { + "app_installation_domain": app_installation_domain, + "access_ip": external_ip, + "serial_number": get_serial(), + "core_ip": internal_ip, + "developer_mode": developer_mode, + "kamailio_nat": kamailio_nat == '1' + } + + output_text = template.render(data) + output_file = output_directory + "/db." + app_installation_domain + output_file_path = os.path.join(script_dir, output_file) + + with open(output_file_path, "w") as file: + file.write(output_text + "\n") + + +def prepare_system_zone_config(core_ip, output_directory, template_file_dir, script_dir, system_app_installation_domain): + util.print_black_light(f"Preparing system zone (Core IP:{core_ip})") + template_file_path = os.path.join(script_dir, template_file_dir) + + file = open(template_file_path, 'r') + template_content = file.read() + template = Template(template_content) + + data = { + "system_app_installation_domain": system_app_installation_domain, + "core_ip": core_ip, + "serial_number": get_serial() + } + + output_text = template.render(data) + output_file = output_directory + "/db." + system_app_installation_domain + output_file_path = os.path.join(script_dir, output_file) + + with open(output_file_path, "w") as file: + file.write(output_text + "\n") + + +def create_config(data, template_path, output_path, script_dir): + template_file_path = os.path.join(script_dir, template_path) + + file = open(template_file_path, 'r') + template_content = file.read() + template = Template(template_content) + + output_text = template.render(data) + + output_file_path = os.path.join(script_dir, output_path) + + with open(output_file_path, "w") as file: + file.write(output_text + "\n") + + +def run(config, developer_mode=False): + util.print_black_light("Preparing bind configs") + + internal_ip = config["new_machine_network"]["internal_ip"] + external_ip = config["new_machine_network"]["external_ip"] + app_installation_domain = config["new_machine_network"]["app_installation_domain"] + system_app_installation_domain = config["new_machine_network"]["system_app_installation_domain"] + + var_bind_directory = os.path.join(util.get_output_path(), "var", "cache", "bind") + shutil.rmtree(var_bind_directory, ignore_errors=True) + os.makedirs(var_bind_directory, exist_ok=True) + + etc_bind_directory = os.path.join(util.get_output_path(), "etc", "bind") + shutil.rmtree(etc_bind_directory, ignore_errors=True) + os.makedirs(etc_bind_directory, exist_ok=True) + + template_directory = os.path.join(util.get_templates_path(), "bind9") + + kamailio_nat = '1' + if config.has_option('kamailio', 'nat'): + kamailio_nat = config["kamailio"]["nat"] + + # /var/cache configs + prepare_access_zone_config(external_ip, app_installation_domain, var_bind_directory, "access_zone.tmpl", template_directory, internal_ip, developer_mode, kamailio_nat) + prepare_system_zone_config(internal_ip, var_bind_directory, "system_zone.tmpl", template_directory, system_app_installation_domain) + + forwarders = config["bind9"]["forwarders"] + if not forwarders: + forwarders = "1.1.1.1;" + + if ";" not in forwarders: + util.print_yellow("; not in bind9 forwarders... dynamically add to end") + forwarders += ";" + + # /etc/configs + data = {"forward_dns": forwarders} + create_config(data, "named.conf.options.tmpl", os.path.join(etc_bind_directory, "named.conf.options"), template_directory) + data = {"NETWORK_DOMAIN": app_installation_domain} + create_config(data, "named.conf.access_network.tmpl", os.path.join(etc_bind_directory, "named.conf.access_network"), template_directory) + data = {"NETWORK_DOMAIN": system_app_installation_domain} + create_config(data, "named.conf.system_network.tmpl", os.path.join(etc_bind_directory, "named.conf.system_network"), template_directory) + + files_to_copy = [ + "named.conf" + ] + + for file in files_to_copy: + util.copy_file(os.path.join(template_directory, file), etc_bind_directory) diff --git a/file_generator/generate_cert.py b/file_generator/generate_cert.py new file mode 100644 index 0000000..8476a56 --- /dev/null +++ b/file_generator/generate_cert.py @@ -0,0 +1,13 @@ +import os + +from conpeek_setup import util + + +def run(config): + util.print_black_light("Preparing certificates directories") + + certs_directory = os.path.join(util.get_output_path(), "etc/ssl/certs") + private_directory = os.path.join(util.get_output_path(), "etc/ssl/private") + + os.makedirs(certs_directory, exist_ok=True) + os.makedirs(private_directory, exist_ok=True) diff --git a/file_generator/generate_env.py b/file_generator/generate_env.py new file mode 100644 index 0000000..d4d48b5 --- /dev/null +++ b/file_generator/generate_env.py @@ -0,0 +1,64 @@ +import os +import shutil + +from jinja2 import Template + +from conpeek_setup import util + + +def run(config): + util.print_black_light("Preparing env file") + + output_directory = os.path.join(util.get_output_path(), "env") + template_env_directory = os.path.join(util.get_templates_path(), "env") + + compose_prod = os.path.join(util.get_output_path(), "compose_prod") + template_compose_prod = os.path.join(util.get_templates_path(), "compose_prod") + + shutil.rmtree(output_directory, ignore_errors=True) + os.makedirs(output_directory, exist_ok=True) + os.makedirs(os.path.join(util.get_output_path(), "etc"), exist_ok=True) + + shutil.rmtree(compose_prod, ignore_errors=True) + shutil.copytree(template_compose_prod, compose_prod) + + file = open(os.path.join(template_env_directory, "config.env"), 'r') + template_content = file.read() + template = Template(template_content) + tenant_data = util.get_minimal_configuration() + + util.copy_file(os.path.join(template_env_directory, "basic_conpeek.ini"), util.get_output_path()) + + kamailio_private_ip = config["new_machine_network"]["internal_ip"] + if config.has_option('kamailio', 'private_ip'): + kamailio_private_ip = config["kamailio"]["private_ip"] + + kamailio_public_ip = config["new_machine_network"]["external_ip"] + if config.has_option('kamailio', 'public_ip'): + kamailio_public_ip = config["kamailio"]["public_ip"] + + kamailio_nat = '1' + if config.has_option('kamailio', 'nat'): + kamailio_nat = config["kamailio"]["nat"] + + data = { + "MASTER_PASSWORD": config["machine_secrets"]["master_password"], + "DEPLOYMENT_TAG": config["deployment_purpose"]["deployment_tag"], + "APP_INSTALLATION_DOMAIN": config["new_machine_network"]["app_installation_domain"], + "SYSTEM_APP_INSTALLATION_DOMAIN": config["new_machine_network"]["system_app_installation_domain"], + "INTERNAL_IP": config["new_machine_network"]["internal_ip"], + "EXTERNAL_IP": config["new_machine_network"]["external_ip"], + "REPLICASET": config["new_machine_network"]["cluster_name"], + "SYSTEM_TOKEN_SECRETKEY": util.get_token("system_token_secretkey"), + "KAMAILIO_PRIVATE_IP": kamailio_private_ip, + "KAMAILIO_PUBLIC_IP": kamailio_public_ip, + "KAMAILIO_NAT": kamailio_nat + } + + data.update(tenant_data) + + output_text = template.render(data) + output_file = os.path.join(output_directory, "config.env") + + with open(output_file, "w") as file: + file.write(output_text) diff --git a/file_generator/generate_freeswitch.py b/file_generator/generate_freeswitch.py new file mode 100644 index 0000000..7a06e50 --- /dev/null +++ b/file_generator/generate_freeswitch.py @@ -0,0 +1,83 @@ +import os +import shutil + +from conpeek_setup import util + + +def subnet_mask_to_cidr(mask): + # Split the subnet mask into its octets + octets = mask.split('.') + # Convert each octet from string to integer, then to binary, count the '1' bits + try: + cidr = str(sum(bin(int(octet)).count('1') for octet in octets)) + except Exception: + util.print_red(f"Mask {mask} is invalid") + raise Exception("Mask {mask} is invalid") + + return cidr + + +def run(config): + util.print_black_light("Preparing freeswitch file") + + output_directory = os.path.join(util.get_output_path(), "freeswitch") + template_freeswitch_directory = os.path.join(util.get_templates_path(), "freeswitch/conf") + + shutil.rmtree(output_directory, ignore_errors=True) + os.makedirs(output_directory, exist_ok=True) + + util.copy_directory(template_freeswitch_directory, os.path.join(output_directory, "conf")) + + mod_verto_replacements = { + 'VERTO_IP': config["new_machine_network"]["internal_ip"], + 'EXTERNAL_IP': config["new_machine_network"]["external_ip"], + 'EXTERNAL_NET_ADDRESS': config["new_machine_network"]["external_net_address"], + 'EXTERNAL_NET_MASK': subnet_mask_to_cidr(config["new_machine_network"]['external_mask']), + 'INTERNAL_IP': config["new_machine_network"]["internal_ip"], + 'INTERNAL_NET_ADDRESS': config["new_machine_network"]["internal_net_address"], + 'INTERNAL_NET_MASK': subnet_mask_to_cidr(config["new_machine_network"]['internal_mask']), + } + + for name in mod_verto_replacements.keys(): + util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/verto.conf.xml"), name, mod_verto_replacements[name]) + + tenant_data = util.get_minimal_configuration() + + # mod_event_socket + util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/event_socket.conf.xml"), "ES_PORT", "9900") + util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/event_socket.conf.xml"), "ES_IP", config["new_machine_network"]["internal_ip"]) + + # switch + util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/switch.conf.xml"), "FS_DOMAIN", f"{tenant_data['freeswitch_name']}.{config['new_machine_network']['system_app_installation_domain']}") + + if config.has_option("freeswitch", "rtp_start_port") and config.has_option("freeswitch", "rtp_end_port"): + util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/switch.conf.xml"), "RTP_START_PORT", config["freeswitch"]["rtp_start_port"]) + util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/switch.conf.xml"), "RTP_END_PORT", config["freeswitch"]["rtp_end_port"]) + else: + util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/switch.conf.xml"), "RTP_START_PORT", "16384") + util.basic_on_location_sed(os.path.join(output_directory, "conf/autoload_configs/switch.conf.xml"), "RTP_END_PORT", "32767") + + # vars.xml + util.basic_on_location_sed(os.path.join(output_directory, "conf/vars.xml"), "XML_RPC_PASSWORD", "works") + util.basic_on_location_sed(os.path.join(output_directory, "conf/vars.xml"), "DEFAULT_PASSWORD", "Q3G2omiUNgD67fgwP6Xa") + + # dialplan + util.basic_on_location_sed(os.path.join(output_directory, "conf/dialplan/virtual_contact.xml"), "GATEWAY_NAME", tenant_data["gateway_server_name"]) + util.basic_on_location_sed(os.path.join(output_directory, "conf/dialplan/virtual_contact.xml"), "INTERNAL_IP", config["new_machine_network"]['internal_ip']) + + # sip profiles + util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/gateway0.xml"), "INTERNAL_IP", config["new_machine_network"]['internal_ip']) + util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/line0_an1.xml"), "INTERNAL_IP", config["new_machine_network"]['internal_ip']) + + is_nat = True + if config.has_option('kamailio', 'nat'): + is_nat = config["kamailio"]['nat'] == '1' + + if is_nat == '1': + util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/line0_an1.xml"), "LOCAL_NETWORK_ACL", 'nat.auto') + util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/line0_an1.xml"), "EXT_RTP_IP", config["new_machine_network"]['external_ip']) + else: + util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/line0_an1.xml"), "LOCAL_NETWORK_ACL", 'localnet.auto') + util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/line0_an1.xml"), "EXT_RTP_IP", config["new_machine_network"]['internal_ip']) + + util.basic_on_location_sed(os.path.join(output_directory, "conf/sip_profiles/gw1_internal0.xml"), "INTERNAL_IP", config["new_machine_network"]['internal_ip']) diff --git a/file_generator/generate_kamailio.py b/file_generator/generate_kamailio.py new file mode 100644 index 0000000..02ecccb --- /dev/null +++ b/file_generator/generate_kamailio.py @@ -0,0 +1,39 @@ +import os +import shutil + +from conpeek_setup import util + + +def run(config): + util.print_black_light("Preparing kamailio file") + + output_directory = os.path.join(util.get_output_path(), "kamailio") + template_kamailio_directory = os.path.join(util.get_templates_path(), "kamailio") + + shutil.rmtree(output_directory, ignore_errors=True) + os.makedirs(output_directory, exist_ok=True) + + tenant_data = util.get_minimal_configuration() + + files_to_copy = [ + "kamailio.cfg", + "kamailio-python.cfg" + ] + + for file in files_to_copy: + util.copy_file(os.path.join(template_kamailio_directory, file), output_directory) + + kamailio_replacements = { + 'MASTER_PASSWORD': config["machine_secrets"]["master_password"], + 'KAMAILIO_NAME': tenant_data["kamailio_name"], + 'DB_HOST': config["new_machine_network"]["internal_ip"] + } + + for name in kamailio_replacements.keys(): + util.basic_on_location_sed(os.path.join(output_directory, "kamailio-python.cfg"), name, kamailio_replacements[name]) + + public_ip = config["new_machine_network"]["external_ip"] + if config.has_option('kamailio', 'public_ip'): + public_ip = config["kamailio"]["public_ip"] + + util.basic_on_location_sed(os.path.join(output_directory, "kamailio.cfg"), 'KAMAILIO_PUBLIC_IP', public_ip) diff --git a/file_generator/generate_mail_relay.py b/file_generator/generate_mail_relay.py new file mode 100644 index 0000000..100a622 --- /dev/null +++ b/file_generator/generate_mail_relay.py @@ -0,0 +1,32 @@ +import os +import shutil + +from conpeek_setup import util + + +def run(config): + util.print_black_light("Preparing mail relay file") + output_directory = os.path.join(util.get_output_path(), "mail_relay") + template_mail_relay_directory = os.path.join(util.get_templates_path(), "mail_relay") + + shutil.rmtree(output_directory, ignore_errors=True) + os.makedirs(output_directory, exist_ok=True) + + files_to_copy = [ + "000-default.conf", + "ports.conf", + "main.cf" + ] + + for file in files_to_copy: + util.copy_file(os.path.join(template_mail_relay_directory, file), output_directory) + + replacements = { + 'ACCESS_DOMAIN_NAME': config["new_machine_network"]["app_installation_domain"], + } + + if "mail_relay" in config: + replacements["POSTFIX_MYNETWORKS"] = config["mail_relay"]["mynetworks"] + + for name in replacements.keys(): + util.basic_on_location_sed(os.path.join(output_directory, "main.cf"), name, replacements[name]) \ No newline at end of file diff --git a/file_generator/generate_mariadb.py b/file_generator/generate_mariadb.py new file mode 100644 index 0000000..a41f3db --- /dev/null +++ b/file_generator/generate_mariadb.py @@ -0,0 +1,55 @@ +import os +import shutil + +from conpeek_setup import util + + +def run(config): + util.print_black_light("Preparing mariadb file") + + output_directory = os.path.join(util.get_output_path(), "mariadb") + template_mariadb_directory = os.path.join(util.get_templates_path(), "mariadb") + + shutil.rmtree(output_directory, ignore_errors=True) + os.makedirs(output_directory, exist_ok=True) + + shutil.copytree(template_mariadb_directory, output_directory, dirs_exist_ok=True) + topology_data_file_path = os.path.join(output_directory, "07_topology_data_for_1_tenant.sql") + + tenant_data = util.get_minimal_configuration() + + topology_replacements = { + # machine secrets + 'MASTER_PASSWORD': config["machine_secrets"]["master_password"], + # new machine network + 'KAMAILIO_NAME': tenant_data["kamailio_name"], + 'INSTANCE_NAME': config["new_machine_network"]["app_installation_domain"], + 'ACCESS_DOMAIN_NAME': config["new_machine_network"]["app_installation_domain"], + 'SYSTEM_DOMAIN_NAME': config["new_machine_network"]["system_app_installation_domain"], + 'CORE_IP': config["new_machine_network"]["internal_ip"], + 'CORE_MASK': config["new_machine_network"]["internal_mask"], + 'CORE_NET_ADDRESS': config["new_machine_network"]["internal_net_address"], + 'ACCESS_IP': config["new_machine_network"]["external_ip"], + 'ACCESS_MASK': config["new_machine_network"]["external_mask"], + 'ACCESS_NET_ADDRESS': config["new_machine_network"]["external_net_address"], + 'TELCO_IP': config["new_machine_network"]["telco_ip"], + 'TELCO_GATEWAY': config["new_machine_network"]["telco_gateway"], + 'TELCO_MASK': config["new_machine_network"]["telco_mask"], + 'TELCO_NET_ADDRESS': config["new_machine_network"]["telco_net_address"], + 'MONGO_REPLICASET_NAME': config["new_machine_network"]["cluster_name"], + 'SYSTEM_TOKEN_SECRETKEY': util.get_token("system_token_secretkey"), + } + + for name in topology_replacements.keys(): + util.basic_on_location_sed(topology_data_file_path, name, topology_replacements[name]) + + manager_data_file_path = os.path.join(output_directory, "06_manager_data_for_1_tenant.sql") + + manager_replacements = { + 'OPERATOR_DOMAIN': config["operator"]["domain"], + 'OPERATOR_USERNAME': config["operator"]["username"], + 'OPERATOR_PASSWORD': config["operator"]["password"] + } + + for name in manager_replacements.keys(): + util.basic_on_location_sed(manager_data_file_path, name, manager_replacements[name]) diff --git a/file_generator/generate_metrics.py b/file_generator/generate_metrics.py new file mode 100644 index 0000000..0a8f625 --- /dev/null +++ b/file_generator/generate_metrics.py @@ -0,0 +1,20 @@ +import os +import shutil + +import bcrypt + +from conpeek_setup import util + + +def run(config): + util.print_black_light("Preparing metrics file") + output_directory = os.path.join(util.get_output_path(), "metrics") + template_env_directory = os.path.join(util.get_templates_path(), "metrics") + + shutil.rmtree(output_directory, ignore_errors=True) + os.makedirs(output_directory, exist_ok=True) + + util.copy_file(os.path.join(template_env_directory, "node_exporter.yml"), output_directory) + hashed_password = bcrypt.hashpw(config["machine_secrets"]["prometheus_password"].encode("utf-8"), bcrypt.gensalt()).decode() + + util.basic_on_location_sed(os.path.join(output_directory, "node_exporter.yml"), 'PROMETHEUS_PASSWORD', hashed_password) diff --git a/file_generator/generate_mongodb.py b/file_generator/generate_mongodb.py new file mode 100644 index 0000000..f6392d3 --- /dev/null +++ b/file_generator/generate_mongodb.py @@ -0,0 +1,24 @@ +import os +import shutil + +from conpeek_setup import util + + +def run(config): + util.print_black_light("Preparing mongodb file") + + output_directory = os.path.join(util.get_output_path(), "mongodb") + template_mongodb_directory = os.path.join(util.get_templates_path(), "mongodb") + + shutil.rmtree(output_directory, ignore_errors=True) + os.makedirs(output_directory, exist_ok=True) + + files_to_copy = [ + "mongo_init.sh", + "text_to_speech.js" + ] + + for file in files_to_copy: + util.copy_file(os.path.join(template_mongodb_directory, file), output_directory) + + util.basic_on_location_sed(os.path.join(output_directory, "mongo_init.sh"), 'MASTER_PASSWORD', config["machine_secrets"]["master_password"]) diff --git a/file_generator/generate_nginx.py b/file_generator/generate_nginx.py new file mode 100644 index 0000000..22a2f82 --- /dev/null +++ b/file_generator/generate_nginx.py @@ -0,0 +1,280 @@ +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') + diff --git a/file_generator/generate_rabbitmq.py b/file_generator/generate_rabbitmq.py new file mode 100644 index 0000000..d91aca2 --- /dev/null +++ b/file_generator/generate_rabbitmq.py @@ -0,0 +1,27 @@ +import os +import shutil + +from conpeek_setup import util + + +def run(config): + util.print_black_light("Preparing rabbitmq file") + + output_directory = os.path.join(util.get_output_path(), "rabbitmq") + template_rabbitmq_directory = os.path.join(util.get_templates_path(), "rabbitmq") + + shutil.rmtree(output_directory, ignore_errors=True) + os.makedirs(output_directory, exist_ok=True) + + rabbitmq_directory = os.path.join(util.get_output_path(), "etc/rabbitmq") + os.makedirs(rabbitmq_directory, exist_ok=True) + + files_to_copy = [ + "rabbit_init.sh" + ] + + for file in files_to_copy: + util.copy_file(os.path.join(template_rabbitmq_directory, file), output_directory) + + util.basic_on_location_sed(os.path.join(template_rabbitmq_directory, "rabbit_init.sh"), 'MASTER_PASSWORD', config["machine_secrets"]["master_password"]) + util.copy_file(os.path.join(template_rabbitmq_directory, "rabbitmq.config"), rabbitmq_directory) diff --git a/file_generator/generate_tokens.py b/file_generator/generate_tokens.py new file mode 100644 index 0000000..5538819 --- /dev/null +++ b/file_generator/generate_tokens.py @@ -0,0 +1,40 @@ +import os +import random +import string + +from conpeek_setup import util + + +def generate_password(length=64, lowercase=True, uppercase=True, digits=True): + + basic_characters = "" + if lowercase: + basic_characters += string.ascii_lowercase + + if uppercase: + basic_characters += string.ascii_uppercase + + if digits: + basic_characters += string.digits + + if not lowercase and not uppercase and not digits: + util.print_red("Password must contain at least lowercase, uppercase or digits.") + + password = ''.join(random.choices(basic_characters, k=length)) + return password + + +def run(config): + output_directory = os.path.join(util.get_output_path(), "tokens") + os.makedirs(output_directory, exist_ok=True) + + passwords = { + "system_token_secretkey": 64, + ".erlang.cookie": 56, + } + + for key in passwords.keys(): + token_path = os.path.join(output_directory, key) + if not os.path.exists(token_path): + with open(token_path, "w") as file: + file.write(generate_password(length=passwords[key])) diff --git a/lib/__init__.py b/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/create_sip_trunk.py b/lib/create_sip_trunk.py new file mode 100644 index 0000000..3dd63e0 --- /dev/null +++ b/lib/create_sip_trunk.py @@ -0,0 +1,292 @@ +import argparse +import configparser +import os +import pathlib +import re +import sys +from itertools import product + +from conpeek_setup import util +from conpeek_setup.api import operator_api + + +def unpack_regex(regex): + # Helper function to expand ranges and lists within square brackets, e.g., [2-5] or [234] + def expand_square_brackets(pattern): + expanded = [] + content = pattern[1:-1] # Remove the square brackets + if '-' in content: + # Handle ranges like [2-5] + start, end = content.split('-') + expanded = [str(i) for i in range(int(start), int(end) + 1)] + elif pattern == '\\d': + return [str(i) for i in range(10)] + else: + # Handle specific digits like [234] + expanded = list(content) + return expanded + + # Split the regex into parts of digits and square bracket patterns + # This regex splits on digits and square brackets with their content + parts = re.findall(r'\[\d+-\d+\]|\[\d+\]|\d+|\\d', regex) + + # Process parts to generate all possible values + expanded_parts = [] + + for part in parts: + if part.startswith('[') and part.endswith(']'): + # Handle square brackets + expanded_parts.append(expand_square_brackets(part)) + elif part == '\d': + expanded_parts.append(expand_square_brackets(part)) + + else: + # Handle digits + expanded_parts.append([part]) + + for combination in product(*expanded_parts): + print(''.join(combination)) + + # Generate all combinations of expanded parts + possible_values = [''.join(combination) for combination in product(*expanded_parts)] + + print(possible_values) + + return possible_values + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="") + parser.add_argument("--config", type=str, required=True, help="Path to the config file") + parser.add_argument("--user", type=str, required=True, help="Operator login") + parser.add_argument("--password", type=str, required=True, help="Operator password") + parser.add_argument("--output-path", type=str, required=False, help="Path to the output") + + args = parser.parse_args() + config = configparser.ConfigParser() + + config_directory = args.config + if not os.path.abspath(config_directory): + config_directory = os.path.join(pathlib.Path(__file__).parent.resolve(), config_directory) + config.read(config_directory) + if args.output_path: + util.Settings.output_directory = args.output_path + + output_directory = os.path.join(util.get_output_path(), "freeswitch") + template_freeswitch_directory = os.path.join(util.get_templates_path(), "freeswitch/conf") + + app_domain = config["new_machine_network"]["app_installation_domain"] + api = operator_api.OperatorAPI(app_domain) + api.login(args.user, args.password) + + tenant = None + tenants = api.get_tenants() + for o_tenant in tenants: + tenant = o_tenant + break + + if not tenant: + util.print_red("Tenant not exists. First you need to create tenant and the run this script.") + sys.exit() + + # sip trunks + for section in config: + if not section.startswith("sip_trunk_"): + continue + + operator = "default" + if config.has_option(section, "operator") and config[section]["operator"]: + if config[section]["operator"] not in util.Constants.sip_trunk_operators: + util.print_red(f'Operator does not exists {config[section]["operator"]}. Using default sip trunk!') + else: + operator = config[section]["operator"] + + siptrunk_number = section[10:] + proxy = config[section]["proxy"] + + SIP_TRUNK_NUMBER = str(int(siptrunk_number) + 1) + SIP_TRUNK_INTERNAL_PORT = 5100 + int(siptrunk_number) + SIP_TRUNK_NAME = f"ic{siptrunk_number}" + SIP_TRUNK_NAME_WITH_PORT = f"{SIP_TRUNK_NAME}_{SIP_TRUNK_INTERNAL_PORT}" + SIP_PROFILE_NAME = f"gw1_external_{siptrunk_number}_{SIP_TRUNK_INTERNAL_PORT}" + + template_freeswitch_directory_operator = os.path.join(util.get_templates_path(), f"freeswitch/{operator}") + + sip_profile_template_path = os.path.join(template_freeswitch_directory_operator, "sip_profiles/gw_external.xml") + if not os.path.exists(sip_profile_template_path): + sip_profile_template_path = os.path.join(template_freeswitch_directory, "sip_profiles/gw_external.xml") + + sip_profile_output_path = os.path.join(output_directory, f"conf/sip_profiles/{SIP_PROFILE_NAME}.xml") + if os.path.exists(sip_profile_output_path): + util.print_red(f"SIP profile {sip_profile_output_path} exists.") + continue + else: + util.copy_file(sip_profile_template_path, sip_profile_output_path) + + SIP_TRUNK_USERNAME = "" + if config.has_option(section, "username"): + SIP_TRUNK_USERNAME = config[section]["username"] + + SIP_TRUNK_PASSWORD = "" + if config.has_option(section, "password"): + SIP_TRUNK_PASSWORD = config[section]["password"] + + sip_profile_replacements = { + 'SIP_PROFILE_NAME': SIP_PROFILE_NAME, + 'SIP_TRUNK_NAME_WITH_PORT': SIP_TRUNK_NAME_WITH_PORT, + 'SIP_TRUNK_PROXY': proxy, + 'SIP_TRUNK_INTERNAL_PORT': str(SIP_TRUNK_INTERNAL_PORT), + 'SIP_TRUNK_USERNAME': SIP_TRUNK_USERNAME, + 'SIP_TRUNK_PASSWORD': SIP_TRUNK_PASSWORD, + 'EXTERNAL_IP': config["new_machine_network"]["external_ip"], + 'INTERNAL_IP': config["new_machine_network"]["internal_ip"], + } + + for name in sip_profile_replacements.keys(): + util.basic_on_location_sed(sip_profile_output_path, name, sip_profile_replacements[name]) + + operator_gateways = api.get_operator_gateways() + operator_gateway = None + for o_gateway in operator_gateways: + if o_gateway["name"] == SIP_TRUNK_NAME: + operator_gateway = o_gateway + break + + tenant_telco_networks = api.get_tenant_telco_networks(tenant["id"]) + tenant_has_telco_network_exists = False + for tenant_has_telco_network in tenant_telco_networks: + if tenant_has_telco_network["gateway_external_sip_port"] == SIP_TRUNK_INTERNAL_PORT: + tenant_has_telco_network_exists = True + break + + if not tenant_has_telco_network_exists: + api.create_tenant_telco_network(tenant["id"], { + "8021q_vlan_id": 0, + "gateway_external_sip_port": SIP_TRUNK_INTERNAL_PORT, + "telco_network_id": 1 + }) + + if not operator_gateway: + util.print_black_light(f"Creating operator gateway {SIP_TRUNK_NAME}") + operator_gateway = api.create_operator_gateway({ + "name": SIP_TRUNK_NAME, + "validate_e164": True, + "presentation_preservation_policy": "DISABLED", + "telco_network_id": 1, + "username": SIP_TRUNK_USERNAME, + "password": SIP_TRUNK_PASSWORD + }) + + if not operator_gateway: + util.print_red(f"Cant insert to operator_gateway {SIP_TRUNK_NAME}.") + continue + + normalization_to_create = [{ + "direction": "outbound", + "peer": "caller", + "pattern": '^48([0-9]{9})$', + "replacement": '\\1', + "priority": 10 + }, { + "direction": "inbound", + "peer": "callee", + "pattern": '^([0-9]{9})$', + "replacement": '48\\1', + "priority": 10 + }, { + "direction": "inbound", + "peer": "caller", + "pattern": '^([0-9]{9})$', + "replacement": '48\\1', + "priority": 10 + }, { + "direction": "inbound", + "peer": "caller", + "pattern": '^\\+([0-9]*)$', + "replacement": '\\1', + "priority": 10 + }, { + "direction": "inbound", + "peer": "caller", + "pattern": '^00([0-9]*)$', + "replacement": '\\1', + "priority": 10 + }, { + "direction": "outbound", + "peer": "callee", + "pattern": '^([0-9]*)$', + "replacement": '+\\1', + "priority": 10 + }] + + for normalization in normalization_to_create: + api.create_operator_gateway_normalization(operator_gateway["id"], normalization) + + ddi = config[section]["ddi"] + ddi = ddi.replace(",", ";") + ddi_patterns = ddi.split(";") + for ddi_pattern in ddi_patterns: + if ddi_pattern.startswith("^") and ddi_pattern.endswith("$"): + api.create_operator_routing({ + "priority": 100, + "src_number_to_charge": ddi_pattern, + "src_presentation_number": ".*", + "dst": ".*", + "operator_gateway_id": operator_gateway["id"] + }) + + ddi_list = unpack_regex(ddi_pattern) + if len(ddi_list) > 1000: + util.print_red("There cannot be more than 1000 numbers -- invalid regexp pattern") + sys.exit() + + for ddi_number in ddi_list: + api.create_ddi(tenant["id"], { + "e164number": ddi_number, + "fax_enabled": 1, + "voice_enabled": 1, + "sms_enabled": 0, + "operator_gateway_id": operator_gateway["id"] + }) + + elif "-" in ddi_pattern: + from_number = int(ddi_pattern.split("-")[0]) + to_number = int(ddi_pattern.split("-")[1]) + + numbers = set(range(from_number, to_number + 1)) + if len(numbers) > 1000: + util.print_red("There cannot be more than 1000 numbers") + sys.exit() + + for number in numbers: + api.create_operator_routing({ + "priority": 100, + "src_number_to_charge": f"^{number}$", + "src_presentation_number": ".*", + "dst": ".*", + "operator_gateway_id": operator_gateway["id"] + }) + + api.create_ddi(tenant["id"], { + "e164number": number, + "fax_enabled": 1, + "voice_enabled": 1, + "sms_enabled": 0, + "operator_gateway_id": operator_gateway["id"] + }) + else: + api.create_operator_routing({ + "priority": 100, + "src_number_to_charge": f"^{ddi_pattern}$", + "src_presentation_number": ".*", + "dst": ".*", + "operator_gateway_id": operator_gateway["id"] + }) + + api.create_ddi(tenant["id"], { + "e164number": ddi_pattern, + "fax_enabled": 1, + "voice_enabled": 1, + "sms_enabled": 0, + "operator_gateway_id": operator_gateway["id"] + }) \ No newline at end of file diff --git a/lib/create_tenant.py b/lib/create_tenant.py new file mode 100644 index 0000000..0fc7efe --- /dev/null +++ b/lib/create_tenant.py @@ -0,0 +1,228 @@ +import argparse +import configparser +import os +import pathlib +import sys +from datetime import datetime + +import pytz + +from conpeek_setup import util +from conpeek_setup.api import operator_api +from conpeek_setup.api.tenant_api import TenantAPI + + +def validate_config(config): + sections_to_validate = [ + "tenant" + ] + + for section in sections_to_validate: + if not config.has_section(section): + util.print_red(f"No {section} section in config") + raise Exception(f"No {section} section in config") + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="") + parser.add_argument("--config", type=str, required=True, help="Path to the config file") + parser.add_argument("--user", type=str, required=True, help="Operator login") + parser.add_argument("--password", type=str, required=True, help="Operator password") + + args = parser.parse_args() + config = configparser.ConfigParser() + + config_directory = args.config + if not os.path.abspath(config_directory): + config_directory = os.path.join(pathlib.Path(__file__).parent.resolve(), config_directory) + + config.read(config_directory) + + validate_config(config) + + app_domain = config["new_machine_network"]["app_installation_domain"] + + api = operator_api.OperatorAPI(app_domain) + util.print_black_light(f"Wait for start TenantLoginAPI") + api.wait_for_start(f"{api.api_tenant_login_url}/tenant/check_connection") + util.print_green(f"TenantLoginAPI Started") + api.login(args.user, args.password) + util.print_black_light(f"Wait for start OperatorAPI") + api.wait_for_start() + util.print_green(f"OperatorAPI Started") + + tenant = None + tenants = api.get_tenants() + for o_tenant in tenants: + tenant = o_tenant + break + + if not tenant: + # Create Tenant if not exists + print("Creating tenant...") + tenant = api.create_tenant({ + "name": config["tenant"]["domain"], + "domain": config["tenant"]["domain"], + "time_zone": "Europe/Warsaw", + "language": "pl", + "active": 1, + "estimated_number_of_users": 100, + "allow_to_exceed_concurrent_packages": 0, + "create_recording_checksum_file": 1, + "video_recording_enabled": 0, + "simultaneous_calls_limit": 100, + "anonymous_sessions": 1, + "access_network_id": 1, + "plugin_enabled_domain_id": 1, + "telco_network_id": 1 + }) + + util.print_black_light(f"Created tenant ({tenant['id']}) {tenant['name']}.") + else: + util.print_yellow(f"Tenant {config['tenant']['domain']} exists, id={tenant['id']}.") + + license_packages = api.get_license_packages(tenant_id=tenant["id"]) + packages_count = { + "Super Admin": 3, + } + + license_package_agreements = api.get_package_agreements(tenant_id=tenant["id"]) + for license_package in license_package_agreements: + if license_package["operator_license_package_name"] in packages_count: + if license_package["commercial_license_package_amount"] >= packages_count[license_package["operator_license_package_name"]]: + util.print_black_light(f'Licenses {license_package["operator_license_package_name"]} exists.') + del packages_count[license_package["operator_license_package_name"]] + + super_admin_package_id = None + package_activation_item_list = [] + for package_license in license_packages: + if package_license["name"] == "Super Admin": + super_admin_package_id = package_license["id"] + if package_license["name"] in packages_count: + package_activation_item_list.append({ + "license_package_amount": packages_count[package_license["name"]], + "license_package_type": "COMMERCIAL", + "concurrent_usage_limit": 0, + "operator_license_package_id": package_license["id"] + }) + + local_tz = pytz.timezone(tenant["time_zone"]) + local_now = datetime.now(local_tz) + local_start_of_day = local_tz.localize(datetime(local_now.year, local_now.month, local_now.day, 0, 0, 0)) + utc_start_of_day = local_start_of_day.astimezone(pytz.utc) + + if package_activation_item_list: + api.create_package_activation_request(tenant_id=tenant["id"], params={ + "activate_date": utc_start_of_day.strftime("%Y-%m-%d %H:%M:%S"), + "note": "Auto generated", + "package_activation_item_list": package_activation_item_list + }) + + # Create super administrators + util.print_black_light("Creating super administrators...") + super_admin_users_to_create = [ + { + "username": "super1", + "extension": "1001" + }, + { + "username": "super2", + "extension": "1002" + }, + { + "username": "super3", + "extension": "1003" + } + ] + + super_admin_users_to_create_list = [] + for user in super_admin_users_to_create: + super_admin_users_to_create_list.append(user["username"]) + + users_in_tenant = [] + super_tenant_user_id = None + tenant_api = None + user_mapping = {} + + users = api.get_users(tenant_id=tenant["id"]) + for user in users: + if not super_tenant_user_id: + super_tenant_user_id = user["id"] + + user_mapping[user["username"]] = user["id"] + if not tenant_api: + login_data = api.login_as_user(tenant_id=tenant["id"], tenant_user_id=super_tenant_user_id) + tenant_api = TenantAPI(app_domain) + tenant_api.initialize_user_login(login_data) + util.print_black_light(f"Wait for start TenantAPI") + tenant_api.wait_for_start() + util.print_green(f"TenantAPI Started") + users_in_tenant.append(user["username"]) + + if super_admin_package_id: + for user in super_admin_users_to_create: + + if user["username"] in users_in_tenant: + util.print_black_light(f'User {user["username"]} exists.') + continue + d_user = api.create_user(tenant_id=tenant["id"], params={ + "active": 1, + "username": user["username"], + "password": args.password, + "main_license_package_id": super_admin_package_id, + "language": "pl", + "change_avatar_allowed": 1, + "change_on_leave_allowed": 1, + "on_leave": 0, + "system_role": [], + "tenant_role": [] + }) + + user_mapping[user["username"]] = d_user["id"] + + if not super_tenant_user_id: + super_tenant_user_id = d_user["id"] + + if not tenant_api: + login_data = api.login_as_user(tenant_id=tenant["id"], tenant_user_id=super_tenant_user_id) + tenant_api = TenantAPI(app_domain) + tenant_api.initialize_user_login(login_data) + util.print_black_light(f"Wait for start TenantAPI") + tenant_api.wait_for_start() + util.print_green(f"TenantAPI Started") + + tenant_api.update_feature_tenant_user_call(d_user["id"], { + "call_enabled": 1, + "extension": user["extension"], + "click_to_dial_auto_answer": 1 + }) + + tenant_api.update_feature_tenant_user_consultant(d_user["id"], { + "work_state": "ONLINE" + }) + + tenant_api.update_feature_tenant_user_consultant(d_user["id"], { + "audio_enabled": 1, + "file_enabled": 1, + "chat_enabled": 1 + }) + + tenant_api.update_feature_tenant_user_hotdesk(d_user["id"], { + "hotdesk_enabled": 1, + "hotdesk_identifier": user["extension"], + "hotdesk_pin": user["extension"], + }) + + tenant_api.create_web_link({ + "name": "Web", + "tenant_user_id": d_user["id"], + "audio": 1, + "chat": 1, + "video": 1, + "call_timeout": 30, + "priority": 100, + "state": "ON", + "user_device_type": "WEBAPP" + }) + + if not tenant_api: + sys.exit() diff --git a/main.py b/main.py new file mode 100644 index 0000000..99948dc --- /dev/null +++ b/main.py @@ -0,0 +1,72 @@ +import argparse +import configparser +import os +import pathlib + +from conpeek_setup.file_generator import (generate_bind9, generate_env, generate_freeswitch, + generate_kamailio, generate_mariadb, + generate_metrics, generate_mongodb, generate_nginx, + generate_mail_relay, generate_rabbitmq, + generate_tokens, generate_cert) + +from conpeek_setup import util + + +def validate_config(config): + sections_to_validate = [ + "deployment_purpose", + "bind9", + "new_machine_network", + "machine_secrets", + "operator" + ] + + for section in sections_to_validate: + if not config.has_section(section): + util.print_red(f"No {section} section in config") + raise Exception(f"No {section} section in config") + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="") + parser.add_argument("--action", type=str, required=True, help="Action") + parser.add_argument("--config", type=str, required=True, help="Path to the config file") + parser.add_argument("--output-path", type=str, required=False, help="Path to the output") + parser.add_argument("--dev", help="Developer mode", action="store_true") + + args = parser.parse_args() + action = args.action + config = configparser.ConfigParser() + + config_directory = args.config + if not os.path.abspath(config_directory): + config_directory = os.path.join(pathlib.Path(__file__).parent.resolve(), config_directory) + + config.read(config_directory) + if args.output_path: + util.Settings.output_directory = args.output_path + + validate_config(config) + generate_tokens.run(config) + + if action == "mariadb" or action == "all": + generate_mariadb.run(config) + if action == "mongodb" or action == "all": + generate_mongodb.run(config) + if action == "rabbitmq" or action == "all": + generate_rabbitmq.run(config) + if action == "bind9" or action == "all": + generate_bind9.run(config, args.dev) + if action == "nginx" or action == "all": + generate_nginx.run(config, args.dev) + if action == "freeswitch" or action == "all": + generate_freeswitch.run(config) + if action == "kamailio" or action == "all": + generate_kamailio.run(config) + if action == "metrics" or action == "all": + generate_metrics.run(config) + if action == "mail_relay" or action == "all": + generate_mail_relay.run(config) + if action == "cert" or action == "all": + generate_cert.run(config) + if action == "env" or action == "all": + generate_env.run(config) diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..ce22a0a --- /dev/null +++ b/setup.py @@ -0,0 +1,20 @@ +from setuptools import setup, find_packages +setup( + name='conpeek_setup', + version='0.1.0', + packages=find_packages(), + include_package_data=True, + description='Conpeek Setup', + classifiers=[ + 'Programming Language :: Python :: 3', + 'License :: OSI Approved :: MIT License', + 'Operating System :: OS Independent', + ], + python_requires='>=3.6', + entry_points={ + 'console_scripts': [ + 'conpeek_setup=conpeek_setup.main:main', + ], + }, + install_requires=[''] +) \ No newline at end of file diff --git a/templates/basic_indexes_tenant_data.json b/templates/basic_indexes_tenant_data.json new file mode 100644 index 0000000..1c61eb5 --- /dev/null +++ b/templates/basic_indexes_tenant_data.json @@ -0,0 +1,78 @@ +{ + "session_server_name": "sessionserver1", + "state_machine_server_name": "statemachine01", + "private_api_port": 9100, + "public_api_port": 9000, + "wss_port": 9200, + "monitoring_initial_api_port": 9300, + "monitoring_initial_wss_port": 9400, + "file_server_name": "fileserver1", + "file_server_api_port": 10000, + "cdr_server_name": "cdrserver1", + "cdr_server_api_port": 9700, + "api_tenant_name": "tenantapiserver1", + "api_tenant_port": 7100, + "api_tenant_web_polling_name": "poll1", + "api_tenant_web_polling_port": 7200, + "operator_api_server_response_name": "operatorapiserver1", + "operator_api_server_response_port": 7400, + "report_server_name": "reportserver1", + "report_server_api_port": 13000, + "local_contact_db_name": "localcontactdb1", + "local_contact_db_api_port": 8600, + "local_contact_db_public_api_port": 14700, + "hubspot_server_name": "hubspotserver1", + "hubspot_server_api_port": 8300, + "hubspot_server_public_api_port": 8400, + "messaging_server_name": "messagingserver1", + "messaging_server_public_api_port": 15500, + "messaging_server_private_api_port": "15200", + "messaging_server_wss_port": "15100", + "ticketing_server_name": "ticketingserver1", + "ticketing_server_api_port": "16100", + "gus_server_name": "gusserver1", + "gus_server_public_api_port": "10400", + "meets_server_name": "meets", + "meets_server_port": "7001", + "tenant_login_api_server_name": "tenant-login-api", + "tenant_login_api_server_port": 7000, + "tenant_login_api_server_service_name": "tenantloginapiserver1", + "user_notification_server_name": "usernotification1", + "user_notification_server_wss_port": 8100, + "freeswitch_name": "fs1", + "tenant_plugin_api_server_name": "tenantpluginapiserver1", + "tenant_plugin_api_server_initial_application_port": "7600", + "tenant_bss_api_server_name": "bssserver1", + "tenant_bss_api_server_initial_application_port": "8000", + "mongo_replset_name": "conpeek", + "mongo_domain_name": "mongo1", + "gateway_server_name": "gw1", + "gw_pool_name": "gwpool1", + "sms_server_name": "smsserver1", + "sms_server_api_port": "14600", + "sms_server_public_api_port": "14500", + "bot_server_id": 1, + "bot_server_name": "botserver1", + "bot_server_api_port": "16700", + "bot_train_server_id": 1, + "bot_train_server_name": "bottrainserver1", + "kamailio_name": "kamailio1", + "fs_pool_name": "fspool1", + "facebook_server_name": "facebookserver1", + "facebook_server_api_port": "7800", + "facebook_server_public_api_port": "15600", + "mailbox_server_name": "mailboxserver1", + "mailbox_server_api_port": "11700", + "mailbox_server_public_api_port": "16400", + "provisioning_server_name": "provisioning1", + "provisioning_server_initial_application_port": 7700, + "provisioning_server_initial_management_port": 4600, + "messagebird_server_name": "messagebirdserver1", + "messagebird_server_public_api_port": 11800, + "messagebird_server_api_port": 11900, + "messagebird_server_private_api_port": 12000, + "coturn_min_port": 12288, + "coturn_max_port": 16383, + "coturn_realm": "conpeek.com" + +} diff --git a/templates/bind9/access_zone.tmpl b/templates/bind9/access_zone.tmpl new file mode 100644 index 0000000..76ed559 --- /dev/null +++ b/templates/bind9/access_zone.tmpl @@ -0,0 +1,105 @@ +$TTL 300 +@ IN SOA ns1.{{ app_installation_domain }}. root.{{ app_installation_domain }}. ( + {{ serial_number }} ; serial + 300 ; refresh, seconds + 300 ; retry, seconds + 300 ; expire, seconds + 300 ) ; minimum TTL, seconds + +@ IN NS ns1.{{ app_installation_domain }}. +ns1 IN A {{ access_ip }} + + +; SIP for Kamailio components + +sip-kamailio1 IN A {{ access_ip }}; +*.sip-kamailio1 IN A {{ access_ip }}; + + +ntp IN A {{ access_ip }} +docs IN A {{ access_ip }} + +; NAPTR +line-fspool1 NAPTR 10 100 "S" "SIP+D2U" "" _sip._udp.line-fspool1; + +; SRV fs1 +_sip._udp.line-fspool1 SRV 10 100 5070 line-fs1 + +; A fs1 +{% if kamailio_nat %}line-fs1 IN A {{ core_ip }};{% else %}line-fs1 IN A {{ access_ip }};{% endif %} +verto-routing-fs1 IN A {{ access_ip }}; +verto-stun-fs1 IN A {{ access_ip }}; +verto-no-stun-fs1 IN A {{ access_ip }}; +verto-ext-stun-fs1 IN A {{ access_ip }}; +verto-ext-no-stun-fs1 IN A {{ access_ip }}; +stun-fs1 IN A {{ access_ip }}; + +gen-provisioning1 IN A {{ access_ip }}; +files IN A {{ access_ip }}; +f4c27bf2-912b-4aa7-ade9-b158bebcb349-prov IN A {{ access_ip }}; + +app IN A {{ access_ip }}; +{% if developer_mode %}app-prod IN A {{ access_ip }};{% endif -%} +desk IN A {{ access_ip }}; +operator IN A {{ access_ip }}; +systemapp IN A {{ access_ip }}; +device IN A {{ access_ip }}; +wallboard IN A {{ access_ip }}; +tenant-login-api IN A {{ access_ip }}; +invitation IN A {{ access_ip }}; +meets IN A {{ access_ip }}; +poll1 IN A {{ access_ip }}; +tenantpluginapiserver1 IN A {{ access_ip }}; +public-api-sessionserver1 IN A {{ access_ip }}; +public-api-mailboxserver1 IN A {{ access_ip }}; +wss-sessionserver1 IN A {{ access_ip }}; +wss-monitoring-sessionserver1 IN A {{ access_ip }}; +api-monitoring-sessionserver1 IN A {{ access_ip }}; +api-messagingserver1 IN A {{ access_ip }}; +wss-messagingserver1 IN A {{ access_ip }}; +api-botserver1 IN A {{ access_ip }}; +api-tenantapiserver1 IN A {{ access_ip }}; +api-bssserver1 IN A {{ access_ip }}; +api-gusserver1 IN A {{ access_ip }}; +api-teamviewerserver1 IN A {{ access_ip }}; +api-localcontactdb1 IN A {{ access_ip }}; +public-api-localcontactdb1 IN A {{ access_ip }}; +api-idenfyserver1 IN A {{ access_ip }}; +api-hubspotserver1 IN A {{ access_ip }}; +api-system IN A {{ access_ip }}; +api-operatorapiserver1 IN A {{ access_ip }}; +api-fileserver1 IN A {{ access_ip }}; +api-cdrserver1 IN A {{ access_ip }}; +api-reportserver1 IN A {{ access_ip }}; +api-messagingserver1 IN A {{ access_ip }}; +api-messagebirdserver1 IN A {{ access_ip }}; +api-facebookserver1 IN A {{ access_ip }}; +api-smsserver1 IN A {{ access_ip }}; +public-api-smsserver1 IN A {{ access_ip }}; +wss-messagingserver1 IN A {{ access_ip }}; +api-bookingsync-messagingserver1 IN A {{ access_ip }}; +public-api-bookingsync-messagingserver1 IN A {{ access_ip }}; +wss-usernotification1 IN A {{ access_ip }}; +{{ app_installation_domain }} IN MX 20 {{ app_installation_domain }} +{{ app_installation_domain }} IN A {{ access_ip }}; +docs IN A {{ access_ip }}; +grafana IN A {{ access_ip }}; +api-ticketingserver1 IN A {{ access_ip }}; +api-mailboxserver1 IN A {{ access_ip }}; +api-mailboxserver1 IN A {{ access_ip }}; +desk IN A {{ access_ip }}; +conpeek-exporter IN A {{ access_ip }}; +statsd-exporter IN A {{ access_ip }}; +statsd-api-exporter IN A {{ access_ip }}; +ping-exporter IN A {{ access_ip }}; +node-exporter IN A {{ access_ip }}; +freeswitch-exporter IN A {{ access_ip }}; +process-exporter IN A {{ access_ip }}; +docker-exporter IN A {{ access_ip }}; + +;releay configuration +* IN TXT "v=spf1 a mx ip4:{{ access_ip }} ~all" +@ IN TXT "v=spf1 a mx ip4:{{ access_ip }} ~all" +* IN MX 20 mail +@ IN MX 20 mail +mail IN A {{ access_ip }}; diff --git a/templates/bind9/named.conf b/templates/bind9/named.conf new file mode 100644 index 0000000..1af7f73 --- /dev/null +++ b/templates/bind9/named.conf @@ -0,0 +1,13 @@ +// This is the primary configuration file for the BIND DNS server named. +// +// Please read /usr/share/doc/bind9/README.Debian.gz for information on the +// structure of BIND configuration files in Debian, *BEFORE* you customize +// this configuration file. +// +// If you are just adding zones, please do that in /etc/bind/named.conf.local + +include "/etc/bind/named.conf.options"; +include "/etc/bind/named.conf.local"; +include "/etc/bind/named.conf.access_network"; +include "/etc/bind/named.conf.system_network"; +include "/etc/bind/named.conf.default-zones"; diff --git a/templates/bind9/named.conf.access_network.tmpl b/templates/bind9/named.conf.access_network.tmpl new file mode 100644 index 0000000..e0378b4 --- /dev/null +++ b/templates/bind9/named.conf.access_network.tmpl @@ -0,0 +1,5 @@ +zone "{{ NETWORK_DOMAIN }}" IN { + type master; + file "db.{{ NETWORK_DOMAIN }}"; + allow-update { none; }; +}; diff --git a/templates/bind9/named.conf.options.tmpl b/templates/bind9/named.conf.options.tmpl new file mode 100644 index 0000000..692ed73 --- /dev/null +++ b/templates/bind9/named.conf.options.tmpl @@ -0,0 +1,18 @@ +options { + directory "/var/cache/bind"; + + forwarders { + {{ forward_dns }} + }; + + recursion yes; + + allow-query { any; }; + allow-recursion { localhost; localnets; }; + allow-transfer { none; }; + + dnssec-validation auto; + + auth-nxdomain no; # conform to RFC1035 + listen-on-v6 { any; }; +}; diff --git a/templates/bind9/named.conf.system_network.tmpl b/templates/bind9/named.conf.system_network.tmpl new file mode 100644 index 0000000..e38aeae --- /dev/null +++ b/templates/bind9/named.conf.system_network.tmpl @@ -0,0 +1,6 @@ +zone "{{ NETWORK_DOMAIN }}" IN { + type master; + file "db.{{ NETWORK_DOMAIN }}"; + allow-update { none; }; + check-names ignore; +}; diff --git a/templates/bind9/system_zone.tmpl b/templates/bind9/system_zone.tmpl new file mode 100644 index 0000000..2de94a2 --- /dev/null +++ b/templates/bind9/system_zone.tmpl @@ -0,0 +1,42 @@ +$TTL 300 +@ IN SOA ns1.{{ system_app_installation_domain }}. root.{{ system_app_installation_domain }}. ( + {{ serial_number }} ; serial + 300 ; refresh, seconds + 300 ; retry, seconds + 300 ; expire, seconds + 300 ) ; minimum TTL, seconds + + +@ IN NS ns1.{{ system_app_installation_domain }}. +ns1 IN A {{ core_ip }} + +; NAPTR +gateway-fspool1 NAPTR 10 100 "S" "SIP+D2U" "" _sip._udp.gateway-fspool1; + +; SRV fs1 +_sip._udp.gateway-fspool1 SRV 10 100 5080 gateway-fs1 + +; A fs1 +gateway-fs1 IN A {{ core_ip }}; +mi-fs1 IN A {{ core_ip }}; +api-fs1 IN A {{ core_ip }}; +; NAPTR +internal-gwpool1 NAPTR 10 100 "S" "SIP+D2U" "" _sip._udp.internal-gwpool1; +_sip._udp.internal-gwpool1 SRV 10 100 5090 internal-gw1 + +internal-gw1 IN A {{ core_ip }}; +mi-gw1 IN A {{ core_ip }}; + +mi-tenantloginapiserver1 IN A {{ core_ip }}; +private-api-sessionserver1 IN A {{ core_ip }}; +mi-sessionserver1 IN A {{ core_ip }}; +private-api-api-monitoring-sessionserver1 IN A {{ core_ip }}; +mi-api-monitoring-sessionserver1 IN A {{ core_ip }}; +mi-tenantapiserver1 IN A {{ core_ip }}; +mi-systemapiserver1 IN A {{ core_ip }}; +mi-operatorapiserver1 IN A {{ core_ip }}; +mi-fileserver1 IN A {{ core_ip }}; +mi-cdrserver1 IN A {{ core_ip }}; +mi-localcontactdb1 IN A {{ core_ip }}; +mi-hubspotserver1 IN A {{ core_ip }}; +mongo-mongo1 IN A {{ core_ip }}; diff --git a/templates/compose_dev/10_proxy_compose.yml b/templates/compose_dev/10_proxy_compose.yml new file mode 100644 index 0000000..22c3248 --- /dev/null +++ b/templates/compose_dev/10_proxy_compose.yml @@ -0,0 +1,47 @@ +version: '3.8' + +x-default_config: &default_config + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + +services: + frontend: + image: ${REGISTRY_NAME}frontend:${TAG} + container_name: frontend + network_mode: host + volumes: + - ${CONFIG_FOLDER}/custom/frontend:/custom + - ${CONFIG_FOLDER}/custom/frontend/custom.sh:/docker-entrypoint.d/90-conpeek-custom.sh + - ${CONFIG_FOLDER}/nginx/frontend:/srv/conpeek/app + - ${CONFIG_FOLDER}/nginx/frontend/app_desk:/srv/conpeek/app_desk + - ${CONFIG_FOLDER}/nginx/frontend/app_tenant:/srv/conpeek/app_tenant + - ${CONFIG_FOLDER}/nginx/frontend/app_operator:/srv/conpeek/app_operator + - ${CONFIG_FOLDER}/nginx/frontend/app_wallboard:/srv/conpeek/app_wallboard + - ${SOURCE_CODE_LOCATION}/apis:/srv/conpeek/apis + - ${SOURCE_CODE_LOCATION}/documentation/sdk/site:/srv/conpeek/docs/sdk + - ${SOURCE_CODE_LOCATION}/documentation/api/v1_3/site:/srv/conpeek/docs/api_v1_3 + - ${SOURCE_CODE_LOCATION}/documentation/instruction/site:/srv/conpeek/docs/instruction + - ${SOURCE_CODE_LOCATION}/documentation/troubleshooting/site:/srv/conpeek/docs/troubleshooting + - ${NGINX_CONF_LOCATION}/nginx.conf_frontend:/etc/nginx/nginx.conf + - ${NGINX_CONF_LOCATION}/frontend:/etc/nginx/conf.d + <<: *default_config + reverse_proxy: + image: docker.io/library/nginx:latest + network_mode: host + container_name: reverse_proxy + volumes: + - ${NGINX_CONF_LOCATION}/nginx.conf:/etc/nginx/nginx.conf + - ${NGINX_CONF_LOCATION}/reverse_proxy:/etc/nginx/sites-enabled + - type: bind + source: ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt + target: /etc/ssl/certs/conpeek_ssl.crt + - type: bind + source: ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key + target: /etc/ssl/private/conpeek_ssl.key + command: ['nginx', '-g daemon off;'] + <<: *default_config + diff --git a/templates/compose_dev/20_server_compose.yml b/templates/compose_dev/20_server_compose.yml new file mode 100644 index 0000000..ab609dd --- /dev/null +++ b/templates/compose_dev/20_server_compose.yml @@ -0,0 +1,93 @@ +version: '3.8' + +x-default_config: &default_config + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek + +services: + api_tenant_login: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: api_tenant_login + entrypoint: ["python", "apis/api_tenant_login/main.py"] + command: ['-P', '7000', '-n', '${API_TENANT_LOGIN_SERVER_NAME}'] + <<: *default_config + api_operator: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: api_operator + entrypoint: ["python", "apis/api_operator/main.py"] + command: ['-P', '7400', '-n', '${API_OPERATOR_SERVER_NAME}'] + <<: *default_config + sms_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: sms_server + entrypoint: [ "python", "services/messaging/sms_server/main.py" ] + command: ['-n', '${SMS_SERVER_NAME}'] + <<: *default_config + facebook_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: facebook_server + entrypoint: [ "python", "services/messaging/facebook_server/main.py" ] + command: ['-n', '${FACEBOOK_SERVER_NAME}'] + <<: *default_config + gus_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: gus_server + entrypoint: [ "python", "services/gus_server/main.py" ] + command: ['-n', '${GUS_SERVER_NAME}'] + <<: *default_config + hubspot_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: hubspot_server + entrypoint: [ "python", "contact_database/hubspot/hubspot_server/main.py" ] + command: ['-n', '${HUBSPOT_SERVER_NAME}'] + <<: *default_config + user_notification_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: user_notification_server + entrypoint: [ "python", "services/user_notification_server/main.py" ] + command: ['-n', '${USER_NOTIFICATION_NAME}'] + <<: *default_config + ticketing_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: ticketing_server + entrypoint: [ "python", "services/ticketing_server/main.py" ] + command: [ '-n', '${TICKETING_SERVER_NAME}' ] + <<: *default_config + meets_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: meets_server + entrypoint: [ "python", "services/meets_server/main.py" ] + command: [ '-n', '${MEETS_SERVER_NAME}' ] + <<: *default_config + mail_relay: + image: ${REGISTRY_NAME}mail_transport_agent:${TAG} + container_name: mail_relay + volumes: + - ${CONFIG_FOLDER}/mail_relay/main.cf:/etc/postfix/main.cf + - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek_ssl.crt + - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek_ssl.key + <<: *default_config + bot_server: + image: ${REGISTRY_NAME}python_dev:bot_server_latest + container_name: bot_server + entrypoint: [ "python", "services/bot_server/main.py" ] + command: [ '-n', '${BOT_SERVER_NAME}' ] + volumes: + - /data/conpeek_data:/data + <<: *default_config + bot_train_server: + image: ${REGISTRY_NAME}python_dev:bot_train_server_latest + container_name: bot_train_server + entrypoint: [ "python", "services/bot_train_server/main.py" ] + command: [ '-n', '${BOT_TRAIN_SERVER_NAME}' ] + volumes: + - /data/conpeek_data:/data + <<: *default_config diff --git a/templates/compose_dev/30_tenant_compose.yml b/templates/compose_dev/30_tenant_compose.yml new file mode 100644 index 0000000..0bf9c3c --- /dev/null +++ b/templates/compose_dev/30_tenant_compose.yml @@ -0,0 +1,138 @@ +version: '3.8' + +x-default_config: &default_config + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek + +services: + api_tenant: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: api_tenant + entrypoint: [ "python", "apis/api_tenant/main.py" ] + command: ['-n', '${API_TENANT_SERVER_NAME}', '-P', '${API_TENANT_PORT}'] + <<: *default_config + session_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: session_server + entrypoint: [ "python", "services/session_server/main.py" ] + command: ['-n', '${SESSION_SERVER_NAME}'] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek + - /data/conpeek_data:/data + - /tmp:/tmp + report_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: report_server + entrypoint: [ "python", "services/report_server/main.py" ] + command: ['-n', '${REPORT_SERVER_NAME}'] + mem_limit: 2G + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek + - /tmp:/tmp + file_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: file_server + entrypoint: [ "python", "services/file_server/main.py" ] + command: ['-n', '${FILE_SERVER_NAME}'] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek + - /tmp:/tmp + - /data/recording:/recording + - /files/recording:/data + monitoring_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: monitoring_server + entrypoint: [ "python", "services/monitoring_server/main.py" ] + command: ['-n', '${SESSION_SERVER_NAME}'] + <<: *default_config + messaging_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: messaging_server + entrypoint: [ "python", "services/messaging/messaging_server/main.py" ] + command: ['-n', '${MESSAGING_SERVER_NAME}'] + <<: *default_config + mailbox_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: mailbox_server + entrypoint: [ "python", "services/messaging/mailbox_server/main.py" ] + command: ['-n', '${MAILBOX_SERVER_NAME}'] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek + - /tmp:/tmp + - /data/conpeek_data:/data + messagebird_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: messagebird_server + entrypoint: [ "python", "services/messaging/messagebird_server/main.py" ] + command: ['-n', '${MESSAGEBIRD_SERVER_NAME}'] + <<: *default_config + bss_api_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: bss_api_server + entrypoint: [ "python", "services/bss_api_server/main.py" ] + command: ['-n', '${BSS_SERVER_NAME}', '-P', '${BSS_SERVER_PORT}'] + <<: *default_config + cdr_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: cdr_server + entrypoint: [ "python", "services/cdr_server/main.py" ] + command: ['-n', '${CDR_SERVER_NAME}'] + <<: *default_config + local_contact_db_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: local_contact_db_server + entrypoint: [ "python", "contact_database/local/local_contact_db_server/main.py" ] + command: ['-n', '${LOCAL_CONTACT_DB_SERVER_NAME}'] + <<: *default_config + provisioning_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: provisioning_server + entrypoint: [ "python", "services/provisioning_server/main.py" ] + command: ['-n', '${PROVISIONING_SERVER_NAME}', '-P', '${PROVISIONING_SERVER_PORT}'] + <<: *default_config + api_tenant_plugin: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: api_tenant_plugin + entrypoint: [ "python", "apis/api_tenant_plugin/main.py" ] + command: ['-n', '${API_TENANT_PLUGIN_SERVER_NAME}', '-P', '${API_TENANT_PLUGIN_SERVER_PORT}'] + <<: *default_config diff --git a/templates/compose_dev/40_calling_compose.yml b/templates/compose_dev/40_calling_compose.yml new file mode 100644 index 0000000..f42a7ba --- /dev/null +++ b/templates/compose_dev/40_calling_compose.yml @@ -0,0 +1,110 @@ +version: '3.8' + +x-default_config: &default_config + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek + +services: + fs_amqp_connector: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: fs_amqp_connector + entrypoint: ["python", "services/fs_amqp_connector/main.py"] + command: ['-n', '${FS_NAME}'] + <<: *default_config + fs_directory_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: fs_directory_server + entrypoint: [ "python", "services/fs_directory_server/main.py" ] + command: ['-n', '${FS_NAME}'] + <<: *default_config + gateway_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: gateway_server + entrypoint: [ "python", "services/gateway_server/main.py" ] + command: ['-n', '${GW_NAME}'] + <<: *default_config + kamailio: + image: ${REGISTRY_NAME}kamailio:clear + container_name: kamailio + command: ['-l', 'udp:${INTERNAL_IP}:5060', '-l', 'tcp:${INTERNAL_IP}:5060', '-l', 'tls:${INTERNAL_IP}:5061'] + volumes: + - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek.crt + - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek.key + - ${CONFIG_FOLDER}/kamailio/kamailio_server.py:/usr/local/conpeek/kamailio/kamailio_server.py + - ${CONFIG_FOLDER}/kamailio/kamailio.cfg:/usr/local/conpeek/kamailio/kamailio.cfg + - ${CONFIG_FOLDER}/kamailio/kamailio-python.cfg:/etc/kamailio/kamailio-python.cfg + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + freeswitch: + image: ${REGISTRY_NAME}freeswitch:v1.10.11 + container_name: freeswitch + volumes: + - ${CONFIG_FOLDER}/freeswitch/conf:/usr/local/freeswitch/conf + - /tmp:/tmp + - /data/recording:/recording + - /data/conpeek_data:/data + - /data/pcaps:/data/pcaps + - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek_ssl.crt + - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek_ssl.key + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + coturn: + image: docker.io/coturn/coturn + container_name: coturn + network_mode: host + environment: + - TURNSERVER_ENABLED=1 + command: [ '-n', '--listening-ip=${INTERNAL_IP}', '--min-port=${COTURN_MIN_PORT}', '--max-port=${COTURN_MAX_PORT}', '--fingerprint', '--use-auth-secret', '--static-auth-secret=${COTURN_STATIC_SECRET}', '--realm=${COTURN_REALM}', '--no-stun', '--no-tlsv1', '--no-tlsv1_1', '--relay-ip=${INTERNAL_IP}' ] + <<: *default_config + fs_amd_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: fs_amd_server + entrypoint: [ "python", "services/fs_amd_server/main.py" ] + command: [ '-n', '${FS_NAME}', '-i', 'lo', '--save-recording=0' ] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + cap_add: + - NET_ADMIN + - NET_RAW + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek + - /data/recording:/recording + fs_bot_recorder: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: fs_bot_recorder + command: ['-n', '${FS_NAME}', '-i', 'lo', '--deep-logging=1', '--save-recording=1'] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek + - /data/recording:/recording diff --git a/templates/compose_dev/50_statistic_compose.yml b/templates/compose_dev/50_statistic_compose.yml new file mode 100644 index 0000000..5f1d4c0 --- /dev/null +++ b/templates/compose_dev/50_statistic_compose.yml @@ -0,0 +1,51 @@ +version: '3.8' + +x-default_config: &default_config + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - ${SOURCE_CODE_LOCATION}:/usr/local/conpeek + +services: + project_statistic_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: project_statistics_server + entrypoint: [ "python", "services/project_statistics_server/main.py" ] + command: ['-n', '${SESSION_SERVER_NAME}'] + <<: *default_config + ivr_statistics_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: ivr_statistics_server + entrypoint: [ "python", "services/ivr_statistics_server/main.py" ] + command: ['-n', '${SESSION_SERVER_NAME}'] + <<: *default_config + voice_campaign_statistics_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: voice_campaign_statistics_server + entrypoint: [ "python", "services/voice_campaign_statistics_server/main.py" ] + command: ['-n', '${SESSION_SERVER_NAME}'] + <<: *default_config + consultant_statistics_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: consultant_statistics_server + entrypoint: [ "python", "services/consultant_statistics_server/main.py" ] + command: ['-n', '${SESSION_SERVER_NAME}'] + <<: *default_config + conversation_statistics_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: conversation_statistics_server + entrypoint: [ "python", "services/conversation_statistics_server/main.py" ] + command: ['-n', '${MESSAGING_SERVER_NAME}'] + <<: *default_config + ticketing_statistics_server: + image: ${REGISTRY_NAME}python_dev:${TAG} + container_name: ticketing_statistics_server + entrypoint: [ "python", "services/ticketing_statistics_server/main.py" ] + command: ['-n', '${TICKETING_SERVER_NAME}'] + <<: *default_config \ No newline at end of file diff --git a/templates/compose_dev/60_metrics_compose.yml b/templates/compose_dev/60_metrics_compose.yml new file mode 100644 index 0000000..109fef7 --- /dev/null +++ b/templates/compose_dev/60_metrics_compose.yml @@ -0,0 +1,58 @@ +version: '3.8' + +x-default_config: &default_config + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + log-opt: + max-size: "5m" + max-file: "3" + +services: + node_exporter: + image: docker.io/prom/node-exporter:latest + container_name: node_exporter + command: + - '--path.procfs=/host/proc' + - '--path.rootfs=/rootfs' + - '--path.sysfs=/host/sys' + - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)(2278805|/)' + - '--web.config.file=/etc/node_exporter/config.yml' + - '--web.listen-address=:9854' + volumes: + - /proc:/host/proc:ro + - /sys:/host/sys:ro + - /:/rootfs:ro + - ${CONFIG_FOLDER}/metrics/node_exporter.yml:/etc/node_exporter/config.yml + <<: *default_config + statsd_exporter: + image: docker.io/statsd/statsd:latest + container_name: statsd + command: + - '--web.listen-address=${INTERNAL_IP}:9851' + - '--statsd.listen-udp=127.0.0.1:9852' + - '--statsd.listen-tcp=127.0.0.1:9852' + - '--log.level=error' + - '--web.telemetry-path=/QuFreT5ESqu8d2DsxpyH' + <<: *default_config + docker_exporter: + image: gcr.io/cadvisor/cadvisor:latest + container_name: docker_exporter + command: + - '--port=9857' + - '--podman=unix:///var/run/podman/podman.sock' + volumes: + - /:/rootfs:ro + - /var/run:/var/run:ro + - /sys:/sys:ro + - /var/lib/docker/:/var/lib/docker:ro + - /dev/disk/:/dev/disk:ro + <<: *default_config + prometheus_exporter: + image: ${REGISTRY_NAME}prometheus_exporter:${TAG} + container_name: prometheus_exporter + command: [ '-n', '${PROMETHEUS_EXPORTER_NAME}' ] + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + <<: *default_config \ No newline at end of file diff --git a/templates/compose_dev/notatki b/templates/compose_dev/notatki new file mode 100644 index 0000000..9df3847 --- /dev/null +++ b/templates/compose_dev/notatki @@ -0,0 +1,38 @@ +dla dev: + +1. dodatkowe directory: `/files/conpeek_setup/nginx/frontend` - linkowane jest tutaj `/data/conpeek/web/app` +2. dodatkowy wpis w pliku config.env: `SOURCE_CODE_LOCATION` - domyślnie powinno być do `/data/conpeek` +3. pobranie exta z naszego cepha + +``` +aws configure set aws_access_key_id KLFTL3QDGULEC53UDWAV +aws confifure set aws_secres_access_key P6ojz6CFWAtAUvGfsFFIwx2vdzqLFuTjcdJYEz4 +aws configure set s3.endpoint_url 10.103.10.1:7480 +aws s3 cp s3://build-static-files/extjs/7.4.0.45/ext.tar.gz . --endpoint=http://10.103.10.1:7480 + +tar -xzvf ext.tar.gz +rm -f ext.tar.gz +``` + +4. instalator powinien budować frontend: + +``` +export OPENSSL_CONF=/dev/null +mkdir /opt/repo +chown -R developer:super /opt/repo +chmod 775 /opt/repo +cd ${SOURCE_CODE_LOCATION}/web/app/app_tenant +sencha app build production +sencha app build development +cd ${SOURCE_CODE_LOCATION}/web/app/app_operator +sencha app build production +sencha app build development +cd ${SOURCE_CODE_LOCATION}/web/app/app_desk +sencha app build production +sencha app build development +cd ${SOURCE_CODE_LOCAITON}/web/app/app_wallboard +sencha app build production +sencha app build development +``` + +5. dodać logowanie do s3 przy instalacji developerskiej \ No newline at end of file diff --git a/templates/compose_prod/10_proxy_compose.yml b/templates/compose_prod/10_proxy_compose.yml new file mode 100644 index 0000000..4becf46 --- /dev/null +++ b/templates/compose_prod/10_proxy_compose.yml @@ -0,0 +1,37 @@ +version: '3.8' + +x-default_config: &default_config + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + +services: + frontend: + image: ${REGISTRY_NAME}/frontend:${TAG} + container_name: frontend + network_mode: host + volumes: + - ${NGINX_CONF_LOCATION}/nginx.conf_frontend:/etc/nginx/nginx.conf + - ${NGINX_CONF_LOCATION}/frontend:/etc/nginx/conf.d + - ${CONFIG_FOLDER}/custom/frontend:/custom + - ${CONFIG_FOLDER}/custom/frontend/custom.sh:/docker-entrypoint.d/90-conpeek-custom.sh + <<: *default_config + reverse_proxy: + image: docker.io/library/nginx:latest + network_mode: host + container_name: reverse_proxy + volumes: + - ${NGINX_CONF_LOCATION}/nginx.conf:/etc/nginx/nginx.conf + - ${NGINX_CONF_LOCATION}/reverse_proxy:/etc/nginx/sites-enabled + - type: bind + source: ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt + target: /etc/ssl/certs/conpeek_ssl.crt + - type: bind + source: ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key + target: /etc/ssl/private/conpeek_ssl.key + command: ['nginx', '-g daemon off;'] + <<: *default_config + diff --git a/templates/compose_prod/20_server_compose.yml b/templates/compose_prod/20_server_compose.yml new file mode 100644 index 0000000..1f58f57 --- /dev/null +++ b/templates/compose_prod/20_server_compose.yml @@ -0,0 +1,95 @@ +version: '3.8' + +x-default_config: &default_config + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + +services: + api_tenant_login: + image: ${REGISTRY_NAME}/api_tenant_login:${TAG} + container_name: api_tenant_login + command: ['-P', '7000', '-n', '${API_TENANT_LOGIN_SERVER_NAME}'] + <<: *default_config + api_operator: + image: ${REGISTRY_NAME}/api_operator:${TAG} + container_name: api_operator + command: ['-P', '7400', '-n', '${API_OPERATOR_SERVER_NAME}'] + <<: *default_config + sms_server: + image: ${REGISTRY_NAME}/sms_server:${TAG} + container_name: sms_server + command: ['-n', '${SMS_SERVER_NAME}'] + <<: *default_config + facebook_server: + image: ${REGISTRY_NAME}/facebook_server:${TAG} + container_name: facebook_server + command: ['-n', '${FACEBOOK_SERVER_NAME}'] + <<: *default_config + gus_server: + image: ${REGISTRY_NAME}/gus_server:${TAG} + container_name: gus_server + command: ['-n', '${GUS_SERVER_NAME}'] + <<: *default_config + hubspot_server: + image: ${REGISTRY_NAME}/hubspot_server:${TAG} + container_name: hubspot_server + command: ['-n', '${HUBSPOT_SERVER_NAME}'] + <<: *default_config + user_notification_server: + image: ${REGISTRY_NAME}/user_notification_server:${TAG} + container_name: user_notification_server + command: ['-n', '${USER_NOTIFICATION_NAME}'] + <<: *default_config + ticketing_server: + image: ${REGISTRY_NAME}/ticketing_server:${TAG} + container_name: ticketing_server + command: [ '-n', '${TICKETING_SERVER_NAME}' ] + <<: *default_config + meets_server: + image: ${REGISTRY_NAME}/meets_server:${TAG} + container_name: meets_server + command: [ '-n', '${MEETS_SERVER_NAME}' ] + <<: *default_config + mail_relay: + image: ${REGISTRY_NAME}/mail_transport_agent:${TAG} + container_name: mail_relay + volumes: + - ${CONFIG_FOLDER}/mail_relay/main.cf:/etc/postfix/main.cf + - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek_ssl.crt + - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek_ssl.key + <<: *default_config + bot_server: + image: ${REGISTRY_NAME}/bot_server:${TAG} + container_name: bot_server + command: [ '-n', '${BOT_SERVER_NAME}' ] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + volumes: + - /data/conpeek_data:/data + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + bot_train_server: + image: ${REGISTRY_NAME}/bot_train_server:${TAG} + container_name: bot_train_server + command: [ '-n', '${BOT_TRAIN_SERVER_NAME}' ] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + volumes: + - /data/conpeek_data:/data + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc diff --git a/templates/compose_prod/30_tenant_compose.yml b/templates/compose_prod/30_tenant_compose.yml new file mode 100644 index 0000000..e0c47bb --- /dev/null +++ b/templates/compose_prod/30_tenant_compose.yml @@ -0,0 +1,125 @@ +version: '3.8' + +x-default_config: &default_config + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + +services: + api_tenant: + image: ${REGISTRY_NAME}/api_tenant:${TAG} + container_name: api_tenant + command: ['-n', '${API_TENANT_SERVER_NAME}', '-P', '${API_TENANT_PORT}'] + <<: *default_config + session_server: + image: ${REGISTRY_NAME}/session_server:${TAG} + container_name: session_server + command: ['-n', '${SESSION_SERVER_NAME}'] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + volumes: + - /data/conpeek_data:/data + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - /tmp:/tmp + report_server: + image: ${REGISTRY_NAME}/report_server:${TAG} + container_name: report_server + command: ['-n', '${REPORT_SERVER_NAME}'] + mem_limit: 2G + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - /tmp:/tmp + file_server: + image: ${REGISTRY_NAME}/file_server:${TAG} + container_name: file_server + command: ['-n', '${FILE_SERVER_NAME}'] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - /tmp:/tmp + - /data/recording:/recording + - /data/conpeek_data:/data + monitoring_server: + image: ${REGISTRY_NAME}/monitoring_server:${TAG} + container_name: monitoring_server + command: ['-n', '${SESSION_SERVER_NAME}'] + <<: *default_config + messaging_server: + image: ${REGISTRY_NAME}/messaging_server:${TAG} + container_name: messaging_server + command: ['-n', '${MESSAGING_SERVER_NAME}'] + <<: *default_config + mailbox_server: + image: ${REGISTRY_NAME}/mailbox_server:${TAG} + container_name: mailbox_server + command: ['-n', '${MAILBOX_SERVER_NAME}'] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - /tmp:/tmp + - /data/conpeek_data:/data + messagebird_server: + image: ${REGISTRY_NAME}/messagebird_server:${TAG} + container_name: messagebird_server + command: ['-n', '${MESSAGEBIRD_SERVER_NAME}'] + <<: *default_config + bss_api_server: + image: ${REGISTRY_NAME}/bss_api_server:${TAG} + container_name: bss_api_server + command: ['-n', '${BSS_SERVER_NAME}', '-P', '${BSS_SERVER_PORT}'] + <<: *default_config + cdr_server: + image: ${REGISTRY_NAME}/cdr_server:${TAG} + container_name: cdr_server + command: ['-n', '${CDR_SERVER_NAME}'] + <<: *default_config + local_contact_db_server: + image: ${REGISTRY_NAME}/local_contact_db_server:${TAG} + container_name: local_contact_db_server + command: ['-n', '${LOCAL_CONTACT_DB_SERVER_NAME}'] + <<: *default_config + provisioning_server: + image: ${REGISTRY_NAME}/provisioning_server:${TAG} + container_name: provisioning_server + command: ['-n', '${PROVISIONING_SERVER_NAME}', '-P', '${PROVISIONING_SERVER_PORT}'] + <<: *default_config + api_tenant_plugin: + image: ${REGISTRY_NAME}/api_tenant_plugin:${TAG} + container_name: api_tenant_plugin + command: ['-n', '${API_TENANT_PLUGIN_SERVER_NAME}', '-P', '${API_TENANT_PLUGIN_SERVER_PORT}'] + <<: *default_config + api_tenant_web_polling: + image: ${REGISTRY_NAME}/api_tenant_web_polling:${TAG} + container_name: api_tenant_web_polling + command: ['-n', '${API_TENANT_WEB_POLLING_SERVER_NAME}', '-P', '${API_TENANT_WEB_POLLING_PORT}'] + <<: *default_config diff --git a/templates/compose_prod/40_calling_compose.yml b/templates/compose_prod/40_calling_compose.yml new file mode 100644 index 0000000..f488a08 --- /dev/null +++ b/templates/compose_prod/40_calling_compose.yml @@ -0,0 +1,103 @@ +version: '3.8' + +x-default_config: &default_config + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + +services: + fs_amqp_connector: + image: ${REGISTRY_NAME}/fs_amqp_connector:${TAG} + container_name: fs_amqp_connector + command: ['-n', '${FS_NAME}'] + <<: *default_config + fs_directory_server: + image: ${REGISTRY_NAME}/fs_directory_server:${TAG} + container_name: fs_directory_server + command: ['-n', '${FS_NAME}'] + <<: *default_config + gateway_server: + image: ${REGISTRY_NAME}/gateway_server:${TAG} + container_name: gateway_server + command: ['-n', '${GW_NAME}'] + <<: *default_config + kamailio: + image: ${REGISTRY_NAME}/kamailio:clear + container_name: kamailio + command: ['-l', 'udp:${INTERNAL_IP}:5060', '-l', 'tcp:${INTERNAL_IP}:5060', '-l', 'tls:${INTERNAL_IP}:5061'] + volumes: + - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek.crt + - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek.key + - ${CONFIG_FOLDER}/kamailio/kamailio_server.py:/usr/local/conpeek/kamailio/kamailio_server.py + - ${CONFIG_FOLDER}/kamailio/kamailio.cfg:/etc/kamailio.cfg + - ${CONFIG_FOLDER}/kamailio/kamailio-python.cfg:/etc/kamailio/kamailio-python.cfg + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + freeswitch: + image: ${REGISTRY_NAME}/freeswitch:${TAG} + container_name: freeswitch + volumes: + - ${CONFIG_FOLDER}/freeswitch/conf:/usr/local/freeswitch/conf + - /tmp:/tmp + - /data/recording:/recording + - /data/conpeek_data:/data + - /data/pcaps:/data/pcaps + - ${CONFIG_FOLDER}/etc/ssl/certs/conpeek_ssl.crt:/etc/ssl/certs/conpeek_ssl.crt + - ${CONFIG_FOLDER}/etc/ssl/private/conpeek_ssl.key:/etc/ssl/private/conpeek_ssl.key + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + coturn: + image: docker.io/coturn/coturn:4.6.2 + container_name: coturn + network_mode: host + environment: + - TURNSERVER_ENABLED=1 + command: [ '-n', '--listening-ip=${INTERNAL_IP}', '--min-port=${COTURN_MIN_PORT}', '--max-port=${COTURN_MAX_PORT}', '--fingerprint', '--use-auth-secret', '--static-auth-secret=${COTURN_STATIC_SECRET}', '--realm=${COTURN_REALM}', '--no-stun', '--no-tlsv1', '--no-tlsv1_1', '--relay-ip=${INTERNAL_IP}' ] + <<: *default_config + fs_amd_server: + image: ${REGISTRY_NAME}/fs_amd_server:${TAG} + container_name: fs_amd_server + command: [ '-n', '${FS_NAME}', '-i', 'lo', '--save-recording=0' ] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + cap_add: + - NET_ADMIN + - NET_RAW + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - /data/recording:/recording + fs_bot_recorder: + image: ${REGISTRY_NAME}/fs_bot_recorder:${TAG} + container_name: fs_bot_recorder + command: ['-n', '${FS_NAME}', '-i', 'lo', '--deep-logging=1', '--save-recording=1'] + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + - /data/recording:/recording diff --git a/templates/compose_prod/50_statistic_compose.yml b/templates/compose_prod/50_statistic_compose.yml new file mode 100644 index 0000000..66b3bf9 --- /dev/null +++ b/templates/compose_prod/50_statistic_compose.yml @@ -0,0 +1,46 @@ +version: '3.8' + +x-default_config: &default_config + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + +services: + project_statistic_server: + image: ${REGISTRY_NAME}/project_statistics_server:${TAG} + container_name: project_statistics_server + command: ['-n', '${SESSION_SERVER_NAME}'] + <<: *default_config + ivr_statistics_server: + image: ${REGISTRY_NAME}/ivr_statistics_server:${TAG} + container_name: ivr_statistics_server + command: ['-n', '${SESSION_SERVER_NAME}'] + <<: *default_config + voice_campaign_statistics_server: + image: ${REGISTRY_NAME}/voice_campaign_statistics_server:${TAG} + container_name: voice_campaign_statistics_server + command: ['-n', '${SESSION_SERVER_NAME}'] + <<: *default_config + consultant_statistics_server: + image: ${REGISTRY_NAME}/consultant_statistics_server:${TAG} + container_name: consultant_statistics_server + command: ['-n', '${SESSION_SERVER_NAME}'] + <<: *default_config + conversation_statistics_server: + image: ${REGISTRY_NAME}/conversation_statistics_server:${TAG} + container_name: conversation_statistics_server + command: ['-n', '${MESSAGING_SERVER_NAME}'] + <<: *default_config + ticketing_statistics_server: + image: ${REGISTRY_NAME}/ticketing_statistics_server:${TAG} + container_name: ticketing_statistics_server + command: ['-n', '${TICKETING_SERVER_NAME}'] + <<: *default_config + + diff --git a/templates/compose_prod/60_metrics_compose.yml b/templates/compose_prod/60_metrics_compose.yml new file mode 100644 index 0000000..a6b08dc --- /dev/null +++ b/templates/compose_prod/60_metrics_compose.yml @@ -0,0 +1,45 @@ +version: '3.8' + +x-default_config: &default_config + network_mode: host + restart: always + env_file: ${ENV_FILE} + logging: + options: + max-size: "5m" + max-file: "3" + +services: + node_exporter: + image: docker.io/prom/node-exporter:v1.9.1 + container_name: node_exporter + command: + - '--path.procfs=/host/proc' + - '--path.rootfs=/rootfs' + - '--path.sysfs=/host/sys' + - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)(2278805|/)' + - '--web.config.file=/etc/node_exporter/config.yml' + - '--web.listen-address=:9854' + volumes: + - /proc:/host/proc:ro + - /sys:/host/sys:ro + - /:/rootfs:ro + - ${CONFIG_FOLDER}/metrics/node_exporter.yml:/etc/node_exporter/config.yml + <<: *default_config + statsd_exporter: + image: docker.io/statsd/statsd:latest + container_name: statsd + command: + - '--web.listen-address=${INTERNAL_IP}:9851' + - '--statsd.listen-udp=127.0.0.1:9852' + - '--statsd.listen-tcp=127.0.0.1:9852' + - '--log.level=error' + - '--web.telemetry-path=/QuFreT5ESqu8d2DsxpyH' + <<: *default_config + prometheus_exporter: + image: ${REGISTRY_NAME}/prometheus_exporter:${TAG} + container_name: prometheus_exporter + command: [ '-n', '${PROMETHEUS_EXPORTER_NAME}' ] + volumes: + - ${CONPEEK_ETC_CATALOG_LOCATION}:/usr/local/conpeek/etc + <<: *default_config diff --git a/templates/env/basic_conpeek.ini b/templates/env/basic_conpeek.ini new file mode 100644 index 0000000..cb63cd0 --- /dev/null +++ b/templates/env/basic_conpeek.ini @@ -0,0 +1,49 @@ +[RECORDING] +RecordAllAudioRecording = no +RecordAllVideoRecording = no +RecordAllChatRecording = no +EncryptRecording = no +rocky = + +[SYSTEM] +Name = conpeek +LoggingLevel = DEBUG +RecordingFilenameTemplate = +VideoRecordingFilenameTemplate = +SQLPoolRecycle = 900 +SipProfileNameForGeneratingMRCPAnnouncement = technical +SipProfilePortForGeneratingMRCPAnnouncement = 5066 +ConsultantStatisticsServerProcessNumberInPool = 1 +IVRStatisticsServerProcessNumberInPool = 1 +ProjectStatisticsServerProcessNumberInPool = 1 +VoiceCampaignStatisticsServerProcessNumberInPool = 1 +UseStun = yes +SSHUser = remote +SSHMaxConnection = 1 +CapsLimiter = 10 + +[SIMULATOR] +TenantID = 1 +OperatorID = 1 +TelcoNetworkID = 1 +Consultants = 100 +Projects = 1 +Contacts = 1000 +Distribution = ROUND_ROBIN +RejectBreak = 10 +TimeoutBreak = 10 +GeneratingCallsIntervalTime = 5 +GeneratingNumberOfCalls = 1 +ConsultantAnswerTime = 3 +ConsultantCallTime = 30 +FreeswitchESLPort = 8021 +FreeswitchESLPassword = ClueCon +PlaybackSourceForClient = silence_stream://-1 +PlaybackSourceForConsultant = silence_stream://-1 +ProfileName = simulator +ProfileIPv4 = +SipProxy = +SipProfilePath = /usr/local/freeswitch/conf/sip_profiles +GatewayIPv4 = +GatewayPort = 5100 + diff --git a/templates/env/config.env b/templates/env/config.env new file mode 100644 index 0000000..106a649 --- /dev/null +++ b/templates/env/config.env @@ -0,0 +1,111 @@ +#lab settings +REGISTRY_NAME=docker.io/conpeekspzoo +TAG={{DEPLOYMENT_TAG}} +DOMAIN_NAME={{APP_INSTALLATION_DOMAIN}} + +SYSTEM_DOMAIN={{SYSTEM_APP_INSTALLATION_DOMAIN}} + +CONFIG_FOLDER=/files/conpeek_setup/ +ENV_FILE=/files/conpeek_setup/env/config.env +NGINX_CONF_LOCATION=/files/conpeek_setup/etc/nginx + +#system services variables +SYS_NAME=conpeek.com + +INTERNAL_IP={{INTERNAL_IP}} +INTERNAL_MASK=24 + +EXTERNAL_IP={{EXTERNAL_IP}} +EXTERNAL_MASK=32 + +SERVICES_ID=1 +SERVICES_HOST={{INTERNAL_IP}} + +#variables for core services +MYSQL_ROOT_PASSWORD={{MASTER_PASSWORD}} + +MONGO_INITDB_DATABASE=admin +MONGO_INITDB_ROOT_USERNAME=root_init +MONGO_INITDB_ROOT_PASSWORD={{MASTER_PASSWORD}} +REPL_SET_NAME={{REPLICASET}} + +RABBITMQ_USER=root +RABBITMQ_PASSWORD={{MASTER_PASSWORD}} + +DB_USER=root +DB_PASS={{MASTER_PASSWORD}} +DB_HOST={{INTERNAL_IP}} +DB_PORT=3306 + +AMQP_HOST={{INTERNAL_IP}} +AMQP_USER=root +AMQP_PASS={{MASTER_PASSWORD}} + + +#conpeek services variables +CONPEEK_INI_FILE_LOCATION=/data/conpeek/basic_conpeek.ini +CONPEEK_ETC_CATALOG_LOCATION=/data/conpeek/etc +LOGGING_LEVEL=DEBUG + +SESSION_SERVER_NAME={{session_server_name}} +SESSION_SERVER_TEST_MODE=True +STATE_MACHINE_SERVER_NAME={{state_machine_server_name}} + +API_TENANT_SERVER_NAME={{api_tenant_name}} +API_TENANT_PORT={{api_tenant_port}} + +API_TENANT_WEB_POLLING_SERVER_NAME={{api_tenant_web_polling_name}} +API_TENANT_WEB_POLLING_PORT={{api_tenant_web_polling_port}} + +API_TENANT_LOGIN_SERVER_NAME={{tenant_login_api_server_service_name}} +API_OPERATOR_SERVER_NAME={{operator_api_server_response_name}} +FILE_SERVER_NAME={{file_server_name}} +REPORT_SERVER_NAME={{report_server_name}} +MESSAGING_SERVER_NAME={{messaging_server_name}} +MAILBOX_SERVER_NAME={{mailbox_server_name}} +CDR_SERVER_NAME={{cdr_server_name}} +LOCAL_CONTACT_DB_SERVER_NAME={{local_contact_db_name}} + +PROVISIONING_SERVER_NAME={{provisioning_server_name}} +PROVISIONING_SERVER_PORT={{provisioning_server_initial_application_port}} + +MESSAGEBIRD_SERVER_NAME={{messagebird_server_name}} +SMS_SERVER_NAME={{sms_server_name}} +FACEBOOK_SERVER_NAME={{facebook_server_name}} +GUS_SERVER_NAME={{gus_server_name}} +HUBSPOT_SERVER_NAME={{hubspot_server_name}} +CDR_SERVER_NAME={{cdr_server_name}} +USER_NOTIFICATION_NAME={{user_notification_server_name}} +TICKETING_SERVER_NAME={{ticketing_server_name}} +MEETS_SERVER_NAME={{meets_server_name}} + +BSS_SERVER_NAME={{tenant_bss_api_server_name}} +BSS_SERVER_PORT={{tenant_bss_api_server_initial_application_port}} + +BOT_SERVER_NAME={{bot_server_name}} +BOT_TRAIN_SERVER_NAME={{bot_train_server_name}} + +API_TENANT_PLUGIN_SERVER_NAME={{tenant_plugin_api_server_name}} +API_TENANT_PLUGIN_SERVER_PORT={{tenant_plugin_api_server_initial_application_port}} + +FS_NAME={{freeswitch_name}} +GW_NAME={{gateway_server_name}} + +#coturn +COTURN_MIN_PORT={{coturn_min_port}} +COTURN_MAX_PORT={{coturn_max_port}} +COTURN_REALM={{coturn_realm}} +COTURN_STATIC_SECRET={{SYSTEM_TOKEN_SECRETKEY}} + +#kamailio +KAMAILIO_NAT={{KAMAILIO_NAT}} +KAMAILIO_PRIVATE_IP={{KAMAILIO_PRIVATE_IP}} +KAMAILIO_PUBLIC_IP={{KAMAILIO_PUBLIC_IP}} + +#dev_variables: +CONPEEK_SOURCE_CODE_LOCATION=/data/conpeek +CONPEEK_FRONTEND_LOCATION=/data/conpeek/web/app + + +#unbuffer stdout +PYTHONUNBUFFERED=1 diff --git a/templates/freeswitch/conf/autoload_configs/acl.conf.xml b/templates/freeswitch/conf/autoload_configs/acl.conf.xml new file mode 100644 index 0000000..a93c2dc --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/acl.conf.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/cdr_csv.conf.xml b/templates/freeswitch/conf/autoload_configs/cdr_csv.conf.xml new file mode 100644 index 0000000..448a671 --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/cdr_csv.conf.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/conference.conf.xml b/templates/freeswitch/conf/autoload_configs/conference.conf.xml new file mode 100644 index 0000000..400ef0d --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/conference.conf.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/console.conf.xml b/templates/freeswitch/conf/autoload_configs/console.conf.xml new file mode 100644 index 0000000..0c3345d --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/console.conf.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/db.conf.xml b/templates/freeswitch/conf/autoload_configs/db.conf.xml new file mode 100644 index 0000000..712fdcc --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/db.conf.xml @@ -0,0 +1,3 @@ + + + diff --git a/templates/freeswitch/conf/autoload_configs/event_socket.conf.xml b/templates/freeswitch/conf/autoload_configs/event_socket.conf.xml new file mode 100644 index 0000000..cbe12a5 --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/event_socket.conf.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/httapi.conf.xml b/templates/freeswitch/conf/autoload_configs/httapi.conf.xml new file mode 100644 index 0000000..627d57f --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/httapi.conf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/local_stream.conf.xml b/templates/freeswitch/conf/autoload_configs/local_stream.conf.xml new file mode 100644 index 0000000..60aed8a --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/local_stream.conf.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/templates/freeswitch/conf/autoload_configs/logfile.conf.xml b/templates/freeswitch/conf/autoload_configs/logfile.conf.xml new file mode 100644 index 0000000..8e3d991 --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/logfile.conf.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/modules.conf.xml b/templates/freeswitch/conf/autoload_configs/modules.conf.xml new file mode 100644 index 0000000..bdff845 --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/modules.conf.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/sofia.conf.xml b/templates/freeswitch/conf/autoload_configs/sofia.conf.xml new file mode 100644 index 0000000..496df7c --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/sofia.conf.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/switch.conf.xml b/templates/freeswitch/conf/autoload_configs/switch.conf.xml new file mode 100644 index 0000000..d103a4d --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/switch.conf.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/timezones.conf.xml b/templates/freeswitch/conf/autoload_configs/timezones.conf.xml new file mode 100644 index 0000000..9ddded7 --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/timezones.conf.xml @@ -0,0 +1,661 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/verto.conf.xml b/templates/freeswitch/conf/autoload_configs/verto.conf.xml new file mode 100644 index 0000000..3fe896b --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/verto.conf.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/xml_curl.conf.xml b/templates/freeswitch/conf/autoload_configs/xml_curl.conf.xml new file mode 100644 index 0000000..2623317 --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/xml_curl.conf.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/templates/freeswitch/conf/autoload_configs/xml_rpc.conf.xml b/templates/freeswitch/conf/autoload_configs/xml_rpc.conf.xml new file mode 100644 index 0000000..5a8a1ff --- /dev/null +++ b/templates/freeswitch/conf/autoload_configs/xml_rpc.conf.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/dialplan/bridge_failed.xml b/templates/freeswitch/conf/dialplan/bridge_failed.xml new file mode 100644 index 0000000..1af7334 --- /dev/null +++ b/templates/freeswitch/conf/dialplan/bridge_failed.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/templates/freeswitch/conf/dialplan/external.xml b/templates/freeswitch/conf/dialplan/external.xml new file mode 100644 index 0000000..6e72686 --- /dev/null +++ b/templates/freeswitch/conf/dialplan/external.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/dialplan/gateway.xml b/templates/freeswitch/conf/dialplan/gateway.xml new file mode 100644 index 0000000..41a7e41 --- /dev/null +++ b/templates/freeswitch/conf/dialplan/gateway.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/dialplan/internal.xml b/templates/freeswitch/conf/dialplan/internal.xml new file mode 100644 index 0000000..659d743 --- /dev/null +++ b/templates/freeswitch/conf/dialplan/internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/dialplan/line.xml b/templates/freeswitch/conf/dialplan/line.xml new file mode 100644 index 0000000..9c43161 --- /dev/null +++ b/templates/freeswitch/conf/dialplan/line.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/dialplan/line_verto.xml b/templates/freeswitch/conf/dialplan/line_verto.xml new file mode 100644 index 0000000..23d4b91 --- /dev/null +++ b/templates/freeswitch/conf/dialplan/line_verto.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/dialplan/lineredirect.xml b/templates/freeswitch/conf/dialplan/lineredirect.xml new file mode 100644 index 0000000..206763d --- /dev/null +++ b/templates/freeswitch/conf/dialplan/lineredirect.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/dialplan/linetransfer.xml b/templates/freeswitch/conf/dialplan/linetransfer.xml new file mode 100644 index 0000000..9cca28e --- /dev/null +++ b/templates/freeswitch/conf/dialplan/linetransfer.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/dialplan/systemtransfer.xml b/templates/freeswitch/conf/dialplan/systemtransfer.xml new file mode 100644 index 0000000..1c69280 --- /dev/null +++ b/templates/freeswitch/conf/dialplan/systemtransfer.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/dialplan/virtual_contact.xml b/templates/freeswitch/conf/dialplan/virtual_contact.xml new file mode 100644 index 0000000..de3eabf --- /dev/null +++ b/templates/freeswitch/conf/dialplan/virtual_contact.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/dialplan/virtual_endpoint.xml b/templates/freeswitch/conf/dialplan/virtual_endpoint.xml new file mode 100644 index 0000000..c6222b9 --- /dev/null +++ b/templates/freeswitch/conf/dialplan/virtual_endpoint.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/templates/freeswitch/conf/freeswitch.xml b/templates/freeswitch/conf/freeswitch.xml new file mode 100644 index 0000000..20f7782 --- /dev/null +++ b/templates/freeswitch/conf/freeswitch.xml @@ -0,0 +1,12 @@ + + + + +
+ +
+ +
+ +
+
\ No newline at end of file diff --git a/templates/freeswitch/conf/mime.types b/templates/freeswitch/conf/mime.types new file mode 100644 index 0000000..456a221 --- /dev/null +++ b/templates/freeswitch/conf/mime.types @@ -0,0 +1,1610 @@ +# +# MIME type configs overriden by the FreeSWITCH project. +# +audio/mpeg mp3 mpga mp2 mp2a m2a m3a +image/jpeg jpg jpeg jpe +# +# Additional MIME types added by the FreeSWITCH project. Any duplicate file extensions listed here will only be +# used to map from MIME -> extension and not extension -> MIME +audio/x-mpeg mp3 +audio/mp3 mp3 +audio/x-mp3 mp3 +audio/mpeg3 mp3 +audio/x-mpeg3 mp3 +audio/mpg mp3 +audio/x-mpegaudio mp3 +audio/x-wave wav +audio/wave wav +audio/wav wav +# +# The section below was taken from Apache httpd Project at +# +# +# This file maps Internet media types to unique file extension(s). +# Although created for httpd, this file is used by many software systems +# and has been placed in the public domain for unlimited redisribution. +# +# The table below contains both registered and (common) unregistered types. +# A type that has no unique extension can be ignored -- they are listed +# here to guide configurations toward known types and to make it easier to +# identify "new" types. File extensions are also commonly used to indicate +# content languages and encodings, so choose them carefully. +# +# Internet media types should be registered as described in RFC 4288. +# The registry is at . +# +# MIME type (lowercased) Extensions +# ============================================ ========== +# application/1d-interleaved-parityfec +# application/3gpp-ims+xml +# application/activemessage +application/andrew-inset ez +# application/applefile +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +# application/atomicmail +application/atomsvc+xml atomsvc +# application/auth-policy+xml +# application/batch-smtp +# application/beep+xml +# application/calendar+xml +# application/cals-1840 +# application/ccmp+xml +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +# application/cea-2018+xml +# application/cellml+xml +# application/cfw +# application/cnrp+xml +# application/commonground +# application/conference-info+xml +# application/cpl+xml +# application/csta+xml +# application/cstadata+xml +application/cu-seeme cu +# application/cybercash +application/davmount+xml davmount +# application/dca-rft +# application/dec-dx +# application/dialog-info+xml +# application/dicom +# application/dns +application/docbook+xml dbk +# application/dskpp+xml +application/dssc+der dssc +application/dssc+xml xdssc +# application/dvcs +application/ecmascript ecma +# application/edi-consent +# application/edi-x12 +# application/edifact +application/emma+xml emma +# application/epp+xml +application/epub+zip epub +# application/eshop +# application/example +application/exi exi +# application/fastinfoset +# application/fastsoap +# application/fits +application/font-tdpfr pfr +# application/framework-attributes+xml +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +# application/h224 +# application/held+xml +# application/http +application/hyperstudio stk +# application/ibe-key-request+xml +# application/ibe-pkg-reply+xml +# application/ibe-pp-data +# application/iges +# application/im-iscomposing+xml +# application/index +# application/index.cmd +# application/index.obj +# application/index.response +# application/index.vnd +application/inkml+xml ink inkml +# application/iotp +application/ipfix ipfix +# application/ipp +# application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +application/json json +application/jsonml+json jsonml +# application/kpml-request+xml +# application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +# application/macwriteii +application/mads+xml mads +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +# application/mathml-content+xml +# application/mathml-presentation+xml +application/mathml+xml mathml +# application/mbms-associated-procedure-description+xml +# application/mbms-deregister+xml +# application/mbms-envelope+xml +# application/mbms-msk+xml +# application/mbms-msk-response+xml +# application/mbms-protection-description+xml +# application/mbms-reception-report+xml +# application/mbms-register+xml +# application/mbms-register-response+xml +# application/mbms-user-service-description+xml +application/mbox mbox +# application/media_control+xml +application/mediaservercontrol+xml mscml +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +# application/mikey +application/mods+xml mods +# application/moss-keys +# application/moss-signature +# application/mosskey-data +# application/mosskey-request +application/mp21 m21 mp21 +application/mp4 mp4s +# application/mpeg4-generic +# application/mpeg4-iod +# application/mpeg4-iod-xmt +# application/msc-ivr+xml +# application/msc-mixer+xml +application/msword doc dot +application/mxf mxf +# application/nasdata +# application/news-checkgroups +# application/news-groupinfo +# application/news-transmission +# application/nss +# application/ocsp-request +# application/ocsp-response +application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +# application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +# application/pgp-keys +application/pgp-signature asc sig +application/pics-rules prf +# application/pidf+xml +# application/pidf-diff+xml +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +# application/poc-settings+xml +application/postscript ai eps ps +# application/prs.alvestrand.titrax-sheet +application/prs.cww cww +# application/prs.nprend +# application/prs.plucker +# application/prs.rdf-xml-crypt +# application/prs.xsf+xml +application/pskc+xml pskcxml +# application/qsig +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +# application/remote-printing +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +# application/riscos +# application/rlmi+xml +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +# application/rpki-updown +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +# application/rtx +# application/samlassertion+xml +# application/samlmetadata+xml +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +# application/set-payment +application/set-payment-initiation setpay +# application/set-registration +application/set-registration-initiation setreg +# application/sgml +# application/sgml-open-catalog +application/shf+xml shf +# application/sieve +# application/simple-filter+xml +# application/simple-message-summary +# application/simplesymbolcontainer +# application/slate +# application/smil +application/smil+xml smi smil +# application/soap+fastinfoset +# application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +# application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +# application/tamp-apex-update +# application/tamp-apex-update-confirm +# application/tamp-community-update +# application/tamp-community-update-confirm +# application/tamp-error +# application/tamp-sequence-adjust +# application/tamp-sequence-adjust-confirm +# application/tamp-status-query +# application/tamp-status-response +# application/tamp-update +# application/tamp-update-confirm +application/tei+xml tei teicorpus +application/thraud+xml tfi +# application/timestamp-query +# application/timestamp-reply +application/timestamped-data tsd +# application/tve-trigger +# application/ulpfec +# application/vcard+xml +# application/vemmi +# application/vividence.scriptfile +# application/vnd.3gpp.bsf+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +# application/vnd.3gpp.sms +# application/vnd.3gpp2.bcmcsinfo+xml +# application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +# application/vnd.adobe.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +# application/vnd.aether.imp +# application/vnd.ah-barcode +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +# application/vnd.amundsen.maze+xml +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +# application/vnd.arastra.swi +application/vnd.aristanetworks.swi swi +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +# application/vnd.autopackage +# application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +# application/vnd.bluetooth.ep.oob +application/vnd.bmi bmi +application/vnd.businessobjects rep +# application/vnd.cab-jscript +# application/vnd.canon-cpdl +# application/vnd.canon-lips +# application/vnd.cendio.thinlinc.clientconf +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +# application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +# application/vnd.collection+json +# application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +# application/vnd.ctct.ws+xml +# application/vnd.cups-pdf +# application/vnd.cups-postscript +application/vnd.cups-ppd ppd +# application/vnd.cups-raster +# application/vnd.cups-raw +# application/vnd.curl +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +# application/vnd.cybank +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +# application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mlp mlp +# application/vnd.dolby.mobile.1 +# application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.ds-keypoint kpxx +application/vnd.dvb.ait ait +# application/vnd.dvb.dvbj +# application/vnd.dvb.esgcontainer +# application/vnd.dvb.ipdcdftnotifaccess +# application/vnd.dvb.ipdcesgaccess +# application/vnd.dvb.ipdcesgaccess2 +# application/vnd.dvb.ipdcesgpdd +# application/vnd.dvb.ipdcroaming +# application/vnd.dvb.iptv.alfec-base +# application/vnd.dvb.iptv.alfec-enhancement +# application/vnd.dvb.notif-aggregate-root+xml +# application/vnd.dvb.notif-container+xml +# application/vnd.dvb.notif-generic+xml +# application/vnd.dvb.notif-ia-msglist+xml +# application/vnd.dvb.notif-ia-registration-request+xml +# application/vnd.dvb.notif-ia-registration-response+xml +# application/vnd.dvb.notif-init+xml +# application/vnd.dvb.pfr +application/vnd.dvb.service svc +# application/vnd.dxr +application/vnd.dynageo geo +# application/vnd.easykaraoke.cdgdownload +# application/vnd.ecdis-update +application/vnd.ecowin.chart mag +# application/vnd.ecowin.filerequest +# application/vnd.ecowin.fileupdate +# application/vnd.ecowin.series +# application/vnd.ecowin.seriesrequest +# application/vnd.ecowin.seriesupdate +# application/vnd.emclient.accessrequest+xml +application/vnd.enliven nml +# application/vnd.eprints.data+xml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +# application/vnd.ericsson.quickcall +application/vnd.eszigno3+xml es3 et3 +# application/vnd.etsi.aoc+xml +# application/vnd.etsi.cug+xml +# application/vnd.etsi.iptvcommand+xml +# application/vnd.etsi.iptvdiscovery+xml +# application/vnd.etsi.iptvprofile+xml +# application/vnd.etsi.iptvsad-bc+xml +# application/vnd.etsi.iptvsad-cod+xml +# application/vnd.etsi.iptvsad-npvr+xml +# application/vnd.etsi.iptvservice+xml +# application/vnd.etsi.iptvsync+xml +# application/vnd.etsi.iptvueprofile+xml +# application/vnd.etsi.mcid+xml +# application/vnd.etsi.overload-control-policy-dataset+xml +# application/vnd.etsi.sci+xml +# application/vnd.etsi.simservs+xml +# application/vnd.etsi.tsl+xml +# application/vnd.etsi.tsl.der +# application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +# application/vnd.f-secure.mobile +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +# application/vnd.ffsns +# application/vnd.fints +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +# application/vnd.font-fontforge-sfd +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +# application/vnd.fujixerox.art-ex +# application/vnd.fujixerox.art4 +# application/vnd.fujixerox.hbpl +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +# application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +# application/vnd.geocube+xml +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +# application/vnd.globalplatform.card-content-mgt +# application/vnd.globalplatform.card-content-mgt-response +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +# application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +# application/vnd.hal+json +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +# application/vnd.hcl-bireports +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +# application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +# application/vnd.hzn-3d-crossword +# application/vnd.ibm.afplinedata +# application/vnd.ibm.electronic-media +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +# application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary +# application/vnd.infotech.project +# application/vnd.infotech.project+xml +# application/vnd.innopath.wamp.notification +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +# application/vnd.intertrust.digibox +# application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +# application/vnd.iptc.g2.conceptitem+xml +# application/vnd.iptc.g2.knowledgeitem+xml +# application/vnd.iptc.g2.newsitem+xml +# application/vnd.iptc.g2.newsmessage+xml +# application/vnd.iptc.g2.packageitem+xml +# application/vnd.iptc.g2.planningitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +# application/vnd.japannet-directory-service +# application/vnd.japannet-jpnstore-wakeup +# application/vnd.japannet-payment-wakeup +# application/vnd.japannet-registration +# application/vnd.japannet-registration-wakeup +# application/vnd.japannet-setstore-wakeup +# application/vnd.japannet-verification +# application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +# application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +# application/vnd.marlin.drm.actiontoken+xml +# application/vnd.marlin.drm.conftoken+xml +# application/vnd.marlin.drm.license+xml +# application/vnd.marlin.drm.mdcf +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +# application/vnd.meridian-slingshot +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +# application/vnd.minisoft-hp3000-save +# application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +# application/vnd.motorola.flexsuite +# application/vnd.motorola.flexsuite.adsi +# application/vnd.motorola.flexsuite.fis +# application/vnd.motorola.flexsuite.gotap +# application/vnd.motorola.flexsuite.kmr +# application/vnd.motorola.flexsuite.ttc +# application/vnd.motorola.flexsuite.wem +# application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +# application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +# application/vnd.ms-color.iccprofile +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +# application/vnd.ms-office.activex+xml +application/vnd.ms-officetheme thmx +# application/vnd.ms-opentype +# application/vnd.ms-package.obfuscated-opentype +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +# application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +# application/vnd.ms-printing.printticket+xml +application/vnd.ms-project mpp mpt +# application/vnd.ms-tnef +# application/vnd.ms-wmdrm.lic-chlg-req +# application/vnd.ms-wmdrm.lic-resp +# application/vnd.ms-wmdrm.meter-chlg-req +# application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +# application/vnd.msign +# application/vnd.multiad.creator +# application/vnd.multiad.creator.cif +# application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +# application/vnd.ncd.control +# application/vnd.ncd.reference +# application/vnd.nervana +# application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +# application/vnd.nokia.catalogs +# application/vnd.nokia.conml+wbxml +# application/vnd.nokia.conml+xml +# application/vnd.nokia.isds-radio-presets +# application/vnd.nokia.iptv.config+xml +# application/vnd.nokia.landmark+wbxml +# application/vnd.nokia.landmark+xml +# application/vnd.nokia.landmarkcollection+xml +# application/vnd.nokia.n-gage.ac+xml +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +# application/vnd.nokia.ncd +# application/vnd.nokia.pcd+wbxml +# application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +# application/vnd.ntt-local.file-transfer +# application/vnd.ntt-local.sip-ta_remote +# application/vnd.ntt-local.sip-ta_tcp_stream +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +# application/vnd.obn +# application/vnd.oftn.l10n+json +# application/vnd.oipf.contentaccessdownload+xml +# application/vnd.oipf.contentaccessstreaming+xml +# application/vnd.oipf.cspg-hexbinary +# application/vnd.oipf.dae.svg+xml +# application/vnd.oipf.dae.xhtml+xml +# application/vnd.oipf.mippvcontrolmessage+xml +# application/vnd.oipf.pae.gem +# application/vnd.oipf.spdiscovery+xml +# application/vnd.oipf.spdlist+xml +# application/vnd.oipf.ueprofile+xml +# application/vnd.oipf.userprofile+xml +application/vnd.olpc-sugar xo +# application/vnd.oma-scws-config +# application/vnd.oma-scws-http-request +# application/vnd.oma-scws-http-response +# application/vnd.oma.bcast.associated-procedure-parameter+xml +# application/vnd.oma.bcast.drm-trigger+xml +# application/vnd.oma.bcast.imd+xml +# application/vnd.oma.bcast.ltkm +# application/vnd.oma.bcast.notification+xml +# application/vnd.oma.bcast.provisioningtrigger +# application/vnd.oma.bcast.sgboot +# application/vnd.oma.bcast.sgdd+xml +# application/vnd.oma.bcast.sgdu +# application/vnd.oma.bcast.simple-symbol-container +# application/vnd.oma.bcast.smartcard-trigger+xml +# application/vnd.oma.bcast.sprov+xml +# application/vnd.oma.bcast.stkm +# application/vnd.oma.cab-address-book+xml +# application/vnd.oma.cab-feature-handler+xml +# application/vnd.oma.cab-pcc+xml +# application/vnd.oma.cab-user-prefs+xml +# application/vnd.oma.dcd +# application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +# application/vnd.oma.drm.risd+xml +# application/vnd.oma.group-usage-list+xml +# application/vnd.oma.pal+xml +# application/vnd.oma.poc.detailed-progress-report+xml +# application/vnd.oma.poc.final-report+xml +# application/vnd.oma.poc.groups+xml +# application/vnd.oma.poc.invocation-descriptor+xml +# application/vnd.oma.poc.optimized-progress-report+xml +# application/vnd.oma.push +# application/vnd.oma.scidm.messages+xml +# application/vnd.oma.xcap-directory+xml +# application/vnd.omads-email+xml +# application/vnd.omads-file+xml +# application/vnd.omads-folder+xml +# application/vnd.omaloc-supl-init +application/vnd.openofficeorg.extension oxt +# application/vnd.openxmlformats-officedocument.custom-properties+xml +# application/vnd.openxmlformats-officedocument.customxmlproperties+xml +# application/vnd.openxmlformats-officedocument.drawing+xml +# application/vnd.openxmlformats-officedocument.drawingml.chart+xml +# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml +# application/vnd.openxmlformats-officedocument.extended-properties+xml +# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml +# application/vnd.openxmlformats-officedocument.presentationml.comments+xml +# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +# application/vnd.openxmlformats-officedocument.presentationml.slide+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml +# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml +# application/vnd.openxmlformats-officedocument.presentationml.tags+xml +application/vnd.openxmlformats-officedocument.presentationml.template potx +# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml +# application/vnd.openxmlformats-officedocument.theme+xml +# application/vnd.openxmlformats-officedocument.themeoverride+xml +# application/vnd.openxmlformats-officedocument.vmldrawing +# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml +# application/vnd.openxmlformats-package.core-properties+xml +# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml +# application/vnd.openxmlformats-package.relationships+xml +# application/vnd.quobject-quoxdocument +# application/vnd.osa.netdeploy +application/vnd.osgeo.mapguide.package mgp +# application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +# application/vnd.otps.ct-kip+xml +application/vnd.palm pdb pqa oprc +# application/vnd.paos.xml +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +# application/vnd.piaccess.application-licence +application/vnd.picsel efif +application/vnd.pmi.widget wg +# application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +# application/vnd.powerbuilder6-s +# application/vnd.powerbuilder7 +# application/vnd.powerbuilder7-s +# application/vnd.powerbuilder75 +# application/vnd.powerbuilder75-s +# application/vnd.preminet +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +# application/vnd.pwg-multiplexed +# application/vnd.pwg-xhtml-print+xml +# application/vnd.qualcomm.brew-app-res +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +# application/vnd.radisys.moml+xml +# application/vnd.radisys.msml+xml +# application/vnd.radisys.msml-audit+xml +# application/vnd.radisys.msml-audit-conf+xml +# application/vnd.radisys.msml-audit-conn+xml +# application/vnd.radisys.msml-audit-dialog+xml +# application/vnd.radisys.msml-audit-stream+xml +# application/vnd.radisys.msml-conf+xml +# application/vnd.radisys.msml-dialog+xml +# application/vnd.radisys.msml-dialog-base+xml +# application/vnd.radisys.msml-dialog-fax-detect+xml +# application/vnd.radisys.msml-dialog-fax-sendrecv+xml +# application/vnd.radisys.msml-dialog-group+xml +# application/vnd.radisys.msml-dialog-speech+xml +# application/vnd.radisys.msml-dialog-transform+xml +# application/vnd.rainstor.data +# application/vnd.rapid +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +# application/vnd.renlearn.rlprint +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +# application/vnd.rs-274x +# application/vnd.ruckus.download +# application/vnd.s3sms +application/vnd.sailingtracker.track st +# application/vnd.sbm.cid +# application/vnd.sbm.mid2 +# application/vnd.scribus +# application/vnd.sealed.3df +# application/vnd.sealed.csf +# application/vnd.sealed.doc +# application/vnd.sealed.eml +# application/vnd.sealed.mht +# application/vnd.sealed.net +# application/vnd.sealed.ppt +# application/vnd.sealed.tiff +# application/vnd.sealed.xls +# application/vnd.sealedmedia.softseal.html +# application/vnd.sealedmedia.softseal.pdf +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +# application/vnd.smart.notebook +application/vnd.smart.teacher teacher +# application/vnd.software602.filler.form+xml +# application/vnd.software602.filler.form-xml-zip +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +# application/vnd.sss-cod +# application/vnd.sss-dtf +# application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +# application/vnd.street-stream +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +# application/vnd.sun.wadl+xml +application/vnd.sus-calendar sus susp +application/vnd.svd svd +# application/vnd.swiftview-ics +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +# application/vnd.syncml.dm.notification +# application/vnd.syncml.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +# application/vnd.truedoc +# application/vnd.ubisoft.webplayer +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +# application/vnd.uplanet.alert +# application/vnd.uplanet.alert-wbxml +# application/vnd.uplanet.bearer-choice +# application/vnd.uplanet.bearer-choice-wbxml +# application/vnd.uplanet.cacheop +# application/vnd.uplanet.cacheop-wbxml +# application/vnd.uplanet.channel +# application/vnd.uplanet.channel-wbxml +# application/vnd.uplanet.list +# application/vnd.uplanet.list-wbxml +# application/vnd.uplanet.listcmd +# application/vnd.uplanet.listcmd-wbxml +# application/vnd.uplanet.signal +application/vnd.vcx vcx +# application/vnd.vd-study +# application/vnd.vectorworks +# application/vnd.verimatrix.vcas +# application/vnd.vidsoft.vidconference +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +# application/vnd.vividence.scriptfile +application/vnd.vsf vsf +# application/vnd.wap.sic +# application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +# application/vnd.wfa.wsc +# application/vnd.wmc +# application/vnd.wmf.bootstrap +# application/vnd.wolfram.mathematica +# application/vnd.wolfram.mathematica.package +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +# application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +# application/vnd.wv.csp+wbxml +# application/vnd.wv.csp+xml +# application/vnd.wv.ssp+xml +application/vnd.xara xar +application/vnd.xfdl xfdl +# application/vnd.xfdl.webform +# application/vnd.xmi+xml +# application/vnd.xmpie.cpkg +# application/vnd.xmpie.dpkg +# application/vnd.xmpie.plan +# application/vnd.xmpie.ppkg +# application/vnd.xmpie.xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +# application/vnd.yamaha.remote-setup +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +# application/vnd.yamaha.through-ngn +# application/vnd.yamaha.tunnel-udpencap +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +# application/vq-rtcpxr +# application/watcherinfo+xml +# application/whoispp-query +# application/whoispp-response +application/widget wgt +application/winhlp hlp +# application/wita +# application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +# application/x-amf +application/x-apple-diskimage dmg +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +application/x-conference nsc +# application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +application/x-eva eva +application/x-font-bdf bdf +# application/x-font-dos +# application/x-font-framemaker +application/x-font-ghostscript gsf +# application/x-font-libgrx +application/x-font-linux-psf psf +application/x-font-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +# application/x-font-speedo +# application/x-font-sunos-news +application/x-font-ttf ttf ttc +application/x-font-type1 pfa pfb pfm afm +application/font-woff woff +# application/x-font-vfont +application/x-freearc arc +application/x-futuresplash spl +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +# application/x-gzip +application/x-hdf hdf +application/x-install-instructions install +application/x-iso9660-image iso +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lzh-compressed lzh lha +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload exe dll com bat msi +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf wmz emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-nzb nzb +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-research-info-systems ris +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-wais-source src +application/x-x509-ca-cert der crt +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +# application/x400-bp +application/xaml+xml xaml +# application/xcap-att+xml +# application/xcap-caps+xml +application/xcap-diff+xml xdf +# application/xcap-el+xml +# application/xcap-error+xml +# application/xcap-ns+xml +# application/xcon-conference-info-diff+xml +# application/xcon-conference-info+xml +application/xenc+xml xenc +application/xhtml+xml xhtml xht +# application/xhtml-voice+xml +application/xml xml xsl +application/xml-dtd dtd +# application/xml-external-parsed-entity +# application/xmpp+xml +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +# audio/1d-interleaved-parityfec +# audio/32kadpcm +# audio/3gpp +# audio/3gpp2 +# audio/ac3 +audio/adpcm adp +# audio/amr +# audio/amr-wb +# audio/amr-wb+ +# audio/asc +# audio/atrac-advanced-lossless +# audio/atrac-x +# audio/atrac3 +audio/basic au snd +# audio/bv16 +# audio/bv32 +# audio/clearmode +# audio/cn +# audio/dat12 +# audio/dls +# audio/dsr-es201108 +# audio/dsr-es202050 +# audio/dsr-es202211 +# audio/dsr-es202212 +# audio/dv +# audio/dvi4 +# audio/eac3 +# audio/evrc +# audio/evrc-qcp +# audio/evrc0 +# audio/evrc1 +# audio/evrcb +# audio/evrcb0 +# audio/evrcb1 +# audio/evrcwb +# audio/evrcwb0 +# audio/evrcwb1 +# audio/example +# audio/fwdred +# audio/g719 +# audio/g722 +# audio/g7221 +# audio/g723 +# audio/g726-16 +# audio/g726-24 +# audio/g726-32 +# audio/g726-40 +# audio/g728 +# audio/g729 +# audio/g7291 +# audio/g729d +# audio/g729e +# audio/gsm +# audio/gsm-efr +# audio/gsm-hr-08 +# audio/ilbc +# audio/ip-mr_v2.5 +# audio/isac +# audio/l16 +# audio/l20 +# audio/l24 +# audio/l8 +# audio/lpc +audio/midi mid midi kar rmi +# audio/mobile-xmf +audio/mp4 mp4a +# audio/mp4a-latm +# audio/mpa +# audio/mpa-robust +audio/mpeg mpga mp2 mp2a mp3 m2a m3a +# audio/mpeg4-generic +# audio/musepack +audio/ogg oga ogg spx +# audio/opus +# audio/parityfec +# audio/pcma +# audio/pcma-wb +# audio/pcmu-wb +# audio/pcmu +# audio/prs.sid +# audio/qcelp +# audio/red +# audio/rtp-enc-aescm128 +# audio/rtp-midi +# audio/rtx +audio/s3m s3m +audio/silk sil +# audio/smv +# audio/smv0 +# audio/smv-qcp +# audio/sp-midi +# audio/speex +# audio/t140c +# audio/t38 +# audio/telephone-event +# audio/tone +# audio/uemclip +# audio/ulpfec +# audio/vdvi +# audio/vmr-wb +# audio/vnd.3gpp.iufp +# audio/vnd.4sb +# audio/vnd.audiokoz +# audio/vnd.celp +# audio/vnd.cisco.nse +# audio/vnd.cmles.radio-events +# audio/vnd.cns.anp1 +# audio/vnd.cns.inf1 +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +# audio/vnd.dlna.adts +# audio/vnd.dolby.heaac.1 +# audio/vnd.dolby.heaac.2 +# audio/vnd.dolby.mlp +# audio/vnd.dolby.mps +# audio/vnd.dolby.pl2 +# audio/vnd.dolby.pl2x +# audio/vnd.dolby.pl2z +# audio/vnd.dolby.pulse.1 +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +# audio/vnd.dvb.file +# audio/vnd.everad.plj +# audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +# audio/vnd.nokia.mobile-xmf +# audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +# audio/vnd.octel.sbc +# audio/vnd.qcelp +# audio/vnd.rhetorex.32kadpcm +audio/vnd.rip rip +# audio/vnd.sealedmedia.softseal.mpeg +# audio/vnd.vmx.cvsd +# audio/vorbis +# audio/vorbis-config +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +# audio/x-tta +audio/x-wav wav +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +# chemical/x-pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +# image/example +# image/fits +image/g3fax g3 +image/gif gif +image/ief ief +# image/jp2 +image/jpeg jpeg jpg jpe +# image/jpm +# image/jpx +image/ktx ktx +# image/naplps +image/png png +image/prs.btif btif +# image/prs.pti +image/sgi sgi +image/svg+xml svg svgz +# image/t38 +image/tiff tiff tif +# image/tiff-fx +image/vnd.adobe.photoshop psd +# image/vnd.cns.inf2 +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.dvb.subtitle sub +image/vnd.djvu djvu djv +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +# image/vnd.globalgraphics.pgb +# image/vnd.microsoft.icon +# image/vnd.mix +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +# image/vnd.radiance +# image/vnd.sealed.png +# image/vnd.sealedmedia.softseal.gif +# image/vnd.sealedmedia.softseal.jpg +# image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +image/webp webp +image/x-3ds 3ds +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +image/x-mrsid-image sid +image/x-pcx pcx +image/x-pict pic pct +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +# message/cpim +# message/delivery-status +# message/disposition-notification +# message/example +# message/external-body +# message/feedback-report +# message/global +# message/global-delivery-status +# message/global-disposition-notification +# message/global-headers +# message/http +# message/imdn+xml +# message/news +# message/partial +message/rfc822 eml mime +# message/s-http +# message/sip +# message/sipfrag +# message/tracking-status +# message/vnd.si.simp +# model/example +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +# model/vnd.flatland.3dml +model/vnd.gdl gdl +# model/vnd.gs-gdl +# model/vnd.gs.gdl +model/vnd.gtw gtw +# model/vnd.moml+xml +model/vnd.mts mts +# model/vnd.parasolid.transmit.binary +# model/vnd.parasolid.transmit.text +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +# multipart/alternative +# multipart/appledouble +# multipart/byteranges +# multipart/digest +# multipart/encrypted +# multipart/example +# multipart/form-data +# multipart/header-set +# multipart/mixed +# multipart/parallel +# multipart/related +# multipart/report +# multipart/signed +# multipart/voice-message +# text/1d-interleaved-parityfec +text/cache-manifest appcache +text/calendar ics ifb +text/css css +text/csv csv +# text/directory +# text/dns +# text/ecmascript +# text/enriched +# text/example +# text/fwdred +text/html html htm +# text/javascript +text/n3 n3 +# text/parityfec +text/plain txt text conf def list log in +# text/prs.fallenstein.rst +text/prs.lines.tag dsc +# text/vnd.radisys.msml-basic-layout +# text/red +# text/rfc822-headers +text/richtext rtx +# text/rtf +# text/rtp-enc-aescm128 +# text/rtx +text/sgml sgml sgm +# text/t140 +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +# text/ulpfec +text/uri-list uri uris urls +text/vcard vcard +# text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.scurl scurl +text/vnd.curl.mcurl mcurl +# text/vnd.dmclientscript +text/vnd.dvb.subtitle sub +# text/vnd.esmertec.theme-descriptor +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +# text/vnd.iptc.newsml +# text/vnd.iptc.nitf +# text/vnd.latex-z +# text/vnd.motorola.reflex +# text/vnd.ms-mediapackage +# text/vnd.net2phone.commcenter.command +# text/vnd.si.uricatalogue +text/vnd.sun.j2me.app-descriptor jad +# text/vnd.trolltech.linguist +# text/vnd.wap.si +# text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-fortran f for f77 f90 +text/x-java-source java +text/x-opml opml +text/x-pascal p pas +text/x-nfo nfo +text/x-setext etx +text/x-sfv sfv +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +# text/xml +# text/xml-external-parsed-entity +# video/1d-interleaved-parityfec +video/3gpp 3gp +# video/3gpp-tt +video/3gpp2 3g2 +# video/bmpeg +# video/bt656 +# video/celb +# video/dv +# video/example +video/h261 h261 +video/h263 h263 +# video/h263-1998 +# video/h263-2000 +video/h264 h264 +# video/h264-rcdo +# video/h264-svc +video/jpeg jpgv +# video/jpeg2000 +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +# video/mp1s +# video/mp2p +# video/mp2t +video/mp4 mp4 mp4v mpg4 +# video/mp4v-es +video/mpeg mpeg mpg mpe m1v m2v +# video/mpeg4-generic +# video/mpv +# video/nv +video/ogg ogv +# video/parityfec +# video/pointer +video/quicktime qt mov +# video/raw +# video/rtp-enc-aescm128 +# video/rtx +# video/smpte292m +# video/ulpfec +# video/vc1 +# video/vnd.cctv +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +# video/vnd.dece.mp4 +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +# video/vnd.directv.mpeg +# video/vnd.directv.mpeg-tts +# video/vnd.dlna.mpeg-tts +video/vnd.dvb.file dvb +video/vnd.fvt fvt +# video/vnd.hns.video +# video/vnd.iptvforum.1dparityfec-1010 +# video/vnd.iptvforum.1dparityfec-2005 +# video/vnd.iptvforum.2dparityfec-1010 +# video/vnd.iptvforum.2dparityfec-2005 +# video/vnd.iptvforum.ttsavc +# video/vnd.iptvforum.ttsmpeg2 +# video/vnd.motorola.video +# video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +# video/vnd.nokia.interleaved-multimedia +# video/vnd.nokia.videovoip +# video/vnd.objectvideo +# video/vnd.sealed.mpeg1 +# video/vnd.sealed.mpeg4 +# video/vnd.sealed.swf +# video/vnd.sealedmedia.softseal.mov +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice diff --git a/templates/freeswitch/conf/modules.conf b/templates/freeswitch/conf/modules.conf new file mode 100644 index 0000000..7b521c2 --- /dev/null +++ b/templates/freeswitch/conf/modules.conf @@ -0,0 +1,21 @@ +languages/mod_python3 +applications/mod_commands +applications/mod_conference +applications/mod_db +applications/mod_dptools +applications/mod_hash +applications/mod_httapi +applications/mod_spandsp +asr_tts/mod_unimrcp +dialplans/mod_dialplan_xml +event_handlers/mod_event_socket +formats/mod_local_stream +formats/mod_shout +formats/mod_tone_stream +formats/mod_sndfile +loggers/mod_console +endpoints/mod_rtc +endpoints/mod_sofia +endpoints/mod_verto +xml_int/mod_xml_curl +loggers/mod_logfile \ No newline at end of file diff --git a/templates/freeswitch/conf/sip_profiles/gateway0.xml b/templates/freeswitch/conf/sip_profiles/gateway0.xml new file mode 100644 index 0000000..6eb75d4 --- /dev/null +++ b/templates/freeswitch/conf/sip_profiles/gateway0.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/sip_profiles/gw1_internal0.xml b/templates/freeswitch/conf/sip_profiles/gw1_internal0.xml new file mode 100644 index 0000000..986e062 --- /dev/null +++ b/templates/freeswitch/conf/sip_profiles/gw1_internal0.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/sip_profiles/line0_an1.xml b/templates/freeswitch/conf/sip_profiles/line0_an1.xml new file mode 100644 index 0000000..a64ed44 --- /dev/null +++ b/templates/freeswitch/conf/sip_profiles/line0_an1.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/conf/vars.xml b/templates/freeswitch/conf/vars.xml new file mode 100644 index 0000000..687f6c7 --- /dev/null +++ b/templates/freeswitch/conf/vars.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/default/sip_profiles/gw_external.xml b/templates/freeswitch/default/sip_profiles/gw_external.xml new file mode 100644 index 0000000..e49a57c --- /dev/null +++ b/templates/freeswitch/default/sip_profiles/gw_external.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/freeswitch/tmobile/sip_profiles/gw_external.xml b/templates/freeswitch/tmobile/sip_profiles/gw_external.xml new file mode 100644 index 0000000..2d281eb --- /dev/null +++ b/templates/freeswitch/tmobile/sip_profiles/gw_external.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/kamailio/kamailio-python.cfg b/templates/kamailio/kamailio-python.cfg new file mode 100644 index 0000000..a116f4e --- /dev/null +++ b/templates/kamailio/kamailio-python.cfg @@ -0,0 +1,14 @@ +[main] +name = KAMAILIO_NAME + +[topology-db] +user = root +password = MASTER_PASSWORD +host = DB_HOST +pool_size = 4 + +[manager-db] +pool_size = 4 + +[kamailio-db] +pool_size = 4 diff --git a/templates/kamailio/kamailio.cfg b/templates/kamailio/kamailio.cfg new file mode 100644 index 0000000..f202733 --- /dev/null +++ b/templates/kamailio/kamailio.cfg @@ -0,0 +1,78 @@ +#!KAMAILIO +# +log_facility=LOG_LOCAL0 +log_stderror=yes +debug=0 + +fork=yes +children=4 + +memdbg=5 +memlog=5 + +auto_aliases=no +alias=KAMAILIO_PUBLIC_IP:5060 + +disable_tcp=no +enable_tls=yes + +#use_dns_cache = off +#use_dns_failover = on +#dns_srv_lb = on +#dns_try_naptr = on + +dns_try_ipv6=no +dns_retr_time=1 +dns_retr_no=1 +dns_use_search_list=no +use_dns_cache=on +use_dns_failover=on +dns_srv_lb=on + +mpath="/usr/local/kamailio/lib64/kamailio/modules/" + +server_signature=no + +loadmodule "kex.so" +loadmodule "corex.so" +loadmodule "tm.so" +loadmodule "tmx.so" +loadmodule "sl.so" +loadmodule "tls.so" +loadmodule "rr.so" +loadmodule "pv.so" +loadmodule "maxfwd.so" +loadmodule "textops.so" +loadmodule "siputils.so" +loadmodule "xlog.so" +loadmodule "sanity.so" +loadmodule "cfg_rpc.so" +loadmodule "counters.so" +loadmodule "path.so" +loadmodule "app_python.so" +loadmodule "nathelper.so" + +modparam("tls", "config", "/etc/kamailio/tls.cfg") + + +# ----- tm params ----- +# auto-discard branches from previous serial forking leg +modparam("tm", "failure_reply_mode", 3) +# default retransmission timeout: 30sec +modparam("tm", "fr_timer", 30000) +# default invite retransmission timeout after 1xx: 120sec +modparam("tm", "fr_inv_timer", 120000) + +# ----- rr params ----- +# set next param to 1 to add value to ;lr param (helps with some UAs) +modparam("rr", "enable_full_lr", 0) +# do not append from tag to the RR (no need for this script) +modparam("rr", "append_fromtag", 0) + +####### Routing Logic ######## + +modparam("app_python", "script_name", "/usr/local/conpeek/kamailio/kamailio_server.py") + +cfgengine "python" + +#include_file "/usr/local/kamailio/etc/kamailio/kamailio-local.cfg" diff --git a/templates/kamailio/kamailio_server.py b/templates/kamailio/kamailio_server.py new file mode 100644 index 0000000..4cb62e8 --- /dev/null +++ b/templates/kamailio/kamailio_server.py @@ -0,0 +1,754 @@ +import re +import uuid + +import ConfigParser +import KSR as KSR +import mysql.connector +import logging +import os +#import threading + +#threading.current_thread() + +#formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') + +logging.basicConfig( + level=logging.DEBUG, + format='%(asctime)s.%(msecs)03d - %(levelname)s - %(funcName)s():%(lineno)i - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' # Format daty +) +#logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') +#logging.getLogger().handlers[0].setFormatter(formatter) + +def mod_init(): + # logging.basicConfig(filename='/var/log/kamailio/app_python.log', level=logging.INFO) + logging.debug('APP_PYTHON starting...') + return KamailioServer() + + +ENV_KAMAILIO_NAT = "KAMAILIO_NAT" +ENV_KAMAILIO_PUBLIC_IP = "KAMAILIO_PUBLIC_IP" +ENV_KAMAILIO_PRIVATE_IP = "KAMAILIO_PRIVATE_IP" + +KAMAILIO_NAT = True if os.getenv(ENV_KAMAILIO_NAT) == "1" else False +PRIVATE_IP = os.getenv(ENV_KAMAILIO_PRIVATE_IP) +PUBLIC_IP = os.getenv(ENV_KAMAILIO_PUBLIC_IP) + +if KAMAILIO_NAT: + if not PRIVATE_IP: + logging.error("Parameter ENV_KAMAILIO_PRIVATE_IP not exists!") + exit(0) + + if not PUBLIC_IP: + logging.error("Parameter ENV_KAMAILIO_PUBLIC_IP not exists!") + exit(0) + + +class KamailioServer: + SIP_PORT = 5060 + + def __init__(self): + + logging.debug('Kamailio object initializing...') + + if os.path.exists('/etc/kamailio/kamailio-python.cfg'): + + logging.debug("getting config from /etc/kamailio/kamailio-python.cfg") + + configParser = ConfigParser.RawConfigParser() + configParser.read('/etc/kamailio/kamailio-python.cfg') + + self.kamailio_name = configParser.get('main', 'name') + self.topology_config = { + 'user': configParser.get('topology-db', 'user'), + 'password': configParser.get('topology-db', 'password'), + 'host': configParser.get('topology-db', 'host'), + 'database': 'topology', + 'raw': True + } + else: + logging.debug("nie podano pliku /etc/kamailio/kamailio-python.cfg, pobieram dane ze zmiennych srodowiskowych") + self.kamailio_name = os.environ.get("KAMAILIO_NAME") + self.topology_config = { + 'user': os.environ.get("DB_USER"), + 'password': os.environ.get("DB_PASS"), + 'host': os.environ.get("DB_HOST"), + 'database': 'topology', + 'raw': True + } + + # Get System and kamailio info + # + try: + topology_cnx = mysql.connector.connect(**self.topology_config) + except Exception as e: + logging.exception(e) + logging.error('Topology DB connection error.') + exit(0) + + try: + cursor = topology_cnx.cursor() + query = 'SELECT S.id, S.name, S.manager_db_user, S.manager_db_password, S.manager_db_host, K.kamailio_db_ipv4, K.kamailio_db_user, K.kamailio_db_password FROM system S, kamailio K WHERE K.system_id = S.id AND K.name = %s' + cursor.execute(query, [self.kamailio_name]) + row = cursor.fetchone() + cursor.close() + if not row: + logging.error('Kamailio server "{}" not found in topology database.'.format(self.kamailio_name)) + topology_cnx.close() + exit(0) + + except Exception as e: + logging.exception(e) + logging.error('Topology DB operation error.') + exit(0) + + self.system_id = row[0] + self.system_name = row[1] + + # Initialize manager database + # + self.manager_config = { + 'user': str(row[2]), + 'password': str(row[3]), + 'host': str(row[4]), + 'database': 'manager', + 'raw': True + } + + # Initialize kamailio database + # + self.kamailio_config = { + 'user': str(row[6]), + 'password': str(row[7]), + 'host': str(row[5]), + 'database': 'kamailio', + 'raw': True + } + + # Get Freeswitch and FreeswitchPool info: + # + try: + topology_cnx = mysql.connector.connect(**self.topology_config) + + except Exception as e: + logging.exception(e) + logging.error('Topology DB connection error.') + exit(0) + + try: + cursor = topology_cnx.cursor() + query = 'SELECT F.name, SAN.ipv4_address, SA.domain FROM freeswitch F, freeswitch_pool P, server_node_has_access_network SAN, access_network SA WHERE F.freeswitch_pool_id = P.id AND ' \ + 'F.server_node_id=SAN.server_node_id AND SAN.access_network_id = SA.id AND P.system_id = %s' + cursor.execute(query, [int(self.system_id)]) + self.freeswitch_ipv4_list = [] + self.freeswitch_switchname_list = [] + rows = cursor.fetchall() + cursor.close() + for row in rows: + self.freeswitch_switchname_list.append('{}.{}'.format(str(row[0]), row[2])) + self.freeswitch_ipv4_list.append(str(row[1])) + topology_cnx.close() + + except Exception as e: + logging.exception(e) + logging.error('Topology DB operation error.') + exit(0) + + # self.realm = 'sip-{}.{}'.format(self.kamailio_name, KSR.pv.get('$rd')) + + def child_init(self, rank): + logging.debug('Kamailio child starting ...') + return 0 + + def ksr_onsend_route(self, msg): + return 0 + + def ksr_request_route(self, msg): + #logging.debug('Request arrived.') + + if KSR.pv.get("$ua") in ("sipcli", "sipvicious", "sip-scan", "sipsak", "sundayddr", "friendly-scanner", "iWar", "CSipSimple", "SIVuS", "Gulp", "sipv", "smap", "friendly-request", "VaxIPUserAgent", "VaxSIPUserAgent", "siparmyknife", "Test Agent"): + logging.debug('Suspicious User-Agent blocked.') + KSR.sl.send_reply(404, 'Not Found') + return -255 + + if KSR.maxfwd.process_maxfwd(10) < 0: + KSR.sl.sl_send_reply(483, "Too Many Hops") + return -255 + + if KSR.pv.get('$si') in self.freeswitch_ipv4_list: + self.softswitch_request_route(msg) + else: + self.terminal_request_route(msg) + return 1 + +# !!!!!!! POPRAWKA do rolki +# def ksr_reply_route(self, msg): +# try: +# logging.debug('Reply arrived.') +# if KSR.nathelper.nat_uac_test(2): +# logging.warning('NATed UAC REPLY') +# KSR.nathelper.fix_nated_contact() +# +# else: +# logging.warning('Not NATed UAC REPLY') +# +# except: +# logging.warning('Exception in ksr_reply') +# +# return 1 + + def softswitch_request_route(self, msg): + + #logging.debug('Processing request from Freeswitch .') + + # Process INVITE request + # + if KSR.pv.get('$rm') == 'INVITE': + + # Different processing for reInvite and new dialog requests + # + if KSR.rr.loose_route() == 1: + KSR.tm.t_relay() + return + else: + if not KAMAILIO_NAT: + KSR.rr.record_route() + KSR.tm.t_relay() + else: + KSR.tm.t_on_reply("ksr_onreply_route_three") + KSR.set_advertised_address(PUBLIC_IP) + KSR.rr.record_route_advertised_address("{}:5060".format(PUBLIC_IP)) + KSR.tm.t_relay() + return + + # Process ACK request + # + if KSR.pv.get('$rm') == 'ACK': + KSR.rr.loose_route() + if KAMAILIO_NAT: + KSR.set_advertised_address(PUBLIC_IP) + KSR.tm.t_relay() + return + + # Process BYE request + # + if KSR.pv.get('$rm') == 'BYE': + KSR.rr.loose_route() + if KAMAILIO_NAT: + KSR.set_advertised_address(PUBLIC_IP) + KSR.tm.t_relay() + return + + # Process UPDATE request + # + if KSR.pv.get('$rm') == 'UPDATE': + pai_hdr = KSR.pv.get('$hdr(P-Asserted-Identity)') + display_pattern = re.compile('^\s*"(.+)\s<(.+)@(.+)>"\s*<(.+)>\s*$') + m = display_pattern.match(pai_hdr) + if m: + KSR.hdr.remove('P-Asserted-Identity') + KSR.hdr.append('P-Asserted-Identity: "{}" <{}@{}>\r\n'.format(m.group(1), m.group(2), 'sip-{}.{}'.format(self.kamailio_name, KSR.pv.get('$rd')))) + KSR.rr.loose_route() + # !!!!!!! POPRAWKA do rolki + KSR.tm.t_on_reply("ksr_onreply_route_three") + if KAMAILIO_NAT: + KSR.set_advertised_address(PUBLIC_IP) + KSR.tm.t_relay() + return + + # Process NOTIFY request + # + if KSR.pv.get('$rm') == 'NOTIFY': + KSR.rr.loose_route() + if KAMAILIO_NAT: + KSR.set_advertised_address(PUBLIC_IP) + KSR.tm.t_relay() + return + + # Process CANCEL request + # + if KSR.pv.get('$rm') == 'CANCEL': + if KAMAILIO_NAT: + KSR.set_advertised_address(PUBLIC_IP) + KSR.tm.t_relay() + return + + # Deny other requests + # + logging.warning('FREESWITCH Method not allowed') + KSR.sl.send_reply(405, 'Method Not Allowed') + return + + def terminal_request_route(self, msg): + + unique_id = uuid.uuid4() + logging.debug('{} Processing {} request from Terminal'.format(unique_id, KSR.pv.get('$rm'))) + + # Test UAC is NATed + # + if KSR.nathelper.nat_uac_test(2): + logging.warning('NATed UAC REQUEST') + KSR.nathelper.fix_nated_contact() + KSR.force_rport() + else: + logging.warning('Not NATed UAC REQUEST') + + # Process REGISTER request + # + if KSR.pv.get('$rm') == 'REGISTER': + from_user = KSR.pv.get('$fU') + sip_username_pattern = re.compile(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{12,}$') + m = sip_username_pattern.match(from_user) + if not m: + KSR.sl.send_reply(403, "Forbidden") + logging.debug('From User {} does not fulfil validation rules'.format(KSR.pv.get('$fU'))) + return + + call_id = KSR.pv.get('$hdr(Call-ID)') + logging.debug('Call-ID: {}'.format(call_id)) + try: + kamailio_cnx = mysql.connector.connect(**self.kamailio_config) + + except Exception as e: + logging.exception(e) + logging.error('Kamailio DB connection error.') + KSR.sl.send_reply(500, 'Server Internal Error') + return + + try: + cursor = kamailio_cnx.cursor() + query = 'SELECT freeswitch_ipv4, freeswitch_port FROM selected_freeswitch WHERE call_id = %s' + cursor.execute(query, [call_id]) + row = cursor.fetchone() + logging.debug('row: {}'.format(row)) + cursor.close() + if row: + freeswitch_ipv4 = row[0] + freeswitch_port = row[1] + msg.rewrite_ruri('sip:{}:{}'.format(freeswitch_ipv4, freeswitch_port)) + logging.debug('rewrite_ruri: sip:{}:{}'.format(freeswitch_ipv4, freeswitch_port)) + else: + realm = self.get_fspool_realm() + if not realm: + KSR.sl.send_reply(404, 'Not Found') + logging.debug('send_reply 404 Not Found') + return + msg.rewrite_ruri('sip:{}'.format(realm)) + logging.debug('rewrite_ruri sip:{}'.format(realm)) + + KSR.tm.t_on_reply("ksr_onreply_route_one") + KSR.hdr.append('Path: '.format(KSR.pv.get('$Ri'), KamailioServer.SIP_PORT)) + logging.debug('append Path: '.format(KSR.pv.get('$Ri'), KamailioServer.SIP_PORT)) + KSR.tm.t_relay() + + except Exception as e: + logging.exception(e) + logging.error('Kamailio DB operation error.') + KSR.sl.send_reply(500, 'Server Internal Error') + return + + finally: + kamailio_cnx.close() + return + + # Process INVITE request + # + if KSR.pv.get('$rm') == 'INVITE': + from_user = KSR.pv.get('$fU') + sip_username_pattern = re.compile(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{12,}$') + m = sip_username_pattern.match(from_user) + if not m: + KSR.sl.send_reply(403, "Forbidden") + logging.debug('From User {} does not fulfil validation rules'.format(KSR.pv.get('$fU'))) + return + + if KSR.rr.loose_route() == 1: + KSR.tm.t_relay() + return + + else: + user = self.normalize(KSR.pv.get('$rU')) + if not user: + logging.error('Kamailio normalize error.') + KSR.sl.send_reply(500, 'Server Internal Error') + return + + call_id = KSR.pv.get('$hdr(Call-ID)') + try: + kamailio_cnx = mysql.connector.connect(**self.kamailio_config) + + except Exception as e: + logging.exception(e) + logging.error('Kamailio DB connection error.') + KSR.sl.send_reply(500, 'Server Internal Error') + return + try: + cursor = kamailio_cnx.cursor() + query = 'SELECT freeswitch_ipv4, freeswitch_port FROM selected_freeswitch WHERE call_id = %s' + cursor.execute(query, [call_id]) + row = cursor.fetchone() + cursor.close() + if row: + freeswitch_ipv4 = row[0] + freeswitch_port = row[1] + realm = '{}:{}'.format(freeswitch_ipv4, freeswitch_port) + + else: + realm = self.get_fspool_realm() + if not realm: + KSR.sl.send_reply(404, 'Not Found') + return + + msg.rewrite_ruri("sip:{}@{}".format(user, realm)) + KSR.tm.t_on_reply("ksr_onreply_route_two") + KSR.rr.record_route() + KSR.tm.t_relay() + return + + except Exception as e: + logging.exception(e) + logging.error('Kamailio DB operation error.') + KSR.sl.send_reply(500, 'Server Internal Error') + return + + finally: + kamailio_cnx.close() + return + + # Process SUBSCRIBE request + # + if KSR.pv.get('$rm') == 'SUBSCRIBE': + if KSR.rr.loose_route() == 1: + KSR.tm.t_relay() + return + else: + user = self.normalize(KSR.pv.get('$rU')) + if not user: + logging.error('Kamailio normalize error.') + KSR.sl.send_reply(500, 'Server Internal Error') + return + realm = self.get_fspool_realm() + if not realm: + KSR.sl.send_reply(404, 'Not Found') + return + msg.rewrite_ruri("sip:{}@{}".format(user, realm)) + KSR.rr.record_route() + KSR.tm.t_relay() + return + + # Process ACK request + # + if KSR.pv.get('$rm') == 'ACK': + KSR.rr.loose_route() + KSR.tm.t_relay() + return + + # Process BYE request + # + if KSR.pv.get('$rm') == 'BYE': + KSR.rr.loose_route() + KSR.tm.t_relay() + return + + # Process CANCEL request + # + if KSR.pv.get('$rm') == 'CANCEL': + KSR.tm.t_relay() + return + + # Process OPTIONS request + # + if KSR.pv.get("$rm") == "OPTIONS": + KSR.sl.sl_send_reply(200, "Keepalive") + return -255 + + # Process REFER request + # + if KSR.pv.get('$rm') == 'REFER': + # Relay request + # + KSR.rr.loose_route() + KSR.tm.t_relay() + return + + # Deny other requests + # + logging.warning('TERMINAL Method not allowed') + KSR.tm.t_reply(405, 'Method Not Allowed') + return + + def ksr_onreply_route_one(self, msg): + + #logging.debug('Processing onreply_route_first_register...') + + # Get kamailio db connection + # + try: + kamailio_cnx = mysql.connector.connect(**self.kamailio_config) + + except Exception as e: + logging.exception(e) + logging.error('Kamailio DB connection error.') + return + + # Process reply + # + try: + # Process 401 Unauthorized + # + if msg.Status == '401': + freeswitch_ipv4 = KSR.pv.get('$si') + freeswitch_port = KSR.pv.get('$sp') + call_id = KSR.pv.get('$hdr(Call-ID)') + cursor = kamailio_cnx.cursor() + cursor.execute('DELETE FROM selected_freeswitch where call_id = %s', [call_id]) + query = 'INSERT INTO selected_freeswitch (call_id, freeswitch_ipv4, freeswitch_port) VALUES (%s, %s, %s)' + cursor.execute(query, [call_id, freeswitch_ipv4, freeswitch_port]) + cursor.close() + kamailio_cnx.commit() + # Process any other reply + # + else: + call_id = KSR.pv.get('$hdr(Call-ID)') + cursor = kamailio_cnx.cursor() + query = 'DELETE FROM selected_freeswitch WHERE call_id = %s' + cursor.execute(query, [call_id]) + cursor.close() + kamailio_cnx.commit() + + except Exception as e: + logging.exception(e) + logging.error('Kamailio onreply_route_one operation error.') + KSR.sl.send_reply(500, 'Server Internal Error') + return + + finally: + kamailio_cnx.close() + + def ksr_onreply_route_two(self, msg): + + #logging.debug('Processing onreply_route_first_invite...') + + # Get kamailio db connection + # + try: + kamailio_cnx = mysql.connector.connect(**self.kamailio_config) + + except Exception as e: + logging.exception(e) + logging.error('Kamailio DB connection error.') + return + + # Process reply + # + try: + # Process 407 ProxyAuthenticationRequired + # + if msg.Status == '407': + freeswitch_ipv4 = KSR.pv.get('$si') + freeswitch_port = KSR.pv.get('$sp') + call_id = KSR.pv.get('$hdr(Call-ID)') + cursor = kamailio_cnx.cursor() + query = 'INSERT INTO selected_freeswitch (call_id, freeswitch_ipv4, freeswitch_port) VALUES (%s, %s, %s)' + cursor.execute(query, [call_id, freeswitch_ipv4, freeswitch_port]) + cursor.close() + kamailio_cnx.commit() + + # Process 100 Trying + elif msg.Status != '100': + call_id = KSR.pv.get('$hdr(Call-ID)') + cursor = kamailio_cnx.cursor() + query = 'DELETE FROM selected_freeswitch WHERE call_id = %s' + cursor.execute(query, [call_id]) + cursor.close() + kamailio_cnx.commit() + # raise Exception('Test') + + # Process redirect from Freeswitch + # + if msg.Status == '302': + hContact = KSR.pv.get('$hdr(Contact)') + contact_pattern = re.compile('(.*)(.*)') + m = contact_pattern.match(hContact) + if m: + new_header = 'Contact: {}{}\r\n'.format(m.group(1), m.group(2), m.group(3), 'sip-{}.{}'.format(self.kamailio_name, KSR.pv.get('$rd')), m.group(4)) + KSR.hdr.remove('Contact') + KSR.hdr.append(new_header) + + # Process 200 from Freeswitch + # + elif msg.Status == '200': + if KAMAILIO_NAT: + new_header = 'Record-Route: \r\n'.format(PUBLIC_IP) + KSR.hdr.remove('Record-Route') + KSR.hdr.append(new_header) + + except Exception as e: + logging.exception(e) + logging.error('Kamailio onreply_route_two operation error.\n') + KSR.sl.send_reply(500, 'Server Internal Error') + return + + finally: + kamailio_cnx.close() + + def ksr_onreply_route_three(self, msg): + # !!!!!!! POPRAWKA do rolki + KSR.nathelper.fix_nated_contact() + if msg.Status == '200': + if KAMAILIO_NAT: + new_header = 'Record-Route: \r\n'.format(PRIVATE_IP) + KSR.hdr.remove('Record-Route') + KSR.hdr.append(new_header) + + def normalize(self, request_number): + + # logging.debug('Processing normalize...') + + # Get manager db connection + # + try: + manager_cnx = mysql.connector.connect(**self.manager_config) + except Exception as e: + logging.exception(e) + logging.error('Manager DB connection error.') + return + + # Process normalization + # + try: + cursor = manager_cnx.cursor() + sip_username = KSR.pv.get("$fU") + query = 'SELECT T.id, T.domain FROM tenant T, line_link L WHERE L.tenant_id = T.id AND L.sip_username = %s LIMIT 1' + cursor.execute(query, [sip_username]) + row = cursor.fetchone() + cursor.close() + if not row: + logging.error('Tenant data not found in manager database for user {}'.format(sip_username)) + return + + tenant_id = str(row[0]) + # tenant_domain = str(row[1]) + cursor = manager_cnx.cursor() + query = "SELECT pattern, replacement, priority FROM normalization WHERE tenant_id = %s ORDER BY priority ASC" + cursor.execute(query, [tenant_id]) + rows = cursor.fetchall() + cursor.close() + logging.debug('Normalization for number') + target_user = request_number + if rows: + rules = [] + for row in rows: + try: + rules.append({'pattern': re.compile(str(row[0])), 'replacement': str(row[1])}) + except Exception as e: + logging.exception(e) + logging.error("Normalization error") + continue + + limit = 10 + while 1: + matched = False + for rule in rules: + result = rule['pattern'].sub(rule['replacement'], target_user) + if target_user != result: + matched = True + target_user = result + break + + if not matched: + break + + limit -= 1 + if limit == 0: + break + + return target_user + + except Exception as e: + logging.exception(e) + logging.error('Kamailio normalize operation error.') + return + + finally: + manager_cnx.close() + + def get_fspool_realm(self): + + # logging.debug('Processing get_fspool_realm...') + + # Get manager db connection + # + try: + manager_cnx = mysql.connector.connect(**self.manager_config) + except Exception as e: + logging.exception(e) + logging.error('Manager DB connection error.') + return + + # Process request + # + try: + subrealm_pattern = re.compile('([a-z0-9\.]+)\.{}'.format('sip-{}.{}'.format(self.kamailio_name, KSR.pv.get('$rd')))) + m = subrealm_pattern.match(KSR.pv.get('$rd')) + if m: + switchname = m.group(1) + if switchname in self.freeswitch_switchname_list: + return 'line-{}'.format(switchname) + + else: + logging.error('Switch "{}" not found in topology database.'.format(switchname)) + return + + cursor = manager_cnx.cursor() + sip_username = KSR.pv.get("$fU") + query = 'SELECT T.domain FROM tenant T, line_link L WHERE L.tenant_id = T.id AND L.sip_username = %s LIMIT 1' + cursor.execute(query, [sip_username]) + row = cursor.fetchone() + cursor.close() + if not row: + logging.error('Tenant data not found in manager database for user "{}"'.format(sip_username)) + return + + tenant_domain = str(row[0]) + + except Exception as e: + logging.exception(e) + logging.error('Kamailio get_fspool_realm operation error.') + return + + finally: + manager_cnx.close() + + # Get topology db connection + # + try: + topology_cnx = mysql.connector.connect(**self.topology_config) + except Exception as e: + logging.exception(e) + logging.error('Topology DB connection error.') + return + + # Process request + # + try: + cursor = topology_cnx.cursor() + query = 'SELECT P.name,A.domain FROM freeswitch_pool P, tenant T, access_network A WHERE T.freeswitch_pool_id = P.id AND A.id = T.access_network_id AND T.domain = %s LIMIT 1' + cursor.execute(query, [tenant_domain]) + row = cursor.fetchone() + if not row: + logging.error('FreeswitchPool data not found in topology database for user in domain {}'.format(tenant_domain)) + cursor.close() + return + + realm = 'line-{}.{}'.format(row[0], row[1]) + cursor.close() + return realm + + except Exception as e: + logging.exception(e) + logging.error('Kamailio get_fspool_realm operation error.') + return + + finally: + topology_cnx.close() diff --git a/templates/mail_relay/000-default.conf b/templates/mail_relay/000-default.conf new file mode 100644 index 0000000..7b2a864 --- /dev/null +++ b/templates/mail_relay/000-default.conf @@ -0,0 +1,7 @@ + + ServerAdmin webmaster@localhost + DocumentRoot ${APACHE_DOCUMENT_ROOT} + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + diff --git a/templates/mail_relay/main.cf b/templates/mail_relay/main.cf new file mode 100644 index 0000000..768d1c3 --- /dev/null +++ b/templates/mail_relay/main.cf @@ -0,0 +1,21 @@ +smtpd_banner = ACCESS_DOMAIN_NAME +biff = no +append_dot_mydomain = no +readme_directory = no +smtpd_tls_cert_file=/etc/ssl/certs/conpeek_ssl.crt +smtpd_tls_key_file=/etc/ssl/private/conpeek_ssl.key +smtpd_tls_security_level=may +smtp_tls_CApath=/etc/ssl/certs +smtp_tls_security_level=may +smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache +smtp_bind_address = 0.0.0.0 +smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination +myhostname = ACCESS_DOMAIN_NAME +alias_maps = hash:/etc/aliases +alias_database = hash:/etc/aliases +mydestination = $myhostname, mail.$myhostname, localhost.localdomain, localhost +mynetworks = POSTFIX_MYNETWORKS +mailbox_size_limit = 0 +recipient_delimiter = + +inet_protocols = ipv4 +debug_peer_level = 10 diff --git a/templates/mail_relay/ports.conf b/templates/mail_relay/ports.conf new file mode 100644 index 0000000..443ad1e --- /dev/null +++ b/templates/mail_relay/ports.conf @@ -0,0 +1,9 @@ +Listen 83 + + + Listen 443 + + + + Listen 443 + diff --git a/templates/mariadb/01_create_db_topology.sql b/templates/mariadb/01_create_db_topology.sql new file mode 100644 index 0000000..6f52584 --- /dev/null +++ b/templates/mariadb/01_create_db_topology.sql @@ -0,0 +1,1886 @@ +-- MySQL Script generated by MySQL Workbench +-- Thu Jun 9 15:32:24 2022 +-- Model: New Model Version: 1.0 +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; + +-- ----------------------------------------------------- +-- Schema topology +-- ----------------------------------------------------- +DROP SCHEMA IF EXISTS `topology` ; + +-- ----------------------------------------------------- +-- Schema topology +-- ----------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS `topology` DEFAULT CHARACTER SET utf8 ; +USE `topology` ; + +-- ----------------------------------------------------- +-- Table `topology`.`system` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`system` ; + +CREATE TABLE IF NOT EXISTS `topology`.`system` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `network_domain` VARCHAR(100) NOT NULL, + `ipv4_network_address` VARCHAR(45) NOT NULL, + `ipv4_network_mask` VARCHAR(45) NOT NULL, + `manager_db_host` VARCHAR(45) NOT NULL, + `manager_db_user` VARCHAR(45) NOT NULL, + `manager_db_password` VARCHAR(45) NOT NULL, + `amqp_host` VARCHAR(45) NOT NULL, + `amqp_user` VARCHAR(45) NOT NULL, + `amqp_password` VARCHAR(45) NOT NULL, + `token_secretkey` VARCHAR(100) NOT NULL, + `token_issuer` VARCHAR(45) NOT NULL, + `token_audience` VARCHAR(45) NOT NULL, + `user_token_expiration_time` INT NOT NULL, + `tenant_token_expiration_time` INT NULL, + `remote_public_key` TEXT NOT NULL, + `remote_private_key` TEXT NOT NULL, + `facebook_app_id` TEXT NULL DEFAULT NULL, + `facebook_app_secret` TEXT NULL DEFAULT NULL, + `facebook_app_token` TEXT NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + UNIQUE INDEX `manager_db_host_UNIQUE` (`manager_db_host` ASC), + UNIQUE INDEX `amqp_host_UNIQUE` (`amqp_host` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`server_node` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`server_node` ; + +CREATE TABLE IF NOT EXISTS `topology`.`server_node` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `system_ipv4_address` VARCHAR(45) NOT NULL, + `system_ipv4_mask` VARCHAR(45) NOT NULL, + `data_ipv4_address` VARCHAR(45) NULL, + `data_ipv4_mask` VARCHAR(45) NULL, + `management_ipv4_address` VARCHAR(45) NULL, + `management_ipv4_mask` VARCHAR(45) NULL, + `console_ipv4_address` VARCHAR(45) NULL, + `console_ipv4_mask` VARCHAR(45) NULL, + `access_network_interface` VARCHAR(45) NULL, + `telco_network_interface` VARCHAR(45) NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_server_node_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`nginx` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`nginx` ; + +CREATE TABLE IF NOT EXISTS `topology`.`nginx` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_nginx_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_nginx_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_api_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_api_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_api_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_listener_count` INT NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_api_server_nginx1_idx` (`nginx_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_tenant_api_server_system1_idx` (`system_id` ASC), + INDEX `fk_operator_api_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`access_network` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`access_network` ; + +CREATE TABLE IF NOT EXISTS `topology`.`access_network` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain` VARCHAR(100) NOT NULL, + `ipv4_network_address` VARCHAR(45) NOT NULL, + `ipv4_network_mask` VARCHAR(45) NOT NULL, + `ipv4_gateway_address` VARCHAR(45) NOT NULL, + `8021q_vlan_id` INT NOT NULL, + `ssl_certificate` TEXT NOT NULL, + `ssl_key` TEXT NOT NULL, + `site_ssl_certificate` TEXT NULL, + `site_ssl_key` TEXT NULL, + `core_smtp_port` INT NULL, + `operator_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_access_network_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`hubspot_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`hubspot_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`hubspot_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `application_id` VARCHAR(45) NOT NULL, + `client_id` VARCHAR(45) NOT NULL, + `client_secret` VARCHAR(45) NOT NULL, + `api_port` INT NOT NULL, + `private_api_port` INT NOT NULL, + `public_api_port` INT NOT NULL, + `mi_port` INT NOT NULL, + `developer_api_key` VARCHAR(45) NOT NULL, + `developer_user_id` VARCHAR(45) NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `access_network_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_session_server_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_session_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_session_server_access_network1_idx` (`access_network_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`mongodb_replicaset` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`mongodb_replicaset` ; + +CREATE TABLE IF NOT EXISTS `topology`.`mongodb_replicaset` ( + `id` INT NOT NULL, + `name` VARCHAR(45) NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain` VARCHAR(100) NOT NULL, + `operator_api_server_id` INT NOT NULL, + `hubspot_server_id` INT NULL, + `system_id` INT NOT NULL, + `mongodb_replicaset_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `domain_UNIQUE` (`domain` ASC), + INDEX `fk_operator_system1_idx` (`system_id` ASC), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_operator_operator_api_server1_idx` (`operator_api_server_id` ASC), + INDEX `fk_operator_hubspot_server1_idx` (`hubspot_server_id` ASC), + INDEX `fk_operator_mongodb_replicaset1_idx` (`mongodb_replicaset_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`session_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`session_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`session_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `private_api_port` INT NOT NULL, + `public_api_port` INT NOT NULL, + `mi_port` INT NOT NULL, + `wss_port` INT NOT NULL, + `state_machine_private_api_port` INT NOT NULL, + `state_machine_mi_port` INT NOT NULL, + `monitoring_api_port` INT NOT NULL, + `monitoring_wss_port` INT NOT NULL, + `session_server_db_host` VARCHAR(45) NOT NULL, + `session_server_db_user` VARCHAR(45) NOT NULL, + `session_server_db_password` VARCHAR(45) NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `operator_id` INT NOT NULL, + `access_network_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_session_server_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_session_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_session_server_operator1_idx` (`operator_id` ASC), + INDEX `fk_session_server_access_network1_idx` (`access_network_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`file_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`file_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`file_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_port` INT NOT NULL, + `private_api_port` INT NOT NULL, + `mi_port` INT NOT NULL, + `directory` VARCHAR(100) NOT NULL, + `aws_region_name` VARCHAR(45) NULL, + `aws_access_key_identifier` VARCHAR(128) NULL, + `aws_access_key_secret` VARCHAR(128) NULL, + `google_application_credentials_file` VARCHAR(255) NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_file_server_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_file_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_file_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`cdr_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`cdr_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`cdr_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_port` INT NOT NULL, + `mi_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_cdr_server_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_cdr_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_cdr_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`freeswitch` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`freeswitch` ; + +CREATE TABLE IF NOT EXISTS `topology`.`freeswitch` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL DEFAULT 'fs1', + `event_socket_password` VARCHAR(45) NOT NULL DEFAULT 'aR3H2vxs', + `sip_profile_line_count` INT NOT NULL DEFAULT 1, + `line_srv_priority` INT NOT NULL DEFAULT 100, + `line_srv_weight` INT NOT NULL DEFAULT 100, + `sip_profile_gateway_count` INT NOT NULL DEFAULT 1, + `gateway_srv_priority` INT NOT NULL DEFAULT 100, + `gateway_srv_weight` INT ZEROFILL NOT NULL DEFAULT 100, + `recording_path` VARCHAR(255) NOT NULL DEFAULT '/recording', + `max_fs_db_handles` INT NOT NULL DEFAULT 64, + `max_sessions` INT NOT NULL DEFAULT 1000, + `max_sps` INT NOT NULL DEFAULT 30, + `amd_license_limit` INT NOT NULL DEFAULT 0, + `rtp_port_min` INT NOT NULL DEFAULT 16384, + `rtp_port_max` INT NOT NULL DEFAULT 32767, + `recording_pcap_path` VARCHAR(255) NOT NULL DEFAULT '/data/pcaps', + `bot_recorder_port` INT NULL, + `freeswitch_pool_id` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `switchname_UNIQUE` (`name` ASC), + INDEX `fk_freeswitch_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC), + INDEX `fk_freeswitch_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_freeswitch_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`freeswitch_pool` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`freeswitch_pool` ; + +CREATE TABLE IF NOT EXISTS `topology`.`freeswitch_pool` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `system_id` INT NOT NULL, + `presence_server_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_softswitch_pool_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_freeswitch_pool_freeswitch1_idx` (`presence_server_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`kamailio` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`kamailio` ; + +CREATE TABLE IF NOT EXISTS `topology`.`kamailio` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `kamailio_db_ipv4` VARCHAR(45) NOT NULL, + `kamailio_db_user` VARCHAR(45) NOT NULL, + `kamailio_db_password` VARCHAR(45) NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_kamailio_system1_idx` (`system_id` ASC), + INDEX `fk_kamailio_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`tenant_api_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`tenant_api_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`tenant_api_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_listener_count` INT NOT NULL, + `initial_application_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_api_server_nginx1_idx` (`nginx_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_tenant_api_server_system1_idx` (`system_id` ASC), + INDEX `fk_tenant_api_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`provisioning_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`provisioning_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`provisioning_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_listener_count` INT NOT NULL, + `initial_application_port` INT NOT NULL, + `initial_management_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_api_server_nginx1_idx` (`nginx_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_tenant_api_server_system1_idx` (`system_id` ASC), + INDEX `fk_provisioning_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`gateway_pool` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`gateway_pool` ; + +CREATE TABLE IF NOT EXISTS `topology`.`gateway_pool` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_gateway_pool_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`telco_network` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`telco_network` ; + +CREATE TABLE IF NOT EXISTS `topology`.`telco_network` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain` VARCHAR(100) NOT NULL, + `ipv4_network_address` VARCHAR(45) NOT NULL, + `ipv4_network_mask` VARCHAR(45) NOT NULL, + `ipv4_gateway_address` VARCHAR(45) NOT NULL, + `8021q_vlan_id` INT NOT NULL, + `presentation_preservation_policy` VARCHAR(45) NOT NULL DEFAULT 'DIRECT' COMMENT 'DIRECT|DIVERSION', + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_telco_network_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`sms_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`sms_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`sms_server` ( + `id` INT NOT NULL, + `name` VARCHAR(45) NOT NULL, + `public_api_port` INT NOT NULL, + `api_port` INT NOT NULL, + `private_api_port` INT NOT NULL, + `sms_protocol` VARCHAR(45) NULL, + `json_config` TEXT NULL, + `sms_server_db_host` VARCHAR(45) NOT NULL, + `sms_server_db_user` VARCHAR(45) NOT NULL, + `sms_server_db_password` VARCHAR(45) NOT NULL, + `smsapi_client_id` VARCHAR(255) NULL, + `smsapi_client_secret` VARCHAR(255) NULL, + `nginx_id` INT NOT NULL, + `operator_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `system_id` INT NOT NULL, + `mongodb_replicaset_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_sms_server_operator1_idx` (`operator_id` ASC), + INDEX `fk_sms_server_server_node1_idx` (`server_node_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_sms_server_system1_idx` (`system_id` ASC), + INDEX `fk_sms_server_mongodb_replicaset1_idx` (`mongodb_replicaset_id` ASC), + INDEX `fk_sms_server_nginx1_idx` (`nginx_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`tenant_plugin_api_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`tenant_plugin_api_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`tenant_plugin_api_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_listener_count` INT NOT NULL, + `initial_application_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_tenant_plugin_api_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_tenant_plugin_api_server_system1_idx` (`system_id` ASC), + INDEX `fk_tenant_plugin_api_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`anti_fraud_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`anti_fraud_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`anti_fraud_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_anti_fraud_server_system1_idx` (`system_id` ASC), + INDEX `fk_anti_fraud_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`report_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`report_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`report_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `process_count` INT NOT NULL DEFAULT 3, + `api_port` INT NOT NULL, + `mi_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_report_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_report_server_system1_idx` (`system_id` ASC), + INDEX `fk_report_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`tenant_bss_api_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`tenant_bss_api_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`tenant_bss_api_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_listener_count` INT NOT NULL, + `initial_application_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_bss_api_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_tenant_bss_api_server_system1_idx` (`system_id` ASC), + INDEX `fk_tenant_bss_api_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`local_contact_db_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`local_contact_db_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`local_contact_db_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_port` INT NOT NULL, + `public_api_port` INT NULL, + `mi_port` INT NOT NULL, + `bookingsync_client_id` VARCHAR(255) NULL, + `bookingsync_client_secret` VARCHAR(255) NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `access_network_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_session_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_session_server_access_network1_idx` (`access_network_id` ASC), + INDEX `fk_local_contact_db_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`team_viewer_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`team_viewer_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`team_viewer_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NULL, + `public_api_port` INT NOT NULL, + `api_port` INT NOT NULL, + `mi_port` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `nginx_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_team_viewer_server_system1_idx` (`system_id` ASC), + INDEX `fk_team_viewer_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_team_viewer_server_nginx1_idx` (`nginx_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`zammad_contact_db_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`zammad_contact_db_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`zammad_contact_db_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `private_api_port` INT NOT NULL, + `public_api_port` INT NOT NULL, + `mi_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `access_network_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_zammad_contact_db_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_zammad_contact_db_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_zammad_contact_db_server_access_network1_idx` (`access_network_id` ASC), + INDEX `fk_zammad_contact_db_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`livespace_contact_db_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`livespace_contact_db_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`livespace_contact_db_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `private_api_port` INT NOT NULL, + `public_api_port` INT NOT NULL, + `mi_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `access_network_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_livespace_contact_db_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_livespace_contact_db_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_livespace_contact_db_server_access_network1_idx` (`access_network_id` ASC), + INDEX `fk_livespace_contact_db_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`salesforce_contact_db_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`salesforce_contact_db_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`salesforce_contact_db_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `private_api_port` INT NOT NULL, + `public_api_port` INT NOT NULL, + `mi_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `access_network_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_salesforce_contact_db_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_salesforce_contact_db_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_salesforce_contact_db_server_access_network1_idx` (`access_network_id` ASC), + INDEX `fk_salesforce_contact_db_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`dynamics_contact_db_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`dynamics_contact_db_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`dynamics_contact_db_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `private_api_port` INT NOT NULL, + `public_api_port` INT NOT NULL, + `mi_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `access_network_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_dynamics_contact_db_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_dynamics_contact_db_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_dynamics_contact_db_server_access_network1_idx` (`access_network_id` ASC), + INDEX `fk_dynamics_contact_db_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`idenfy_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`idenfy_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`idenfy_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `public_api_port` INT NOT NULL, + `private_api_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_idenfy_server_system1_idx` (`system_id` ASC), + INDEX `fk_idenfy_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_idenfy_server_nginx1_idx` (`nginx_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`fully_verified_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`fully_verified_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`fully_verified_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `public_api_port` INT NOT NULL, + `private_api_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_fully_verified_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_fully_verified_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_fully_verified_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`talkieai_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`talkieai_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`talkieai_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `private_api_port` INT NOT NULL, + `public_api_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_talkieai_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_talkieai_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_talkieai_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`mailbox_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`mailbox_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`mailbox_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `private_api_port` INT NOT NULL, + `json_config` TEXT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_session_server_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`messaging_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`messaging_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`messaging_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `public_api_port` INT NOT NULL, + `private_api_port` INT NOT NULL, + `bookingsync_public_api_port` INT NULL, + `bookingsync_api_port` INT NULL, + `bookingsync_private_api_port` INT NULL, + `bookingsync_client_id` VARCHAR(255) NULL, + `bookingsync_client_secret` VARCHAR(255) NULL, + `wss_port` INT NOT NULL, + `mi_port` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `nginx_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_session_server_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_messaging_server_nginx1_idx` (`nginx_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`techmo_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`techmo_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`techmo_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `techmo_server_address` VARCHAR(255) NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `nginx_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_session_server_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_messaging_server_nginx1_idx` (`nginx_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`ldap_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`ldap_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`ldap_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `login` VARCHAR(255) NOT NULL, + `password` VARCHAR(255) NOT NULL, + `port` INT NOT NULL DEFAULT 389, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_session_server_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`login` ASC), + INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`facebook_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`facebook_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`facebook_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_port` INT NOT NULL, + `private_api_port` INT NOT NULL, + `public_api_port` INT NOT NULL, + `app_id` VARCHAR(255) NOT NULL, + `app_secret` VARCHAR(255) NOT NULL, + `verify_token` VARCHAR(255) NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_fb_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_fb_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_fb_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`messagebird_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`messagebird_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`messagebird_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `public_api_port` INT NOT NULL, + `api_port` INT NOT NULL, + `private_api_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_whatsapp_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_whatsapp_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_whatsapp_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`user_notification_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`user_notification_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`user_notification_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `private_api_port` INT NULL, + `wss_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_user_notification_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_user_notification_server_system1_idx` (`system_id` ASC), + INDEX `fk_user_notification_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`tenant_web_polling_api_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`tenant_web_polling_api_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`tenant_web_polling_api_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_listener_count` INT NOT NULL, + `initial_application_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_user_notification_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_user_notification_server_system1_idx` (`system_id` ASC), + INDEX `fk_user_notification_server_server_node1_idx` (`server_node_id` ASC), + UNIQUE INDEX `id_UNIQUE` (`id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`ticketing_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`ticketing_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`ticketing_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_port` INT NOT NULL, + `private_api_port` INT NOT NULL, + `system_id` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_user_notification_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_user_notification_server_system1_idx` (`system_id` ASC), + INDEX `fk_user_notification_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`tenant` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`tenant` ; + +CREATE TABLE IF NOT EXISTS `topology`.`tenant` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain` VARCHAR(100) NOT NULL, + `anti_fraud_lock` INT NOT NULL DEFAULT 0, + `session_server_id` INT NOT NULL, + `freeswitch_pool_id` INT NOT NULL, + `gateway_pool_id` INT NOT NULL, + `kamailio_id` INT NOT NULL, + `anti_fraud_server_id` INT NOT NULL, + `file_server_id` INT NOT NULL, + `cdr_server_id` INT NOT NULL, + `tenant_api_server_id` INT NOT NULL, + `tenant_plugin_api_server_id` INT NOT NULL, + `tenant_bss_api_server_id` INT NOT NULL, + `provisioning_server_id` INT NOT NULL, + `facebook_server_id` INT NULL, + `messagebird_server_id` INT NULL, + `sms_server_id` INT NULL, + `telco_network_id` INT NULL, + `access_network_id` INT NOT NULL, + `mongodb_replicaset_id` INT NOT NULL, + `report_server_id` INT NOT NULL, + `mailbox_server_id` INT NULL, + `team_viewer_server_id` INT NULL, + `local_contact_db_server_id` INT NOT NULL, + `zammad_contact_db_server_id` INT NULL, + `livespace_contact_db_server_id` INT NULL, + `salesforce_contact_db_server_id` INT NULL, + `dynamics_contact_db_server_id` INT NULL, + `fully_verified_server_id` INT NULL, + `idenfy_server_id` INT NULL, + `talkieai_server_id` INT NULL, + `techmo_server_id` INT NULL, + `ldap_server_id` INT NULL, + `messaging_server_id` INT NOT NULL, + `user_notification_server_id` INT NULL, + `tenant_web_polling_api_server_id` INT NOT NULL, + `ticketing_server_id` INT NOT NULL, + `operator_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_session_server1_idx` (`session_server_id` ASC), + INDEX `fk_tenant_file_server1_idx` (`file_server_id` ASC), + INDEX `fk_tenant_cdr_server1_idx` (`cdr_server_id` ASC), + UNIQUE INDEX `domain_UNIQUE` (`domain` ASC), + INDEX `fk_tenant_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC), + INDEX `fk_tenant_system1_idx` (`system_id` ASC), + INDEX `fk_tenant_kamailio1_idx` (`kamailio_id` ASC), + INDEX `fk_tenant_tenant_api_server1_idx` (`tenant_api_server_id` ASC), + INDEX `fk_tenant_provisioning_server1_idx` (`provisioning_server_id` ASC), + INDEX `fk_tenant_gateway_pool1_idx` (`gateway_pool_id` ASC), + INDEX `fk_tenant_telco_network1_idx` (`telco_network_id` ASC), + INDEX `fk_tenant_access_network1_idx` (`access_network_id` ASC), + INDEX `fk_tenant_mongodb_replicaset1_idx` (`mongodb_replicaset_id` ASC), + INDEX `fk_tenant_sms_server1_idx` (`sms_server_id` ASC), + INDEX `fk_tenant_tenant_plugin_api_server1_idx` (`tenant_plugin_api_server_id` ASC), + INDEX `fk_tenant_anti_fraud_server1_idx` (`anti_fraud_server_id` ASC), + INDEX `fk_tenant_report_server1_idx` (`report_server_id` ASC), + INDEX `fk_tenant_tenant_bss_api_server1_idx` (`tenant_bss_api_server_id` ASC), + INDEX `fk_tenant_operator1_idx` (`operator_id` ASC), + INDEX `fk_tenant_local_contact_db_server1_idx` (`local_contact_db_server_id` ASC), + INDEX `fk_tenant_team_viewer_server1_idx` (`team_viewer_server_id` ASC), + INDEX `fk_tenant_zammad_contact_db_server1_idx` (`zammad_contact_db_server_id` ASC), + INDEX `fk_tenant_livespace_contact_db_server1_idx` (`livespace_contact_db_server_id` ASC), + INDEX `fk_tenant_salesforce_contact_db_server1_idx` (`salesforce_contact_db_server_id` ASC), + INDEX `fk_tenant_dynamics_contact_db_server1_idx` (`dynamics_contact_db_server_id` ASC), + INDEX `fk_tenant_idenfy_server1_idx` (`idenfy_server_id` ASC), + INDEX `fk_tenant_fully_verified_server1_idx` (`fully_verified_server_id` ASC), + INDEX `fk_tenant_talkieai_server1_idx` (`talkieai_server_id` ASC), + INDEX `fk_tenant_mailbox_server1_idx` (`mailbox_server_id` ASC), + INDEX `fk_tenant_messaging_server1_idx` (`messaging_server_id` ASC), + INDEX `fk_tenant_techmo_server1_idx` (`techmo_server_id` ASC), + INDEX `fk_tenant_ldap_server1_idx` (`ldap_server_id` ASC), + INDEX `fk_tenant_facebook_server1_idx` (`facebook_server_id` ASC), + INDEX `fk_tenant_messagebird_server1_idx` (`messagebird_server_id` ASC), + INDEX `fk_tenant_user_notification_server1_idx` (`user_notification_server_id` ASC), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_tenant_tenant_web_polling_api_server1_idx` (`tenant_web_polling_api_server_id` ASC), + INDEX `fk_tenant_ticketing_server1_idx` (`ticketing_server_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_gateway` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_gateway` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_gateway` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `username` VARCHAR(90) NULL, + `realm` VARCHAR(90) NULL, + `from_user` VARCHAR(90) NULL, + `from_domain` VARCHAR(90) NULL, + `password` VARCHAR(90) NULL, + `extension` VARCHAR(90) NULL, + `proxy` VARCHAR(90) NULL, + `register_proxy` VARCHAR(90) NULL, + `expire_seconds` INT NULL, + `register` TINYINT(1) NULL DEFAULT 0, + `register_transport` VARCHAR(45) NULL DEFAULT 'udp', + `retry_seconds` INT NULL, + `caller_id_in_from` TINYINT(1) NOT NULL DEFAULT 0, + `contact_params` VARCHAR(255) NULL, + `ping` INT NULL, + `validate_e164` TINYINT(1) NOT NULL DEFAULT 1, + `presentation_preservation_policy` VARCHAR(45) NOT NULL DEFAULT 'DIRECT' COMMENT 'DIRECT | DIVERSION | DISABLED', + `diversion_header_format` VARCHAR(255) NOT NULL DEFAULT '{}', + `sip_cid_type` VARCHAR(45) NOT NULL DEFAULT 'pid' COMMENT '\'pid | rpid | none\'', + `telco_network_id` INT NOT NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_gateway_telco_network1_idx` (`telco_network_id` ASC), + INDEX `fk_operator_gateway_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`normalization` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`normalization` ; + +CREATE TABLE IF NOT EXISTS `topology`.`normalization` ( + `id` INT NOT NULL AUTO_INCREMENT, + `direction` VARCHAR(45) NOT NULL DEFAULT 'OUTBOUND' COMMENT 'INBOUND | OUTBOUND', + `peer` VARCHAR(45) NOT NULL DEFAULT 'caller' COMMENT 'caller | calee', + `pattern` VARCHAR(255) NOT NULL, + `replacement` VARCHAR(45) NOT NULL, + `priority` INT NOT NULL DEFAULT 100, + `operator_gateway_id` INT NOT NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_normalization_operator_gateway1_idx` (`operator_gateway_id` ASC), + INDEX `fk_normalization_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`gateway` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`gateway` ; + +CREATE TABLE IF NOT EXISTS `topology`.`gateway` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `event_socket_password` VARCHAR(45) NOT NULL, + `sip_profile_internal_count` INT NOT NULL, + `internal_srv_priority` INT NOT NULL DEFAULT 100, + `internal_srv_weight` INT NOT NULL DEFAULT 100, + `sip_profile_external_count` INT NOT NULL, + `external_srv_priority` INT NOT NULL DEFAULT 100, + `external_srv_weight` INT NOT NULL DEFAULT 100, + `gateway_pool_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_gateway_gateway_pool1_idx` (`gateway_pool_id` ASC), + INDEX `fk_gateway_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`country_acl` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`country_acl` ; + +CREATE TABLE IF NOT EXISTS `topology`.`country_acl` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `list_type` VARCHAR(45) NOT NULL COMMENT 'BLACK|WHITE', + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`, `operator_id`), + INDEX `fk_country_acl_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`country_acl_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`country_acl_item` ; + +CREATE TABLE IF NOT EXISTS `topology`.`country_acl_item` ( + `id` INT NOT NULL AUTO_INCREMENT, + `iso_code` VARCHAR(2) NOT NULL, + `country_acl_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_country_acl_item_country_acl1_idx` (`country_acl_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`tenant_login_api_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`tenant_login_api_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`tenant_login_api_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_listener_count` INT NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_api_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_tenant_api_server_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_tenant_login_api_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`system_api_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`system_api_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`system_api_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `api_listener_count` INT NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_api_server_nginx1_idx` (`nginx_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_tenant_api_server_system1_idx` (`system_id` ASC), + INDEX `fk_system_api_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`tenant_app_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`tenant_app_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`tenant_app_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_app_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_tenant_app_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`system_app_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`system_app_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`system_app_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_system_app_server_system1_idx` (`system_id` ASC), + INDEX `fk_system_app_server_nginx1_idx` (`nginx_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_app_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_app_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_app_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_reseller_app_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_reseller_app_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`sip_profile_param` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`sip_profile_param` ; + +CREATE TABLE IF NOT EXISTS `topology`.`sip_profile_param` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`sip_profile_setting` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`sip_profile_setting` ; + +CREATE TABLE IF NOT EXISTS `topology`.`sip_profile_setting` ( + `id` INT NOT NULL AUTO_INCREMENT, + `value` VARCHAR(45) NOT NULL, + `sip_profile_param_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_sip_profile_setting_sip_profile_param1_idx` (`sip_profile_param_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`line_has_profile_setting` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`line_has_profile_setting` ; + +CREATE TABLE IF NOT EXISTS `topology`.`line_has_profile_setting` ( + `id` INT NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) NOT NULL, + `freeswitch_pool_id` INT NOT NULL, + `sip_profile_setting_id` INT NOT NULL, + INDEX `fk_freeswitch_pool_has_sip_profile_setting_sip_profile_sett_idx` (`sip_profile_setting_id` ASC), + INDEX `fk_freeswitch_pool_has_sip_profile_setting_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`gateway_has_profile_setting` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`gateway_has_profile_setting` ; + +CREATE TABLE IF NOT EXISTS `topology`.`gateway_has_profile_setting` ( + `id` INT NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) NOT NULL, + `freeswitch_pool_id` INT NOT NULL, + `sip_profile_setting_id` INT NOT NULL, + INDEX `fk_freeswitch_pool_has_sip_profile_setting_sip_profile_sett_idx` (`sip_profile_setting_id` ASC), + INDEX `fk_freeswitch_pool_has_sip_profile_setting_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`internal_has_profile_setting` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`internal_has_profile_setting` ; + +CREATE TABLE IF NOT EXISTS `topology`.`internal_has_profile_setting` ( + `id` INT NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) NOT NULL, + `gateway_pool_id` INT NOT NULL, + `sip_profile_setting_id` INT NOT NULL, + INDEX `fk_gateway_pool_has_sip_profile_setting_sip_profile_setting_idx` (`sip_profile_setting_id` ASC), + INDEX `fk_gateway_pool_has_sip_profile_setting_gateway_pool1_idx` (`gateway_pool_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`external_has_profile_setting` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`external_has_profile_setting` ; + +CREATE TABLE IF NOT EXISTS `topology`.`external_has_profile_setting` ( + `id` INT NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) NOT NULL, + `gateway_pool_id` INT NOT NULL, + `sip_profile_setting_id` INT NOT NULL, + INDEX `fk_gateway_pool_has_sip_profile_setting_sip_profile_setting_idx` (`sip_profile_setting_id` ASC), + INDEX `fk_gateway_pool_has_sip_profile_setting_gateway_pool1_idx` (`gateway_pool_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`server_node_has_access_network` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`server_node_has_access_network` ; + +CREATE TABLE IF NOT EXISTS `topology`.`server_node_has_access_network` ( + `id` INT NOT NULL AUTO_INCREMENT, + `ipv4_address` VARCHAR(45) NOT NULL, + `ext_ipv4_address` VARCHAR(45) NULL, + `server_node_id` INT NOT NULL, + `access_network_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_server_node_has_access_network_access_network1_idx` (`access_network_id` ASC), + INDEX `fk_server_node_has_access_network_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`server_node_has_telco_network` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`server_node_has_telco_network` ; + +CREATE TABLE IF NOT EXISTS `topology`.`server_node_has_telco_network` ( + `id` INT NOT NULL AUTO_INCREMENT, + `ipv4_address` VARCHAR(45) NOT NULL, + `server_node_id` INT NOT NULL, + `telco_network_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_server_node_has_telco_network_telco_network1_idx` (`telco_network_id` ASC), + INDEX `fk_server_node_has_telco_network_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_freeswitch_pool` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_freeswitch_pool` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_freeswitch_pool` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `freeswitch_pool_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_has_freeswitch_pool_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC), + INDEX `fk_operator_has_freeswitch_pool_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_gateway_pool` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_gateway_pool` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_gateway_pool` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `gateway_pool_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_has_gateway_pool_gateway_pool1_idx` (`gateway_pool_id` ASC), + INDEX `fk_operator_has_gateway_pool_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`mongodb_node` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`mongodb_node` ; + +CREATE TABLE IF NOT EXISTS `topology`.`mongodb_node` ( + `id` INT NOT NULL, + `name` VARCHAR(45) NULL, + `db_user` VARCHAR(45) NULL, + `db_password` VARCHAR(45) NULL, + `db_path` VARCHAR(45) NULL, + `arbiter_only` TINYINT(1) NULL, + `mongodb_replicaset_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_mongodb_node_mongodb_replicaset1_idx` (`mongodb_replicaset_id` ASC), + INDEX `fk_mongodb_node_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`domain_name_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`domain_name_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`domain_name_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`, `server_node_id`), + INDEX `fk_domain_name_server_system1_idx` (`system_id` ASC), + INDEX `fk_domain_name_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_kamailio` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_kamailio` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_kamailio` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `kamailio_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_has_kamailio_kamailio1_idx` (`kamailio_id` ASC), + INDEX `fk_operator_has_kamailio_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_file_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_file_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_file_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `file_server_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_has_file_server_file_server1_idx` (`file_server_id` ASC), + INDEX `fk_operator_has_file_server_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_cdr_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_cdr_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_cdr_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `cdr_server_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_has_cdr_server_cdr_server1_idx` (`cdr_server_id` ASC), + INDEX `fk_operator_has_cdr_server_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_tenant_api_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_tenant_api_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_tenant_api_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `tenant_api_server_id` INT NOT NULL, + INDEX `fk_operator_has_tenant_api_server_tenant_api_server1_idx` (`tenant_api_server_id` ASC), + INDEX `fk_operator_has_tenant_api_server_operator1_idx` (`operator_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_prov_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_prov_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_prov_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `provisioning_server_id` INT NOT NULL, + INDEX `fk_operator_has_provisioning_server_provisioning_server1_idx` (`provisioning_server_id` ASC), + INDEX `fk_operator_has_provisioning_server_operator1_idx` (`operator_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_sms_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_sms_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_sms_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `sms_server_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_has_sms_server_sms_server1_idx` (`sms_server_id` ASC), + INDEX `fk_operator_has_sms_server_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_anti_fraud_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_anti_fraud_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_anti_fraud_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `anti_fraud_server_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_has_anti_fraud_server_anti_fraud_server1_idx` (`anti_fraud_server_id` ASC), + INDEX `fk_operator_has_anti_fraud_server_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_plugin_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_plugin_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_plugin_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `tenant_plugin_api_server_id` INT NOT NULL, + INDEX `fk_operator_has_tenant_plugin_api_server_tenant_plugin_api__idx` (`tenant_plugin_api_server_id` ASC), + INDEX `fk_operator_has_tenant_plugin_api_server_operator1_idx` (`operator_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_mail_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_mail_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_mail_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `mail_server_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_has_mail_server_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_fb_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_fb_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_fb_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `fb_server_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_has_fb_server_operator1_idx` (`operator_id` ASC), + INDEX `fk_operator_has_fb_server_fb_server1_idx` (`fb_server_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_report_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_report_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_report_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `report_server_id` INT NOT NULL, + INDEX `fk_operator_has_report_server_operator1_idx` (`operator_id` ASC), + INDEX `fk_operator_has_report_server_report_server1_idx` (`report_server_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`communicator_app_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`communicator_app_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`communicator_app_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_communicator_app_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_communicator_app_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`device_app_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`device_app_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`device_app_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_device_app_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_device_app_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`wallboard_app_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`wallboard_app_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`wallboard_app_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_wallboard_app_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_wallboard_app_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_tenant_app_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_tenant_app_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_tenant_app_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `tenant_app_server_id` INT NOT NULL, + INDEX `fk_operator_has_tenant_app_server_tenant_app_server1_idx` (`tenant_app_server_id` ASC), + INDEX `fk_operator_has_tenant_app_server_operator1_idx` (`operator_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_tenant_bss_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_tenant_bss_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_tenant_bss_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `tenant_bss_api_server_id` INT NOT NULL, + INDEX `fk_operator_has_tenant_bss_api_server_tenant_bss_api_server_idx` (`tenant_bss_api_server_id` ASC), + INDEX `fk_operator_has_tenant_bss_api_server_operator1_idx` (`operator_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`invitation_app_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`invitation_app_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`invitation_app_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `app_listener_count` INT NOT NULL, + `nginx_id` INT NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_invitation_app_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_invitation_app_server_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_invitation_app_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`model_version` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`model_version` ; + +CREATE TABLE IF NOT EXISTS `topology`.`model_version` ( + `id` INT NOT NULL AUTO_INCREMENT, + `serial` VARCHAR(45) NOT NULL, + `dirty` TINYINT(1) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_routing` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_routing` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_routing` ( + `id` INT NOT NULL AUTO_INCREMENT, + `src_number_to_charge` VARCHAR(45) NULL, + `src_presentation_number` VARCHAR(45) NULL, + `dst` VARCHAR(45) NULL, + `priority` INT NULL, + `operator_gateway_id` INT NOT NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_routing_operator_gateway1_idx` (`operator_gateway_id` ASC), + INDEX `fk_operator_routing_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_access_network` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_access_network` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_access_network` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `access_network_id` INT NOT NULL, + INDEX `fk_operator_has_access_network_access_network1_idx` (`access_network_id` ASC), + INDEX `fk_operator_has_access_network_operator1_idx` (`operator_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`operator_has_telco_network` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`operator_has_telco_network` ; + +CREATE TABLE IF NOT EXISTS `topology`.`operator_has_telco_network` ( + `id` INT NOT NULL AUTO_INCREMENT, + `operator_id` INT NOT NULL, + `telco_network_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_has_telco_network_telco_network1_idx` (`telco_network_id` ASC), + INDEX `fk_operator_has_telco_network_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`gus_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`gus_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`gus_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `wsdl` VARCHAR(200) NULL, + `service_url` VARCHAR(200) NULL, + `service_key` VARCHAR(100) NULL, + `public_api_port` INT NOT NULL, + `nginx_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_gus_server_nginx1_idx` (`nginx_id` ASC), + INDEX `fk_gus_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_gus_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`tenant_has_telco_network` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`tenant_has_telco_network` ; + +CREATE TABLE IF NOT EXISTS `topology`.`tenant_has_telco_network` ( + `id` INT NOT NULL AUTO_INCREMENT, + `gateway_external_sip_port` INT NOT NULL, + `telco_network_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_has_telco_network_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_tenant_has_telco_network_telco_network1_idx` (`telco_network_id` ASC), + UNIQUE INDEX `id_UNIQUE` (`id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`storage` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`storage` ; + +CREATE TABLE IF NOT EXISTS `topology`.`storage` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `storage_type` VARCHAR(45) NOT NULL DEFAULT 'LOCAL' COMMENT 'LOCAL|NFS|S3', + `path` VARCHAR(255) NOT NULL, + `tenant_id` INT NOT NULL, + `file_server_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_storage_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_storage_file_server1_idx` (`file_server_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`mail_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`mail_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`mail_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `directory` VARCHAR(255) NOT NULL, + `system_id` INT NOT NULL, + `server_node_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_session_server_system1_idx` (`system_id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_session_server_server_node1_idx` (`server_node_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`mrcp_profile` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`mrcp_profile` ; + +CREATE TABLE IF NOT EXISTS `topology`.`mrcp_profile` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `version` INT NOT NULL DEFAULT 2, + `rtp_port_min` INT NOT NULL DEFAULT 4000, + `rtp_port_max` INT NOT NULL DEFAULT 5000, + `speechsynth` VARCHAR(45) NULL, + `speechrecog` VARCHAR(45) NULL, + `sip_transport` VARCHAR(45) NULL, + `server_ip` VARCHAR(45) NULL, + `server_port` INT NULL, + `freeswitch_pool_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_mrcp_profile_freeswitch_pool1_idx` (`freeswitch_pool_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`bot_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`bot_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`bot_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `private_port` INT NOT NULL, + `server_node_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_bot_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_bot_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `topology`.`bot_train_server` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `topology`.`bot_train_server` ; + +CREATE TABLE IF NOT EXISTS `topology`.`bot_train_server` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `private_port` INT NOT NULL, + `pool_process_limit` INT NOT NULL DEFAULT (3), + `server_node_id` INT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_bot_train_server_server_node1_idx` (`server_node_id` ASC), + INDEX `fk_bot_train_server_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/templates/mariadb/02_create_db_manager.sql b/templates/mariadb/02_create_db_manager.sql new file mode 100644 index 0000000..355efd0 --- /dev/null +++ b/templates/mariadb/02_create_db_manager.sql @@ -0,0 +1,6054 @@ +-- MySQL Script generated by MySQL Workbench +-- Wed Jul 20 08:48:19 2022 +-- Model: New Model Version: 1.0 +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; + +-- ----------------------------------------------------- +-- Schema manager +-- ----------------------------------------------------- +DROP SCHEMA IF EXISTS `manager` ; + +-- ----------------------------------------------------- +-- Schema manager +-- ----------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS `manager` DEFAULT CHARACTER SET utf8 ; +USE `manager` ; + +-- ----------------------------------------------------- +-- Table `manager`.`system` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`system` ; + +CREATE TABLE IF NOT EXISTS `manager`.`system` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `domain` VARCHAR(45) NULL, + `description` VARCHAR(255) NULL, + `language` VARCHAR(45) NOT NULL DEFAULT 'en', + `default_tenant_id` INT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + UNIQUE INDEX `domain_UNIQUE` (`domain` ASC), + INDEX `fk_system_tenant1_idx` (`default_tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `domain` VARCHAR(45) NOT NULL, + `currency` VARCHAR(45) NOT NULL, + `email` VARCHAR(100) NOT NULL, + `phone` VARCHAR(45) NULL, + `country` VARCHAR(45) NULL, + `province` VARCHAR(45) NULL, + `postcode` VARCHAR(10) NULL, + `city` VARCHAR(45) NULL, + `address_1` VARCHAR(100) NULL, + `address_2` VARCHAR(100) NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_operator_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`dealer` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`dealer` ; + +CREATE TABLE IF NOT EXISTS `manager`.`dealer` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NULL, + `firstname` VARCHAR(45) NULL, + `surname` VARCHAR(45) NULL, + `phone` VARCHAR(45) NULL, + `dealer_type` VARCHAR(45) NOT NULL COMMENT 'PERSON|BUSINESS', + `active` TINYINT(1) NOT NULL, + `email` VARCHAR(100) NOT NULL, + `country` VARCHAR(45) NULL, + `province` VARCHAR(45) NULL, + `postcode` VARCHAR(10) NULL, + `city` VARCHAR(45) NULL, + `address_1` VARCHAR(100) NULL, + `address_2` VARCHAR(100) NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `email_UNIQUE` (`email` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_dealer_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`special_service_zone` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`special_service_zone` ; + +CREATE TABLE IF NOT EXISTS `manager`.`special_service_zone` ( + `id` INT NOT NULL AUTO_INCREMENT, + `zone_code` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `country_iso_alpha2_code` VARCHAR(45) NOT NULL, + `province` VARCHAR(45) NULL, + `city` VARCHAR(45) NULL, + `postcode` VARCHAR(45) NULL, + `district` VARCHAR(45) NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_emergency_zones_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant` ( + `id` INT NOT NULL AUTO_INCREMENT, + `uuid` VARCHAR(36) NOT NULL, + `name` VARCHAR(100) NOT NULL, + `domain` VARCHAR(45) NOT NULL, + `time_zone` VARCHAR(100) NOT NULL DEFAULT 'Europe/Warsaw', + `language` VARCHAR(45) NOT NULL DEFAULT 'en', + `deleted` TINYINT(1) NOT NULL DEFAULT 0, + `active` TINYINT(1) NOT NULL DEFAULT 1, + `anonymous_sessions` TINYINT(1) NOT NULL, + `last_resort_ddi` VARCHAR(45) NULL, + `country` VARCHAR(45) NULL, + `province` VARCHAR(45) NULL, + `postcode` VARCHAR(45) NULL, + `city` VARCHAR(45) NULL, + `address_1` VARCHAR(100) NULL, + `address_2` VARCHAR(100) NULL, + `user_device_verification` TINYINT(1) NOT NULL DEFAULT 0, + `external_call_timeout` INT NOT NULL DEFAULT 120, + `pro_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `note` TEXT NULL, + `simultaneous_calls_limit` INT NOT NULL DEFAULT 100, + `dealer_id` INT NULL, + `default_special_service_zone_id` INT NULL, + `system_id` INT NOT NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_system1_idx` (`system_id` ASC), + UNIQUE INDEX `domain_UNIQUE` (`domain` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + UNIQUE INDEX `api_id_domain_UNIQUE` (`domain` ASC), + UNIQUE INDEX `uuid_UNIQUE` (`uuid` ASC), + INDEX `fk_tenant_operator1_idx` (`operator_id` ASC), + INDEX `fk_tenant_dealer1_idx` (`dealer_id` ASC), + INDEX `fk_tenant_special_service_zone1_idx` (`default_special_service_zone_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_wallet` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_wallet` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_wallet` ( + `id` INT NOT NULL AUTO_INCREMENT, + `currency` VARCHAR(45) NOT NULL, + `debit_enable` TINYINT(1) NOT NULL, + `debit_limit` DECIMAL(17,2) NULL, + `balance` DECIMAL(17,2) NOT NULL, + `min_withdraw` DECIMAL(17,2) NOT NULL DEFAULT 0, + `withdraw_cost` DECIMAL(17,2) NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_wallet_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`account` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`account` ; + +CREATE TABLE IF NOT EXISTS `manager`.`account` ( + `id` INT NOT NULL AUTO_INCREMENT, + `account_number` VARCHAR(100) NULL, + `account_type` VARCHAR(45) NOT NULL COMMENT 'CUSTOMER|PARTNER', + `company` TINYINT(1) NOT NULL COMMENT 'COMPANY|PERSON', + `company_name` VARCHAR(100) NULL, + `tax_identification_number` VARCHAR(45) NULL, + `priority` INT NOT NULL DEFAULT 100, + `country` VARCHAR(45) NULL, + `province` VARCHAR(45) NULL, + `postcode` VARCHAR(45) NULL, + `city` VARCHAR(45) NULL, + `address_1` VARCHAR(100) NULL, + `address_2` VARCHAR(100) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_client_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `customer_number_UNIQUE` (`account_number` ASC, `tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`team` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`team` ; + +CREATE TABLE IF NOT EXISTS `manager`.`team` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `target_identifier` VARCHAR(45) NOT NULL, + `tag_for_cdr` VARCHAR(255) NULL, + `show_only_assigned_projects` TINYINT(1) NOT NULL DEFAULT 0, + `limit_coffee_break_per_day_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `limit_coffee_break_per_day_count` INT NOT NULL DEFAULT 30, + `coffee_break_exceed_notify_user` TINYINT(1) NOT NULL DEFAULT 0, + `coffee_break_exceed_notify_managers` TINYINT(1) NOT NULL DEFAULT 0, + `limit_business_break_per_day_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `limit_business_break_per_day_count` INT NOT NULL DEFAULT 30, + `business_break_exceed_notify_user` TINYINT(1) NOT NULL DEFAULT 0, + `business_break_exceed_notify_managers` TINYINT(1) NOT NULL DEFAULT 0, + `team_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_team_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_team_team1_idx` (`team_id` ASC), + UNIQUE INDEX `uq_tenant_name` (`tenant_id` ASC, `name` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_user` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_user` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_user` ( + `id` INT NOT NULL AUTO_INCREMENT, + `username` VARCHAR(45) NOT NULL, + `password` VARCHAR(100) NOT NULL, + `password_change_enforce` TINYINT(1) NOT NULL DEFAULT 0, + `password_expiration_date` DATETIME NULL, + `language` VARCHAR(45) NOT NULL DEFAULT 'en', + `deleted` TINYINT(1) NOT NULL DEFAULT 0, + `active` TINYINT(1) NOT NULL DEFAULT 1, + `on_leave` TINYINT(1) NOT NULL DEFAULT 0, + `leave_cause` VARCHAR(45) NULL COMMENT 'VACATION|SICK', + `email` VARCHAR(45) NULL, + `phone_number_notification` VARCHAR(45) NULL, + `firstname` VARCHAR(45) NULL, + `surname` VARCHAR(45) NULL, + `avatar_id` VARCHAR(100) NULL, + `terminal_display` VARCHAR(45) NULL, + `team_id` INT NULL, + `change_avatar_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `change_on_leave_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `api_key` VARCHAR(100) NULL, + `main_license_package_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_user_tenant_idx` (`tenant_id` ASC), + INDEX `fk_tenant_user_team_idx` (`team_id` ASC), + UNIQUE INDEX `uk_tenant_id_username_idx` (`tenant_id` ASC, `username` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`system_role` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`system_role` ; + +CREATE TABLE IF NOT EXISTS `manager`.`system_role` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `available` TINYINT(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`schedule` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`schedule` ; + +CREATE TABLE IF NOT EXISTS `manager`.`schedule` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `default_rule` VARCHAR(45) NOT NULL DEFAULT 'DENY' COMMENT 'ALLOW|DENY', + `description` VARCHAR(255) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_schedule_tenant_idx` (`tenant_id` ASC), + UNIQUE INDEX `uk_tenant_id_name_idx` (`tenant_id` ASC, `name` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`calling_policy` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`calling_policy` ; + +CREATE TABLE IF NOT EXISTS `manager`.`calling_policy` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `default_rule` VARCHAR(45) NOT NULL DEFAULT 'ALLOW', + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_outbound_policy_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`project_ddi_pool` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`project_ddi_pool` ; + +CREATE TABLE IF NOT EXISTS `manager`.`project_ddi_pool` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_project_ddi_pool_project1_idx` (`project_id` ASC), + INDEX `fk_project_ddi_pool_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`project` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`project` ; + +CREATE TABLE IF NOT EXISTS `manager`.`project` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL COMMENT 'Dla usługo Konsultacje jeśli jest wielu agentów podpiętych pod projekt, wybieramy roundrobin jednego agenta i kierujemy połączenie do jego kolejki personalnej.', + `active` TINYINT(1) NOT NULL DEFAULT 1, + `language` VARCHAR(45) NOT NULL DEFAULT 'en', + `service_type` VARCHAR(45) NOT NULL COMMENT 'DIRECT_CALL|CONTACT_CENTER|BROADCAST', + `service_id` INT NOT NULL, + `target_identifier` VARCHAR(45) NOT NULL, + `transfer_preserve_presentation` TINYINT(1) NOT NULL DEFAULT 1, + `voice_presentation_ddi` VARCHAR(45) NULL, + `voice_primary_ddi` VARCHAR(45) NULL, + `sms_presentation_type` VARCHAR(45) NOT NULL DEFAULT 'DDI' COMMENT 'DDI|ALPHANUM', + `sms_presentation_ddi` VARCHAR(45) NULL, + `sms_presentation_alphanum` VARCHAR(45) NULL, + `sms_primary_ddi` VARCHAR(45) NULL, + `fax_presentation_ddi` VARCHAR(45) NULL, + `fax_primary_ddi` VARCHAR(45) NULL, + `email_signature` TEXT NULL, + `display_name` VARCHAR(45) NULL, + `avatar_id` VARCHAR(45) NULL, + `access_mode` VARCHAR(45) NOT NULL DEFAULT 'PUBLIC' COMMENT 'PUBLIC|IDENTIFIED|CUSTOMER|PARTNER|ACL', + `inbound_webapp_required` TINYINT(1) NOT NULL DEFAULT 0, + `inbound_consultants_reserve_count` INT NOT NULL DEFAULT 0, + `expected_service_time` INT NULL DEFAULT 10, + `permitted_service_time` INT NULL DEFAULT 120, + `show_service_time_notification` TINYINT(1) NULL DEFAULT 0, + `expected_service_ratio` INT NULL DEFAULT 95, + `permitted_service_ratio` INT NULL DEFAULT 80, + `show_service_ratio_notification` TINYINT(1) NULL DEFAULT 0, + `expected_predictive_drop_rate` INT NULL DEFAULT 5, + `permitted_predictive_drop_rate` INT NULL DEFAULT 10, + `show_predictive_drop_rate_notification` TINYINT(1) NULL DEFAULT 0, + `expected_predictive_answer_time` INT NULL DEFAULT 3, + `permitted_predictive_answer_time` INT NULL DEFAULT 10, + `show_predictive_answer_time_notification` TINYINT(1) NULL DEFAULT 0, + `expected_inbound_staff` INT NULL, + `permitted_inbound_staff` INT NULL, + `show_inbound_staff_notification` TINYINT(1) NULL DEFAULT 0, + `show_inbound_consultant_waiting_notification` TINYINT(1) NULL DEFAULT 0, + `expected_outbound_staff` INT NULL, + `permitted_outbound_staff` INT NULL, + `show_outbound_staff_notification` TINYINT(1) NULL DEFAULT 0, + `permitted_inbound_consultant_waiting` INT NULL, + `expected_inbound_consultant_waiting` INT NULL, + `expected_predictive_answer_time_ratio` INT NULL DEFAULT 90, + `permitted_predictive_answer_time_ratio` INT NULL DEFAULT 70, + `sla_predictive_answer_time` INT NULL DEFAULT 5, + `expected_service_time_ratio` INT NULL DEFAULT 90, + `permitted_service_time_ratio` INT NULL DEFAULT 70, + `show_service_time_ratio_notification` TINYINT(1) NULL DEFAULT 0, + `sla_service_time` INT NULL DEFAULT 20, + `show_sla_service_time_notification` TINYINT(1) NULL DEFAULT 0, + `show_sla_service_time_ratio_notification` TINYINT(1) NULL DEFAULT 0, + `show_sla_inbound_consultant_waiting_notification` TINYINT(1) NULL DEFAULT 0, + `show_predictive_sla_service_time_ratio_notification` TINYINT(1) NULL DEFAULT 0, + `sla_dialer_call_time` INT NULL DEFAULT 300, + `expected_dialer_call_time_ratio` INT NULL DEFAULT 90, + `permitted_dialer_call_time_ratio` INT NULL DEFAULT 70, + `sla_dialer_connect_time` INT NULL DEFAULT 900, + `expected_dialer_connect_time_ratio` INT NULL DEFAULT 90, + `permitted_dialer_connect_time_ratio` INT NOT NULL DEFAULT 70, + `acw_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `acw_time` INT NOT NULL DEFAULT 30, + `acw_lock_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `acw_notify_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `acw_recommended_time` INT NOT NULL DEFAULT 30, + `contact_fail_acw_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `reject_break_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `reject_break_time` INT NOT NULL DEFAULT 10, + `timeout_break_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `timeout_break_time` INT NOT NULL DEFAULT 10, + `noanswer_limit_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `noanswer_limit` INT NOT NULL DEFAULT 10, + `tier_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tier_timeout` INT ZEROFILL NOT NULL DEFAULT 120, + `tier_timeout_multiply` TINYINT(1) NOT NULL DEFAULT 0, + `tier_noagent_skip` TINYINT(1) NOT NULL DEFAULT 0, + `dedicated_user_transfer_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `dedicated_user_transfer_timeout` INT NOT NULL DEFAULT 30, + `consultant_call_timeout` INT NOT NULL DEFAULT 30, + `enable_video` TINYINT(1) NULL DEFAULT 0, + `enable_audio` TINYINT(1) NOT NULL DEFAULT 0, + `enable_chat` TINYINT(1) NOT NULL DEFAULT 0, + `enable_sms` TINYINT(1) NOT NULL DEFAULT 0, + `enable_email` TINYINT(1) NOT NULL DEFAULT 0, + `enable_facebook` TINYINT(1) NOT NULL DEFAULT 0, + `enable_whatsapp` TINYINT(1) NOT NULL DEFAULT 0, + `enable_webmessage` TINYINT(1) NOT NULL DEFAULT 0, + `enable_voicemail` TINYINT(1) NOT NULL DEFAULT 0, + `enable_fax` TINYINT(1) NOT NULL DEFAULT 0, + `enable_bookingsync` TINYINT(1) NOT NULL DEFAULT 0, + `enable_instagram` TINYINT(1) NOT NULL DEFAULT 0, + `sms_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST', + `close_sms_on_out_message` INT NOT NULL DEFAULT 0, + `unassign_sms_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1, + `email_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST', + `close_email_on_out_message` INT NOT NULL DEFAULT 0, + `unassign_email_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 0, + `facebook_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST', + `unassign_facebook_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1, + `whatsapp_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN', + `unassign_whatsapp_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1, + `close_whatsapp_on_out_message` INT NOT NULL DEFAULT 0, + `webmessage_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST', + `unassign_webmessage_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1, + `voicemail_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST', + `unassign_voicemail_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1, + `fax_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN' COMMENT 'RANDOM|ROUND_ROBIN|SCORE|LEAST', + `unassign_fax_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1, + `close_fax_on_out_message` INT NOT NULL DEFAULT 0, + `bookingsync_distribution_method` VARCHAR(45) NOT NULL DEFAULT 'ROUND_ROBIN', + `unassign_bookingsync_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1, + `instagram_distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN', + `unassign_instagram_after_open_if_user_cannot_serve` INT NOT NULL DEFAULT 1, + `state` VARCHAR(45) NOT NULL DEFAULT 'STARTED' COMMENT 'STARTED|STOPPED', + `prioritized_predictive_overcalling` TINYINT(1) NOT NULL DEFAULT 0, + `work_schedule_id` INT NULL, + `out_of_schedule_announcement_id` VARCHAR(45) NULL, + `out_of_schedule_announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `out_of_schedule_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `out_of_schedule_diversion_number` VARCHAR(45) NULL, + `outbound_presentation_strategy` VARCHAR(45) NOT NULL DEFAULT 'PROJECT' COMMENT 'USER|PROJECT', + `outbound_policy_id` INT NULL, + `inbound_policy_id` INT NULL, + `project_ddi_pool_id` INT NULL, + `show_number_history` TINYINT(1) NOT NULL DEFAULT 1, + `show_number_recording` TINYINT(1) NOT NULL DEFAULT 1, + `dialog_info_template` TEXT NULL, + `conversation_send_without_assign` TINYINT(1) NOT NULL DEFAULT 0, + `block_assigned_conversation` TINYINT(1) NOT NULL DEFAULT 0, + `default_priority_sms` INT NOT NULL DEFAULT 100, + `default_priority_email` INT NOT NULL DEFAULT 100, + `default_priority_facebook` INT NOT NULL DEFAULT 100, + `default_priority_whatsapp` INT NOT NULL DEFAULT 100, + `default_priority_webmessage` INT NOT NULL DEFAULT 100, + `default_priority_voicemail` INT NOT NULL DEFAULT 100, + `default_priority_fax` INT NOT NULL DEFAULT 100, + `default_priority_bookingsync` INT NOT NULL DEFAULT 100, + `default_priority_instagram` INT NOT NULL DEFAULT 100, + `call_request_process_mode` VARCHAR(45) NOT NULL DEFAULT 'FIFO' COMMENT 'FIFO|LIFO', + `close_conversation_after_days_of_inactivity` INT NULL, + `conversation_prefer_manager` TINYINT(1) NOT NULL DEFAULT 0, + `conversation_distribution_login_required` TINYINT(1) NOT NULL DEFAULT 1, + `lock_change_to_break_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `lock_change_to_break_members_limit` INT NOT NULL DEFAULT 1, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_project_tenant_idx` (`tenant_id` ASC), + INDEX `fk_project_schedule_idx` (`work_schedule_id` ASC), + UNIQUE INDEX `uk_tenant_id_target_identifier` (`tenant_id` ASC, `target_identifier` ASC), + INDEX `fk_project_inbound_policy1_idx` (`inbound_policy_id` ASC), + INDEX `fk_project_project_ddi_pool1_idx` (`project_ddi_pool_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`credit_offer` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`credit_offer` ; + +CREATE TABLE IF NOT EXISTS `manager`.`credit_offer` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `launched` TINYINT(1) NOT NULL, + `launch_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `active` TINYINT(1) NOT NULL, + `visible` TINYINT(1) NOT NULL, + `credit_currency` VARCHAR(45) NOT NULL, + `credit_value` DECIMAL(17,2) NOT NULL, + `offer_expire_time` VARCHAR(45) NULL, + `min_purchase` INT NULL, + `max_purchase` INT NULL, + `credit_expire_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `credit_life_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `purse_limit` INT NULL, + `purse_amount` INT NULL, + `description` VARCHAR(255) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_credit_offer_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`credit_purse` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`credit_purse` ; + +CREATE TABLE IF NOT EXISTS `manager`.`credit_purse` ( + `id` INT NOT NULL AUTO_INCREMENT, + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `active` TINYINT(1) NOT NULL, + `credit_currency` VARCHAR(45) NOT NULL, + `credit_value` DECIMAL(17,2) NOT NULL COMMENT 'zniżka w wysokości procet wartości zwykłej monety typu C w przedzialei 0-100% (w przypadku monety tenanta)', + `purse_volume` INT NOT NULL, + `balance` INT NOT NULL, + `expire_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `customer_id` INT NOT NULL, + `credit_offer_id` INT NOT NULL, + `customer_supply_transaction_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_credit_purse_customer1_idx` (`customer_id` ASC), + INDEX `fk_credit_purse_credit_offer1_idx` (`credit_offer_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`contact_center_service` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`contact_center_service` ; + +CREATE TABLE IF NOT EXISTS `manager`.`contact_center_service` ( + `id` INT NOT NULL AUTO_INCREMENT, + `distribution_strategy` VARCHAR(45) NOT NULL DEFAULT 'TOP_DOWN', + `prefer_recent_agent` TINYINT(1) NOT NULL DEFAULT 0, + `prefer_recent_agent_grace_period` INT NOT NULL DEFAULT 30, + `prefer_manager` TINYINT(1) NOT NULL DEFAULT 0, + `multichat_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `according_to_score` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_cc_queue_service_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_has_service` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_has_service` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_has_service` ( + `id` INT NOT NULL, + `name` VARCHAR(45) NULL, + `description` VARCHAR(255) NULL, + `margin` FLOAT NULL, + `minimum_credit_cost` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_service_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`broadcast_service` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`broadcast_service` ; + +CREATE TABLE IF NOT EXISTS `manager`.`broadcast_service` ( + `id` INT NOT NULL AUTO_INCREMENT, + `anonymous_limit` INT NOT NULL DEFAULT 0, + `customer_limit` INT NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_broadcast_service_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_contact_person` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_contact_person` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_contact_person` ( + `id` INT NOT NULL AUTO_INCREMENT, + `firstname` VARCHAR(45) NOT NULL, + `surname` VARCHAR(45) NOT NULL, + `contact_type` VARCHAR(45) NULL, + `email` VARCHAR(45) NULL, + `phone` VARCHAR(45) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_contact_person_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_user_has_system_role` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_user_has_system_role` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_system_role` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_user_id` INT NOT NULL, + `system_role_id` INT NOT NULL, + PRIMARY KEY (`id`, `tenant_user_id`, `system_role_id`), + INDEX `fk_user_has_role_role1_idx` (`system_role_id` ASC), + INDEX `fk_user_has_role_user1_idx` (`tenant_user_id` ASC), + UNIQUE INDEX `id_UNIQUE` (`id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`system_wallet` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`system_wallet` ; + +CREATE TABLE IF NOT EXISTS `manager`.`system_wallet` ( + `id` INT NOT NULL AUTO_INCREMENT, + `currency` VARCHAR(45) NOT NULL, + `balance` DECIMAL(17,2) NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_system_wallet_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`dealer_wallet` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`dealer_wallet` ; + +CREATE TABLE IF NOT EXISTS `manager`.`dealer_wallet` ( + `id` INT NOT NULL AUTO_INCREMENT, + `currency` VARCHAR(45) NOT NULL, + `balance` DECIMAL(17,2) NOT NULL, + `min_withdraw` DECIMAL(17,2) NOT NULL DEFAULT 0, + `withdraw_cost` DECIMAL(17,2) NOT NULL DEFAULT 0, + `dealer_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_dealer_wallet_dealer1_idx` (`dealer_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`dealer_withdraw_bank_account` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`dealer_withdraw_bank_account` ; + +CREATE TABLE IF NOT EXISTS `manager`.`dealer_withdraw_bank_account` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `iban` VARCHAR(45) NOT NULL, + `active` TINYINT(1) NOT NULL, + `currency` VARCHAR(45) NOT NULL, + `country` VARCHAR(45) NULL, + `postcode` VARCHAR(10) NULL, + `city` VARCHAR(45) NULL, + `address` VARCHAR(100) NULL, + `description` VARCHAR(255) NULL, + `dealer_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_dealer_withdraw_bank_account_dealer1_idx` (`dealer_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_withdraw_bank_account` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_withdraw_bank_account` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_withdraw_bank_account` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `iban` VARCHAR(45) NOT NULL, + `active` TINYINT(1) NOT NULL, + `currency` VARCHAR(45) NOT NULL, + `country` VARCHAR(45) NULL, + `postcode` VARCHAR(10) NULL, + `city` VARCHAR(45) NULL, + `address` VARCHAR(100) NULL, + `description` VARCHAR(255) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_bank_account_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `iban_UNIQUE` (`iban` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`task_service` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`task_service` ; + +CREATE TABLE IF NOT EXISTS `manager`.`task_service` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `offer_life_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `persistent` TINYINT(1) NOT NULL COMMENT 'session, tenant, user\n', + `autocreate` TINYINT(1) NOT NULL, + `piggybank` TINYINT(1) NOT NULL, + `charge_negotiation` TINYINT(1) NOT NULL, + `credit_charge_amount` INT NULL, + `min_credit_charge_amount` INT NULL, + `max_credit_charge_amount` INT NULL, + `min_piggybank_credit_charge_amount` INT NULL, + `dtmf_approve_code` VARCHAR(10) NULL, + `description` VARCHAR(255) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_task_service_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`task_agreement` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`task_agreement` ; + +CREATE TABLE IF NOT EXISTS `manager`.`task_agreement` ( + `id` INT NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) NOT NULL, + `agreement_uuid` VARCHAR(100) NOT NULL, + `agreement_file` VARCHAR(100) NULL, + `offer_create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `offer_expire_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `piggybank_progress` DECIMAL(4,2) NULL, + `payment_status` VARCHAR(45) NULL COMMENT 'requested, pending, done', + `payment_status_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `execution_status` VARCHAR(45) NULL, + `execution_status_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `task_service_id` INT NOT NULL, + `tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_task_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_task_task_service1_idx` (`task_service_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`project_has_task_service` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`project_has_task_service` ; + +CREATE TABLE IF NOT EXISTS `manager`.`project_has_task_service` ( + `id` INT NOT NULL AUTO_INCREMENT, + `project_id` INT NOT NULL, + `task_service_id` INT NOT NULL, + PRIMARY KEY (`id`, `project_id`, `task_service_id`), + INDEX `fk_project_has_task_service_task_service1_idx` (`task_service_id` ASC), + INDEX `fk_project_has_task_service_project1_idx` (`project_id` ASC), + UNIQUE INDEX `id_UNIQUE` (`id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`system_withdraw_bank_account` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`system_withdraw_bank_account` ; + +CREATE TABLE IF NOT EXISTS `manager`.`system_withdraw_bank_account` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `iban` VARCHAR(45) NOT NULL, + `active` TINYINT(1) NOT NULL, + `currency` VARCHAR(45) NOT NULL, + `country` VARCHAR(45) NULL, + `postcode` VARCHAR(10) NULL, + `city` VARCHAR(45) NULL, + `address` VARCHAR(100) NULL, + `description` VARCHAR(255) NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_system_bank_account_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`task_agreement_has_customer` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`task_agreement_has_customer` ; + +CREATE TABLE IF NOT EXISTS `manager`.`task_agreement_has_customer` ( + `id` INT NOT NULL AUTO_INCREMENT, + `task_agreement_id` INT NOT NULL, + `customer_id` INT NOT NULL, + PRIMARY KEY (`id`, `task_agreement_id`, `customer_id`), + INDEX `fk_task_agreement_has_customer_customer1_idx` (`customer_id` ASC), + INDEX `fk_task_agreement_has_customer_task_agreement1_idx` (`task_agreement_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator_contact_person` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator_contact_person` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator_contact_person` ( + `id` INT NOT NULL AUTO_INCREMENT, + `firstname` VARCHAR(45) NOT NULL, + `surname` VARCHAR(45) NOT NULL, + `job_title` VARCHAR(45) NULL, + `email` VARCHAR(100) NULL, + `phone` VARCHAR(45) NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_reseller_contact_person_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`system_user` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`system_user` ; + +CREATE TABLE IF NOT EXISTS `manager`.`system_user` ( + `id` INT NOT NULL AUTO_INCREMENT, + `username` VARCHAR(45) NOT NULL, + `password` VARCHAR(100) NOT NULL, + `email` VARCHAR(100) NOT NULL, + `role` VARCHAR(45) NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `username_UNIQUE` (`username` ASC), + INDEX `fk_system_user_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`voucher_offer` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`voucher_offer` ; + +CREATE TABLE IF NOT EXISTS `manager`.`voucher_offer` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `launched` TINYINT(1) NOT NULL, + `launch_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `active` TINYINT(1) NOT NULL, + `visible` TINYINT(1) NOT NULL, + `voucher_currency` VARCHAR(45) NOT NULL, + `nominal_value` DECIMAL(17,2) NOT NULL, + `purchase_value` DECIMAL(17,2) NOT NULL, + `offer_expire_time` VARCHAR(45) NULL, + `voucher_expire_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `voucher_life_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `description` VARCHAR(255) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_voucher_offer_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`voucher` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`voucher` ; + +CREATE TABLE IF NOT EXISTS `manager`.`voucher` ( + `id` INT NOT NULL AUTO_INCREMENT, + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `active` TINYINT(1) NOT NULL, + `voucher_currency` VARCHAR(45) NOT NULL, + `nominal_value` VARCHAR(45) NOT NULL, + `purchase_value` VARCHAR(45) NOT NULL, + `balance` DECIMAL(17,2) NOT NULL, + `expire_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `customer_id` INT NOT NULL, + `voucher_offer_id` INT NOT NULL, + `customer_supply_transaction_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_voucher_customer1_idx` (`customer_id` ASC), + INDEX `fk_voucher_voucher_offer1_idx` (`voucher_offer_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`routing` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`routing` ; + +CREATE TABLE IF NOT EXISTS `manager`.`routing` ( + `id` INT NOT NULL AUTO_INCREMENT, + `routing_type` VARCHAR(45) NOT NULL COMMENT 'SYSTEM | USER', + `src` VARCHAR(100) NOT NULL COMMENT 'PSTN unikalny globalnie zawiera CC\nWEB unikalny w ramach tenanta\nEMAIL\nSMS', + `dst` VARCHAR(100) NOT NULL, + `target_type` VARCHAR(45) NOT NULL COMMENT 'CALL | SMS | EMAIL', + `priority` INT NOT NULL DEFAULT 100, + `application_type` VARCHAR(45) NOT NULL COMMENT 'PROJECT | CALL_USER| IVR', + `application_id` VARCHAR(100) NULL, + `selection_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_project_target_project1_idx` (`dst` ASC), + INDEX `fk_routing_tenant1_idx` (`tenant_id` ASC), + INDEX `idx_tenant_type_src_dst_priority` (`tenant_id` ASC, `target_type` ASC, `src` ASC, `dst` ASC, `priority` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`project_currency_cost` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`project_currency_cost` ; + +CREATE TABLE IF NOT EXISTS `manager`.`project_currency_cost` ( + `id` INT NOT NULL AUTO_INCREMENT, + `currency` VARCHAR(45) NOT NULL, + `currency_charge_amount` DECIMAL(17,2) NOT NULL, + `project_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_project_currency_cost_project1_idx` (`project_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`task_service_currency_cost` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`task_service_currency_cost` ; + +CREATE TABLE IF NOT EXISTS `manager`.`task_service_currency_cost` ( + `id` INT NOT NULL AUTO_INCREMENT, + `task_service_id` INT NOT NULL, + `currency` VARCHAR(45) NOT NULL, + `currency_charge_amount` DECIMAL(17,2) NOT NULL, + `min_currency_charge_amount` DECIMAL(17,2) NULL, + `max_currency_charge_amount` DECIMAL(17,2) NULL, + `min_piggybank_currency_charge_amount` DECIMAL(17,2) NULL, + PRIMARY KEY (`id`), + INDEX `fk_task_currency_cost_task_service1_idx` (`task_service_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`task_agreement_currency_cost` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`task_agreement_currency_cost` ; + +CREATE TABLE IF NOT EXISTS `manager`.`task_agreement_currency_cost` ( + `id` INT NOT NULL AUTO_INCREMENT, + `currency` VARCHAR(45) NOT NULL, + `currency_charge_amount` DECIMAL(17,2) NOT NULL, + `min_piggybank_currency_charge_amount` DECIMAL(17,2) NULL, + `task_agreement_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_task_agreement_currency_cost_task_agreement1_idx` (`task_agreement_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator_user` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator_user` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator_user` ( + `id` INT NOT NULL AUTO_INCREMENT, + `user_type` VARCHAR(45) NOT NULL COMMENT 'OPERATOR|DEALER', + `username` VARCHAR(45) NOT NULL, + `password` VARCHAR(255) NOT NULL, + `active` TINYINT(1) NOT NULL DEFAULT 1, + `firstname` VARCHAR(45) NOT NULL, + `surname` VARCHAR(45) NOT NULL, + `email` VARCHAR(100) NOT NULL, + `phone` VARCHAR(45) NULL, + `role` VARCHAR(45) NOT NULL COMMENT 'ADMINISTRATOR|OPERATOR|INSPECTOR', + `dealer_id` INT NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `username_UNIQUE` (`username` ASC), + INDEX `fk_reseller_user_operator1_idx` (`operator_id` ASC), + INDEX `fk_operator_user_dealer1_idx` (`dealer_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`account_wallet` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`account_wallet` ; + +CREATE TABLE IF NOT EXISTS `manager`.`account_wallet` ( + `id` INT NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) NULL, + `currency` VARCHAR(45) NOT NULL, + `wallet_currency_balance` DECIMAL(17,2) NOT NULL, + `account_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_account_wallet_account1_idx` (`account_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`paypal_account` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`paypal_account` ; + +CREATE TABLE IF NOT EXISTS `manager`.`paypal_account` ( + `id` INT NOT NULL AUTO_INCREMENT, + `app_id` VARCHAR(100) NOT NULL, + `account` VARCHAR(100) NULL, + `client_id` VARCHAR(100) NOT NULL, + `secret` VARCHAR(100) NOT NULL, + `access_token` VARCHAR(200) NULL, + `expire_date` TIMESTAMP NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `clinet_id_UNIQUE` (`client_id` ASC), + UNIQUE INDEX `secret_UNIQUE` (`secret` ASC), + INDEX `fk_paypal_account_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`paypal_webhook` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`paypal_webhook` ; + +CREATE TABLE IF NOT EXISTS `manager`.`paypal_webhook` ( + `id` INT NOT NULL AUTO_INCREMENT, + `webhook_url` VARCHAR(100) NULL, + `webhook_id` VARCHAR(100) NULL, + `paypal_account_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_paypal_webhook_paypal_account1_idx` (`paypal_account_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`login` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`login` ; + +CREATE TABLE IF NOT EXISTS `manager`.`login` ( + `id` INT NOT NULL AUTO_INCREMENT, + `username` VARCHAR(45) NULL, + `nonce` VARCHAR(45) NULL, + `ip` TEXT NULL, + `time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `scope` VARCHAR(45) NULL COMMENT 'system\ntenant\noperator\ndealer\ncustomer', + `login_type` VARCHAR(45) NULL COMMENT 'nonce\npass', + `token_uuid` VARCHAR(64) NULL, + `token_valid` TINYINT(1) NULL, + `tenant_id` INT NULL, + `system_id` INT NULL, + `operator_id` INT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_login_system1_idx` (`system_id` ASC), + INDEX `fk_login_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_login_operator1_idx` (`operator_id` ASC), + INDEX `idx_token_uuid_scope` (`token_uuid` ASC, `scope` ASC), + INDEX `idx_system_id_username` (`system_id` ASC, `username` ASC), + INDEX `idx_operator_id_username` (`operator_id` ASC, `username` ASC), + INDEX `idx_time` (`time` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`project_has_consultant` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`project_has_consultant` ; + +CREATE TABLE IF NOT EXISTS `manager`.`project_has_consultant` ( + `id` INT NOT NULL AUTO_INCREMENT, + `score` INT NOT NULL DEFAULT 100, + `priority` INT NOT NULL DEFAULT 100, + `position` INT NOT NULL DEFAULT 1, + `tier` INT NOT NULL DEFAULT 1, + `accept_chat` TINYINT(1) NOT NULL DEFAULT 0, + `accept_audio` TINYINT(1) NOT NULL DEFAULT 0, + `accept_video` TINYINT(1) NOT NULL DEFAULT 0, + `accept_sms` TINYINT(1) NOT NULL DEFAULT 0, + `accept_email` TINYINT(1) NOT NULL DEFAULT 0, + `accept_facebook` TINYINT(1) NOT NULL DEFAULT 0, + `accept_whatsapp` TINYINT(1) NOT NULL DEFAULT 0, + `accept_webmessage` TINYINT(1) NOT NULL DEFAULT 0, + `accept_fax` TINYINT(1) NOT NULL DEFAULT 0, + `accept_voicemail` TINYINT(1) NOT NULL DEFAULT 0, + `accept_bookingsync` TINYINT(1) NOT NULL DEFAULT 0, + `accept_instagram` TINYINT(1) NOT NULL DEFAULT 0, + `fax2email_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `email2fax_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `voice_presentation_ddi` VARCHAR(45) NULL, + `voice_primary_ddi` VARCHAR(45) NULL, + `sms_presentation_type` VARCHAR(45) NOT NULL DEFAULT 'DDI' COMMENT 'DDI | ALPHANUM', + `sms_presentation_ddi` VARCHAR(45) NULL, + `sms_presentation_alphanum` VARCHAR(45) NULL, + `sms_primary_ddi` VARCHAR(45) NULL, + `fax_presentation_ddi` VARCHAR(45) NULL, + `fax_primary_ddi` VARCHAR(45) NULL, + `display_name` VARCHAR(45) NULL, + `avatar_id` VARCHAR(45) NULL, + `state` VARCHAR(45) NOT NULL DEFAULT 'BLENDING' COMMENT 'INBOUND|OUTBOUND|BLENDING|DISABLED', + `work_schedule_state` VARCHAR(45) NULL COMMENT 'INBOUND|OUTBOUND|BLENDING', + `work_schedule_id` INT NULL, + `priority_sms` INT NOT NULL DEFAULT 100, + `priority_email` INT NOT NULL DEFAULT 100, + `priority_facebook` INT NOT NULL DEFAULT 100, + `priority_whatsapp` INT NOT NULL DEFAULT 100, + `priority_webmessage` INT NOT NULL DEFAULT 100, + `priority_voicemail` INT NOT NULL DEFAULT 100, + `priority_fax` INT NOT NULL DEFAULT 100, + `priority_bookingsync` INT NOT NULL DEFAULT 100, + `priority_instagram` INT NOT NULL DEFAULT 100, + `automatic_sms_pickup` TINYINT(1) NOT NULL DEFAULT 1, + `automatic_email_pickup` TINYINT(1) NOT NULL DEFAULT 1, + `automatic_facebook_pickup` TINYINT(1) NOT NULL DEFAULT 1, + `automatic_whatsapp_pickup` TINYINT(1) NOT NULL DEFAULT 1, + `automatic_webmessage_pickup` TINYINT(1) NOT NULL DEFAULT 1, + `automatic_voicemail_pickup` TINYINT(1) NOT NULL DEFAULT 1, + `automatic_fax_pickup` TINYINT(1) NOT NULL DEFAULT 1, + `automatic_bookingsync_pickup` TINYINT(1) NOT NULL DEFAULT 1, + `automatic_instagram_pickup` TINYINT(1) NOT NULL DEFAULT 1, + `automatic_ticketing_pickup` TINYINT(1) NOT NULL DEFAULT 1, + `default_signature_from` VARCHAR(45) NULL, + `email_signature` TEXT NULL, + `tenant_user_id` INT NOT NULL, + `project_id` INT NOT NULL, + INDEX `fk_project_has_consultant_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_project_has_consultant_project_idx` (`project_id` ASC), + UNIQUE INDEX `uk_project_id_tenant_user_id_idx` (`project_id` ASC, `tenant_user_id` ASC), + INDEX `fk_project_has_consultant_schedule_idx` (`work_schedule_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`resource_privilege` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`resource_privilege` ; + +CREATE TABLE IF NOT EXISTS `manager`.`resource_privilege` ( + `id` INT NOT NULL AUTO_INCREMENT, + `module` VARCHAR(45) NULL, + `resource` VARCHAR(45) NULL, + `privilege` VARCHAR(45) NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`system_role_has_privilege` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`system_role_has_privilege` ; + +CREATE TABLE IF NOT EXISTS `manager`.`system_role_has_privilege` ( + `id` INT NOT NULL AUTO_INCREMENT, + `scope` VARCHAR(45) NOT NULL DEFAULT 'ALL' COMMENT 'ALL|SELF|PROJECT_SUPERVISOR|PROJECT_CONSULTANT|TEAM', + `super` TINYINT(1) NOT NULL DEFAULT 0, + `resource_privilege_id` INT NOT NULL, + `system_role_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_user_privilege_resource_privilege1_idx` (`resource_privilege_id` ASC), + INDEX `fk_role_has_privilege_role1_idx` (`system_role_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`schedule_item_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`schedule_item_group` ; + +CREATE TABLE IF NOT EXISTS `manager`.`schedule_item_group` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `tenant_id` INT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_schedule_item_group_tenant_idx` (`tenant_id` ASC), + INDEX `fk_schedule_item_group_system_idx` (`system_id` ASC), + UNIQUE INDEX `uk_tenant_id_name_idx` (`tenant_id` ASC, `name` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`schedule_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`schedule_item` ; + +CREATE TABLE IF NOT EXISTS `manager`.`schedule_item` ( + `id` INT NOT NULL AUTO_INCREMENT, + `priority` INT NOT NULL DEFAULT 100, + `day_match_type` VARCHAR(45) NOT NULL DEFAULT 'EVERYDAY' COMMENT 'EVERYDAY|DAY_OF_YEAR|DAY_OF_MONTH|DAY_OF_WEEK|DATE', + `start_date` DATE NULL, + `stop_date` DATE NULL, + `start_time` TIME NOT NULL, + `stop_time` TIME NOT NULL, + `match_day_of_month` INT NULL, + `match_day_of_week` INT NULL, + `match_day_of_year` DATE NULL, + `schedule_item_group_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_schedule_item_chedule_item_group_idx` (`schedule_item_group_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`schedule_has_item_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`schedule_has_item_group` ; + +CREATE TABLE IF NOT EXISTS `manager`.`schedule_has_item_group` ( + `id` INT NOT NULL AUTO_INCREMENT, + `priority` INT NOT NULL DEFAULT 100, + `rule` VARCHAR(45) NOT NULL DEFAULT 'ALLOW' COMMENT 'ALLOW|DENY', + `schedule_id` INT NOT NULL, + `schedule_item_group_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_schedule_has_item_group_schedule_item_group_idx` (`schedule_item_group_id` ASC), + INDEX `fk_schedule_has_item_group_schedule_idx` (`schedule_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`web_link` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`web_link` ; + +CREATE TABLE IF NOT EXISTS `manager`.`web_link` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `state` VARCHAR(45) NOT NULL DEFAULT 'OFF' COMMENT 'ON|OFF', + `priority` INT NOT NULL DEFAULT 100, + `call_timeout` INT NULL, + `chat` TINYINT(1) NOT NULL DEFAULT 0, + `audio` TINYINT(1) NOT NULL DEFAULT 0, + `video` TINYINT(1) NOT NULL DEFAULT 0, + `video_hq` TINYINT(1) NOT NULL DEFAULT 0, + `user_device_type` VARCHAR(45) NOT NULL DEFAULT 'WEBAPP' COMMENT 'WEBAPP|COMMUNICATOR|DESKTOP', + `tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_web_link_tenant_user1_idx` (`tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`external_link` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`external_link` ; + +CREATE TABLE IF NOT EXISTS `manager`.`external_link` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `state` VARCHAR(45) NOT NULL DEFAULT 'OFF' COMMENT 'ON|OFF', + `priority` INT NOT NULL DEFAULT 100, + `call_timeout` INT NULL, + `external_number` VARCHAR(45) NOT NULL, + `presentation_method` VARCHAR(45) NOT NULL DEFAULT 'PRESERVE', + `presentation_number` VARCHAR(45) NULL, + `mobile_agent_redirect_ddi` VARCHAR(45) NULL, + `mobile_operator` VARCHAR(45) NULL COMMENT 'Operator sieci komórkowej dla aplikacji mobilnej call redirect', + `turn_on_redirect_code` VARCHAR(45) NULL COMMENT 'Kod do włączenia przekierowania dla aplikacji call redirect dla konkretnego operatora mobilnego', + `turn_off_redirect_code` VARCHAR(45) NULL, + `mobile_agent_change_work_mode_allowed` INT NOT NULL DEFAULT 1, + `tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_external_link_tenant_user1_idx` (`tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`sip_terminal_firmware_version` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`sip_terminal_firmware_version` ; + +CREATE TABLE IF NOT EXISTS `manager`.`sip_terminal_firmware_version` ( + `id` INT NOT NULL AUTO_INCREMENT, + `version` VARCHAR(45) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `version_UNIQUE` (`version` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`sip_terminal_model` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`sip_terminal_model` ; + +CREATE TABLE IF NOT EXISTS `manager`.`sip_terminal_model` ( + `id` INT NOT NULL AUTO_INCREMENT, + `vendor` VARCHAR(45) NOT NULL, + `model` VARCHAR(45) NOT NULL, + `product_key` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `default_config_template_file` VARCHAR(255) NOT NULL, + `line_key_count` INT NOT NULL DEFAULT 0, + `line_key_features` VARCHAR(500) NULL, + `expansion_key_count` INT NOT NULL DEFAULT 0, + `expansion_key_features` VARCHAR(500) NULL, + `soft_key_count` INT NOT NULL DEFAULT 0, + `soft_key_features` VARCHAR(500) NULL, + `video` TINYINT(1) NOT NULL DEFAULT 0, + `sip_terminal_firmware_version_id` INT NULL COMMENT 'DEFAULT FIRMWARE VERSION', + PRIMARY KEY (`id`), + INDEX `fk_sip_terminal_model_sip_terminal_model_version1_idx` (`sip_terminal_firmware_version_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`sip_terminal` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`sip_terminal` ; + +CREATE TABLE IF NOT EXISTS `manager`.`sip_terminal` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `mac` VARCHAR(45) NOT NULL, + `serial` VARCHAR(100) NULL, + `nis` VARCHAR(100) NULL, + `description` VARCHAR(255) NULL, + `sip_terminal_model_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + `sip_terminal_firmware_version_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_sip_terminal_sip_terminal_model1_idx` (`sip_terminal_model_id` ASC), + INDEX `fk_sip_terminal_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_sip_terminal_sip_terminal_firmware_version1_idx` (`sip_terminal_firmware_version_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`line_link` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`line_link` ; + +CREATE TABLE IF NOT EXISTS `manager`.`line_link` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `state` VARCHAR(45) NOT NULL DEFAULT 'OFF', + `priority` INT NOT NULL DEFAULT 100, + `call_timeout` INT NULL, + `video` TINYINT(1) NOT NULL DEFAULT 1, + `sip_username` VARCHAR(45) NOT NULL, + `sip_password` VARCHAR(45) NOT NULL, + `custom` TINYINT(1) NOT NULL DEFAULT 0, + `confidential` TINYINT(1) NOT NULL DEFAULT 1, + `portnumber` INT NULL, + `network_ip` VARCHAR(45) NULL, + `last_autoprov_date` DATETIME NULL, + `sip_terminal_id` INT NULL, + `tenant_user_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_line_link_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_line_link_sip_terminal1_idx` (`sip_terminal_id` ASC), + INDEX `idx_sip_username` (`sip_username` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`break_cause` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`break_cause` ; + +CREATE TABLE IF NOT EXISTS `manager`.`break_cause` ( + `id` INT NOT NULL AUTO_INCREMENT, + `break_type` VARCHAR(45) NOT NULL COMMENT 'BUSINESS|COFFEE', + `break_cause` VARCHAR(45) NOT NULL, + `break_identifier` VARCHAR(45) NOT NULL, + `allow_internal_calls` TINYINT(1) NOT NULL DEFAULT 0, + `supervisor_only` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + `team_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_break_cause_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `UNIQUE_break_identifier_tenant` (`tenant_id` ASC, `break_identifier` ASC), + INDEX `fk_break_cause_team1_idx` (`team_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_login` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_login` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_login` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain` VARCHAR(45) NOT NULL, + `nonce` VARCHAR(45) NULL, + `ip` VARCHAR(15) NULL, + `time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `login_type` VARCHAR(45) NULL COMMENT 'nonce/pass', + `token_uuid` VARCHAR(64) NULL, + `token_valid` TINYINT(1) NULL, + `tenant_id` INT NULL, + PRIMARY KEY (`id`, `domain`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_tenant_login_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`portal_template` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`portal_template` ; + +CREATE TABLE IF NOT EXISTS `manager`.`portal_template` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NULL, + `source` VARCHAR(45) NULL, + `thumbnail_id` VARCHAR(45) NULL, + `description` VARCHAR(45) NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`subpage` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`subpage` ; + +CREATE TABLE IF NOT EXISTS `manager`.`subpage` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NULL, + `style` VARCHAR(45) NULL, + `published` TINYINT(1) NOT NULL DEFAULT 0, + `connection_manager_hide` TINYINT(1) NOT NULL DEFAULT 0, + `connection_manager_dst_type` VARCHAR(45) NULL, + `connection_manager_dst_id` INT NULL, + `connection_manager_selection_strategy` VARCHAR(45) NULL, + `connection_manager_selection_id` INT NULL, + `tenant_portal_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_subpage_tenant_portal1_idx` (`tenant_portal_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_portal` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_portal` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_portal` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_portal_name` VARCHAR(45) NULL, + `title` VARCHAR(45) NULL, + `subtitle` VARCHAR(45) NULL, + `name` VARCHAR(45) NULL, + `description` VARCHAR(45) NULL, + `address` VARCHAR(45) NULL, + `email` VARCHAR(45) NULL, + `phone_number` VARCHAR(45) NULL, + `fax_number` VARCHAR(45) NULL, + `logo_source` VARCHAR(45) NULL, + `enabled` TINYINT(1) NOT NULL DEFAULT 0, + `main_subpage_id` INT NOT NULL, + `portal_template_id` INT NOT NULL, + `tenant_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_portal_portal_template1_idx` (`portal_template_id` ASC), + INDEX `fk_tenant_portal_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_tenant_portal_subpage1_idx` (`main_subpage_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_portal_domain` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_portal_domain` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_portal_domain` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain` VARCHAR(45) NOT NULL, + `external` TINYINT(1) NOT NULL, + `enabled` TINYINT(1) NOT NULL, + `tenant_id` INT NULL, + `tenant_portal_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_portal_domain_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_tenant_portal_domain_tenant_portal1_idx` (`tenant_portal_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`virtual_terminal` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`virtual_terminal` ; + +CREATE TABLE IF NOT EXISTS `manager`.`virtual_terminal` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `display_type` VARCHAR(45) NOT NULL DEFAULT 'USER' COMMENT 'USER/EXTENSION/DDI/USER_LOGIN/USER_NAME/CUSTOM', + `custom_display_name` VARCHAR(45) NULL, + `vlan_id` VARCHAR(45) NULL, + `prov_url` VARCHAR(255) NULL, + `certificate_url` VARCHAR(255) NULL, + `ntp_server` VARCHAR(90) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_virtual_terminal_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`virtual_terminal_key_setting` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`virtual_terminal_key_setting` ; + +CREATE TABLE IF NOT EXISTS `manager`.`virtual_terminal_key_setting` ( + `id` INT NOT NULL AUTO_INCREMENT, + `key_type` VARCHAR(45) NOT NULL, + `key_position` INT NOT NULL, + `key_feature` VARCHAR(45) NOT NULL, + `key_config` ENUM('user', 'terminal') NOT NULL, + `label` VARCHAR(45) NULL, + `value` VARCHAR(45) NULL, + `extension` VARCHAR(45) NULL, + `virtual_terminal_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_virtual_terminal_key_setting_virtual_terminal1_idx` (`virtual_terminal_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`target` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`target` ; + +CREATE TABLE IF NOT EXISTS `manager`.`target` ( + `id` INT NOT NULL AUTO_INCREMENT, + `type` VARCHAR(45) NOT NULL COMMENT 'TEXT | DDI | EXTENSION', + `location` VARCHAR(100) NULL, + `dst_type` VARCHAR(45) NULL COMMENT 'SYSTEM|PROJECT | USER | TRUNK', + `dst_id` VARCHAR(45) NULL, + `selection_id` INT NULL, + `routing_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_target_routing1_idx` (`routing_id` ASC), + INDEX `fk_target_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_target_location_idx` (`location` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`setting_param` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`setting_param` ; + +CREATE TABLE IF NOT EXISTS `manager`.`setting_param` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`setting` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`setting` ; + +CREATE TABLE IF NOT EXISTS `manager`.`setting` ( + `id` INT NOT NULL AUTO_INCREMENT, + `value` VARCHAR(100) NOT NULL, + `scope` VARCHAR(45) NOT NULL DEFAULT 'global' COMMENT 'GLOBAL|TENANT|TENANT_USER|CUSTOMER', + `scope_id` INT NULL, + `setting_param_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_setting_tenant_setting_param1_idx` (`setting_param_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`normalization` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`normalization` ; + +CREATE TABLE IF NOT EXISTS `manager`.`normalization` ( + `id` INT NOT NULL AUTO_INCREMENT, + `pattern` VARCHAR(255) NOT NULL, + `replacement` VARCHAR(45) NOT NULL, + `priority` INT NOT NULL DEFAULT 100, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_normalization_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`license` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`license` ; + +CREATE TABLE IF NOT EXISTS `manager`.`license` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `label` VARCHAR(45) NOT NULL, + `license_type` VARCHAR(45) NOT NULL COMMENT 'TENANT|USER', + `position` INT NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_has_license` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_has_license` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_has_license` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_limit` INT NULL, + `used` INT NULL, + `tenant_id` INT NOT NULL, + `license_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_has_license_license1_idx` (`license_id` ASC), + INDEX `fk_tenant_has_license_tenant1_idx` (`tenant_id` ASC), + INDEX `tenant_has_license_tenant1_id_license1_idx` (`tenant_id` ASC, `license_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_user_has_license` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_user_has_license` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_license` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_limit` INT NOT NULL DEFAULT 0, + `used` INT NOT NULL DEFAULT 0, + `license_id` INT NOT NULL, + `tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_user_has_license_license_idx` (`license_id` ASC), + INDEX `fk_tenant_user_has_license_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `tenant_user_has_license_tenant_user_id_license_idx` (`tenant_user_id` ASC, `license_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`buddy_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`buddy_group` ; + +CREATE TABLE IF NOT EXISTS `manager`.`buddy_group` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `position` INT NOT NULL, + `tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_buddy_group_tenant_user1_idx` (`tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`buddy_relation` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`buddy_relation` ; + +CREATE TABLE IF NOT EXISTS `manager`.`buddy_relation` ( + `id` INT NOT NULL, + `left_tenant_user_id` INT NOT NULL, + `right_tenant_user_id` INT NOT NULL, + `left_accepted` TINYINT(1) NOT NULL, + `right_accepted` TINYINT(1) NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_buddy_relation_tenant_user1_idx` (`left_tenant_user_id` ASC), + INDEX `fk_buddy_relation_tenant_user2_idx` (`right_tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`buddy_group_has_buddy_relation` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`buddy_group_has_buddy_relation` ; + +CREATE TABLE IF NOT EXISTS `manager`.`buddy_group_has_buddy_relation` ( + `id` INT NOT NULL AUTO_INCREMENT, + `position` INT NOT NULL, + `buddy_group_id` INT NOT NULL, + `buddy_relation_id` INT NOT NULL, + INDEX `fk_buddy_group_has_buddy_relation_buddy_relation1_idx` (`buddy_relation_id` ASC), + INDEX `fk_buddy_group_has_buddy_relation_buddy_group1_idx` (`buddy_group_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator_tariff` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator_tariff` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator_tariff` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NULL, + `active` TINYINT(1) NOT NULL DEFAULT 0, + `create_date` DATETIME NOT NULL, + `activate_date` DATETIME NULL, + `deactivate_date` DATETIME NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_license_tariff_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_contract` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_contract` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_contract` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NULL, + `active` TINYINT(1) NOT NULL, + `create_date` DATETIME NOT NULL, + `activate_date` DATETIME NULL, + `deactivate_date` DATETIME NULL, + `currency` VARCHAR(45) NOT NULL, + `operator_tariff_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_contract_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_tenant_contract_operator_tariff1_idx` (`operator_tariff_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator_wallet` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator_wallet` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator_wallet` ( + `id` INT NOT NULL AUTO_INCREMENT, + `currency` VARCHAR(45) NOT NULL, + `balance` DECIMAL(17,2) NOT NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_wallet_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator_wallet_bank_account` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator_wallet_bank_account` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator_wallet_bank_account` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `iban` VARCHAR(45) NOT NULL, + `active` TINYINT(1) NOT NULL, + `currency` VARCHAR(45) NOT NULL, + `country` VARCHAR(45) NULL, + `postcode` VARCHAR(10) NULL, + `city` VARCHAR(45) NULL, + `address` VARCHAR(100) NULL, + `description` VARCHAR(255) NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_wallet_bank_account_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator_withdraw_bank_account` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator_withdraw_bank_account` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator_withdraw_bank_account` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `iban` VARCHAR(45) NOT NULL, + `active` TINYINT(1) NOT NULL, + `currency` VARCHAR(45) NOT NULL, + `country` VARCHAR(45) NULL, + `postcode` VARCHAR(10) NULL, + `city` VARCHAR(45) NULL, + `address` VARCHAR(100) NULL, + `description` VARCHAR(255) NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_withdraw_bank_account_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator_contract` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator_contract` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator_contract` ( + `id` INT NOT NULL AUTO_INCREMENT, + `agreement_no` VARCHAR(100) NOT NULL, + `active` TINYINT(1) NOT NULL, + `create_date` DATETIME NOT NULL, + `activate_date` DATETIME NULL, + `deactivate_date` DATETIME NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_contract_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`product_category` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`product_category` ; + +CREATE TABLE IF NOT EXISTS `manager`.`product_category` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_product_category_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`product_template` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`product_template` ; + +CREATE TABLE IF NOT EXISTS `manager`.`product_template` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `template` TEXT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_product_definition_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`product` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`product` ; + +CREATE TABLE IF NOT EXISTS `manager`.`product` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `product_template_id` INT NULL, + `product_data` TEXT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_product_product_template1_idx` (`product_template_id` ASC), + INDEX `fk_product_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`account_has_manager` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`account_has_manager` ; + +CREATE TABLE IF NOT EXISTS `manager`.`account_has_manager` ( + `id` INT NOT NULL, + `product_category_id` INT NULL, + `product_id` INT NULL, + `tenant_user_id` INT NOT NULL, + `account_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_customer_has_manager_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_customer_has_manager_product_category1_idx` (`product_category_id` ASC), + INDEX `fk_customer_has_manager_product1_idx` (`product_id` ASC), + INDEX `fk_customer_has_manager_account1_idx` (`account_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`main_menu` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`main_menu` ; + +CREATE TABLE IF NOT EXISTS `manager`.`main_menu` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NULL, + `dst_type` VARCHAR(45) NULL, + `dst_value` VARCHAR(45) NULL, + `position` INT NULL, + `tenant_portal_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_portal_main_menu_tenant_portal1_idx` (`tenant_portal_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`pstn_tariff` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`pstn_tariff` ; + +CREATE TABLE IF NOT EXISTS `manager`.`pstn_tariff` ( + `id` INT NOT NULL AUTO_INCREMENT, + `destination` VARCHAR(45) NOT NULL, + `destination_regexp` VARCHAR(45) NOT NULL, + `rate` VARCHAR(45) NOT NULL, + `currency` VARCHAR(45) NOT NULL, + `fraud_risk` TINYINT(1) NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tarif_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`virtual_terminal_setting_param` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`virtual_terminal_setting_param` ; + +CREATE TABLE IF NOT EXISTS `manager`.`virtual_terminal_setting_param` ( + `id` INT NOT NULL AUTO_INCREMENT, + `param` VARCHAR(255) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`virtual_terminal_has_param` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`virtual_terminal_has_param` ; + +CREATE TABLE IF NOT EXISTS `manager`.`virtual_terminal_has_param` ( + `id` INT NOT NULL AUTO_INCREMENT, + `value` VARCHAR(255) NOT NULL, + `virtual_terminal_id` INT NOT NULL, + `virtual_terminal_setting_param_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_virtual_sip_terminal_has_param_virtual_terminal1_idx` (`virtual_terminal_id` ASC), + INDEX `fk_virtual_sip_terminal_has_param_virtual_sip_terminal_sett_idx` (`virtual_terminal_setting_param_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`language` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`language` ; + +CREATE TABLE IF NOT EXISTS `manager`.`language` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(45) NULL, + `iso_code` VARCHAR(45) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`system_announcement` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`system_announcement` ; + +CREATE TABLE IF NOT EXISTS `manager`.`system_announcement` ( + `id` INT NOT NULL AUTO_INCREMENT, + `language` VARCHAR(45) NOT NULL DEFAULT 'en' COMMENT 'iso language', + `label` VARCHAR(100) NOT NULL, + `audio_path` VARCHAR(255) NULL, + `video_path` VARCHAR(255) NULL, + `message` TEXT NULL, + `category` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_system_announcement_system1_idx` (`system_id` ASC), + UNIQUE INDEX `UNIQUE_language_label_tenant` (`language` ASC, `label` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`portal_widget` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`portal_widget` ; + +CREATE TABLE IF NOT EXISTS `manager`.`portal_widget` ( + `id` INT NOT NULL AUTO_INCREMENT, + `type` VARCHAR(45) NULL, + `content_type` VARCHAR(45) NULL, + `tenant_portal_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_portal_widget_tenant_portal1_idx` (`tenant_portal_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`subpage_widget` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`subpage_widget` ; + +CREATE TABLE IF NOT EXISTS `manager`.`subpage_widget` ( + `id` INT NOT NULL AUTO_INCREMENT, + `position` INT NULL, + `priority` INT NULL, + `subpage_id` INT NOT NULL, + `portal_widget_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_subpage_widget_subpage1_idx` (`subpage_id` ASC), + INDEX `fk_subpage_widget_portal_widget1_idx` (`portal_widget_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`widget_project_routes` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`widget_project_routes` ; + +CREATE TABLE IF NOT EXISTS `manager`.`widget_project_routes` ( + `id` INT NOT NULL AUTO_INCREMENT, + `dst_type` VARCHAR(45) NULL, + `dst_id` INT NULL, + `target_id` INT NOT NULL, + `portal_widget_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_widget_project_routes_portal_widget1_idx` (`portal_widget_id` ASC), + INDEX `fk_widget_project_routes_target1_idx` (`target_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`widget_html` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`widget_html` ; + +CREATE TABLE IF NOT EXISTS `manager`.`widget_html` ( + `id` INT NOT NULL AUTO_INCREMENT, + `html_value` VARCHAR(45) NULL, + `portal_widget_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_widget_html_portal_widget1_idx` (`portal_widget_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`case_status` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`case_status` ; + +CREATE TABLE IF NOT EXISTS `manager`.`case_status` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `close_status` TINYINT(1) NOT NULL, + `delivery_progress` INT NULL, + `case_definition_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_case_status_case_definition1_idx` (`case_definition_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`case_definition` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`case_definition` ; + +CREATE TABLE IF NOT EXISTS `manager`.`case_definition` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `case_type` VARCHAR(45) NOT NULL COMMENT 'PROCESS|TASK', + `case_number_pattern` VARCHAR(45) NOT NULL, + `sla_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `estimated_delivery_time` INT NULL, + `due_delivery_time` INT NULL, + `open_case_status_id` INT NULL, + `force_close_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `force_close_case_status_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_case_definition_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_case_definition_case_status1_idx` (`force_close_case_status_id` ASC), + INDEX `fk_case_definition_case_status2_idx` (`open_case_status_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`case_definition_has_project` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`case_definition_has_project` ; + +CREATE TABLE IF NOT EXISTS `manager`.`case_definition_has_project` ( + `case_definition_id` INT NOT NULL, + `project_id` INT NOT NULL, + PRIMARY KEY (`case_definition_id`, `project_id`), + INDEX `fk_case_definition_has_project_project1_idx` (`project_id` ASC), + INDEX `fk_case_definition_has_project_case_definition1_idx` (`case_definition_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`script` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`script` ; + +CREATE TABLE IF NOT EXISTS `manager`.`script` ( + `id` INT NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`case_definition_has_script` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`case_definition_has_script` ; + +CREATE TABLE IF NOT EXISTS `manager`.`case_definition_has_script` ( + `case_definition_id` INT NOT NULL, + `script_id` INT NOT NULL, + `case_status_id` INT NULL, + PRIMARY KEY (`case_definition_id`, `script_id`), + INDEX `fk_case_definition_has_script_script1_idx` (`script_id` ASC), + INDEX `fk_case_definition_has_script_case_definition1_idx` (`case_definition_id` ASC), + INDEX `fk_case_definition_has_script_case_status1_idx` (`case_status_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`case_user_change_priv` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`case_user_change_priv` ; + +CREATE TABLE IF NOT EXISTS `manager`.`case_user_change_priv` ( + `id` INT NOT NULL AUTO_INCREMENT, + `priv_owner` VARCHAR(45) NOT NULL COMMENT 'ROLE|AUTHOR|ASSIGNEE', + `case_definition_id` INT NOT NULL, + `role_id` INT NULL, + `case_status_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_case_user_change_priv_case_definition1_idx` (`case_definition_id` ASC), + INDEX `fk_case_user_change_priv_role1_idx` (`role_id` ASC), + INDEX `fk_case_user_change_priv_case_status1_idx` (`case_status_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`case_project_change_priv` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`case_project_change_priv` ; + +CREATE TABLE IF NOT EXISTS `manager`.`case_project_change_priv` ( + `id` INT NOT NULL AUTO_INCREMENT, + `priv_owner` VARCHAR(45) NOT NULL COMMENT 'ROLE|AUTHOR|ASSIGNEE', + `case_definition_id` INT NOT NULL, + `role_id` INT NULL, + `case_status_id` INT NULL, + `project_id` INT NULL, + `new_project_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_case_user_change_priv_case_definition1_idx` (`case_definition_id` ASC), + INDEX `fk_case_user_change_priv_role1_idx` (`role_id` ASC), + INDEX `fk_case_user_change_priv_case_status1_idx` (`case_status_id` ASC), + INDEX `fk_case_project_change_priv_project1_idx` (`project_id` ASC), + INDEX `fk_case_project_change_priv_project2_idx` (`new_project_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`case_subcase_create_priv` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`case_subcase_create_priv` ; + +CREATE TABLE IF NOT EXISTS `manager`.`case_subcase_create_priv` ( + `id` INT NOT NULL AUTO_INCREMENT, + `priv_owner` VARCHAR(45) NOT NULL COMMENT 'ROLE|AUTHOR|ASSIGNEE', + `case_definition_id` INT NOT NULL, + `role_id` INT NULL, + `case_status_id` INT NULL, + `subcase_definition_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_case_user_change_priv_case_definition1_idx` (`case_definition_id` ASC), + INDEX `fk_case_user_change_priv_role1_idx` (`role_id` ASC), + INDEX `fk_case_user_change_priv_case_status1_idx` (`case_status_id` ASC), + INDEX `fk_case_subcase_create_change_priv_case_definition1_idx` (`subcase_definition_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`case_status_change_priv` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`case_status_change_priv` ; + +CREATE TABLE IF NOT EXISTS `manager`.`case_status_change_priv` ( + `id` INT NOT NULL AUTO_INCREMENT, + `priv_owner` VARCHAR(45) NOT NULL COMMENT 'ROLE|AUTHOR|ASSIGNEE', + `case_definition_id` INT NOT NULL, + `role_id` INT NULL, + `case_status_id` INT NULL, + `new_case_status_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_case_user_change_priv_case_definition1_idx` (`case_definition_id` ASC), + INDEX `fk_case_user_change_priv_role1_idx` (`role_id` ASC), + INDEX `fk_case_user_change_priv_case_status1_idx` (`case_status_id` ASC), + INDEX `fk_case_project_change_priv_copy1_case_status1_idx` (`new_case_status_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`action_definition` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`action_definition` ; + +CREATE TABLE IF NOT EXISTS `manager`.`action_definition` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `definition` TEXT NOT NULL, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_action_definition_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`case_status_time_trigger` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`case_status_time_trigger` ; + +CREATE TABLE IF NOT EXISTS `manager`.`case_status_time_trigger` ( + `id` INT NOT NULL AUTO_INCREMENT, + `trigger_time` INT NOT NULL, + `cyclic` TINYINT(1) NOT NULL, + `action_definition_id` INT NOT NULL, + `action_data` TEXT NOT NULL, + `case_definition_id` INT NOT NULL, + `case_status_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_case_scheduled_trigger_action_definition1_idx` (`action_definition_id` ASC), + INDEX `fk_case_scheduled_trigger_copy1_case_definition1_idx` (`case_definition_id` ASC), + INDEX `fk_case_status_time_trigger_case_status1_idx` (`case_status_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`case_status_flow_trigger` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`case_status_flow_trigger` ; + +CREATE TABLE IF NOT EXISTS `manager`.`case_status_flow_trigger` ( + `id` INT NOT NULL AUTO_INCREMENT, + `action_definition_id` INT NOT NULL, + `action_data` TEXT NOT NULL, + `case_definition_id` INT NOT NULL, + `case_status_id` INT NULL, + `new_case_status_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_case_scheduled_trigger_action_definition1_idx` (`action_definition_id` ASC), + INDEX `fk_case_scheduled_trigger_copy1_case_definition1_idx` (`case_definition_id` ASC), + INDEX `fk_case_status_time_trigger_case_status1_idx` (`case_status_id` ASC), + INDEX `fk_case_status_flow_trigger_case_status1_idx` (`new_case_status_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`account_location` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`account_location` ; + +CREATE TABLE IF NOT EXISTS `manager`.`account_location` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `country` VARCHAR(45) NOT NULL, + `province` VARCHAR(45) NULL, + `postcode` VARCHAR(45) NULL, + `city` VARCHAR(45) NOT NULL, + `address_1` VARCHAR(100) NOT NULL, + `address_2` VARCHAR(100) NULL, + `account_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_account_location_account1_idx` (`account_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`contact` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`contact` ; + +CREATE TABLE IF NOT EXISTS `manager`.`contact` ( + `id` INT NOT NULL AUTO_INCREMENT, + `role` VARCHAR(45) NOT NULL COMMENT 'ADMIN|PRIVILEGED|CONTACT', + `language` VARCHAR(45) NOT NULL, + `firstname` VARCHAR(45) NULL, + `surname` VARCHAR(45) NULL, + `nick` VARCHAR(45) NULL, + `department` VARCHAR(45) NULL, + `job_title` VARCHAR(45) NULL, + `avatar_id` VARCHAR(45) NULL, + `phone_account_enabled` TINYINT(1) NOT NULL, + `phone_account_login` VARCHAR(45) NULL, + `phone_account_password` VARCHAR(100) NULL, + `web_account_enabled` TINYINT(1) NOT NULL, + `web_account_login` VARCHAR(45) NULL, + `web_account_email` VARCHAR(45) NULL, + `web_account_facebook` VARCHAR(45) NULL, + `web_account_password` VARCHAR(100) NULL, + `country` VARCHAR(45) NULL, + `province` VARCHAR(45) NULL, + `postcode` VARCHAR(45) NULL, + `city` VARCHAR(45) NULL, + `address_1` VARCHAR(100) NULL, + `address_2` VARCHAR(100) NULL, + `account_id` INT NULL, + `account_location_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_contact_person_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `login_name_UNIQUE` (`web_account_login` ASC, `tenant_id` ASC), + UNIQUE INDEX `login_email_UNIQUE` (`web_account_email` ASC, `tenant_id` ASC), + INDEX `fk_contact_account1_idx` (`account_id` ASC), + INDEX `fk_contact_account_location1_idx` (`account_location_id` ASC), + UNIQUE INDEX `login_facebook` (`web_account_facebook` ASC, `tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`contact_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`contact_group` ; + +CREATE TABLE IF NOT EXISTS `manager`.`contact_group` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_customer_contact_group_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`connection_manager_widget` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`connection_manager_widget` ; + +CREATE TABLE IF NOT EXISTS `manager`.`connection_manager_widget` ( + `id` INT NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) NOT NULL DEFAULT 0, + `dst_type` VARCHAR(45) NULL, + `dst_id` INT NULL, + `selection_strategy` VARCHAR(45) NULL, + `selection_id` INT NULL, + `tenant_portal_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_connection_manager_widget_tenant_portal1_idx` (`tenant_portal_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`communication_channel` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`communication_channel` ; + +CREATE TABLE IF NOT EXISTS `manager`.`communication_channel` ( + `id` INT NOT NULL, + `channel_type` VARCHAR(45) NOT NULL COMMENT 'MOBILE|FIXED|FAX|EMAIL|FACEBOOK|TWITTER', + `channel_identifier` VARCHAR(100) NOT NULL, + `trusted` TINYINT(1) NOT NULL DEFAULT 0, + `default` TINYINT(1) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`service_level_agreement` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`service_level_agreement` ; + +CREATE TABLE IF NOT EXISTS `manager`.`service_level_agreement` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `recovery_point_objective` INT NULL, + `recovery_time_objective` INT NULL, + `availability` DECIMAL(11,7) NULL, + `schedule_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_service_level_agreement_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_service_level_agreement_schedule1_idx` (`schedule_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`account_contract` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`account_contract` ; + +CREATE TABLE IF NOT EXISTS `manager`.`account_contract` ( + `id` INT NOT NULL AUTO_INCREMENT, + `contract_number` VARCHAR(100) NOT NULL, + `sign_date` DATETIME NOT NULL, + `end_date` DATETIME NULL, + `account_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_account_contract_account1_idx` (`account_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`account_has_product` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`account_has_product` ; + +CREATE TABLE IF NOT EXISTS `manager`.`account_has_product` ( + `account_id` INT NOT NULL, + `product_id` INT NOT NULL, + `delivery_date` DATETIME NULL, + `life_end_date` DATETIME NULL, + `service_end_date` VARCHAR(45) NULL, + `service_level_agreement_id` INT NULL, + `customer_contract_id` INT NULL, + PRIMARY KEY (`account_id`, `product_id`), + INDEX `fk_customer_has_product_product1_idx` (`product_id` ASC), + INDEX `fk_customer_has_product_service_level_agreement1_idx` (`service_level_agreement_id` ASC), + INDEX `fk_customer_has_product_customer_contract1_idx` (`customer_contract_id` ASC), + INDEX `fk_account_has_product_account1_idx` (`account_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`case_definition_has_subcase_definition` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`case_definition_has_subcase_definition` ; + +CREATE TABLE IF NOT EXISTS `manager`.`case_definition_has_subcase_definition` ( + `case_definition_id` INT NOT NULL, + `subcase_definition_id` INT NOT NULL, + PRIMARY KEY (`case_definition_id`, `subcase_definition_id`), + INDEX `fk_case_definition_has_case_definition_case_definition2_idx` (`subcase_definition_id` ASC), + INDEX `fk_case_definition_has_case_definition_case_definition1_idx` (`case_definition_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`contact_has_channel` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`contact_has_channel` ; + +CREATE TABLE IF NOT EXISTS `manager`.`contact_has_channel` ( + `contact_id` INT NOT NULL, + `communication_channel_id` INT NOT NULL, + PRIMARY KEY (`contact_id`, `communication_channel_id`), + INDEX `fk_contact_has_communication_channel_communication_channel1_idx` (`communication_channel_id` ASC), + INDEX `fk_contact_has_communication_channel_contact1_idx` (`contact_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`account_location_has_channel` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`account_location_has_channel` ; + +CREATE TABLE IF NOT EXISTS `manager`.`account_location_has_channel` ( + `account_location_id` INT NOT NULL, + `communication_channel_id` INT NOT NULL, + PRIMARY KEY (`account_location_id`, `communication_channel_id`), + INDEX `fk_account_location_has_communication_channel_communication_idx` (`communication_channel_id` ASC), + INDEX `fk_account_location_has_communication_channel_account_locat_idx` (`account_location_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`contact_has_product` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`contact_has_product` ; + +CREATE TABLE IF NOT EXISTS `manager`.`contact_has_product` ( + `contact_id` INT NOT NULL, + `product_id` INT NOT NULL, + PRIMARY KEY (`contact_id`, `product_id`), + INDEX `fk_contact_has_product_product1_idx` (`product_id` ASC), + INDEX `fk_contact_has_product_contact1_idx` (`contact_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`contact_has_product_category` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`contact_has_product_category` ; + +CREATE TABLE IF NOT EXISTS `manager`.`contact_has_product_category` ( + `contact_id` INT NOT NULL, + `product_category_id` INT NOT NULL, + PRIMARY KEY (`contact_id`, `product_category_id`), + INDEX `fk_contact_has_product_category_product_category1_idx` (`product_category_id` ASC), + INDEX `fk_contact_has_product_category_contact1_idx` (`contact_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`request_level` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`request_level` ; + +CREATE TABLE IF NOT EXISTS `manager`.`request_level` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `response_time` INT NULL, + `bypass_time` INT NULL, + `solution_time` INT NULL, + `service_level_agreement_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_request_level_service_level_agreement1_idx` (`service_level_agreement_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`contact_group_has_contact` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`contact_group_has_contact` ; + +CREATE TABLE IF NOT EXISTS `manager`.`contact_group_has_contact` ( + `contact_group_id` INT NOT NULL, + `contact_id` INT NOT NULL, + PRIMARY KEY (`contact_group_id`, `contact_id`), + INDEX `fk_contact_group_has_contact_contact1_idx` (`contact_id` ASC), + INDEX `fk_contact_group_has_contact_contact_group1_idx` (`contact_group_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_recording` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_recording` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_recording` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_recording_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_recording_video_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_recording_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `audio_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND', + `video_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND', + `chat_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND', + `file_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND', + `internal_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `mode_inbound` VARCHAR(45) NOT NULL DEFAULT 'ALWAYS' COMMENT 'ALWAYS | ON_DEMAND | NEVER', + `mode_outbound` VARCHAR(45) NOT NULL DEFAULT 'ALWAYS' COMMENT 'ALWAYS | ON_DEMAND | NEVER', + `announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `announcement_scope` VARCHAR(45) NOT NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL', + `announcement_id` VARCHAR(45) NULL, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_recording_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_recording_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_diversion` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_diversion` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_diversion` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_diversion_always_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_diversion_busy_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_diversion_unavailable_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_diversion_timeout_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_diversion_selective_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_diversion_schedule_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `always_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `always_diversion_number` VARCHAR(100) NULL, + `always_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL', + `busy_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `busy_diversion_number` VARCHAR(100) NULL, + `busy_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL', + `unavailable_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `unavailable_diversion_number` VARCHAR(100) NULL, + `unavailable_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL', + `timeout_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `timeout_diversion_number` VARCHAR(100) NULL, + `timeout_diversion_seconds` INT NULL DEFAULT 20, + `timeout_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL', + `selective_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `selective_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL', + `schedule_diversion_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `schedule_diversion_number` VARCHAR(100) NULL, + `schedule_diversion_schedule_id` INT NULL, + `schedule_diversion_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL|ALL', + `change_diversion_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_diversion_schedule1_idx` (`schedule_diversion_schedule_id` ASC), + INDEX `fk_feature_tenant_user_diversion_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_diversion_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`selective_diversion` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`selective_diversion` ; + +CREATE TABLE IF NOT EXISTS `manager`.`selective_diversion` ( + `id` INT NOT NULL AUTO_INCREMENT, + `source_pattern` VARCHAR(100) NOT NULL, + `destination` VARCHAR(100) NOT NULL, + `feature_tenant_user_diversion_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_selective_diversion_feature_tenant_user_diversion_idx` (`feature_tenant_user_diversion_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_hotdesk` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_hotdesk` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_hotdesk` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_hotdesk_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `hotdesk_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `hotdesk_identifier` VARCHAR(45) NULL, + `hotdesk_pin` VARCHAR(100) NULL, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_hotdesk_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_hotdesk_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_consultant` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_consultant` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_consultant` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_consultant_dialer_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_video_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_sms_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_email_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_facebook_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_whatsapp_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_webmessage_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_fax_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_voicemail_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_bookingsync_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_consultant_channel_instagram_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `work_state` VARCHAR(45) NOT NULL DEFAULT 'OFFLINE' COMMENT 'ONLINE|OFFLINE|ONBREAK', + `break_type` VARCHAR(45) NULL COMMENT 'BUSINESS|COFFEE', + `break_cause` VARCHAR(45) NULL, + `break_note` VARCHAR(255) NULL, + `work_schedule_id` INT NULL, + `break_schedule_id` INT NULL, + `break_schedule_type` VARCHAR(45) NULL COMMENT 'BUSINESS|COFFEE', + `break_schedule_cause` VARCHAR(45) NULL, + `outbound_project_id` INT NULL, + `change_work_state_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `change_project_state_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `change_project_media_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `change_outbound_project_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `email_signature` TEXT NULL, + `max_auto_assigned_conversation` INT NOT NULL DEFAULT 10 COMMENT 'Liczba maksymalnej ilości przypisanych konwersacji dla użytkownika sprawdzana tylko przez system dystrybucji. Użytkownik ręcznie może sobie przypisać ile chce konwersacji.', + `max_auto_assigned_ticket` INT NOT NULL DEFAULT 10, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_consultant_schedule_work_idx` (`work_schedule_id` ASC), + INDEX `fk_feature_tenant_user_consultant_schedule_break_idx` (`break_schedule_id` ASC), + INDEX `fk_feature_tenant_user_consultant_project_idx` (`outbound_project_id` ASC), + INDEX `fk_feature_tenant_user_consultant_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_consultant_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_adhocconf` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_adhocconf` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_adhocconf` ( + `id` INT NOT NULL AUTO_INCREMENT, + `adhoc_conference_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `member_limit` INT NOT NULL DEFAULT 5, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_adhocconf_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_adhocconf_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_voicemail` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_voicemail` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_voicemail` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_voicemail_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `voicemail_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `beep_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `announcement_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `custom_announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `custom_announcement_id` VARCHAR(45) NULL, + `recording_time` INT NOT NULL DEFAULT 30, + `change_announcement_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_voicemail_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_voicemail_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_queue` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_queue` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_queue` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_queue_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `queue_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `queue_priority` INT NOT NULL DEFAULT 100, + `queue_limit` INT NOT NULL DEFAULT 5, + `queue_timeout` INT NOT NULL DEFAULT 900, + `queue_member_resume_time` INT NOT NULL DEFAULT 60, + `queue_time_base` VARCHAR(45) NOT NULL DEFAULT 'SYSTEM' COMMENT 'SYSTEM|QUEUE', + `message_interval` INT NOT NULL DEFAULT 30, + `message_delay` INT NOT NULL DEFAULT 15, + `moh_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `comfort_message_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `position_message_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `ewt_message_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `alerting_signal_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `custom_announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `custom_announcement_id` VARCHAR(45) NULL, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_queue_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_queue_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_queue` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_queue` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_queue` ( + `id` INT NOT NULL AUTO_INCREMENT, + `queue_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `queue_priority` INT NOT NULL DEFAULT 100, + `default_inbound_member_priority` INT NOT NULL DEFAULT 100, + `queue_limit` INT NOT NULL DEFAULT 10, + `queue_timeout` INT NOT NULL DEFAULT 3600, + `queue_member_resume_time` INT NOT NULL DEFAULT 60, + `queue_time_base` VARCHAR(45) NOT NULL DEFAULT 'SYSTEM' COMMENT 'SYSTEM|QUEUE', + `queue_noagent_abandon` TINYINT(1) NOT NULL DEFAULT 0, + `queue_noagent_timeout` INT NOT NULL DEFAULT 60, + `expected_service_time_priority_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `expected_service_time_priority` INT NOT NULL DEFAULT 100, + `permitted_service_time_priority_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `permitted_service_time_priority` INT NOT NULL DEFAULT 100, + `message_interval` INT NOT NULL DEFAULT 30, + `message_delay` INT NOT NULL DEFAULT 15, + `moh_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `comfort_message_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `position_message_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `ewt_message_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `voicemail_on_demand_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `alerting_signal_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `custom_announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `custom_announcement_id` VARCHAR(45) NULL, + `custom_moh_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `custom_moh_id` VARCHAR(45) NULL, + `call_me_enabled` INT NOT NULL DEFAULT 0, + `call_me_custom_announcement_id` VARCHAR(45) NULL, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_queue_project_idx` (`project_id` ASC), + INDEX `fk_feature_project_queue_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_upresence` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_upresence` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_upresence` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_user_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_user_pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_user_eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_user_eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_user_eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `user_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_upresence_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_upresence_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`presence_has_tenant_user` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`presence_has_tenant_user` ; + +CREATE TABLE IF NOT EXISTS `manager`.`presence_has_tenant_user` ( + `id` INT NOT NULL AUTO_INCREMENT, + `label` VARCHAR(45) NOT NULL, + `position` INT NOT NULL, + `pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `dialog_info_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `message_info_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL DEFAULT 0, + `feature_tenant_user_upresence_id` INT NOT NULL, + INDEX `fk_presence_has_tenant_user_tenant_user_idx` (`tenant_user_id` ASC), + PRIMARY KEY (`id`), + UNIQUE INDEX `uk_feature_tenant_user_upresence_id_tenant_user_id_idx` (`feature_tenant_user_upresence_id` ASC, `tenant_user_id` ASC), + INDEX `fk_presence_has_tenant_user_feature_tenant_user_upresence_idx` (`feature_tenant_user_upresence_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_ppresence` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_ppresence` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_ppresence` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_project_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_project_pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_project_eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_project_eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_project_eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `project_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_ppresence_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_ppresence_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`presence_has_project` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`presence_has_project` ; + +CREATE TABLE IF NOT EXISTS `manager`.`presence_has_project` ( + `id` INT NOT NULL AUTO_INCREMENT, + `label` VARCHAR(45) NOT NULL, + `position` INT NOT NULL, + `pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `pickup_mode` VARCHAR(45) NOT NULL DEFAULT 'LIFO' COMMENT 'FIFO|LIFO', + `eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `dialog_info_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `message_info_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `project_id` INT NOT NULL, + `feature_tenant_user_ppresence_id` INT NOT NULL, + INDEX `fk_presence_has_project_project_idx` (`project_id` ASC), + INDEX `fk_presence_has_project_feature_tenant_user_ppresence_idx` (`feature_tenant_user_ppresence_id` ASC), + PRIMARY KEY (`id`), + UNIQUE INDEX `uk_feature_tenant_user_ppresence_id_project_id_idx` (`project_id` ASC, `feature_tenant_user_ppresence_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_prepaid` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_prepaid` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_prepaid` ( + `id` INT NOT NULL AUTO_INCREMENT, + `prepaid_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `prepaid_model` VARCHAR(45) NOT NULL DEFAULT 'CURRENCY' COMMENT 'CURRENCY|CREDIT', + `charge_period` INT NOT NULL DEFAULT 60, + `charge_credit_amount` INT NULL DEFAULT 0, + `charge_currency_amount` DECIMAL(17,2) NULL DEFAULT 0, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_prepaid_project_idx` (`project_id` ASC), + INDEX `fk_feature_project_prepaid_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_supervisor` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_supervisor` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_supervisor` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_supervisor_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `supervisor_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_supervisor_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_supervisor_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`project_has_supervisor` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`project_has_supervisor` ; + +CREATE TABLE IF NOT EXISTS `manager`.`project_has_supervisor` ( + `id` INT NOT NULL AUTO_INCREMENT, + `project_id` INT NOT NULL, + `tenant_user_id` INT NOT NULL, + INDEX `fk_project_has_tenant_user_tenant_user2_idx` (`tenant_user_id` ASC), + INDEX `fk_project_has_tenant_user_project2_idx` (`project_id` ASC), + PRIMARY KEY (`id`), + UNIQUE INDEX `project_user_UNIQUE` (`project_id` ASC, `tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_call` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_call` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_call` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_link_web_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_link_web_video_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_link_web_video_hq_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_link_web_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_link_web_limit` INT NOT NULL DEFAULT 0, + `license_link_line_limit` INT NOT NULL DEFAULT 0, + `license_link_external_limit` INT NOT NULL DEFAULT 0, + `link_call_timeout` INT NOT NULL DEFAULT 30, + `call_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `transfer_preserve_presentation` TINYINT(1) NOT NULL DEFAULT 1, + `show_contact` TINYINT(1) NOT NULL DEFAULT 1, + `clir_always_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `clir_on_demand_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `target_identifier` VARCHAR(45) NOT NULL, + `voice_presentation_ddi` VARCHAR(45) NULL, + `voice_primary_ddi` VARCHAR(45) NULL, + `display_name` VARCHAR(45) NULL, + `multichat_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `meeting_limit` INT NOT NULL DEFAULT 2, + `do_not_disturb` TINYINT(1) NOT NULL DEFAULT 0, + `extension` VARCHAR(45) NULL, + `virtual_terminal_id` INT NULL, + `change_do_not_disturb_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `change_link_state_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `change_clir_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `change_auto_answer_allowed` TINYINT(1) NULL DEFAULT 0, + `auto_answer` TINYINT(1) NOT NULL DEFAULT 0, + `click_to_dial_auto_answer` TINYINT(1) NOT NULL DEFAULT 0, + `send_basic_presence_info` TINYINT(1) NOT NULL DEFAULT 1, + `outbound_policy_id` INT NULL, + `inbound_policy_id` INT NULL, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + `special_service_zone_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_call_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_call_tenant_idx` (`tenant_id` ASC), + UNIQUE INDEX `uk_tenant_id_target_identifier_idx` (`tenant_id` ASC, `target_identifier` ASC), + UNIQUE INDEX `uk_tenant_id_extension_idx` (`tenant_id` ASC, `extension` ASC), + INDEX `fk_feature_tenant_user_call_virtual_terminal1_idx` (`virtual_terminal_id` ASC), + INDEX `fk_feature_tenant_user_call_inbound_policy1_idx` (`inbound_policy_id` ASC), + INDEX `fk_feature_tenant_user_call_special_service_zone1_idx` (`special_service_zone_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_sip_terminal_autoprov` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_sip_terminal_autoprov` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_sip_terminal_autoprov` ( + `id` INT NOT NULL AUTO_INCREMENT, + `autoprovisioning_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `config_filename` VARCHAR(90) NULL, + `config_template_file_source` VARCHAR(255) NULL, + `sip_terminal_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_sip_terminal_hotdesk_sip_terminal1_idx` (`sip_terminal_id` ASC), + INDEX `fk_feature_sip_terminal_hotdesk_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_api` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_api` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_api` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_api_limit` INT NOT NULL DEFAULT 0, + `api_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `requests_per_hour` INT NOT NULL DEFAULT 10000, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_antifraud` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_antifraud` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_antifraud` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_antifraud_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `antifraud_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `antifraud_lock` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_autoprov` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_autoprov` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_autoprov` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_autoprovisioning_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `autoprovisioning_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `autogenerate_terminal` TINYINT(1) NOT NULL DEFAULT 0, + `autogenerate_line_link` TINYINT(1) NOT NULL DEFAULT 0, + `config_filename` VARCHAR(90) NULL, + `config_template_file_source` VARCHAR(255) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_crm` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_crm` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_crm` ( + `id` INT NOT NULL AUTO_INCREMENT, + `crm_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `authenticate_private_calls_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `default_crm_id` VARCHAR(45) NULL, + `restricted_crm` TINYINT(1) NOT NULL DEFAULT 0, + `ldap_login` VARCHAR(45) NULL, + `ldap_password` VARCHAR(45) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_recording` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_recording` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_recording` ( + `id` INT NOT NULL AUTO_INCREMENT, + `audio_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND', + `video_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND', + `chat_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND', + `file_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND', + `internal_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `announcement_scope` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT 'INTERNAL|EXTERNAL | ALL', + `announcement_id` VARCHAR(45) NULL, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_recording_project1_idx` (`project_id` ASC), + INDEX `fk_feature_project_recording_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_jsplugin` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_jsplugin` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_jsplugin` ( + `id` INT NOT NULL AUTO_INCREMENT, + `jsplugin_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `audio_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND', + `video_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND', + `chat_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'NEVER|ALWAYS|ON_DEMAND', + `connect_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `connect_member_priority` INT NOT NULL DEFAULT 100, + `connect_schedule_id` INT NULL, + `snapshot_frame_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `geolocation_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `welcome_message` TEXT NULL, + `goodbye_message` TEXT NULL, + `download_audio_recording` TINYINT(1) NOT NULL DEFAULT 0, + `download_video_recording` TINYINT(1) NOT NULL DEFAULT 0, + `download_chat_recording` TINYINT(1) NOT NULL DEFAULT 0, + `download_file_recording` TINYINT(1) NOT NULL DEFAULT 0, + `callme_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `callme_days_ahead` INT NOT NULL DEFAULT 4, + `callme_monday_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `callme_monday_from_time` INT NULL, + `callme_monday_to_time` INT NULL, + `callme_tuesday_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `callme_tuesday_from_time` INT NULL, + `callme_tuesday_to_time` INT NULL, + `callme_wednesday_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `callme_wednesday_from_time` INT NULL, + `callme_wednesday_to_time` INT NULL, + `callme_thursday_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `callme_thursday_from_time` INT NULL, + `callme_thursday_to_time` INT NULL, + `callme_friday_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `callme_friday_from_time` INT NULL, + `callme_friday_to_time` INT NULL, + `callme_saturday_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `callme_saturday_from_time` INT NULL, + `callme_saturday_to_time` INT NULL, + `callme_sunday_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `callme_sunday_from_time` INT NULL, + `callme_sunday_to_time` INT NULL, + `callme_any_day_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `callme_any_day_from_time` INT NULL DEFAULT 28800, + `callme_any_day_to_time` INT NULL DEFAULT 57600, + `callme_title` TEXT NULL, + `webmessage_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `webmessage_definition_id` VARCHAR(100) NULL, + `web_poll_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `web_poll_id` VARCHAR(100) NULL, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`, `tenant_id`), + INDEX `fk_feature_project_jsplugin_project_idx` (`project_id` ASC), + INDEX `fk_feature_project_jsplugin_schedule1_idx` (`connect_schedule_id` ASC), + INDEX `fk_feature_project_jsplugin_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_wizard` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_wizard` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_wizard` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_wizard_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `wizard_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `show_admission` VARCHAR(45) NOT NULL DEFAULT 'PUBLIC' COMMENT 'PUBLIC|IDENTIFIED|CUSTOMER|PARTNER|ACL', + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_pstatistics` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_pstatistics` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_pstatistics` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_project_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `project_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_pstatistics_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_pstatistics_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_ustatistics` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_ustatistics` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_ustatistics` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_user_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `user_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_ustatistics_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_ustatistics_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`statistics_has_project` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`statistics_has_project` ; + +CREATE TABLE IF NOT EXISTS `manager`.`statistics_has_project` ( + `id` INT NOT NULL AUTO_INCREMENT, + `position` INT NOT NULL, + `reset_time` TIME NOT NULL DEFAULT '00:00:00', + `project_id` INT NOT NULL, + `feature_tenant_user_pstatistics_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_statistics_has_project_project1_idx` (`project_id` ASC), + INDEX `fk_statistics_has_project_feature_tenant_user_pstatistics1_idx` (`feature_tenant_user_pstatistics_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`statistics_has_tenant_user` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`statistics_has_tenant_user` ; + +CREATE TABLE IF NOT EXISTS `manager`.`statistics_has_tenant_user` ( + `id` INT NOT NULL AUTO_INCREMENT, + `position` INT NOT NULL, + `reset_time` TIME NOT NULL DEFAULT '00:00:00', + `tenant_user_id` INT NOT NULL, + `feature_tenant_user_ustatistics_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_statistics_has_user_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_statistics_has_user_feature_tenant_user_ustatistics1_idx` (`feature_tenant_user_ustatistics_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`schedule_has_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`schedule_has_item` ; + +CREATE TABLE IF NOT EXISTS `manager`.`schedule_has_item` ( + `id` INT NOT NULL AUTO_INCREMENT, + `rule` VARCHAR(45) NOT NULL DEFAULT 'ALLOW' COMMENT 'ALLOW|DENY', + `schedule_id` INT NOT NULL, + `schedule_item_id` INT NOT NULL, + INDEX `fk_schedule_has_schedule_item_schedule_item_idx` (`schedule_item_id` ASC), + INDEX `fk_schedule_has_schedule_item_schedule_idx` (`schedule_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_istatistics` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_istatistics` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_istatistics` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_ivr_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `ivr_statistics_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_pstatistics_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_pstatistics_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`statistics_has_ivr` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`statistics_has_ivr` ; + +CREATE TABLE IF NOT EXISTS `manager`.`statistics_has_ivr` ( + `id` INT NOT NULL AUTO_INCREMENT, + `position` INT NOT NULL, + `reset_time` TIME NOT NULL DEFAULT '00:00:00', + `ivr_id` VARCHAR(45) NOT NULL, + `feature_tenant_user_istatistics_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_statistics_has_ivr_feature_tenant_user_istatistics1_idx` (`feature_tenant_user_istatistics_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_cannouncements` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_cannouncements` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_cannouncements` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_custom_announcements_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `custom_announcements_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`dashboard` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`dashboard` ; + +CREATE TABLE IF NOT EXISTS `manager`.`dashboard` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `type` VARCHAR(45) NOT NULL DEFAULT 'monitoring', + `tab_position` INT NULL, + `dashboard_tabpanel_id` VARCHAR(45) NULL, + `tenant_user_id` INT NOT NULL, + `dashboard_uid` VARCHAR(45) NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_dashboard_tenant_user1_idx` (`tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`dashboard_window` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`dashboard_window` ; + +CREATE TABLE IF NOT EXISTS `manager`.`dashboard_window` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NULL, + `default_window` TINYINT(1) NOT NULL DEFAULT 0, + `window_type` VARCHAR(45) NOT NULL, + `x_cord` INT NULL DEFAULT 0, + `y_cord` INT NULL, + `width` INT NULL DEFAULT 4, + `height` INT NULL, + `dashboard_uid` VARCHAR(45) NOT NULL, + `dashboard_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_dashboard_window_dashboard1_idx` (`dashboard_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_speed_dial` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_speed_dial` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_speed_dial` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_speed_dial_enabled` INT NOT NULL DEFAULT 0, + `speed_dial_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_pstatistics_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_pstatistics_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`speed_dial_has_tenant_user` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`speed_dial_has_tenant_user` ; + +CREATE TABLE IF NOT EXISTS `manager`.`speed_dial_has_tenant_user` ( + `id` INT NOT NULL AUTO_INCREMENT, + `value` VARCHAR(45) NOT NULL, + `position` INT NOT NULL DEFAULT 1, + `label` VARCHAR(45) NOT NULL, + `feature_tenant_user_speed_dial_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_speed_dial_has_tenant_user_feature_tenant_user_speed_dia_idx` (`feature_tenant_user_speed_dial_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_conference` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_conference` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_conference` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_conference_bridge_limit` INT NOT NULL DEFAULT 0, + `license_conference_room_limit` INT NOT NULL DEFAULT 0, + `license_conference_chat_port_limit` INT NOT NULL DEFAULT 0, + `license_conference_audio_port_limit` INT NOT NULL DEFAULT 0, + `license_conference_video_port_limit` INT NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`conference_bridge` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`conference_bridge` ; + +CREATE TABLE IF NOT EXISTS `manager`.`conference_bridge` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `primary_ddi` VARCHAR(45) NULL, + `conference_bridge_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `target_identifier` VARCHAR(45) NOT NULL, + `feature_tenant_conference_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_conference_bridge_feature_tenant_conference1_idx` (`feature_tenant_conference_id` ASC), + UNIQUE INDEX `uk_feature_tenant_conference_id_name_idx` (`feature_tenant_conference_id` ASC, `name` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`conference_room` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`conference_room` ; + +CREATE TABLE IF NOT EXISTS `manager`.`conference_room` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `active` TINYINT(1) NOT NULL DEFAULT 0, + `room_identifier` VARCHAR(45) NOT NULL, + `port_limit` INT NOT NULL DEFAULT 0, + `chat_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `audio_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `video_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `target_identifier` VARCHAR(45) NOT NULL, + `schedule_id` INT NULL, + `jsplugin_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `jsplugin_welcome_message` TEXT NULL, + `jsplugin_goodbye_message` TEXT NULL, + `limit_hours_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `limit_hours_from` VARCHAR(45) NULL, + `limit_hours_to` VARCHAR(45) NULL, + `conference_bridge_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_conference_room_conference_bridge1_idx` (`conference_bridge_id` ASC), + UNIQUE INDEX `uk_conference_bridge_id_name_idx` (`conference_bridge_id` ASC, `name` ASC), + UNIQUE INDEX `uk_conference_bridge_id_room_identifier_idx` (`conference_bridge_id` ASC, `room_identifier` ASC), + INDEX `fk_conference_room_schedule1_idx` (`schedule_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`conference_room_acl` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`conference_room_acl` ; + +CREATE TABLE IF NOT EXISTS `manager`.`conference_room_acl` ( + `id` INT NOT NULL AUTO_INCREMENT, + `check_mode` VARCHAR(45) NOT NULL COMMENT 'USER|DDI|PIN', + `check_value` VARCHAR(45) NOT NULL, + `access_mode` VARCHAR(45) NOT NULL COMMENT 'MEMBER|MODERATOR', + `conference_room_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_conference_room_acl_conference_room1_idx` (`conference_room_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_address_book` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_address_book` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_address_book` ( + `id` INT NOT NULL AUTO_INCREMENT, + `address_book_enabled` TINYINT NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_voicemail` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_voicemail` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_voicemail` ( + `id` INT NOT NULL AUTO_INCREMENT, + `beep_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `announcement_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `custom_announcement_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'INTERNAL|EXTERNAL|ALL', + `custom_announcement_id` VARCHAR(45) NULL, + `recording_time` INT NOT NULL DEFAULT 30, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_wizard_project_idx` (`project_id` ASC), + INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`address_book` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`address_book` ; + +CREATE TABLE IF NOT EXISTS `manager`.`address_book` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `address_book_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `type` VARCHAR(45) NOT NULL DEFAULT 'TENANT' COMMENT 'TENANT|TENANT_USER', + `ldap_synchronization_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `feature_tenant_address_book_id` INT NOT NULL, + `tenant_user_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_address_book_feature_tenant_address_book1_idx` (`feature_tenant_address_book_id` ASC), + INDEX `fk_address_book_tenant_user1_idx` (`tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`address_book_entry` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`address_book_entry` ; + +CREATE TABLE IF NOT EXISTS `manager`.`address_book_entry` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NULL, + `firstname` VARCHAR(255) NULL, + `surname` VARCHAR(255) NULL, + `job_title` VARCHAR(255) NULL, + `country` VARCHAR(255) NULL, + `province` VARCHAR(255) NULL, + `postcode` VARCHAR(45) NULL, + `city` VARCHAR(255) NULL, + `address_1` VARCHAR(255) NULL, + `address_2` VARCHAR(255) NULL, + `phone_fixed` VARCHAR(45) NULL, + `phone_mobile` VARCHAR(45) NULL, + `email` VARCHAR(255) NULL, + `facebook` VARCHAR(45) NULL, + `extension_number` VARCHAR(45) NULL, + `address_book_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_address_book_entry_address_book1_idx` (`address_book_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator_license_price` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator_license_price` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator_license_price` ( + `id` INT NOT NULL AUTO_INCREMENT, + `unit_price` DECIMAL(17,2) NOT NULL, + `license_id` INT NOT NULL, + `operator_tariff_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operatore_license_price_license1_idx` (`license_id` ASC), + INDEX `fk_operatore_license_price_operator_tariff1_idx` (`operator_tariff_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_license_agreement` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_license_agreement` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_license_agreement` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO', + `license_amount` INT NOT NULL, + `license_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + `operator_license_price_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_license_agreement_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_tenant_license_agreement_license1_idx` (`license_id` ASC), + INDEX `fk_tenant_license_agreement_operatore_license_price1_idx` (`operator_license_price_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`dealer_contact_person` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`dealer_contact_person` ; + +CREATE TABLE IF NOT EXISTS `manager`.`dealer_contact_person` ( + `id` INT NOT NULL AUTO_INCREMENT, + `firstname` VARCHAR(45) NOT NULL, + `surname` VARCHAR(45) NOT NULL, + `contact_type` VARCHAR(45) NULL, + `email` VARCHAR(100) NULL, + `phone` VARCHAR(45) NULL, + `dealer_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_dealer_contact_person_dealer1_idx` (`dealer_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_billing` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_billing` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_billing` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_billing_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `billing_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`hunting_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`hunting_group` ; + +CREATE TABLE IF NOT EXISTS `manager`.`hunting_group` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `distribution_strategy` VARCHAR(45) NOT NULL, + `user_call_timeout` INT NOT NULL DEFAULT 30, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_hunting_group_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`hunting_group_has_tenant_user` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`hunting_group_has_tenant_user` ; + +CREATE TABLE IF NOT EXISTS `manager`.`hunting_group_has_tenant_user` ( + `id` INT NOT NULL AUTO_INCREMENT, + `position` INT NOT NULL, + `hunting_group_id` INT NOT NULL, + `tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_hunting_group_has_tenant_user_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_hunting_group_has_tenant_user_hunting_group1_idx` (`hunting_group_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_hgroup` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_hgroup` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_hgroup` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_hunting_group_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `hunting_group_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_pstatistics_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_pstatistics_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`ddi` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`ddi` ; + +CREATE TABLE IF NOT EXISTS `manager`.`ddi` ( + `id` INT NOT NULL AUTO_INCREMENT, + `e164number` VARCHAR(45) NOT NULL, + `voice_enabled` TINYINT(1) NOT NULL, + `sms_enabled` TINYINT(1) NOT NULL, + `fax_enabled` TINYINT(1) NOT NULL, + `voice_used` TINYINT(1) NOT NULL DEFAULT 0, + `sms_used` TINYINT(1) NOT NULL, + `fax_used` TINYINT(1) NOT NULL, + `sms_integration_id` VARCHAR(45) NULL, + `system_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_ddi_system1_idx` (`system_id` ASC), + INDEX `fk_ddi_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `e164number_UNIQUE` (`e164number` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`sms_alphanum` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`sms_alphanum` ; + +CREATE TABLE IF NOT EXISTS `manager`.`sms_alphanum` ( + `id` INT NOT NULL AUTO_INCREMENT, + `alphanum` VARCHAR(45) NOT NULL, + `used` TINYINT(1) NOT NULL DEFAULT 0, + `sms_integration_id` VARCHAR(45) NULL, + `system_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_ddi_system1_idx` (`system_id` ASC), + INDEX `fk_ddi_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_voice_campaign` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_voice_campaign` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_voice_campaign` ( + `id` INT NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) NOT NULL DEFAULT 0, + `preview_auto_answer` INT NULL DEFAULT NULL, + `predictive_auto_answer` INT NULL, + `user_reservation_timeout_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `user_reservation_timeout` INT NOT NULL DEFAULT 900, + `user_reservation_retry_interval` INT NOT NULL DEFAULT 1800, + `user_reservation_attempts` INT NOT NULL DEFAULT 5, + `user_reservation_check_user_online` TINYINT(1) NOT NULL DEFAULT 1, + `set_recall_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `set_recall_days_ahead` INT NULL, + `request_confirmation_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `request_confirmation_url` VARCHAR(100) NULL, + `request_confirmation_apphash` VARCHAR(100) NULL, + `request_confirmation_interval` INT NOT NULL DEFAULT 1800, + `consultant_retry_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `consultant_retry_count` INT NOT NULL DEFAULT 5, + `consultant_retry_time` INT NOT NULL DEFAULT 30, + `contact_retry_count` INT NOT NULL DEFAULT 1, + `contact_retry_time` INT NOT NULL DEFAULT 1800, + `contact_retry_count_per_day_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `contact_retry_count_per_day` INT NOT NULL DEFAULT 5, + `contact_no_answer_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `contact_no_answer_time` INT NOT NULL DEFAULT 300, + `contact_no_answer_status` VARCHAR(45) NOT NULL DEFAULT 'RETRY' COMMENT 'RETRY|RECALL|CLOSED', + `contact_no_answer_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `contact_user_busy_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `contact_user_busy_time` INT NOT NULL DEFAULT 300, + `contact_user_busy_status` VARCHAR(45) NOT NULL DEFAULT 'RETRY' COMMENT 'RETRY|RECALL|CLOSED', + `contact_user_busy_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `contact_routing_not_found_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `contact_routing_not_found_time` INT NOT NULL DEFAULT 0, + `contact_routing_not_found_status` VARCHAR(45) NOT NULL DEFAULT 'CLOSED' COMMENT 'RETRY|RECALL|CLOSED', + `contact_routing_not_found_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `contact_abandoned_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `contact_abandoned_time` INT NOT NULL DEFAULT 60, + `contact_abandoned_status` VARCHAR(45) NOT NULL DEFAULT 'RETRY' COMMENT 'RETRY|RECALL|CLOSED', + `contact_abandoned_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `contact_abandoned_change_dialing_method_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `contact_abandoned_change_dialing_method` VARCHAR(45) NOT NULL DEFAULT 'PREVIEW', + `contact_machine_detected_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `contact_machine_detected_time` INT NOT NULL DEFAULT 600, + `contact_machine_detected_status` VARCHAR(45) NOT NULL DEFAULT 'RETRY' COMMENT 'RETRY|RECALL|CLOSED', + `contact_machine_detected_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `contact_error_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `contact_error_time` INT NOT NULL DEFAULT 240, + `contact_error_status` VARCHAR(45) NOT NULL DEFAULT 'RETRY' COMMENT 'RETRY|RECALL|CLOSED', + `contact_error_skip_retry_count_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `auto_change_priority_recall_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `auto_change_priority_recall` INT NOT NULL DEFAULT 150, + `auto_change_priority_retry_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `auto_change_priority_retry` INT NOT NULL DEFAULT 250, + `auto_change_required_skill_recall_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `auto_change_required_skill_recall` VARCHAR(45) NULL, + `auto_change_required_skill_retry_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `auto_change_required_skill_retry` VARCHAR(45) NULL, + `first_change_retry_interval_time_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `first_change_retry_interval_time_after_try` INT NOT NULL DEFAULT 0, + `first_change_retry_interval_time` INT NOT NULL DEFAULT 0, + `second_change_retry_interval_time_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `second_change_retry_interval_time_after_try` INT NOT NULL DEFAULT 0, + `second_change_retry_interval_time` INT NOT NULL DEFAULT 0, + `predictive_aggressiveness_control_method` VARCHAR(45) NOT NULL DEFAULT 'contact_abandoned_rate' COMMENT 'contact_abandoned_rate|call_number|aggressiveness_constant', + `predictive_aggressiveness_regulator_min` FLOAT NOT NULL DEFAULT 0.1, + `predictive_aggressiveness_regulator_max` FLOAT NOT NULL DEFAULT 5, + `predictive_aggressiveness_regulator_default` FLOAT NOT NULL DEFAULT 0.2, + `predictive_aggressiveness_inc_step` FLOAT NOT NULL DEFAULT 0.1, + `predictive_aggressiveness_dec_step` FLOAT NOT NULL DEFAULT 0.3, + `predictive_expected_waiting_time_value` INT NOT NULL DEFAULT 5, + `predictive_expected_waiting_time_ratio_goal` INT NOT NULL DEFAULT 90, + `predictive_contact_abandoned_rate_goal` INT NOT NULL DEFAULT 5, + `predictive_aggressiveness_constant` FLOAT NOT NULL DEFAULT 2, + `predictive_call_number_goal` INT NOT NULL DEFAULT 10, + `predictive_consultant_call_timeout` INT NOT NULL DEFAULT 30, + `predictive_contact_call_timeout` INT NOT NULL DEFAULT 120, + `disable_acw_on_transfer` TINYINT(1) NOT NULL DEFAULT 1, + `auto_change_dialing_method_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `auto_change_dialing_method_after_try` INT NOT NULL DEFAULT 3, + `auto_change_dialing_method` VARCHAR(45) NOT NULL DEFAULT 'PREVIEW', + `auto_change_dialing_method_no_consultant_talks` TINYINT(1) NOT NULL DEFAULT 1, + `state_after_acw` VARCHAR(45) NOT NULL DEFAULT 'CLOSED', + `change_dialing_method_after_acw_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `change_dialing_method_after_acw` VARCHAR(45) NOT NULL DEFAULT 'PREVIEW', + `change_mode_after_acw_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `change_mode_after_acw` VARCHAR(45) NOT NULL DEFAULT 'MANUAL', + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_voice_campaign_project_idx` (`project_id` ASC), + INDEX `fk_feature_project_voice_campaign_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`fb_account` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`fb_account` ; + +CREATE TABLE IF NOT EXISTS `manager`.`fb_account` ( + `id` INT NOT NULL AUTO_INCREMENT, + `email` VARCHAR(500) NOT NULL, + `name` VARCHAR(255) NULL, + `user_id` VARCHAR(255) NOT NULL, + `access_token` TEXT NOT NULL, + `data_access_expire_date` DATETIME NOT NULL, + `tenant_id` INT NOT NULL, + `created_by_tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_fb_page_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC, `tenant_id` ASC), + INDEX `fk_fb_account_tenant_user1_idx` (`created_by_tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`fb_page` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`fb_page` ; + +CREATE TABLE IF NOT EXISTS `manager`.`fb_page` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL, + `page_id` VARCHAR(255) NOT NULL, + `sync_after` DATETIME NULL, + `project_id` INT NULL, + `imrs_id` VARCHAR(255) NULL, + `fb_account_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_fb_page_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_fb_page_project1_idx` (`project_id` ASC), + UNIQUE INDEX `page_id_UNIQUE` (`page_id` ASC, `tenant_id` ASC), + INDEX `fk_fb_page_fb_account1_idx` (`fb_account_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`custom_announcement` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`custom_announcement` ; + +CREATE TABLE IF NOT EXISTS `manager`.`custom_announcement` ( + `id` INT NOT NULL AUTO_INCREMENT, + `language` VARCHAR(45) NOT NULL DEFAULT 'en' COMMENT 'iso language', + `label` VARCHAR(100) NOT NULL, + `audio_path` VARCHAR(255) NULL, + `video_path` VARCHAR(255) NULL, + `message` TEXT NULL, + `category` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `system_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_custom_announcement_system1_idx` (`system_id` ASC), + UNIQUE INDEX `UNIQUE_language_label_tenant` (`language` ASC, `label` ASC, `tenant_id` ASC), + INDEX `fk_custom_announcement_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`team_has_manager` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`team_has_manager` ; + +CREATE TABLE IF NOT EXISTS `manager`.`team_has_manager` ( + `id` INT NOT NULL AUTO_INCREMENT, + `team_id` INT NOT NULL, + `tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_team_has_manager_team1_idx` (`team_id` ASC), + INDEX `fk_team_has_manager_tenant_user1_idx` (`tenant_user_id` ASC), + UNIQUE INDEX `team_user_UNIQUE` (`team_id` ASC, `tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`user_device` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`user_device` ; + +CREATE TABLE IF NOT EXISTS `manager`.`user_device` ( + `id` INT NOT NULL AUTO_INCREMENT, + `user_agent` VARCHAR(255) NOT NULL, + `name` VARCHAR(45) NOT NULL, + `uuid` VARCHAR(100) NOT NULL, + `create_date` DATETIME NOT NULL, + `create_ip` VARCHAR(45) NOT NULL, + `verify_key` VARCHAR(100) NOT NULL, + `verified` TINYINT(1) NOT NULL DEFAULT 0, + `verified_by_tenant_user_id` INT NULL, + `verify_date` DATETIME NULL, + `verify_ip` VARCHAR(45) NULL, + `webapp_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `communicator_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `wallboard_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `description` VARCHAR(255) NULL, + `tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_user_device_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_user_device_tenant_user2_idx` (`verified_by_tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator_license_demo` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator_license_demo` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator_license_demo` ( + `id` INT NOT NULL, + `license_limit` INT NOT NULL, + `license_id` INT NOT NULL, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_license_demo_license1_idx` (`license_id` ASC), + INDEX `fk_operator_license_demo_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`license_activation_request` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`license_activation_request` ; + +CREATE TABLE IF NOT EXISTS `manager`.`license_activation_request` ( + `id` INT NOT NULL AUTO_INCREMENT, + `note` TEXT NULL, + `create_date` DATETIME NOT NULL, + `activate_date` DATETIME NOT NULL, + `status` VARCHAR(45) NOT NULL DEFAULT 'WAITING' COMMENT 'WAITING|SUCCEED|FAILED', + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_license_activation_request_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`license_deactivation_request` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`license_deactivation_request` ; + +CREATE TABLE IF NOT EXISTS `manager`.`license_deactivation_request` ( + `id` INT NOT NULL AUTO_INCREMENT, + `note` TEXT NULL, + `create_date` DATETIME NOT NULL, + `deactivate_date` DATETIME NOT NULL, + `status` VARCHAR(45) NOT NULL DEFAULT 'WAITING' COMMENT 'WAITING|SUCCEED|FAILED', + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_license_deactivation_request_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`license_deactivation_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`license_deactivation_item` ; + +CREATE TABLE IF NOT EXISTS `manager`.`license_deactivation_item` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_amount` INT NOT NULL, + `license_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO', + `system_verification_info` VARCHAR(255) NULL, + `verification_info` VARCHAR(100) NULL, + `license_id` INT NOT NULL, + `license_deactivation_request_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_license_deactivation_request_license1_idx` (`license_id` ASC), + INDEX `fk_license_deactivation_item_license_deactivation_request1_idx` (`license_deactivation_request_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_contract_activation_request` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_contract_activation_request` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_contract_activation_request` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NULL, + `create_date` DATETIME NOT NULL, + `activate_date` DATETIME NOT NULL, + `tenant_contract_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_contract_activation_request_tenant_contract1_idx` (`tenant_contract_id` ASC), + INDEX `fk_tenant_contract_activation_request_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`license_activation_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`license_activation_item` ; + +CREATE TABLE IF NOT EXISTS `manager`.`license_activation_item` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_amount` INT NOT NULL, + `license_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO', + `system_verification_info` VARCHAR(255) NULL, + `verification_info` VARCHAR(100) NULL, + `license_id` INT NOT NULL, + `license_activation_request_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_license_activation_item_license1_idx` (`license_id` ASC), + INDEX `fk_license_activation_item_license_activation_request1_idx` (`license_activation_request_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_wallboard` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_wallboard` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_wallboard` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_wallboard_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `wallboard_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_hotdesk_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_hotdesk_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`shift` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`shift` ; + +CREATE TABLE IF NOT EXISTS `manager`.`shift` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NULL, + `description` VARCHAR(100) NULL, + `dynamic_break_minutes_per_hour` INT NOT NULL DEFAULT 0, + `dynamic_break_after_hours` INT NOT NULL DEFAULT 0, + `static_break_minutes` INT NOT NULL DEFAULT 30, + `static_break_after_hours` INT NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_shift_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `unique_name_tenant` (`tenant_id` ASC, `name` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_work_agenda` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_work_agenda` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_work_agenda` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_work_agenda_enabled` INT NOT NULL DEFAULT 0, + `work_agenda_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `change_planned_work_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `change_planned_break_allowed` TINYINT(1) NOT NULL DEFAULT 1, + `shift_id` INT NULL, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_pstatistics_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_pstatistics_tenant_idx` (`tenant_id` ASC), + INDEX `fk_feature_tenant_user_work_agenda_shift1_idx` (`shift_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_work_agenda` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_work_agenda` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_work_agenda` ( + `id` INT NOT NULL AUTO_INCREMENT, + `work_agenda_enabled` INT NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`billing_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`billing_group` ; + +CREATE TABLE IF NOT EXISTS `manager`.`billing_group` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(100) NULL, + `billing_period` INT NOT NULL DEFAULT 1, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_billing_group_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`billing_group_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`billing_group_item` ; + +CREATE TABLE IF NOT EXISTS `manager`.`billing_group_item` ( + `id` INT NOT NULL AUTO_INCREMENT, + `country_iso_alpha2_code` VARCHAR(45) NOT NULL, + `priority` INT NOT NULL DEFAULT 100, + `regexp` VARCHAR(100) NULL, + `billing_group_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_billing_item_billing_group1_idx` (`billing_group_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`billing_ruleset` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`billing_ruleset` ; + +CREATE TABLE IF NOT EXISTS `manager`.`billing_ruleset` ( + `id` INT NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) NOT NULL DEFAULT 0, + `create_date` DATETIME NOT NULL, + `activate_date` DATETIME NULL, + `deactivate_date` DATETIME NULL, + `tenant_id` INT NOT NULL, + `feature_tenant_billing_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_billing_ruleset_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_billing_ruleset_feature_tenant_billing1_idx` (`feature_tenant_billing_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`billing_ruleset_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`billing_ruleset_item` ; + +CREATE TABLE IF NOT EXISTS `manager`.`billing_ruleset_item` ( + `id` INT NOT NULL AUTO_INCREMENT, + `free_minutes_limit` INT NOT NULL DEFAULT 0, + `price` DECIMAL(4,2) NOT NULL DEFAULT 0, + `billing_group_id` INT NOT NULL, + `billing_ruleset_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_billing_ruleset_item_billing_group1_idx` (`billing_group_id` ASC), + INDEX `fk_billing_ruleset_item_billing_ruleset1_idx` (`billing_ruleset_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_calling_policy` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_calling_policy` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_calling_policy` ( + `id` INT NOT NULL AUTO_INCREMENT, + `outbound_policy_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `inbound_policy_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `default_outbound_policy_id` INT NULL, + `default_inbound_policy_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC), + INDEX `fk_feature_tenant_inbound_policy_inbound_policy1_idx` (`default_inbound_policy_id` ASC), + INDEX `fk_feature_tenant_calling_policy_inbound_policy1_idx` (`default_outbound_policy_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`policy_fraction` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`policy_fraction` ; + +CREATE TABLE IF NOT EXISTS `manager`.`policy_fraction` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(100) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_outbound_policy_group_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`policy_fraction_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`policy_fraction_item` ; + +CREATE TABLE IF NOT EXISTS `manager`.`policy_fraction_item` ( + `id` INT NOT NULL AUTO_INCREMENT, + `country_iso_alpha2_code` VARCHAR(45) NOT NULL, + `e164_regexp` VARCHAR(100) NOT NULL, + `policy_fraction_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_policy_fraction_item_policy_fraction1_idx` (`policy_fraction_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`policy_has_fraction` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`policy_has_fraction` ; + +CREATE TABLE IF NOT EXISTS `manager`.`policy_has_fraction` ( + `id` INT NOT NULL AUTO_INCREMENT, + `rule` VARCHAR(45) NOT NULL DEFAULT 'DENY', + `priority` INT NOT NULL DEFAULT 100, + `calling_policy_id` INT NOT NULL, + `policy_fraction_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_policy_has_fraction_calling_policy1_idx` (`calling_policy_id` ASC), + INDEX `fk_policy_has_fraction_policy_fraction1_idx` (`policy_fraction_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_email` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_email` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_email` ( + `id` INT NOT NULL AUTO_INCREMENT, + `email_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `integration_method` VARCHAR(45) NOT NULL DEFAULT 'MAILBOX' COMMENT 'SMTP|MAILBOX', + `mailbox_refresh_time` INT NOT NULL DEFAULT 300, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_fax` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_fax` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_fax` ( + `id` INT NOT NULL AUTO_INCREMENT, + `fax_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `max_concurrent_outbound_calls` INT NOT NULL DEFAULT 5, + `send_tries_limit` INT NOT NULL DEFAULT 3, + `send_retry_timeout` INT NOT NULL DEFAULT 300, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_email_domain` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_email_domain` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_email_domain` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain` VARCHAR(45) NOT NULL, + `enabled` TINYINT(1) NOT NULL, + `relay_address` VARCHAR(45) NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_portal_domain_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_fax_domain` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_fax_domain` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_fax_domain` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain` VARCHAR(45) NOT NULL, + `external` TINYINT(1) NOT NULL, + `enabled` TINYINT(1) NOT NULL, + `relay_address` VARCHAR(15) NULL, + `fax2email` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + `feature_tenant_fax_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_portal_domain_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_tenant_fax_domain_feature_tenant_fax1_idx` (`feature_tenant_fax_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`special_service_number` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`special_service_number` ; + +CREATE TABLE IF NOT EXISTS `manager`.`special_service_number` ( + `id` INT NOT NULL AUTO_INCREMENT, + `dial_number` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `emergency` TINYINT(1) NOT NULL DEFAULT 0, + `operator_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_emergency_numbers_operator1_idx` (`operator_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`special_service_mapping` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`special_service_mapping` ; + +CREATE TABLE IF NOT EXISTS `manager`.`special_service_mapping` ( + `id` INT NOT NULL, + `e164_process_number` VARCHAR(45) NOT NULL, + `special_service_number_id` INT NOT NULL, + `special_service_zone_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_special_number_number_mapping_special_service_number1_idx` (`special_service_number_id` ASC), + INDEX `fk_special_service_mapping_special_service_zone1_idx` (`special_service_zone_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_call_info` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_call_info` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_call_info` ( + `id` INT NOT NULL AUTO_INCREMENT, + `call_info_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `outbound_call_info_definition_id` VARCHAR(100) NULL, + `inbound_call_info_definition_id` VARCHAR(100) NULL, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_wizard_project_idx` (`project_id` ASC), + INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_talk_script` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_talk_script` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_talk_script` ( + `id` INT NOT NULL AUTO_INCREMENT, + `talk_script_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_wizard_project_idx` (`project_id` ASC), + INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_callback` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_callback` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_callback` ( + `id` INT NOT NULL AUTO_INCREMENT, + `callback_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `call_duration_min` INT NOT NULL DEFAULT 5, + `webapp_required` TINYINT(1) NOT NULL DEFAULT 1, + `active` TINYINT(1) NOT NULL DEFAULT 0, + `mode` VARCHAR(45) NOT NULL DEFAULT 'AUTO' COMMENT 'MANUAL|AUTO', + `dialing_method` VARCHAR(45) NOT NULL DEFAULT 'PROGRESSIVE' COMMENT 'PREVIEW|PROGRESSIVE', + `active_calls_limit` INT NOT NULL DEFAULT 5, + `progressive_wait_time` INT NOT NULL DEFAULT 30, + `consultant_retry_count` INT NOT NULL DEFAULT 5, + `consultant_retry_time` INT NOT NULL DEFAULT 30, + `contact_retry_count` INT NOT NULL DEFAULT 1, + `contact_retry_time` INT NOT NULL DEFAULT 1800, + `member_priority` INT NOT NULL DEFAULT 200, + `call_info_definition_id` VARCHAR(100) NULL, + `schedule_id` INT NULL, + `user_reservation_timeout_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `user_reservation_timeout` INT NOT NULL DEFAULT 900, + `user_reservation_retry_interval` INT NOT NULL DEFAULT 1800, + `user_reservation_attempts` INT NOT NULL DEFAULT 5, + `user_reservation_check_user_online` TINYINT(1) NOT NULL DEFAULT 1, + `register_system_drop` TINYINT(1) NOT NULL DEFAULT 1, + `preview_auto_answer` INT NULL, + `default_info` TEXT NULL, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_wizard_project_idx` (`project_id` ASC), + INDEX `fk_feature_project_wizard_tenant_idx` (`tenant_id` ASC), + INDEX `fk_feature_project_callback_schedule1_idx` (`schedule_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_callme` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_callme` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_callme` ( + `id` INT NOT NULL AUTO_INCREMENT, + `webapp_required` TINYINT(1) NOT NULL DEFAULT 1, + `active` TINYINT(1) NOT NULL DEFAULT 0, + `mode` VARCHAR(45) NOT NULL DEFAULT 'AUTO' COMMENT 'AUTO|MANUAL', + `dialing_method` VARCHAR(45) NOT NULL DEFAULT 'PROGRESSIVE' COMMENT 'PREVIEW|PROGRESSIVE', + `active_calls_limit` INT NOT NULL DEFAULT 5, + `progressive_wait_time` INT NOT NULL DEFAULT 30, + `consultant_retry_count` INT NOT NULL DEFAULT 5, + `consultant_retry_time` INT NOT NULL DEFAULT 30, + `contact_retry_count` INT NOT NULL DEFAULT 1, + `contact_retry_time` INT NOT NULL DEFAULT 1800, + `member_priority` INT NOT NULL DEFAULT 200, + `call_info_definition_id` VARCHAR(100) NULL, + `user_reservation_timeout_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `user_reservation_timeout` INT NOT NULL DEFAULT 900, + `user_reservation_retry_interval` INT NOT NULL DEFAULT 1800, + `user_reservation_attempts` INT NOT NULL DEFAULT 5, + `user_reservation_check_user_online` TINYINT(1) NOT NULL DEFAULT 1, + `preview_auto_answer` INT NULL, + `default_info` TEXT NULL, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_jsplugin_project_idx` (`project_id` ASC), + INDEX `fk_feature_project_jsplugin_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`bss_api` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`bss_api` ; + +CREATE TABLE IF NOT EXISTS `manager`.`bss_api` ( + `id` INT NOT NULL AUTO_INCREMENT, + `version` VARCHAR(45) NOT NULL, + `active` TINYINT(1) NOT NULL DEFAULT 1, + `system_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_bss_api_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_application` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_application` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_application` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `token_key` VARCHAR(100) NOT NULL, + `application_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `application_config_id` VARCHAR(100) NOT NULL, + `bss_api_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_application_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_tenant_application_bss_api1_idx` (`bss_api_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`sip_terminal_model_has_version` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`sip_terminal_model_has_version` ; + +CREATE TABLE IF NOT EXISTS `manager`.`sip_terminal_model_has_version` ( + `id` INT NOT NULL AUTO_INCREMENT, + `sip_terminal_model_id` INT NOT NULL, + `sip_terminal_firmware_version_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_sip_terminal_model_has_version_sip_terminal_model1_idx` (`sip_terminal_model_id` ASC), + INDEX `fk_sip_terminal_model_has_version_sip_terminal_model_versio_idx` (`sip_terminal_firmware_version_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_jsplugin` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_jsplugin` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_jsplugin` ( + `id` INT NOT NULL AUTO_INCREMENT, + `uuid` VARCHAR(64) NULL, + `default_language` VARCHAR(45) NULL DEFAULT 'pl', + `color` VARCHAR(45) NULL DEFAULT 'blue', + `type` VARCHAR(45) NULL, + `json_config` TEXT NULL, + `iwrs_id` VARCHAR(45) NULL, + `project_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_feature_tenant_jsplugin_project1_idx` (`project_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`ddi_pool_number` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`ddi_pool_number` ; + +CREATE TABLE IF NOT EXISTS `manager`.`ddi_pool_number` ( + `id` INT NOT NULL AUTO_INCREMENT, + `ddi` VARCHAR(45) NOT NULL, + `inbound` TINYINT(1) NOT NULL DEFAULT 1, + `outbound` TINYINT(1) NOT NULL DEFAULT 1, + `default_number` TINYINT(1) NOT NULL DEFAULT 0, + `prefix` VARCHAR(45) NULL, + `project_ddi_pool_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_ddi_pool_number_project_ddi_pool1_idx` (`project_ddi_pool_id` ASC), + INDEX `uk_pool_prefix` (`project_ddi_pool_id` ASC, `prefix` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`voice_campaign_trigger` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`voice_campaign_trigger` ; + +CREATE TABLE IF NOT EXISTS `manager`.`voice_campaign_trigger` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(64) NOT NULL, + `description` VARCHAR(255) NULL, + `code` VARCHAR(64) NOT NULL, + `voice_campaign_trigger_definition_id` VARCHAR(100) NULL, + `project_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_trigger_code_project1_idx` (`project_id` ASC), + UNIQUE INDEX `code_project_UNIQUE` (`project_id` ASC, `code` ASC), + UNIQUE INDEX `name_project_UNIQUE` (`project_id` ASC, `name` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`model_version` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`model_version` ; + +CREATE TABLE IF NOT EXISTS `manager`.`model_version` ( + `id` INT NOT NULL AUTO_INCREMENT, + `serial` VARCHAR(45) NOT NULL, + `dirty` TINYINT(1) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_voice_polling` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_voice_polling` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_voice_polling` ( + `id` INT NOT NULL AUTO_INCREMENT, + `active_calls_limit` INT NOT NULL DEFAULT 3, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_voice_polling_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`address_book_assign` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`address_book_assign` ; + +CREATE TABLE IF NOT EXISTS `manager`.`address_book_assign` ( + `id` INT NOT NULL AUTO_INCREMENT, + `scope` VARCHAR(45) NOT NULL DEFAULT 'tenant_user' COMMENT 'tenant_user | project | team', + `scope_id` VARCHAR(45) NOT NULL DEFAULT 0, + `address_book_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_address_book_assign_address_book1_idx` (`address_book_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_addressbook` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_addressbook` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_addressbook` ( + `id` INT NOT NULL AUTO_INCREMENT, + `address_book_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_address_book_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_address_book_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`crm_contact_job` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`crm_contact_job` ; + +CREATE TABLE IF NOT EXISTS `manager`.`crm_contact_job` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `crm_id` VARCHAR(45) NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `name_tenant_id` (`name` ASC, `crm_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`custom_tag` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`custom_tag` ; + +CREATE TABLE IF NOT EXISTS `manager`.`custom_tag` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `type` VARCHAR(45) NOT NULL COMMENT 'CRM/TICKETING', + `position` INT NULL, + `crm_id` VARCHAR(45) NULL, + `color_hex` VARCHAR(45) NULL, + `tenant_user_id` INT NULL, + `used_count` INT NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_blf` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_blf` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_blf` ( + `id` INT NOT NULL AUTO_INCREMENT, + `blf_enabled` INT NOT NULL DEFAULT 3, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_voice_polling_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`internal_network` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`internal_network` ; + +CREATE TABLE IF NOT EXISTS `manager`.`internal_network` ( + `id` INT NOT NULL, + `network_address` VARCHAR(18) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_internal_network_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator_license_package` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator_license_package` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator_license_package` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `licence_package_variant` VARCHAR(45) NOT NULL COMMENT 'TENANT_USER_MAIN|TENANT_USER_VAS|TENANT_MAIN|TENANT_VAS', + `unit_price` DECIMAL(17,2) NOT NULL, + `operator_tariff_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_license_package_operator_tariff1_idx` (`operator_tariff_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_package_agreement` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_package_agreement` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_package_agreement` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_package_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO', + `license_package_amount` INT NOT NULL, + `operator_license_package_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_license_agreement_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_tenant_package_agreement_operator_license_package1_idx` (`operator_license_package_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`license_package_has_license` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`license_package_has_license` ; + +CREATE TABLE IF NOT EXISTS `manager`.`license_package_has_license` ( + `id` INT NOT NULL AUTO_INCREMENT, + `amount` INT NOT NULL, + `license_package_id` INT NOT NULL, + `license_id` INT NOT NULL, + INDEX `fk_license_package_has_license_license1_idx` (`license_id` ASC), + INDEX `fk_license_package_has_license_license_package1_idx` (`license_package_id` ASC), + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`operator_package_demo` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`operator_package_demo` ; + +CREATE TABLE IF NOT EXISTS `manager`.`operator_package_demo` ( + `id` INT NOT NULL AUTO_INCREMENT, + `package_limit` INT NOT NULL, + `operator_license_package_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_operator_package_demo_operator_package_price1_idx` (`operator_license_package_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`package_activation_request` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`package_activation_request` ; + +CREATE TABLE IF NOT EXISTS `manager`.`package_activation_request` ( + `id` INT NOT NULL AUTO_INCREMENT, + `create_date` DATETIME NOT NULL, + `activate_date` DATETIME NOT NULL, + `status` VARCHAR(45) NOT NULL DEFAULT 'WAITING' COMMENT 'WAITING|SUCCEED|FAILED', + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_license_activation_request_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`package_deactivation_request` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`package_deactivation_request` ; + +CREATE TABLE IF NOT EXISTS `manager`.`package_deactivation_request` ( + `id` INT NOT NULL AUTO_INCREMENT, + `create_date` DATETIME NOT NULL, + `deactivate_date` DATETIME NOT NULL COMMENT 'COMMERCIAL|DEMO', + `status` VARCHAR(45) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`, `tenant_id`), + INDEX `fk_package_deactivation_request_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`package_activation_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`package_activation_item` ; + +CREATE TABLE IF NOT EXISTS `manager`.`package_activation_item` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_package_amount` INT NOT NULL, + `license_package_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO', + `system_verification_info` VARCHAR(255) NULL, + `verification_info` VARCHAR(100) NULL, + `operator_license_package_id` INT NOT NULL, + `package_activation_request_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_package_activation_item_operator_license_package1_idx` (`operator_license_package_id` ASC), + INDEX `fk_package_activation_item_package_activation_request1_idx` (`package_activation_request_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`package_deactivation_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`package_deactivation_item` ; + +CREATE TABLE IF NOT EXISTS `manager`.`package_deactivation_item` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_package_amount` INT NOT NULL, + `license_package_type` VARCHAR(45) NOT NULL DEFAULT 'COMMERCIAL' COMMENT 'COMMERCIAL|DEMO', + `system_verification_info` VARCHAR(255) NULL, + `verification_info` VARCHAR(100) NULL, + `operator_license_package_id` INT NOT NULL, + `package_deactivation_request_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_package_deactivation_item_operator_license_package1_idx` (`operator_license_package_id` ASC), + INDEX `fk_package_deactivation_item_package_deactivation_item1_idx` (`package_deactivation_request_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_has_license_package` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_has_license_package` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_has_license_package` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_package_limit` INT NOT NULL, + `used` INT NOT NULL, + `operator_license_package_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_has_license_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_tenant_has_license_package_operator_license_package1_idx` (`operator_license_package_id` ASC), + INDEX `tenant_has_license_package_tenant1_id_license_package1_idx` (`tenant_id` ASC, `operator_license_package_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_user_has_license_package` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_user_has_license_package` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_license_package` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_user_id` INT NOT NULL, + `operator_license_package_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_user_has_operator_license_package_operator_licens_idx` (`operator_license_package_id` ASC), + INDEX `fk_tenant_user_has_operator_license_package_tenant_user1_idx` (`tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_aaa` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_aaa` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_aaa` ( + `id` INT NOT NULL AUTO_INCREMENT, + `inbound_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `inbound_authentication_method` VARCHAR(45) NULL DEFAULT 'PHONE_NUMBER' COMMENT 'PHONE_NUMBER | TELE_ID', + `inbound_authentication_pin_required` TINYINT(1) NOT NULL DEFAULT 0, + `outbound_authentication_enabled` TINYINT(1) NULL, + `sms_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `email_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `voicemail_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `facebook_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `fax_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `webmessage_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `whatsapp_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `instagram_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `crm_id` VARCHAR(45) NULL, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_aaa_project1_idx` (`project_id` ASC), + INDEX `fk_feature_project_aaa_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`crm_contact_database` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`crm_contact_database` ; + +CREATE TABLE IF NOT EXISTS `manager`.`crm_contact_database` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` TEXT NULL, + `public` TINYINT(1) NOT NULL DEFAULT 0, + `system_id` INT NOT NULL, + `tenant_id` INT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + UNIQUE INDEX `name_UNIQUE` (`name` ASC), + INDEX `fk_tenant_contact_database_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_tenant_contact_database_system1_idx` (`system_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_ad` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_ad` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_ad` ( + `id` INT NOT NULL AUTO_INCREMENT, + `adfs_sso_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `adfs_sso_prefix` VARCHAR(255) NULL, + `idp_entity_id` VARCHAR(255) NULL, + `idp_sso_url` VARCHAR(255) NULL, + `x509_cert` TEXT NULL, + `ldap_host` VARCHAR(45) NULL, + `ldap_port` INT NULL, + `ldap_username` VARCHAR(45) NULL, + `ldap_password` VARCHAR(45) NULL, + `ldap_users_base_dn` VARCHAR(255) NULL, + `ldap_users_filter` VARCHAR(255) NULL, + `ad_login_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `ad_login_host` VARCHAR(255) NULL, + `ad_login_domain` VARCHAR(255) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `adfs_sso_prefix_UNIQUE` (`adfs_sso_prefix` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_ad` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_ad` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_ad` ( + `id` INT NOT NULL AUTO_INCREMENT, + `ad_login` VARCHAR(45) NULL, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_ustatistics_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_ustatistics_tenant_idx` (`tenant_id` ASC), + UNIQUE INDEX `ad_login_UNIQUE` (`ad_login` ASC, `tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`global_property` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`global_property` ; + +CREATE TABLE IF NOT EXISTS `manager`.`global_property` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NULL, + `value` VARCHAR(100) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_global_properties_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`crm_contact_stage_flag` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`crm_contact_stage_flag` ; + +CREATE TABLE IF NOT EXISTS `manager`.`crm_contact_stage_flag` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `required` TINYINT(1) NOT NULL DEFAULT 0, + `flag_type` VARCHAR(45) NOT NULL COMMENT 'SINGLE | MULTI', + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`crm_contact_lifecycle_stage` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`crm_contact_lifecycle_stage` ; + +CREATE TABLE IF NOT EXISTS `manager`.`crm_contact_lifecycle_stage` ( + `id` INT NOT NULL AUTO_INCREMENT, + `stage` VARCHAR(100) NOT NULL, + `kanban_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `kanban_position` INT NULL DEFAULT 1, + `kanban_color` VARCHAR(45) NULL DEFAULT '#CCCCCC', + `crm_id` VARCHAR(45) NOT NULL, + `crm_contact_stage_flag_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `name_tenant_id` (`stage` ASC, `crm_id` ASC), + INDEX `fk_crm_contact_lifecycle_stage_crm_contact_stage_flag1_idx` (`crm_contact_stage_flag_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_crm` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_crm` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_crm` ( + `id` INT NOT NULL AUTO_INCREMENT, + `show_crm_tab_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `crm_id` VARCHAR(45) NULL, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_crm_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_crm_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_voice_sms` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_voice_sms` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_voice_sms` ( + `id` INT NOT NULL AUTO_INCREMENT, + `active_calls_limit` INT NOT NULL DEFAULT 30, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_voice_sms_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_voice_sms` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_voice_sms` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_voice_sms` ( + `id` INT NOT NULL AUTO_INCREMENT, + `voice_sms_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_project_voice_sms_project1_idx` (`project_id` ASC), + INDEX `fk_feature_project_voice_sms_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_ticketing` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_ticketing` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_ticketing` ( + `id` INT NOT NULL AUTO_INCREMENT, + `ticketing_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `ticket_number_format_type` VARCHAR(100) NULL DEFAULT 'GLOBAL' COMMENT 'GLOBAL|YEARLY|MONTHLY|DAYLY - auto increment', + `ticket_number_format` VARCHAR(100) NULL DEFAULT '%NUMBER' COMMENT '%NUMBER - kolejny numer zgłoszenia\n%YEAR - rok\n%MONTH - miesiac\n%DAY - dzien', + `phone_number_notification` VARCHAR(45) NULL, + `email_notification` VARCHAR(45) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_ticketing_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_ticketing` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_ticketing` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_ticketing` ( + `id` INT NOT NULL AUTO_INCREMENT, + `distribution_method` VARCHAR(45) NULL DEFAULT 'ROUND_ROBIN', + `distribution_login_required` TINYINT(1) NOT NULL DEFAULT 1, + `expected_processing_time` INT NULL DEFAULT 3600, + `permitted_processing_time` INT NULL DEFAULT 86400, + `show_notification_sla_changed` TINYINT(1) NOT NULL DEFAULT 0, + `require_tasks_completed_to_close` TINYINT(1) NOT NULL DEFAULT 0, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_project_ticketing_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_feature_project_ticketing_project1_idx` (`project_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_role` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_role` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_role` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `available` TINYINT(1) NOT NULL DEFAULT 1, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_role_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_user_has_tenant_role` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_user_has_tenant_role` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_tenant_role` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_user_id` INT NOT NULL, + `tenant_role_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_user_has_tenant_role_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_tenant_user_has_tenant_role_tenant_role1_idx` (`tenant_role_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_role_has_privilege` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_role_has_privilege` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_role_has_privilege` ( + `id` INT NOT NULL AUTO_INCREMENT, + `scope` VARCHAR(45) NULL, + `super` TINYINT(1) NULL, + `resource_privilege_id` INT NOT NULL, + `tenant_role_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_role_has_privilege_tenant_role1_idx` (`tenant_role_id` ASC), + INDEX `fk_tenant_role_has_privilege_resource_privilege1_idx` (`resource_privilege_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_email_mailbox` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_email_mailbox` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_email_mailbox` ( + `id` INT NOT NULL AUTO_INCREMENT, + `email_address` VARCHAR(100) NOT NULL, + `name` VARCHAR(255) NOT NULL, + `mailbox_type` VARCHAR(45) NOT NULL DEFAULT 'STANDARD', + `login` VARCHAR(45) NOT NULL, + `password` VARCHAR(45) NOT NULL, + `imap_host_name` VARCHAR(45) NOT NULL, + `imap_tcp_port` INT NOT NULL DEFAULT 143, + `imap_authentication_method` VARCHAR(45) NOT NULL DEFAULT 'NORMAL_PASSWORD' COMMENT 'NORMAL_PASSWORD|SECURED_PASSWORD', + `imap_security_protocol` VARCHAR(45) NULL DEFAULT NULL COMMENT 'NULL|STARTTLS|SSL_TLS', + `smtp_host_name` VARCHAR(45) NOT NULL, + `smtp_tcp_port` INT NOT NULL DEFAULT 25, + `smtp_security_protocol` VARCHAR(45) NULL DEFAULT NULL COMMENT 'NULL|STARTTLS|SSL_TLS', + `smtp_authentication_method` VARCHAR(45) NOT NULL DEFAULT 'NORMAL_PASSWORD' COMMENT 'NORMAL_PASSWORD|SECURED_PASSWORD', + `sync_not_before` DATETIME NULL, + `sync_only_crm_contacts` TINYINT(1) NOT NULL DEFAULT 1, + `mark_messages_as_seen` TINYINT(1) NOT NULL DEFAULT 0, + `copy_email_to_folder` VARCHAR(255) NULL, + `imap_connection_state` VARCHAR(255) NULL, + `imap_connection_info` VARCHAR(255) NULL, + `smtp_connection_info` VARCHAR(255) NULL, + `smtp_connection_state` VARCHAR(255) NULL, + `imrs_id` VARCHAR(255) NULL, + `project_id` INT NULL, + `tenant_user_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_email_mailbox_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_tenant_email_mailbox_project1_idx` (`project_id` ASC), + INDEX `fk_tenant_email_mailbox_tenant_user1_idx` (`tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_team_viewer` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_team_viewer` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_team_viewer` ( + `id` INT NOT NULL AUTO_INCREMENT, + `team_viewer_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `client_id` VARCHAR(64) NULL, + `client_secret` VARCHAR(64) NULL, + `group_id` VARCHAR(45) NULL, + `access_token` VARCHAR(64) NULL, + `refresh_token` VARCHAR(64) NULL, + `expires_in` DATETIME NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_team_viewer_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_team_viewer` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_team_viewer` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_team_viewer` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_team_viewer_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `team_viewer_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `team_viewer_user_id` VARCHAR(45) NULL, + `team_viewer_group_id` VARCHAR(45) NULL, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_team_viewer_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_team_viewer_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_gus` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_gus` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_gus` ( + `id` INT NOT NULL AUTO_INCREMENT, + `gus_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_gus_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_webapp` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_webapp` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_webapp` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_webapp_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `webapp_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `double_verification_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `email_for_verification` VARCHAR(135) NULL, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_crm_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_crm_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_tpresence` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_tpresence` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_tpresence` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_team_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_team_pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_team_eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_team_eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_team_eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `team_presence_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_user_upresence_tenant_user_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_upresence_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`presence_has_team` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`presence_has_team` ; + +CREATE TABLE IF NOT EXISTS `manager`.`presence_has_team` ( + `id` INT NOT NULL AUTO_INCREMENT, + `label` VARCHAR(45) NOT NULL, + `position` INT NOT NULL, + `pickup_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `eavesdrop_audio_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `eavesdrop_video_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `eavesdrop_chat_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `dialog_info_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `message_info_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `team_id` INT NOT NULL DEFAULT 0, + `feature_tenant_user_tpresence_id` INT NOT NULL, + INDEX `fk_presence_has_tenant_user_tenant_user_idx` (`team_id` ASC), + PRIMARY KEY (`id`), + UNIQUE INDEX `uk_feature_tenant_user_upresence_id_tenant_user_id_idx` (`feature_tenant_user_tpresence_id` ASC, `team_id` ASC), + INDEX `fk_presence_has_tenant_user_feature_tenant_user_upresence_idx` (`feature_tenant_user_tpresence_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_call_meeting` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_call_meeting` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_call_meeting` ( + `id` INT NOT NULL AUTO_INCREMENT, + `webapp_required` TINYINT(1) NOT NULL DEFAULT 0, + `active` TINYINT(1) NOT NULL DEFAULT 0, + `dialing_method` VARCHAR(45) NOT NULL DEFAULT 'PREVIEW', + `active_calls_limit` INT NOT NULL DEFAULT 5, + `progressive_wait_time` INT NOT NULL DEFAULT 30, + `consultant_retry_count` INT NOT NULL DEFAULT 5, + `consultant_retry_time` INT NOT NULL DEFAULT 30, + `contact_retry_count` INT NOT NULL DEFAULT 1, + `contact_retry_time` INT NOT NULL DEFAULT 1800, + `member_priority` INT NOT NULL DEFAULT 50, + `user_reservation_timeout_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `user_reservation_timeout` INT NOT NULL DEFAULT 900, + `user_reservation_retry_interval` INT NOT NULL DEFAULT 1800, + `user_reservation_attempts` INT NOT NULL DEFAULT 5, + `user_reservation_check_user_online` TINYINT(1) NOT NULL DEFAULT 1, + `preview_auto_answer` INT NULL, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_project_call_meeting_project1_idx` (`project_id` ASC), + INDEX `fk_feature_project_call_meeting_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_amd` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_amd` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_amd` ( + `id` INT NOT NULL AUTO_INCREMENT, + `amd_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `license_limit` INT NOT NULL DEFAULT 0, + `maximum_word_length` INT NOT NULL DEFAULT 1500, + `minimum_word_length` INT NOT NULL DEFAULT 120, + `maximum_number_of_words` INT NOT NULL DEFAULT 3, + `between_words_silence` INT NOT NULL DEFAULT 40, + `total_analysis_time` INT NOT NULL DEFAULT 5000, + `after_greeting_silence` INT NOT NULL DEFAULT 500, + `maximum_greeting_length` INT NOT NULL DEFAULT 1500, + `maximum_initial_silence` INT NOT NULL DEFAULT 1250, + `treat_initial_silence_as_machine` TINYINT(1) NOT NULL DEFAULT 1, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_amd_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `id_UNIQUE` (`id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_mobile_agent` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_mobile_agent` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_mobile_agent` ( + `id` INT NOT NULL AUTO_INCREMENT, + `outgoing_call_ddi` VARCHAR(45) NULL, + `alternative_outgoing_call_ddi` VARCHAR(45) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_voice_polling_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_fac` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_fac` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_fac` ( + `id` INT NOT NULL AUTO_INCREMENT, + `login` VARCHAR(45) NULL DEFAULT '23', + `logout` VARCHAR(45) NULL DEFAULT '24', + `work_state_online` VARCHAR(45) NULL DEFAULT '11', + `work_state_offline` VARCHAR(45) NULL DEFAULT '12', + `work_state_onbreak` VARCHAR(45) NULL DEFAULT '13', + `diversion_always_enable` VARCHAR(45) NULL DEFAULT '71', + `diversion_always_disable` VARCHAR(45) NULL DEFAULT '72', + `diversion_timeout_enable` VARCHAR(45) NULL DEFAULT '73', + `diversion_timeout_disable` VARCHAR(45) NULL DEFAULT '74', + `diversion_busy_enable` VARCHAR(45) NULL DEFAULT '75', + `diversion_busy_disable` VARCHAR(45) NULL DEFAULT '76', + `diversion_unavailable_enable` VARCHAR(45) NULL DEFAULT '77', + `diversion_unavailable_disable` VARCHAR(45) NULL DEFAULT '78', + `diversion_schedule_enable` VARCHAR(45) NULL DEFAULT '79', + `diversion_schedule_disable` VARCHAR(45) NULL DEFAULT '80', + `recording_enable` VARCHAR(45) NULL DEFAULT '41', + `recording_disable` VARCHAR(45) NULL DEFAULT '42', + `clir` VARCHAR(45) NULL DEFAULT '31\*', + `call_prefix` VARCHAR(45) NULL DEFAULT '50\*', + `echo` VARCHAR(45) NULL DEFAULT '00', + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_fac_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`custom_priority` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`custom_priority` ; + +CREATE TABLE IF NOT EXISTS `manager`.`custom_priority` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `priority` INT(11) NOT NULL, + `color_hex` VARCHAR(45) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `name_tenant_id` (`name` ASC, `tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`custom_ticket_state` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`custom_ticket_state` ; + +CREATE TABLE IF NOT EXISTS `manager`.`custom_ticket_state` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `color_hex` VARCHAR(45) NULL, + `system_state` VARCHAR(45) NOT NULL, + `flag_name` VARCHAR(45) NULL, + `kanban_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `kanban_position` INT NULL DEFAULT 1, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_api_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `name_tenant_id` (`name` ASC, `tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_recording` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_recording` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_recording` ( + `id` INT NOT NULL AUTO_INCREMENT, + `recording_encryption` TINYINT(1) NOT NULL DEFAULT 0, + `recording_public_key` TEXT NULL, + `recording_private_key` TEXT NULL, + `recording_private_key_hash` TEXT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_recording_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_web_poll` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_web_poll` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_web_poll` ( + `id` INT NOT NULL AUTO_INCREMENT, + `web_poll_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_project_web_poll_project1_idx` (`project_id` ASC), + INDEX `fk_feature_project_web_poll_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_livespace` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_livespace` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_livespace` ( + `id` INT NOT NULL AUTO_INCREMENT, + `livespace_user_id` VARCHAR(100) NULL, + `livespace_api_key` TEXT NULL, + `livespace_api_secret` TEXT NULL, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_user_livespace_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_feature_tenant_user_livespace_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`license_package_has_system_role` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`license_package_has_system_role` ; + +CREATE TABLE IF NOT EXISTS `manager`.`license_package_has_system_role` ( + `id` INT NOT NULL AUTO_INCREMENT, + `license_package_id` INT NOT NULL, + `system_role_id` INT NOT NULL, + INDEX `fk_license_package_has_license_license_package1_idx` (`license_package_id` ASC), + PRIMARY KEY (`id`), + INDEX `fk_license_package_has_system_role_system_role1_idx` (`system_role_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_idenfy` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_idenfy` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_idenfy` ( + `id` INT NOT NULL AUTO_INCREMENT, + `idenfy_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `api_url` VARCHAR(100) NULL DEFAULT 'https://ivs.idenfy.com/api/v2/', + `api_key` VARCHAR(100) NULL, + `api_secret` VARCHAR(100) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_idenfy_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_identity_verify` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_identity_verify` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_identity_verify` ( + `id` INT NOT NULL AUTO_INCREMENT, + `verification_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `verification_type` VARCHAR(45) NOT NULL DEFAULT 'IDENFY', + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_project_identity_verification_project1_idx` (`project_id` ASC), + INDEX `fk_feature_project_identity_verify_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_fully_verified` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_fully_verified` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_fully_verified` ( + `id` INT NOT NULL AUTO_INCREMENT, + `fully_verified_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `api_url` VARCHAR(100) NULL, + `api_email` VARCHAR(100) NULL, + `api_password` VARCHAR(100) NULL, + `api_customer_name` VARCHAR(100) NULL, + `api_customer_secret_key` VARCHAR(100) NULL, + `api_verification_secret_key` VARCHAR(100) NULL, + `verification_type` VARCHAR(100) NULL DEFAULT 'with_operator' COMMENT 'with_operator|without_operator|mix_with_operator_first', + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_fully_verified_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_talkieai` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_talkieai` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_talkieai` ( + `id` INT NOT NULL AUTO_INCREMENT, + `talkieai_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `sip_host` VARCHAR(100) NULL, + `sip_port` VARCHAR(100) NULL, + `auth_key` VARCHAR(100) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_talkieai_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`ddi_info` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`ddi_info` ; + +CREATE TABLE IF NOT EXISTS `manager`.`ddi_info` ( + `id` INT NOT NULL AUTO_INCREMENT, + `information` TEXT NULL, + `operator` VARCHAR(45) NULL, + `ddi_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_ddi_info_ddi1_idx` (`ddi_id` ASC), + INDEX `fk_ddi_info_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`skill` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`skill` ; + +CREATE TABLE IF NOT EXISTS `manager`.`skill` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(255) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_skill_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_user_has_skill` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_user_has_skill` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_skill` ( + `id` INT NOT NULL AUTO_INCREMENT, + `skill_id` INT NOT NULL, + `tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_user_has_skill_skill1_idx` (`skill_id` ASC), + INDEX `fk_tenant_user_has_skill_tenant_user1_idx` (`tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`black_list` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`black_list` ; + +CREATE TABLE IF NOT EXISTS `manager`.`black_list` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL, + `type` VARCHAR(45) NOT NULL COMMENT 'GLOBAL|PROJECT', + `manual_call_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `voice_campaign_call_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `voice_sms_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `callback_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `voice_polling_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `call_meeting_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `callme_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_voice_opt_out_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`project_has_black_list` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`project_has_black_list` ; + +CREATE TABLE IF NOT EXISTS `manager`.`project_has_black_list` ( + `id` INT NOT NULL AUTO_INCREMENT, + `project_id` INT NOT NULL, + `black_list_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_voice_opt_out_project1_idx` (`project_id` ASC), + INDEX `fk_project_has_black_list_black_list1_idx` (`black_list_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_mrcp` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_mrcp` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_mrcp` ( + `id` INT NOT NULL AUTO_INCREMENT, + `enabled` TINYINT NOT NULL DEFAULT 0, + `profile_name` VARCHAR(225) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_voice_polling_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`project_has_voice_component` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`project_has_voice_component` ; + +CREATE TABLE IF NOT EXISTS `manager`.`project_has_voice_component` ( + `id` INT NOT NULL AUTO_INCREMENT, + `direction` VARCHAR(45) NOT NULL DEFAULT 'BOTH', + `project_id` INT NOT NULL, + `voice_component_id` VARCHAR(45) NOT NULL, + `tenant_id` INT NOT NULL, + INDEX `fk_project_has_tenant_user_tenant_user2_idx` (`voice_component_id` ASC), + INDEX `fk_project_has_tenant_user_project2_idx` (`project_id` ASC), + PRIMARY KEY (`id`), + UNIQUE INDEX `project_user_UNIQUE` (`project_id` ASC, `voice_component_id` ASC), + INDEX `fk_project_has_voice_component_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_voice_verify` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_voice_verify` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_voice_verify` ( + `id` INT NOT NULL AUTO_INCREMENT, + `enabled` TINYINT NOT NULL DEFAULT 0, + `verify_type` VARCHAR(45) NOT NULL DEFAULT 'PHONEXIA', + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_voice_verify_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_phonexia` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_phonexia` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_phonexia` ( + `id` INT NOT NULL AUTO_INCREMENT, + `enabled` TINYINT NOT NULL DEFAULT 0, + `gateway_name` VARCHAR(45) NOT NULL DEFAULT 'phonexia', + `api_url` VARCHAR(100) NULL, + `api_key` VARCHAR(100) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_phonexia_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`facebook_server_url_mapping` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`facebook_server_url_mapping` ; + +CREATE TABLE IF NOT EXISTS `manager`.`facebook_server_url_mapping` ( + `id` INT NOT NULL AUTO_INCREMENT, + `page_id` VARCHAR(255) NULL, + `instagram_account_id` VARCHAR(255) NULL, + `facebook_server_url` VARCHAR(255) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`black_list_entry` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`black_list_entry` ; + +CREATE TABLE IF NOT EXISTS `manager`.`black_list_entry` ( + `id` INT NOT NULL AUTO_INCREMENT, + `ddi` VARCHAR(255) NOT NULL, + `note` VARCHAR(255) NULL, + `tenant_id` INT NOT NULL, + `black_list_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_voice_opt_out_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_black_list_entry_black_list1_idx` (`black_list_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_user_has_cdr_tag` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_user_has_cdr_tag` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_has_cdr_tag` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tag` VARCHAR(255) NOT NULL, + `play_recording_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `download_recording_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_user_has_cdr_tag_user1_idx` (`tenant_user_id` ASC), + UNIQUE INDEX `id_UNIQUE` (`id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`project_has_mailbox` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`project_has_mailbox` ; + +CREATE TABLE IF NOT EXISTS `manager`.`project_has_mailbox` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_email_mailbox_id` INT NOT NULL, + `project_id` INT NOT NULL, + INDEX `fk_project_has_consultant_project_idx` (`project_id` ASC), + PRIMARY KEY (`id`), + INDEX `fk_project_has_consultant_tenant_email_mailbox1_idx` (`tenant_email_mailbox_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`team_has_project_basic_presence` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`team_has_project_basic_presence` ; + +CREATE TABLE IF NOT EXISTS `manager`.`team_has_project_basic_presence` ( + `id` INT NOT NULL AUTO_INCREMENT, + `team_id` INT NOT NULL, + `project_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_team_has_project_basic_presence_team1_idx` (`team_id` ASC), + INDEX `fk_team_has_project_basic_presence_project1_idx` (`project_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_email_mailbox_has_folder` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_email_mailbox_has_folder` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_email_mailbox_has_folder` ( + `id` INT NOT NULL AUTO_INCREMENT, + `folder_name` VARCHAR(255) NOT NULL DEFAULT 0, + `last_synced_uid` INT NULL, + `uidvalidity` INT NULL, + `attribute_list` VARCHAR(510) NULL, + `delimiter` VARCHAR(10) NULL, + `tenant_email_mailbox_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_tenant_email_mailbox_has_folder_tenant_email_mailbox1_idx` (`tenant_email_mailbox_id` ASC), + UNIQUE INDEX `tenant_email_mailbox_id_UNIQUE` (`tenant_email_mailbox_id` ASC, `folder_name` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_messaging_sla` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_messaging_sla` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_messaging_sla` ( + `id` INT NOT NULL AUTO_INCREMENT, + `expected_waiting_time_for_consultant_response` INT NULL DEFAULT 3600, + `permitted_waiting_time_for_consultant_response` INT NULL DEFAULT 86400, + `unassign_user_if_exceeded_sla_wtfcr` TINYINT(1) NOT NULL DEFAULT 0, + `show_notification_sla_wtfcr_changed` TINYINT(1) NOT NULL DEFAULT 0, + `expected_client_waiting_time_for_first_response` INT NULL DEFAULT 3600, + `permitted_client_waiting_time_for_first_response` INT NULL DEFAULT 7200, + `show_notification_sla_cwtffr_changed` TINYINT(1) NOT NULL DEFAULT 0, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_messaging_sla_project_idx` (`project_id` ASC), + INDEX `fk_feature_project_messaging_sla_tenant_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`messagebird_integration` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`messagebird_integration` ; + +CREATE TABLE IF NOT EXISTS `manager`.`messagebird_integration` ( + `id` INT NOT NULL AUTO_INCREMENT, + `api_key` VARCHAR(255) NOT NULL, + `name` VARCHAR(45) NOT NULL, + `webhook_id` VARCHAR(255) NOT NULL, + `namespace_id` VARCHAR(255) NULL, + `verify_token` VARCHAR(255) NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_messagebird_integration_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`messagebird_integration_channel` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`messagebird_integration_channel` ; + +CREATE TABLE IF NOT EXISTS `manager`.`messagebird_integration_channel` ( + `id` INT NOT NULL AUTO_INCREMENT, + `channel_id` VARCHAR(255) NOT NULL, + `channel_name` VARCHAR(45) NOT NULL, + `channel_type` VARCHAR(45) NOT NULL, + `sync_after` DATETIME NULL, + `tenant_id` INT NOT NULL, + `tenant_user_id` INT NULL, + `project_id` INT NOT NULL, + `messagebird_integration_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `channel_id_UNIQUE` (`channel_id` ASC, `tenant_id` ASC), + INDEX `fk_messagebird_integration_channel_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_messagebird_integration_channel_project1_idx` (`project_id` ASC), + INDEX `fk_messagebird_integration_channel_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_messagebird_integration_channel_messagebird_integration1_idx` (`messagebird_integration_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_bot` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_bot` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_bot` ( + `id` INT NOT NULL AUTO_INCREMENT, + `min_word_voice_time` INT NOT NULL DEFAULT 200, + `sentence_end_silence_time` INT NOT NULL DEFAULT 500, + `sentence_start_timeout` INT NOT NULL DEFAULT 10000, + `sentence_time_max` INT NOT NULL DEFAULT 30000, + `min_confidence_level` INT NOT NULL DEFAULT 50, + `with_nlu_processing_time` TINYINT(1) NOT NULL DEFAULT 1, + `duplex_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `prefix_time` INT NOT NULL DEFAULT 700, + `license_bot_voice_limit` INT NOT NULL DEFAULT 0, + `license_bot_chat_limit` INT NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_bot_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`bookingsync_account` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`bookingsync_account` ; + +CREATE TABLE IF NOT EXISTS `manager`.`bookingsync_account` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `access_token` VARCHAR(255) NOT NULL, + `refresh_token` VARCHAR(255) NOT NULL, + `bookingsync_account_id` VARCHAR(255) NOT NULL, + `sync_after` DATETIME NULL, + `project_id` INT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_bookingsync_account_project1_idx` (`project_id` ASC), + INDEX `fk_bookingsync_account_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`project_consultant_bookingsync` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`project_consultant_bookingsync` ; + +CREATE TABLE IF NOT EXISTS `manager`.`project_consultant_bookingsync` ( + `id` INT NOT NULL AUTO_INCREMENT, + `bookingsync_user_id` INT NOT NULL, + `bookingsync_user_fullname` VARCHAR(100) NOT NULL, + `bookingsync_account_id` INT NOT NULL, + `project_has_consultant_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_project_consultant_bookingsync_bookingsync_account1_idx` (`bookingsync_account_id` ASC), + INDEX `fk_project_consultant_bookingsync_project_has_consultant1_idx` (`project_has_consultant_id` ASC), + INDEX `fk_project_consultant_bookingsync_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_msal` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_msal` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_msal` ( + `id` INT NOT NULL AUTO_INCREMENT, + `msal_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `client_id` VARCHAR(64) NULL, + `client_credential` VARCHAR(64) NULL, + `client_tenant_id` VARCHAR(64) NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_tenant_msal_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_user_msal` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_user_msal` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_user_msal` ( + `id` INT NOT NULL AUTO_INCREMENT, + `username` VARCHAR(128) NULL, + `tenant_user_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_user_msal_tenant1_idx` (`tenant_id` ASC), + INDEX `fk_feature_tenant_user_msal_tenant_user1_idx` (`tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`instagram_account` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`instagram_account` ; + +CREATE TABLE IF NOT EXISTS `manager`.`instagram_account` ( + `id` INT NOT NULL AUTO_INCREMENT, + `instagram_account_id` VARCHAR(255) NOT NULL, + `name` VARCHAR(45) NOT NULL, + `username` VARCHAR(45) NOT NULL, + `page_id` VARCHAR(255) NOT NULL, + `sync_after` DATETIME NULL, + `project_id` INT NULL, + `imrs_id` VARCHAR(255) NULL, + `fb_account_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_instagram_account_project1_idx` (`project_id` ASC), + INDEX `fk_instagram_account_fb_account1_idx` (`fb_account_id` ASC), + INDEX `fk_instagram_account_tenant1_idx` (`tenant_id` ASC), + UNIQUE INDEX `instagram_account_id_UNIQUE` (`instagram_account_id` ASC, `tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_project_sms_campaign` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_project_sms_campaign` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_project_sms_campaign` ( + `id` INT NOT NULL AUTO_INCREMENT, + `sms_campaign_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `project_id` INT NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_feature_project_sms_campaign_project1_idx` (`project_id` ASC), + INDEX `fk_feature_project_sms_campaign_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`feature_tenant_local_authentication` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`feature_tenant_local_authentication` ; + +CREATE TABLE IF NOT EXISTS `manager`.`feature_tenant_local_authentication` ( + `id` INT NOT NULL AUTO_INCREMENT, + `local_authentication_enabled` TINYINT(1) NOT NULL DEFAULT 1, + `password_expiration_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `password_expiration_days` INT NOT NULL DEFAULT 30, + `password_history_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `password_history` INT NOT NULL DEFAULT 6, + `password_min_length` INT NOT NULL DEFAULT 6, + `password_max_length` INT NOT NULL DEFAULT 16, + `password_symbol_required` TINYINT(1) NOT NULL DEFAULT 0, + `password_digit_required` TINYINT(1) NOT NULL DEFAULT 0, + `password_letter_mix_required` TINYINT(1) NOT NULL DEFAULT 0, + `first_password_change_required` TINYINT(1) NOT NULL DEFAULT 0, + `send_first_password_via_email` TINYINT(1) NOT NULL DEFAULT 0, + `password_change_notification` TINYINT(1) NOT NULL DEFAULT 0, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_feature_tenant_local_authentication_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `manager`.`tenant_user_password_history` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `manager`.`tenant_user_password_history` ; + +CREATE TABLE IF NOT EXISTS `manager`.`tenant_user_password_history` ( + `id` INT NOT NULL AUTO_INCREMENT, + `password` VARCHAR(100) NOT NULL, + `created_date` DATETIME NOT NULL, + `tenant_id` INT NOT NULL, + `tenant_user_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC), + INDEX `fk_tenant_user_password_history_tenant_user1_idx` (`tenant_user_id` ASC), + INDEX `fk_tenant_user_password_history_tenant1_idx` (`tenant_id` ASC)) +ENGINE = InnoDB; + + + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/templates/mariadb/03_create_db_freeswitch.sql b/templates/mariadb/03_create_db_freeswitch.sql new file mode 100644 index 0000000..02405fc --- /dev/null +++ b/templates/mariadb/03_create_db_freeswitch.sql @@ -0,0 +1,85 @@ +-- MySQL Script generated by MySQL Workbench +-- 09/11/17 15:53:27 +-- Model: New Model Version: 1.0 +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; + +-- ----------------------------------------------------- +-- Schema freeswitch +-- ----------------------------------------------------- +DROP SCHEMA IF EXISTS `freeswitch` ; + +-- ----------------------------------------------------- +-- Schema freeswitch +-- ----------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS `freeswitch` DEFAULT CHARACTER SET utf8 ; +USE `freeswitch` ; + +-- ----------------------------------------------------- +-- Table `freeswitch`.`domain` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `freeswitch`.`domain` ; + +CREATE TABLE IF NOT EXISTS `freeswitch`.`domain` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `sofia_template` VARCHAR(45) NOT NULL, + `verto_template` VARCHAR(45) NOT NULL, + `session_server` VARCHAR(45) NOT NULL, + `realm` VARCHAR(45) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `name_UNIQUE` (`name` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `freeswitch`.`user` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `freeswitch`.`user` ; + +CREATE TABLE IF NOT EXISTS `freeswitch`.`user` ( + `id` INT NOT NULL AUTO_INCREMENT, + `link_type` VARCHAR(45) NOT NULL COMMENT 'SOFIA|VERTO', + `username` VARCHAR(45) NOT NULL, + `password` VARCHAR(45) NOT NULL, + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `domain_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `username_UNIQUE` (`username` ASC), + INDEX `fk_user_domain_idx` (`domain_id` ASC), + CONSTRAINT `fk_user_domain` + FOREIGN KEY (`domain_id`) + REFERENCES `freeswitch`.`domain` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; + +-- ----------------------------------------------------- +-- Data for table `freeswitch`.`domain` +-- ----------------------------------------------------- +START TRANSACTION; +USE `freeswitch`; +INSERT INTO `freeswitch`.`domain` (`id`, `name`, `sofia_template`, `verto_template`, `session_server`, `realm`) VALUES (1, 'conpeek', 'sofia', 'verto', 'session_server01', 'fspool01.conpeek.com'); + +COMMIT; + + +-- ----------------------------------------------------- +-- Data for table `freeswitch`.`user` +-- ----------------------------------------------------- +START TRANSACTION; +USE `freeswitch`; +INSERT INTO `freeswitch`.`user` (`id`, `link_type`, `username`, `password`, `create_time`, `domain_id`) VALUES (1, 'SOFIA', '225957801', '225957801', DEFAULT, 1); +INSERT INTO `freeswitch`.`user` (`id`, `link_type`, `username`, `password`, `create_time`, `domain_id`) VALUES (2, 'SOFIA', '225957802', '225957802', DEFAULT, 1); +INSERT INTO `freeswitch`.`user` (`id`, `link_type`, `username`, `password`, `create_time`, `domain_id`) VALUES (3, 'SOFIA', '225957803', '225957803', DEFAULT, 1); + +COMMIT; + diff --git a/templates/mariadb/04_create_db_session_server.sql b/templates/mariadb/04_create_db_session_server.sql new file mode 100644 index 0000000..a530a34 --- /dev/null +++ b/templates/mariadb/04_create_db_session_server.sql @@ -0,0 +1,583 @@ +-- MySQL Script generated by MySQL Workbench +-- Thu Jul 7 17:59:49 2022 +-- Model: New Model Version: 1.0 +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; + +-- ----------------------------------------------------- +-- Schema sessionserver1 +-- ----------------------------------------------------- +DROP SCHEMA IF EXISTS `sessionserver1` ; + +-- ----------------------------------------------------- +-- Schema sessionserver1 +-- ----------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS `sessionserver1` DEFAULT CHARACTER SET utf8 ; +USE `sessionserver1` ; + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`user_system_state` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`user_system_state` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_system_state` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_id` INT NOT NULL, + `domain` VARCHAR(100) NOT NULL, + `user_id` INT NOT NULL, + `username` VARCHAR(100) NOT NULL, + `system_state` VARCHAR(45) NOT NULL COMMENT 'ACTIVE|INACTIVE', + `system_state_inactive_cause` VARCHAR(45) NULL, + `system_state_change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `work_state` VARCHAR(45) NOT NULL, + `work_state_inactive_cause` VARCHAR(45) NULL, + `work_state_break_cause` VARCHAR(100) NULL, + `work_state_break_started` TINYINT NULL, + `work_state_change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `webapp_state` VARCHAR(45) NOT NULL, + `webapp_state_change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `call_state` VARCHAR(45) NOT NULL COMMENT 'IDLE|BUSY', + `call_state_change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `meeting_limit` INT NOT NULL, + `serving_chat` TINYINT NOT NULL DEFAULT 1, + `serving_audio` TINYINT NOT NULL DEFAULT 1, + `serving_video` TINYINT NOT NULL DEFAULT 1, + `serving_media_cav` VARCHAR(45) NOT NULL DEFAULT '111', + `change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `break_set_time` TIMESTAMP NULL, + `business_break_set_time` TIMESTAMP NULL, + `coffee_break_set_time` TIMESTAMP NULL, + `indicator_talk_count` INT NOT NULL DEFAULT 0, + `indicator_talk_time` INT NOT NULL DEFAULT 0, + `indicator_last_talk` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `online_count` INT NOT NULL DEFAULT 0, + `coffee_break_count` INT NOT NULL DEFAULT 0, + `coffee_break_exceeded_notified` TINYINT NOT NULL DEFAULT 0, + `business_break_count` INT NOT NULL DEFAULT 0, + `business_break_exceeded_notified` TINYINT NOT NULL DEFAULT 0, + `break_count` INT NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE INDEX `UNIQUE_tenant_user` (`tenant_id` ASC, `user_id` ASC), + INDEX `user_system_state_idx_user_id_webapp_state` (`user_id` ASC, `webapp_state` ASC), + INDEX `user_system_state_idx_user_id` (`user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`user_project_state` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`user_project_state` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_project_state` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_id` INT NOT NULL, + `domain` VARCHAR(100) NOT NULL, + `user_id` INT NOT NULL, + `username` VARCHAR(100) NOT NULL, + `project_id` INT NOT NULL, + `project` VARCHAR(45) NOT NULL, + `state` VARCHAR(45) NOT NULL COMMENT 'ACTIVE|INACTIVE', + `state_inactive_cause` VARCHAR(45) NULL, + `state_inactive_break_cause` VARCHAR(45) NULL, + `position` INT NOT NULL, + `score` INT NOT NULL, + `tier` INT NOT NULL, + `mode` VARCHAR(45) NOT NULL, + `priority` INT NOT NULL DEFAULT 100, + `serving_chat` TINYINT NOT NULL DEFAULT 1, + `serving_audio` TINYINT NOT NULL DEFAULT 1, + `serving_video` TINYINT NOT NULL DEFAULT 1, + `serving_media_cav` VARCHAR(45) NOT NULL DEFAULT '111', + `accept_sms` TINYINT(1) NOT NULL DEFAULT 0, + `accept_email` TINYINT(1) NOT NULL DEFAULT 0, + `accept_facebook` TINYINT(1) NOT NULL DEFAULT 0, + `accept_whatsapp` TINYINT(1) NOT NULL DEFAULT 0, + `accept_webmessage` TINYINT(1) NOT NULL DEFAULT 0, + `accept_fax` TINYINT(1) NOT NULL DEFAULT 0, + `accept_voicemail` TINYINT(1) NOT NULL DEFAULT 0, + `accept_bookingsync` TINYINT(1) NOT NULL DEFAULT 0, + `accept_instagram` TINYINT(1) NOT NULL DEFAULT 0, + `noanswer_counter` INT NULL DEFAULT 0, + `change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + INDEX `user_project_state_idx_id_state_tier` (`project_id` ASC, `state` ASC, `tier` ASC), + INDEX `user_project_state_project_user_state_mode` (`project_id` ASC, `user_id` ASC, `state` ASC, `mode` ASC), + INDEX `user_project_state_project_state_mode` (`project_id` ASC, `state` ASC, `mode` ASC), + INDEX `idx_user_id_project_id_state_tier_mode` (`user_id` ASC, `project_id` ASC, `state` ASC, `tier` ASC, `mode` ASC), + INDEX `user_project_state_idx_id_state_mode_chat_audio_video` (`project_id` ASC, `state` ASC, `mode` ASC, `serving_chat` ASC, `serving_audio` ASC, `serving_video` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`user_reservation` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`user_reservation` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_reservation` ( + `id` INT NOT NULL AUTO_INCREMENT, + `reservation_uuid` VARCHAR(100) NOT NULL, + `tenant_id` INT NOT NULL, + `domain` VARCHAR(100) NULL, + `user_id` INT NOT NULL, + `username` VARCHAR(100) NULL, + `project` VARCHAR(45) NULL, + `state` VARCHAR(45) NOT NULL COMMENT 'WORK|ACW', + `mode` VARCHAR(45) NOT NULL COMMENT 'INBOUND|OUTBOUND', + `break_expire_time` TIMESTAMP NULL, + `break_task_uuid` VARCHAR(100) NULL, + `confirm_expire_time` TIMESTAMP NULL, + `confirm_task_uuid` VARCHAR(100) NULL, + `meeting_uuid` VARCHAR(100) NULL, + `reserved_chat` TINYINT NOT NULL, + `reserved_audio` TINYINT NOT NULL COMMENT 'CHAT|VOICE|VIDEO', + `reserved_video` TINYINT NOT NULL, + `reservation_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `information` TEXT NULL, + `project_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `user_reservation_idx_user_id` (`user_id` ASC), + INDEX `user_reservation_idx_reservation_uuid` (`reservation_uuid` ASC), + INDEX `idx_state` (`state` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`contact_session_data` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`contact_session_data` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`contact_session_data` ( + `id` INT NOT NULL AUTO_INCREMENT, + `contact_id` VARCHAR(100) NULL, + `session_id` VARCHAR(45) NOT NULL, + `session_pass` VARCHAR(45) NOT NULL, + `domain` VARCHAR(100) NOT NULL, + `username` VARCHAR(45) NOT NULL, + `token_id` VARCHAR(45) NULL, + `token_valid` VARCHAR(45) NULL, + `nonce` VARCHAR(45) NULL, + `contact_ip` VARCHAR(45) NULL, + `expiration_time` TIMESTAMP NULL, + `tenant_id` INT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `customer_session_id_UNIQUE` (`session_id` ASC), + INDEX `idx_tenant_contact` (`tenant_id` ASC, `contact_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`tenant_user_session_data` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`tenant_user_session_data` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`tenant_user_session_data` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_id` INT NOT NULL, + `domain` VARCHAR(100) NOT NULL, + `tenant_user_id` INT NOT NULL, + `username` VARCHAR(45) NOT NULL, + `state` VARCHAR(45) NOT NULL COMMENT 'CREATED|CONNECTED|DISCONNECTED|DESTROYED', + `weblink_id` INT NULL, + `weblink_name` VARCHAR(45) NULL, + `session_id` VARCHAR(45) NOT NULL, + `session_pass` VARCHAR(45) NOT NULL, + `device_available_chat` TINYINT NOT NULL DEFAULT 0, + `device_available_audio` TINYINT NOT NULL DEFAULT 0, + `device_available_video` TINYINT NOT NULL DEFAULT 0, + `device_available_media_cav` VARCHAR(3) NOT NULL DEFAULT '000', + `token_id` VARCHAR(45) NULL, + `token_valid` VARCHAR(45) NULL, + `nonce` VARCHAR(45) NULL, + `device_uuid` VARCHAR(100) NULL, + `tenant_user_ip` VARCHAR(45) NULL, + `user_agent` VARCHAR(200) NULL, + `expiration_time` TIMESTAMP NULL, + `change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `session_type` VARCHAR(45) NOT NULL DEFAULT 'WEBAPP' COMMENT 'WEBAPP|COMMUNICATOR', + `operator_user_id` INT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `consultant_session_id_UNIQUE` (`session_id` ASC), + INDEX `idx_tenant_id_tenant_user_weblink_id` (`tenant_id` ASC, `tenant_user_id` ASC, `weblink_id` ASC, `session_type` ASC), + INDEX `idx_tenant_id_user_id` (`tenant_id` ASC, `tenant_user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`reservation_queue` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`reservation_queue` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`reservation_queue` ( + `id` INT NOT NULL AUTO_INCREMENT, + `queue_uuid` VARCHAR(100) NOT NULL, + `tenant_id` INT NOT NULL, + `project_id` INT NULL, + `user_id` INT NULL, + `queue_type` VARCHAR(45) NOT NULL COMMENT 'PROJECT_ANYONE|PROJECT_USER|USER', + `queue_priority` INT NOT NULL DEFAULT 100, + `time_base` VARCHAR(45) NOT NULL COMMENT 'SYSTEM|QUEUE', + `queue_member_resume_time` INT NOT NULL DEFAULT 0, + `avg_waiting_time` INT NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + INDEX `reservation_queue_idx_uuid` (`queue_uuid` ASC), + INDEX `reservation_queue_type_project_user` (`queue_type` ASC, `project_id` ASC, `user_id` ASC), + INDEX `reservation_queue_typet_user` (`queue_type` ASC, `user_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`queue_member` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`queue_member` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`queue_member` ( + `id` INT NOT NULL AUTO_INCREMENT, + `member_uuid` VARCHAR(100) NOT NULL, + `member_type` VARCHAR(45) NOT NULL, + `member_id` INT NULL, + `target_identifier` VARCHAR(100) NOT NULL, + `member_display_name` VARCHAR(100) NULL, + `member_priority` INT NOT NULL, + `member_mode` VARCHAR(45) NOT NULL, + `system_join_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `process_join_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `queue_join_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `calculated_join_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `state` VARCHAR(45) NOT NULL COMMENT 'WAITING|ABANDONED', + `member_expire_time` TIMESTAMP NULL, + `member_expire_task_uuid` VARCHAR(100) NULL, + `member_transfer_time` TIMESTAMP NULL, + `member_transfer_task_uuid` VARCHAR(100) NULL, + `noagent_expire_time` TIMESTAMP NULL, + `noagent_expire_task_uuid` VARCHAR(100) NULL, + `member_resume_time` TIMESTAMP NULL, + `member_resume_task_uuid` VARCHAR(100) NULL, + `current_tier` INT NOT NULL, + `next_tier_time` TIMESTAMP NULL, + `next_tier_task_uuid` VARCHAR(100) NULL, + `required_chat` TINYINT NOT NULL, + `required_audio` TINYINT NOT NULL, + `required_video` TINYINT NOT NULL, + `required_media_cav` VARCHAR(45) NOT NULL, + `webapp_required` TINYINT NOT NULL, + `information` VARCHAR(255) NULL, + `event_queue_uuid` VARCHAR(100) NULL, + `skill_name` VARCHAR(45) NOT NULL DEFAULT 'ANY', + `reservation_queue_id` INT NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_queue_member_queue_idx` (`reservation_queue_id` ASC), + INDEX `queue_member_idx_state_id_priorit_time` (`state` ASC, `reservation_queue_id` ASC, `member_priority` ASC, `calculated_join_time` ASC), + INDEX `queue_member_idx_reservation_queue_id_state_mode` (`reservation_queue_id` ASC, `state` ASC, `member_mode` ASC), + INDEX `queue_member_idx_reservation_queue_id_current_tier` (`reservation_queue_id` ASC, `current_tier` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`user_reservation_statistics` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`user_reservation_statistics` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_reservation_statistics` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain` VARCHAR(100) NOT NULL, + `username` VARCHAR(45) NOT NULL, + `period` VARCHAR(45) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`user_reservation_log` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`user_reservation_log` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_reservation_log` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain` VARCHAR(100) NOT NULL, + `username` VARCHAR(45) NOT NULL, + `start_time` TIMESTAMP NOT NULL, + `stop_time` TIMESTAMP NULL, + `duration` TIMESTAMP NULL, + `chat` TINYINT NOT NULL, + `audio` TINYINT NOT NULL, + `video` TINYINT NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`acd` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`acd` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`acd` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain` VARCHAR(45) NOT NULL, + `project` VARCHAR(45) NOT NULL, + `strategy` VARCHAR(45) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`user_link_state` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`user_link_state` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_link_state` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_id` INT NOT NULL, + `domain` VARCHAR(100) NOT NULL, + `user_id` INT NOT NULL, + `username` VARCHAR(45) NOT NULL, + `link_id` INT NOT NULL, + `link_type` VARCHAR(45) NOT NULL COMMENT 'WEB|PSTN|LINE', + `link_name` VARCHAR(45) NOT NULL, + `state` VARCHAR(45) NOT NULL COMMENT 'ACTIVE|INACTIVE', + `state_inactive_cause` VARCHAR(45) NULL, + `priority` INT NOT NULL DEFAULT 100, + `available_chat` TINYINT NOT NULL, + `available_audio` TINYINT NOT NULL, + `available_video` TINYINT NOT NULL, + `available_media_cav` VARCHAR(45) NOT NULL, + `change_time` TIMESTAMP NOT NULL, + PRIMARY KEY (`id`), + INDEX `idx_user_link_type_id` (`user_id` ASC, `link_type` ASC, `link_id` ASC), + INDEX `idx_user_id_link_type` (`user_id` ASC, `link_type` ASC), + INDEX `idx_user_id_state` (`user_id` ASC, `state` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`project_state` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`project_state` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`project_state` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_id` INT NOT NULL, + `domain` VARCHAR(100) NOT NULL, + `project_id` INT NOT NULL, + `project` VARCHAR(45) NOT NULL, + `service_type` VARCHAR(45) NOT NULL, + `service_id` INT NOT NULL, + `state` VARCHAR(45) NOT NULL COMMENT 'ACTIVE|INACTIVE', + `state_inactive_cause` VARCHAR(45) NULL, + `inbound_consultants_reserve_count` INT NOT NULL DEFAULT 0, + `multichat` TINYINT NOT NULL, + `recently_reserved_position` INT NOT NULL DEFAULT 0, + `inbound_users_count` INT NOT NULL DEFAULT 0, + `inbound_chat_users_count` INT NOT NULL DEFAULT 0, + `inbound_audio_users_count` INT NOT NULL DEFAULT 0, + `inbound_video_users_count` INT NOT NULL DEFAULT 0, + `outbound_users_count` INT NOT NULL DEFAULT 0, + `outbound_chat_users_count` INT NOT NULL DEFAULT 0, + `outbound_audio_users_count` INT NOT NULL DEFAULT 0, + `outbound_video_users_count` INT NOT NULL DEFAULT 0, + `outbound_webapp_users_count` INT NOT NULL DEFAULT 0, + `outbound_webapp_chat_users_count` INT NOT NULL DEFAULT 0, + `outbound_webapp_audio_users_count` INT NOT NULL DEFAULT 0, + `outbound_webapp_video_users_count` INT NOT NULL DEFAULT 0, + `inbound_serving_media_cav` VARCHAR(45) NOT NULL, + `outbound_serving_media_cav` VARCHAR(45) NOT NULL, + `outbound_webapp_serving_media_cav` VARCHAR(45) NOT NULL, + `queue_enabled` TINYINT(1) NOT NULL, + `change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `inbound_staff_sla_indicator` VARCHAR(45) NOT NULL DEFAULT 'regular' COMMENT 'regular|increased', + `outbound_staff_sla_indicator` VARCHAR(45) NOT NULL DEFAULT 'regular' COMMENT 'regular|increased', + `webapp_online_users_count` INT NOT NULL DEFAULT 0, + `webapp_online_chat_users_count` INT NOT NULL DEFAULT 0, + `webapp_online_audio_users_count` INT NOT NULL DEFAULT 0, + `webapp_online_video_users_count` INT NOT NULL DEFAULT 0, + `lock_change_to_break_enabled` TINYINT(1) NOT NULL DEFAULT 0, + `lock_change_to_break_members_limit` INT NOT NULL DEFAULT 1, + PRIMARY KEY (`id`), + INDEX `idx_tenant_project_multichat` (`tenant_id` ASC, `project_id` ASC, `multichat` ASC), + INDEX `idx_project_state` (`project_id` ASC, `state` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`sip_location` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`sip_location` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`sip_location` ( + `id` INT NOT NULL AUTO_INCREMENT, + `sip_username` VARCHAR(45) NOT NULL, + `status` VARCHAR(45) NOT NULL, + `contact` VARCHAR(255) NOT NULL, + `expires` INT NOT NULL, + `network_ip` VARCHAR(45) NOT NULL, + `network_port` INT NOT NULL, + `user_agent` VARCHAR(100) NOT NULL, + `freeswitch_hostname` VARCHAR(45) NOT NULL, + `freeswitch_switchname` VARCHAR(45) NOT NULL, + `freeswitch_ipv4` VARCHAR(45) NOT NULL, + `freeswitch_ipv6` VARCHAR(45) NOT NULL, + `profile_name` VARCHAR(45) NOT NULL, + `rpid` VARCHAR(45) NOT NULL, + `change_time` TIMESTAMP NOT NULL, + `user_link_state_id` INT NULL, + PRIMARY KEY (`id`), + INDEX `fk_sip_location_user_link_state1_idx` (`user_link_state_id` ASC), + INDEX `sip_location_idx_sip_username` (`sip_username` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`user_dialog_state` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`user_dialog_state` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_dialog_state` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_id` INT NOT NULL, + `dialog_uuid` VARCHAR(45) NOT NULL, + `user_id` INT NOT NULL, + `team_id` INT NULL, + `project_id` INT NULL, + `state` VARCHAR(45) NOT NULL COMMENT 'ALERTING|RINGING|TALKING|HOLD', + `state_complete` TINYINT(1) NOT NULL DEFAULT 0, + `media_cav` VARCHAR(45) NOT NULL, + `chat` TINYINT(1) NOT NULL DEFAULT 0, + `audio` TINYINT(1) NOT NULL DEFAULT 0, + `video` TINYINT(1) NOT NULL DEFAULT 0, + `direction` VARCHAR(45) NOT NULL, + `self_username` VARCHAR(45) NULL, + `self_firstname` VARCHAR(45) NULL, + `self_surname` VARCHAR(45) NULL, + `self_type` VARCHAR(45) NULL COMMENT 'TENANT_USER|CONSULTANT', + `self_name` VARCHAR(100) NULL, + `self_target` VARCHAR(100) NULL, + `self_project_name` VARCHAR(45) NULL, + `peer_username` VARCHAR(45) NULL, + `peer_firstname` VARCHAR(45) NULL, + `peer_surname` VARCHAR(45) NULL, + `peer_type` VARCHAR(45) NULL, + `peer_name` VARCHAR(100) NULL, + `peer_target` VARCHAR(100) NULL, + `peer_project_name` VARCHAR(45) NULL, + `start_time` TIMESTAMP NOT NULL, + `need_help` TINYINT(1) NULL DEFAULT 0, + PRIMARY KEY (`id`), + INDEX `idx_tenant_user_media_state` (`tenant_id` ASC, `user_id` ASC, `media_cav` ASC, `state` ASC), + INDEX `idx_project_state` (`project_id` ASC, `state` ASC), + INDEX `idx_tenant_user_state` (`user_id` ASC, `state` ASC), + INDEX `idx_tenant_project_media_state` (`tenant_id` ASC, `project_id` ASC, `media_cav` ASC, `state` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`voice_campaign_state` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`voice_campaign_state` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`voice_campaign_state` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_id` INT NOT NULL, + `project_id` INT NOT NULL, + `voice_campaign_id` VARCHAR(100) NOT NULL, + `active` TINYINT(1) NOT NULL DEFAULT 0, + `records_number` INT NOT NULL DEFAULT 0, + `state_new_number` INT NOT NULL DEFAULT 0, + `state_recall_number` INT NOT NULL DEFAULT 0, + `state_retry_number` INT NOT NULL DEFAULT 0, + `state_closed_number` INT NOT NULL DEFAULT 0, + `close_reason_timeout_number` INT NOT NULL DEFAULT 0, + `close_reason_callback_number` INT NOT NULL DEFAULT 0, + `close_reason_cancelled_number` INT NOT NULL DEFAULT 0, + `close_reason_unconfirmed_number` INT NOT NULL DEFAULT 0, + `close_reason_tries_exceeded_number` INT NOT NULL DEFAULT 0, + `close_reason_done_number` INT NOT NULL DEFAULT 0, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`model_version` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`model_version` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`model_version` ( + `id` INT NOT NULL AUTO_INCREMENT, + `serial` VARCHAR(45) NOT NULL, + `dirty` VARCHAR(45) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`recent_agent_log` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`recent_agent_log` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`recent_agent_log` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_id` INT NOT NULL, + `project_id` INT NOT NULL, + `user_id` INT NOT NULL, + `channel` VARCHAR(45) NOT NULL, + `address` VARCHAR(100) NULL, + `contact_id` VARCHAR(100) NULL, + `assign_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + INDEX `idx_channel_project_id_address_assign_time` (`channel` ASC, `project_id` ASC, `address` ASC, `assign_time` ASC), + INDEX `idx_channel_project_id_contact_id_assign_time` (`channel` ASC, `project_id` ASC, `contact_id` ASC, `assign_time` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`hunting_group_state` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`hunting_group_state` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`hunting_group_state` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_id` INT NOT NULL, + `domain` VARCHAR(100) NULL, + `hunting_group_id` INT NOT NULL, + `recently_reserved_position` INT NOT NULL DEFAULT 0, + `change_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`user_skill` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`user_skill` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`user_skill` ( + `id` INT NOT NULL AUTO_INCREMENT, + `tenant_id` INT NOT NULL, + `user_id` INT NOT NULL, + `skill_id` INT NULL, + `skill_name` VARCHAR(45) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `sessionserver1`.`tts_cache_recording` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `sessionserver1`.`tts_cache_recording` ; + +CREATE TABLE IF NOT EXISTS `sessionserver1`.`tts_cache_recording` ( + `id` INT NOT NULL AUTO_INCREMENT, + `md5_hash` VARCHAR(45) NOT NULL, + `recording_source` VARCHAR(1000) NOT NULL, + `last_usage_date` TIMESTAMP NOT NULL, + `tenant_id` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `md5_hash_index` (`md5_hash` ASC), + INDEX `index3` (`last_usage_date` ASC)) +ENGINE = InnoDB; + + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/templates/mariadb/05_create_db_kamailio.sql b/templates/mariadb/05_create_db_kamailio.sql new file mode 100644 index 0000000..b4471bd --- /dev/null +++ b/templates/mariadb/05_create_db_kamailio.sql @@ -0,0 +1,46 @@ +-- MySQL Script generated by MySQL Workbench +-- Wed Oct 31 16:34:07 2018 +-- Model: New Model Version: 1.0 +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; + +-- ----------------------------------------------------- +-- Schema kamailio +-- ----------------------------------------------------- + +-- ----------------------------------------------------- +-- Schema kamailio +-- ----------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS `kamailio` DEFAULT CHARACTER SET utf8 ; +USE `kamailio` ; + +-- ----------------------------------------------------- +-- Table `kamailio`.`selected_freeswitch` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `kamailio`.`selected_freeswitch` ( + `id` INT NOT NULL AUTO_INCREMENT, + `call_id` VARCHAR(100) NOT NULL, + `freeswitch_ipv4` VARCHAR(45) NOT NULL, + `freeswitch_port` INT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `call_id_UNIQUE` (`call_id` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `kamailio`.`model_version` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `kamailio`.`model_version` ( + `id` INT NOT NULL AUTO_INCREMENT, + `serial` VARCHAR(45) NOT NULL, + `dirty` TINYINT NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/templates/mariadb/06_manager_data_for_1_tenant.sql b/templates/mariadb/06_manager_data_for_1_tenant.sql new file mode 100644 index 0000000..41376a8 --- /dev/null +++ b/templates/mariadb/06_manager_data_for_1_tenant.sql @@ -0,0 +1,21 @@ +use manager; +SET @operator_domain = 'OPERATOR_DOMAIN'; +SET @operator_username = 'OPERATOR_USERNAME'; +SET @operator_password = 'OPERATOR_PASSWORD'; + +INSERT INTO `setting` VALUES (1,'1','GLOBAL',NULL,1),(2,'4','GLOBAL',NULL,2),(3,'20','GLOBAL',NULL,3),(4,'10','GLOBAL',NULL,4),(5,'10','GLOBAL',NULL,5),(6,'30','GLOBAL',NULL,6),(7,'60','GLOBAL',NULL,7),(8,'60','GLOBAL',NULL,8),(9,'10','GLOBAL',NULL,9),(10,'0','GLOBAL',NULL,10),(11,'4','GLOBAL',NULL,11),(12,'5','GLOBAL',NULL,12),(13,'120','GLOBAL',NULL,13),(14,'3','GLOBAL',NULL,14),(15,'5','GLOBAL',NULL,15),(16,'0','GLOBAL',NULL,16),(17,'2','GLOBAL',NULL,17),(18,'2','GLOBAL',NULL,18),(19,'0','GLOBAL',NULL,19),(20,'1','GLOBAL',NULL,20); + +INSERT INTO `bss_api` VALUES (1,'v1_3',1,1); +INSERT INTO `normalization` VALUES (1,'^([0-9]{9})$','48\\1',100,1),(2,'^\\\\+(48[0-9]{9})$','\\1',100,1),(3,'^00(48[0-9]{9})$','\\1',100,1); +INSERT INTO `operator` VALUES (1,'Conpeek',@operator_domain,'PLN','support@conpeek.com','48223574199','Polska',NULL,'96-500','Sochaczew','ul. 1-go Maja','24/3',1); +INSERT INTO `operator_contact_person` VALUES (1,'Adam','Kuśmirek','CEO','adam.kusmirek@conpeek.com','48223574199',1); +INSERT INTO `operator_contract` VALUES (1,'XChs67',1,'2016-10-10 10:00:00','2016-10-10 10:00:00',NULL,1); +INSERT INTO `operator_tariff` VALUES (1,'taryfa 1',1,'2023-01-01 00:00:00','2023-01-01 00:00:00',NULL,1); +INSERT INTO `operator_user` VALUES (1,'OPERATOR',@operator_username,@operator_password,1,'Admin','Admin','support@conpeek.com','48223574199','ADMINISTRATOR',NULL,1); + +INSERT INTO `system` VALUES (1,'produkcja','produkcja','produkcja','en',1),(2,'test','test','test','en',NULL); +INSERT INTO `system_user` VALUES (1,'admin','8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918','admin@admin.pl','ADMIN',1),(2,'admin_test','cb9b36b102080fdd528586959f259535502519291b06d3ddfe76c8a74cecd638','admin_test@admin.pl','ADMIN',2); + +INSERT INTO `license_package_has_system_role` VALUES (1,1,2),(15,6,4),(16,6,39),(17,7,3),(18,7,4),(19,7,39),(21,8,4),(22,8,39),(23,9,3),(24,10,3),(25,11,3),(26,12,3),(27,13,3); +INSERT INTO `license_package_has_license` VALUES (1,1,1,222),(2,1,1,203),(15,1,2,17),(16,1,2,18),(17,1,2,19),(18,1,2,20),(19,1,2,21),(21,1,2,23),(22,1,2,28),(23,1,2,30),(24,1,2,37),(25,1,2,38),(26,1,2,42),(27,1,2,45),(200,1,10,45),(232,1,13,4),(233,1,13,6),(234,1,13,7),(235,1,13,8),(236,1,13,9),(237,1,13,45),(238,1,13,203),(239,1,14,32),(240,1,14,33),(241,1,14,34),(242,1,14,35),(243,1,14,36),(244,1,14,37),(245,1,14,38),(248,1,14,41); +INSERT INTO `operator_license_package` VALUES (1,'Admin','TENANT_USER_MAIN',1.00,1),(15,'WALLBOARD','TENANT_USER_VAS',1.00,1),(16,'WORK_AGENDA','TENANT_USER_VAS',1.00,1),(17,'TEAM_VIEWER','TENANT_USER_VAS',1.00,1),(18,'AUTOPROVISIONING','TENANT_VAS',1.00,1),(19,'ANTIFRAUD','TENANT_VAS',1.00,1),(21,'IVR','TENANT_VAS',1.00,1),(22,'CONFERENCE_BRIDGE','TENANT_VAS',1.00,1),(23,'CONFERENCE_ROOM','TENANT_VAS',1.00,1),(24,'CUSTOM_ANNOUNCEMENT','TENANT_VAS',1.00,1),(25,'Super Admin','TENANT_USER_MAIN',0.00,1),(26,'BOT_CHAT','TENANT_VAS',1.00,1),(27,'BOT_VOICE','TENANT_VAS',1.00,1),(200,'Main Supervisor','TENANT_USER_MAIN',1.00,1),(232,'Back Office Basic R','TENANT_USER_MAIN',1.00,1),(233,'Back Office Standard R','TENANT_USER_MAIN',1.00,1),(234,'Back Office UC R','TENANT_USER_MAIN',1.00,1),(235,'Contact Center Basic R','TENANT_USER_MAIN',1.00,1),(236,'Contact Center Standard R','TENANT_USER_MAIN',1.00,1),(237,'Contact Center Comfort R','TENANT_USER_MAIN',1.00,1),(238,'Contact Center Enterprise R','TENANT_USER_MAIN',1.00,1),(239,'Dialer CC R','TENANT_USER_VAS',1.00,1),(240,'Supervisor R','TENANT_USER_VAS',1.00,1),(241,'Administrator R','TENANT_USER_VAS',1.00,1),(242,'Video CC R','TENANT_USER_VAS',1.00,1),(243,'API R','TENANT_VAS',1.00,1),(244,'BSS R','TENANT_VAS',1.00,1),(245,'SLA Premium R','TENANT_VAS',1.00,1),(248,'Video CC Recording R','TENANT_USER_VAS',1.00,1); diff --git a/templates/mariadb/07_topology_data_for_1_tenant.sql b/templates/mariadb/07_topology_data_for_1_tenant.sql new file mode 100644 index 0000000..0dbace1 --- /dev/null +++ b/templates/mariadb/07_topology_data_for_1_tenant.sql @@ -0,0 +1,131 @@ +SET @tenant_access_network_name = 'ACCESS_DOMAIN_NAME'; +SET @tenant_system_network_name = 'SYSTEM_DOMAIN_NAME'; +SET @tenant_name='conpeek.com'; +SET @password = 'MASTER_PASSWORD'; +SET @root_name = 'root'; + +/* internal network (core network) */ +SET @internal_ip = 'CORE_IP'; +SET @internal_mask = 'CORE_MASK'; +SET @internal_network_address = 'CORE_NET_ADDRESS'; + +/* telco network (telco network) */ +SET @telco_ip = 'TELCO_IP'; +SET @telco_gateway = 'TELCO_GATEWAY'; +SET @telco_mask = 'TELCO_MASK'; +SET @telco_network_address = 'TELCO_NET_ADDRESS'; + +/* external network (access network) */ +SET @external_ip = 'ACCESS_IP'; +SET @external_mask = 'ACCESS_MASK'; +SET @external_net_adrr = 'ACCESS_NET_ADDRESS'; +SET @mongo_password = 'MASTER_PASSWORD'; +SET @mongo_root_name = 'root'; + +SET @mongodb_replicaset_name = 'MONGO_REPLICASET_NAME'; +SET @kamailio_name = 'KAMAILIO_NAME'; + +SET @system_token_secretkey = 'SYSTEM_TOKEN_SECRETKEY'; + +USE `topology`; + +CREATE TABLE IF NOT EXISTS `topology`.`grafana` (`id` INT NOT NULL,`name` VARCHAR(45) NOT NULL,`nginx_id` INT NOT NULL,`system_id` INT NOT NULL); +INSERT INTO `grafana` VALUES (1,'grafana',1,1); +INSERT INTO `access_network` VALUES (1, @tenant_access_network_name,@internal_network_address,@internal_mask,@internal_ip,170,'pusty_cert','pusty_klucz',NULL,NULL,2500,1); +INSERT INTO `telco_network` VALUES (1,'telcodomain',@telco_network_address,@telco_mask ,@telco_gateway,170,'DIRECT',1); +INSERT INTO `operator_has_access_network` VALUES (1,1,1); +INSERT INTO `system` VALUES (1,'conpeek',@tenant_system_network_name,@internal_network_address,@internal_mask ,@internal_ip,@root_name,@password,@internal_ip,@root_name,@password,@system_token_secretkey,'conpeek','conpeek',72000,NULL,'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJ1YOv8xeMYsLW72bc5cZciONe43wWPhytJvqY4ok4GriDZimjqveb/jzE99A4S6tHLv9C02Mfg+ytLnzZWRVZ/cb5Y1phbbWS2mVCdZYvEs1JGKgB+TtrexylsjZyTyZZG4LQMUyYLzk5yLKx0dd7CMZyGBJRiYlCom0bXeiYo3n05RUnQNRKkD88mCcBid6d9PZQg22uQ6Tf6wlthohSXfEttRwmL1fpfyIV2+yMJtJail1gvsHO5qD9zbZ7rQoz7LoX/aj75Ig9Jsuz12C91qE6rx0KoXvU/QfgVdimOd8yOc4JFxe4E/pLkR9JjtgT03fEySjJpm3OzN8oFcoh','-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAydWDr/MXjGLC1u9m3OXGXIjjXuN8Fj4crSb6mOKJOBq4g2Yp\no6r3m/48xPfQOEurRy7/QtNjH4PsrS582VkVWf3G+WNaYW21ktplQnWWLxLNSRio\nAfk7a3scpbI2ck8mWRuC0DFMmC85OciysdHXewjGchgSUYmJQqJtG13omKN59OUV\nJ0DUSpA/PJgnAYnenfT2UINtrkOk3+sJbYaIUl3xLbUcJi9X6X8iFdvsjCbSWopd\nYL7Bzuag/c22e60KM+y6F/2o++SIPSbLs9dgvdahOq8dCqF71P0H4FXYpjnfMjnO\nCRcXuBP6S5EfSY7YE9N3xMkoyaZtzszfKBXKIQIDAQABAoIBAGy4LJVMlrSyRk3M\n61W2F+GkgwWL+D1q+7txsa9E57FnA1kUYP2ejH5ktotLCcgpSnuvnyR6BXzmbUjk\nL7BMQioVf2a60+aDWDlglwbznBCDSj1DoMxfWliNGmNO2fE9HWUGYrKOu7mGRocP\nyuHqLO5DTdILkWKGeX+BStBhB3egMUwhidWZdvPy2hBxfa2cmumxBGSkr2/kUC7s\nMmO+IvOsVvCOyjU0y0hZ5ixDPqjOGPFT6JMvE6Lh25L4IVLJ58bxbnkoiaAgzhHw\nvdO/oTrlDqemxzE9qDHrKI9bAObnwu97+iZzpsvkiIAR7R8JdwyYhzDKWoPAXOuT\nq+diLgECgYEA/ECVRN4/DAICrVmXWB7XgW/cWpB3ORaDs2oeVyK3p38mvSK0LoSr\nCQxTUcQzU2PVTcoCgfFyKiFhCfMOQwj28WXh9r2gQN2Lysqz70AbJ9iEiwjjEx7w\n8o0UvFXHm77pqTD1/ktZoDS1sH1n2CKK/Mv21lDXKoLmmd4xx8F4gXECgYEAzNUr\npG7dsZ5qKrqdRS6XU2cQ68SfeQBSQNQVaDlBUdoF27Ize0zpO97jc8zptkP4kfSV\nayfjB9VHhsrKNdwguNRbVXiCmjGtNOCcXyOQcZ1pG136hCBcIWGkI9d0uXljFMEJ\nfvCA5+66QG6FxaxerSjMbpC5MDm0UmGVTu1De7ECgYAlFsnbymGyvkjufBHInyBI\no83ecwdUmX7bzmqPnUcrlYJ4pLWhcVhEiE9n4lU5maAvQ9iCiqGimC3QbLBYIuVM\nMRK8WL1LTEfVlWBHeUGE5kz2tGPO1+nNf/jgiCxFNhjdC5nfvex7pcRhIs819D5D\nVSoB8PjyAzUswoLHQCcbwQKBgBUz+9CJqWk5fMPvjVgb+o4nnRjKwbdE0T7ktVKU\nmq5eYzzatXmN/Ja1+9WA4LB9WL3DE7SD7HxjF4RceZIZt0lqsgmm794GRmey2H0A\nsXMRWE/86nHC58aM1PDg3LRWXGtJkDITs0RO8fi5eB9+OE60anUHhiP31TKx50LE\nTLgBAoGBAIjoLxdSLV3L4y54npr8mxlQGzYU4jaLXgEtYWdZJKlr3mUi4T7dkO/X\nUNlTa5nG312H6kwRNs1h3R7lTOpet1Ic9lNYhgE1WCd+KB++2F+x0jtxFosu5y9A\nIVLJbQCGQLqkxHsVdsLeXWZ+YsO4KX22UkR6LVsD+uGHmCFz5OdZ\n-----END RSA PRIVATE KEY-----\n','372429333174375','efae96bfd24e2cd0add1b39cbfae8111','372429333174375|PpDhAJ7Ukr4Rz2KDQX_EdXoveKM'); +INSERT INTO `nginx` VALUES(1,'nginx1',1,1); +INSERT INTO `mongodb_node` VALUES (1,'mongo1','root',@mongo_password,'/var/mongo',0,1,1); +INSERT INTO `mongodb_replicaset` VALUES (1,@mongodb_replicaset_name); +INSERT INTO `server_node` VALUES (1,'node1',@internal_ip,@internal_mask,@internal_ip,@internal_mask,@internal_ip,@internal_mask,NULL,NULL,'eth0','eth0',1); +INSERT INTO `server_node_has_access_network` VALUES (1,@internal_ip,@external_ip,1,1); +INSERT INTO `server_node_has_telco_network` VALUES (1,@telco_ip,1,1); +INSERT INTO `tenant_bss_api_server` VALUES (1,'bssserver1',1,8000,1,1,1); +INSERT INTO `tenant_api_server` VALUES (1,'tenantapiserver1',1,7100,1,1,1); +INSERT INTO `tenant_app_server` VALUES (1,'app',1,1); +INSERT INTO `session_server` VALUES (1,'sessionserver1',9100,9000,4200,9200,15300,16000,9300,9400,@internal_ip,@root_name,@password,1,1,1,1,1); +INSERT INTO `file_server` VALUES (1,'fileserver1',10000,10100,10200,'/data','us-east-1','AKIAIIHQL6HHI2IXCWOQ','aVivMJwZBuvHzpzd7r0KUYidBgZ+DSFlOIjXUV+w',NULL,1,1,1); +INSERT INTO `freeswitch` VALUES (1,'fs1','ClueCon',1,100,100,1,100,0000000100,'/recording',64,30,1000,0,16384,24574,'/data/pcaps',6800,1,1,1); +INSERT INTO `freeswitch_pool` VALUES (1,'fspool1',1,1); +INSERT INTO `gateway` VALUES (1,'gw1','ClueCon',1,100,100,1,100,100,1,1); +INSERT INTO `gateway_has_profile_setting` VALUES +(1,1,1,1),(2,1,1,3),(3,1,1,5),(4,1,1,6),(5,1,1,7),(6,1,1,9),(7,1,1,10),(8,1,1,11),(9,1,1,12), +(10,1,1,13),(11,1,1,14),(12,1,1,15),(13,1,1,16),(14,1,1,18),(15,1,1,20),(16,1,1,21),(17,1,1,22), +(18,1,1,23),(19,1,1,24),(20,1,1,28),(21,1,1,29); +INSERT INTO `gateway_pool` VALUES (1,'gwpool1',1); +INSERT INTO `sip_profile_param` VALUES +(1,'auth-all-packets'),(2,'auth-calls'),(3,'challenge-realm'),(4,'debug'),(5,'dtmf-duration'),(6,'forward-unsolicited-mwi-notify'), +(7,'hold-music'),(8,'inbound-codec-negotiation'),(9,'inbound-codec-prefs'),(10,'inbound-late-negotiation'), +(11,'inbound-reg-force-matching-username'),(12,'inbound-zrtp-passthru'),(13,'local-network-acl'),(14,'log-auth-failures'), +(15,'manual-redirect'),(16,'nonce-ttl'),(17,'odbc-dsn'),(18,'outbound-codec-prefs'), +(19,'rfc2833-pt'),(20,'rtp-timer-name'),(21,'sip-capture'),(22,'sip-trace'),(23,'watchdog-enabled'),(24,'watchdog-event-timeout'), +(25,'watchdog-step-timeout'),(26,'vad'),(27,'suppress-cng'); +INSERT INTO `sip_profile_setting` VALUES (1,'false',1),(2,'true',1),(3,'false',2),(4,'true',2),(5,'auto_from',3),(6,'false',4), +(7,'2000',5),(8,'false',6),(9,'$${hold_music}',7),(10,'generous',8),(11,'PCMA',9),(12,'true',10),(13,'true',11), +(14,'true',12),(15,'localnet.auto',13),(16,'false',14),(17,'true',15),(18,'60',16),(20,'PCMA',18),(21,'101',19), +(22,'soft',20),(23,'no',21),(24,'no',22),(25,'no',23),(26,'30000',24),(27,'30000',25),(28,'none',26),(29,'true',27), +(30,'false',27),(31,'PCMA,H264',9),(32,'PCMA,H264',18); +INSERT INTO `sms_server` VALUES (1,'smsserver1',14500,14600,7900,'SMPPv3.4',NULL,@internal_ip,@root_name,@password,NULL,NULL,1,1,1,1,1); +INSERT INTO `operator_has_anti_fraud_server` VALUES (1,1,1); +INSERT INTO `operator_has_cdr_server` VALUES (1,1,1); +INSERT INTO `operator_has_file_server` VALUES (1,1,1); +INSERT INTO `operator_has_freeswitch_pool` VALUES (1,1,1); +INSERT INTO `operator_has_gateway_pool` VALUES (1,1,1); +INSERT INTO `operator_has_kamailio` VALUES (1,1,1); +INSERT INTO `operator_has_mail_server` VALUES (1,1,1); +INSERT INTO `operator_has_plugin_server` VALUES (1,1,1); +INSERT INTO `operator_has_prov_server` VALUES (1,1,1); +INSERT INTO `operator_has_report_server` VALUES (1,1,1); +INSERT INTO `operator_has_sms_server` VALUES (1,1,1); +INSERT INTO `operator_has_telco_network` VALUES (1,1,1); +INSERT INTO `provisioning_server` VALUES (1,'provisioning1',3,7700,4600,1,1,1); +INSERT INTO `tenant_login_api_server` VALUES (1,'tenantloginapiserver1',1,1,1,1); +INSERT INTO `tenant_plugin_api_server` VALUES (1,'tenantpluginapiserver1',1,7600,1,1,1); +INSERT INTO `system_api_server` VALUES (1,'systemapiserver1',1,1,1,1); +INSERT INTO `system_app_server` VALUES(1,'systemapp',1,1); +INSERT INTO `wallboard_app_server` VALUES (1,'wallboard',1,1); +INSERT INTO `report_server` VALUES (1,'reportserver1',3,13000,4700,1,1,1); +INSERT INTO `salesforce_contact_db_server` VALUES (1,'salesforcecontactdb1',11200,11100,11300,1,1,1,1); +INSERT INTO `team_viewer_server` VALUES (1,'teamviewerserver1',8900,10300,4800,1,1,1); +INSERT INTO `zammad_contact_db_server` VALUES(1,'zammadcontactdb1',10700,10500,10600,1,1,1,1); +INSERT INTO `anti_fraud_server` VALUES (1,'antifraud1',1,1); +INSERT INTO `cdr_server` VALUES (1,'cdrserver1',9700,4400,1,1,1); +INSERT INTO `communicator_app_server` VALUES (1,'communicator1',1,1); +INSERT INTO `country_acl` VALUES (1,'Poland','WHITE',1); +INSERT INTO `country_acl_item` VALUES (1,'PL',1); +INSERT INTO `device_app_server` VALUES (1,'device',1,1); +INSERT INTO `domain_name_server` VALUES (1,'dns1',1,1); +INSERT INTO `facebook_server` VALUES (1,'facebookserver1',7800,15400,15600,'2059687944061341','3f31b7a9139e82064bf52395ec344e5a','575f96be-bdad-497d-81eb-8104bcb40414',1,1,1); +INSERT INTO `gus_server` VALUES (1,'gusserver1','https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl-ver11-test.wsdl','https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc','abcde12345abcde12345',10400,1,1,1); +INSERT INTO `hubspot_server` VALUES (1,'hubspotserver1','192692','4cd84bbe-79ed-4c09-bbdb-4c5f9640284d','4cf812ad-dc5e-4158-995d-923c24fe13a9',8300,9500,8400,8500,'','',1,1,1,1); +INSERT INTO `idenfy_server` VALUES (1,'idenfyserver1',13100,13200,1,1,1); +INSERT INTO `internal_has_profile_setting` VALUES +(1,1,1,1),(2,1,1,3),(3,1,1,5),(4,1,1,6),(5,1,1,7),(6,1,1,9),(7,1,1,10),(8,1,1,11),(9,1,1,12), +(10,1,1,13),(11,1,1,14),(12,1,1,15),(13,1,1,16),(14,1,1,18),(15,1,1,20),(16,1,1,21),(17,1,1,22), +(18,1,1,23),(19,1,1,24),(20,1,1,28),(21,1,1,29); +INSERT INTO `external_has_profile_setting` VALUES +(1,1,1,1),(2,1,1,3),(3,1,1,5),(4,1,1,6),(5,1,1,7),(6,1,1,9),(7,1,1,10),(8,1,1,11),(9,1,1,12), +(10,1,1,13),(11,1,1,14),(12,1,1,15),(13,1,1,16),(14,1,1,18),(15,1,1,20),(16,1,1,21),(17,1,1,22), +(18,1,1,23),(19,1,1,24),(20,1,1,28),(21,1,1,29); +INSERT INTO `line_has_profile_setting` VALUES +(1,1,1,1),(2,1,1,4),(3,1,1,6),(4,1,1,7),(5,1,1,9),(6,1,1,10),(7,1,1,31), +(8,1,1,12),(9,1,1,13),(10,1,1,14),(11,1,1,16),(12,1,1,17),(13,1,1,18), +(14,1,1,32),(15,1,1,21),(16,1,1,22),(17,1,1,23),(18,1,1,24),(19,1,1,25), +(20,1,1,26),(21,1,1,27),(22,1,1,28),(23,1,1,29); +INSERT INTO `invitation_app_server` VALUES (1,'invitationappserver1',1,1,1,1); +INSERT INTO `livespace_contact_db_server` VALUES(1,'livespacecontactdb1',10900,10800,11000,1,1,1,1); +INSERT INTO `local_contact_db_server` VALUES (1,'localcontactdb1',8600,14700,8700,1,NULL,1,1,1,1); +INSERT INTO `mail_server` VALUES (1,'mail1','/data/emails',1,1); +INSERT INTO `mailbox_server` VALUES (1,'mailboxserver1',8800,NULL,1,1); +INSERT INTO `messagebird_server` VALUES (1,'messagebirdserver1',11800,11900,12000,1,1,1); +INSERT INTO `messaging_server` VALUES (1,'messagingserver1',15500,15200,14200,14300,14400,NULL,NULL,15100,5000,1,1,1); +INSERT INTO `operator` VALUES (1,'conpeek.com',1,1,1,1); +INSERT INTO `operator_api_server` VALUES (1,'operatorapiserver1',1,1,1,1); +INSERT INTO `operator_app_server` VALUES (1,'operatorappserver1',1,1); +INSERT INTO `kamailio` VALUES (1,@kamailio_name,@internal_ip,@root_name,@password,1,1); +INSERT INTO `user_notification_server` VALUES (1,'usernotification1',8200,8100,1,1,1); +INSERT INTO `ticketing_server` VALUES (1, 'ticketingserver1', 16100, 16200, 1,1,1); +INSERT INTO `tenant_web_polling_api_server` VALUES (1,'poll1',1,7200,1,1,1); +INSERT INTO `bot_server` values (1,'botserver1',16500,1,1); +INSERT INTO `bot_train_server` values (1,'bottrainserver1',16300,3,1,1); diff --git a/templates/metrics/node_exporter.yml b/templates/metrics/node_exporter.yml new file mode 100644 index 0000000..f595d4f --- /dev/null +++ b/templates/metrics/node_exporter.yml @@ -0,0 +1,2 @@ +basic_auth_users: + prometheus: PROMETHEUS_PASSWORD diff --git a/templates/mongodb/mongo_init.sh b/templates/mongodb/mongo_init.sh new file mode 100644 index 0000000..88891b0 --- /dev/null +++ b/templates/mongodb/mongo_init.sh @@ -0,0 +1 @@ +docker exec mongo mongosh --authenticationDatabase admin -u root -p MASTER_PASSWORD --eval "use operator_1" --eval "$(cat text_to_speech.js)" \ No newline at end of file diff --git a/templates/mongodb/text_to_speech.js b/templates/mongodb/text_to_speech.js new file mode 100644 index 0000000..07fd01c --- /dev/null +++ b/templates/mongodb/text_to_speech.js @@ -0,0 +1,3 @@ +db.speech_integration.insertOne({"_id": ObjectId("633d2132840da20001127d7d"), "name": "Amazon (Conpeek)", "auto_add_to_new_tenant": 1, "text_to_speech": 1, "speech_to_text": 0, "type": "AMAZON_TEXT_TO_SPEECH", "options": {"default_voice": null, "region_name": "eu-central-1", "access_key_identifier": "AKIAIIHQL6HHI2IXCWOQ"}, "vulnerable_options": {"access_key_secret": "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"}, "tenant_list": []}); +db.voice_definition.insertOne({ "_id" : ObjectId("633d2160840da20001127d7e"), "name" : "Ewa (Conpeek)", "tts_integration_id" : ObjectId("633d2132840da20001127d7d"), "tts_integration_type" : "AMAZON", "voice" : "pl-PL-Ewa", "speaking_rate" : 100, "pitch" : 0, "volume" : 0 }); +db.voice_definition.insertOne({ "_id" : ObjectId("633d216f840da20001127d7f"), "name" : "Jacek (Conpeek)", "tts_integration_id" : ObjectId("633d2132840da20001127d7d"), "tts_integration_type" : "AMAZON", "voice" : "pl-PL-Jacek", "speaking_rate" : 100, "pitch" : 0, "volume" : 0 }); diff --git a/templates/nginx/custom.sh b/templates/nginx/custom.sh new file mode 100644 index 0000000..c659b3f --- /dev/null +++ b/templates/nginx/custom.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +sed -i "s/operatorLogoText: 'Conpeek'/operatorLogoText: 'OPERATOR_NAME'/g" /srv/conpeek/app_tenant/resources/Vars.js + +cp /custom/images/small_logo.png /srv/conpeek/app_tenant/resources/logo/bialy_64.png >/dev/null 2>&1 +cp /custom/images/login_logo.jpg /srv/conpeek/app_tenant/resources/images/lock-screen-logo.jpg >/dev/null 2>&1 +cp /custom/images/favicon.ico /srv/conpeek/app_tenant/favicon_none.ico >/dev/null 2>&1 + +cp /custom/images/small_logo.png /srv/conpeek/app_wallboard/resources/logo/bialy_64.png >/dev/null 2>&1 +cp /custom/images/login_logo.jpg /srv/conpeek/app_wallboard/resources/images/lock-screen-logo.jpg >/dev/null 2>&1 +cp /custom/images/favicon.ico /srv/conpeek/app_wallboard/favicon.ico >/dev/null 2>&1 diff --git a/templates/nginx/custom_settings.tmpl b/templates/nginx/custom_settings.tmpl new file mode 100644 index 0000000..17ff72e --- /dev/null +++ b/templates/nginx/custom_settings.tmpl @@ -0,0 +1,21 @@ +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +map $http_origin $allow_origin { + ~^https?://(.*\.)?{{app_installation_domain}}(:\d+)?$ $http_origin; + ~^https?://(.*\.)?.conpeek.com(:\d+)?$ $http_origin; + default ""; +} + +map $allow_origin $allow_credentials { + default ""; + "~." "true"; +} + +map $http_origin $is_allowed_websocket_origin { + ~^https?://(.*\.)?{{app_installation_domain}}(:\d+)?$ "yes"; + ~^https?://(.*\.)?.conpeek.com(:\d+)?$ "yes"; + default "no"; +} \ No newline at end of file diff --git a/templates/nginx/default.tmpl b/templates/nginx/default.tmpl new file mode 100644 index 0000000..1fa2b0c --- /dev/null +++ b/templates/nginx/default.tmpl @@ -0,0 +1,18 @@ +server { + listen {{ nginx_ip }}:80 default_server; + listen {{ nginx_ip }}:443 ssl default_server; + server_name _; + + ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt; + ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key; + + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_protocols TLSv1.3 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256"; + ssl_session_cache shared:TLS:2m; + ssl_buffer_size 4k; + + return 444; +} \ No newline at end of file diff --git a/templates/nginx/docker_desk_template.tmpl b/templates/nginx/docker_desk_template.tmpl new file mode 100644 index 0000000..00ac38f --- /dev/null +++ b/templates/nginx/docker_desk_template.tmpl @@ -0,0 +1,51 @@ +server { + listen {{ internal_ip }}:81; + server_name {{ server_name }}; + root /srv/conpeek/{{app_name}}/dist; + index index.html; + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header Content-Security-Policy-Report-Only "default-src 'self' data: wss: blob: *; frame-ancestors 'none';report-uri /_csp" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + + location / { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + try_files $uri @index; + } + + location = /_csp { + access_log /var/log/nginx/csp.log CSP; + return 204; + } + + location /index.html { + add_header Content-Security-Policy-Report-Only "default-src 'self' data: wss: blob: *;script-src 'self' 'unsafe-inline';img-src 'self' * data: blob:;media-src 'self' * data: blob:;style-src 'self' 'unsafe-inline' *;connect-src * blob;font-src 'self' * data:;frame-src 'self' blob:;frame-ancestors 'none';worker-src https://{{ server_name }};form-action 'self';report-uri /_csp" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "same-origin" always; + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Permissions-Policy "camera=(self \"https://*.{{app_installation_domain}}\"), microphone=(self \"https://*.{{app_installation_domain}}\"), geolocation=(), fullscreen=(self \"https://*.{{app_installation_domain}}\")" always; + add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate"; + expires 0; + try_files /index.html =404; + } + + location @index { + add_header Content-Security-Policy-Report-Only "default-src 'self' data: wss: blob: *;script-src 'self' 'unsafe-inline';img-src 'self' * data: blob:;media-src 'self' * data: blob:;style-src 'self' 'unsafe-inline' *;connect-src * blob;font-src 'self' * data:;frame-src 'self' blob:;frame-ancestors 'none';worker-src https://{{ server_name }};form-action 'self';report-uri /_csp" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "same-origin" always; + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Permissions-Policy "camera=(self \"https://*.{{app_installation_domain}}\"), microphone=(self \"https://*.{{app_installation_domain}}\"), geolocation=(), fullscreen=(self \"https://*.{{app_installation_domain}}\")" always; + add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate"; + expires 0; + try_files /index.html =404; + } + +} diff --git a/templates/nginx/docker_docs_template.tmpl b/templates/nginx/docker_docs_template.tmpl new file mode 100644 index 0000000..49e5fff --- /dev/null +++ b/templates/nginx/docker_docs_template.tmpl @@ -0,0 +1,6 @@ +server { + listen {{ internal_ip }}:81; + server_name {{ server_name }}; + root /srv/conpeek/{{app_name}}; + index index.html; +} diff --git a/templates/nginx/docker_frontend_production_template.tmpl b/templates/nginx/docker_frontend_production_template.tmpl new file mode 100644 index 0000000..0e5b173 --- /dev/null +++ b/templates/nginx/docker_frontend_production_template.tmpl @@ -0,0 +1,111 @@ +server { + listen {{ internal_ip }}:81; + server_name {{ server_name }}; + + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + + location = /robots.txt { + add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate"; + add_header X-Content-Type-Options "nosniff" always; + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header X-Robots-Tag noindex; + add_header Content-Type text/plain; + return 200 "User-agent: *\nDisallow: /\n"; + } + + location = /sitemap.xml { + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Content-Security-Policy-Report-Only "default-src 'self';report-uri /_csp" always; + add_header X-Robots-Tag noindex; + add_header Content-Type "text/plain charset=UTF-8"; + add_header Content-Length 0; + return 404; + } + + location = /_csp { + access_log /var/log/nginx/csp.log CSP; + return 204; + } + + location /ext/ { + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "SAMEORIGIN" always; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + root /srv/conpeek/app; + } + + location /libs/ { + location ~ (.*\.map) { + return 404; + } + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "SAMEORIGIN" always; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + root /srv/conpeek/app; + } + + location /util/ { + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "SAMEORIGIN" always; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + root /srv/conpeek/app; + } + + location /lang/ { + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "SAMEORIGIN" always; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + root /srv/conpeek/app; + } + + root /srv/conpeek/app_tenant/build/production; + index index.html; + + location /index.html { + add_header Content-Security-Policy-Report-Only "default-src 'self';script-src 'self' 'unsafe-inline' 'unsafe-eval';img-src 'self' * data: blob:;media-src 'self' * data: blob:;style-src 'self' 'unsafe-inline';frame-ancestors 'none';font-src 'self' 'unsafe-inline' data:;worker-src 'self' blob:;frame-src 'self' blob:;connect-src * blob;form-action 'self';report-uri /_csp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header Referrer-Policy "same-origin" always; + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Permissions-Policy "camera=(self \"https://*.{{app_installation_domain}}\"), microphone=(self \"https://*.{{app_installation_domain}}\"), geolocation=(), fullscreen=(self \"https://*.{{app_installation_domain}}\")" always; + add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate"; + expires 0; + try_files /index.html =404; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + } +} diff --git a/templates/nginx/docker_frontend_template.tmpl b/templates/nginx/docker_frontend_template.tmpl new file mode 100644 index 0000000..8d78890 --- /dev/null +++ b/templates/nginx/docker_frontend_template.tmpl @@ -0,0 +1,111 @@ +server { + listen {{ internal_ip }}:81; + server_name {{ server_name }}; + + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + + location = /robots.txt { + add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate"; + add_header X-Content-Type-Options "nosniff" always; + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header X-Robots-Tag noindex; + add_header Content-Type text/plain; + return 200 "User-agent: *\nDisallow: /\n"; + } + + location = /sitemap.xml { + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Content-Security-Policy-Report-Only "default-src 'self'" always; + add_header X-Robots-Tag noindex; + add_header Content-Type "text/plain charset=UTF-8"; + add_header Content-Length 0; + return 404; + } + + location = /_csp { + access_log /var/log/nginx/csp.log CSP; + return 204; + } + + location /ext/ { + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "SAMEORIGIN" always; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + root /srv/conpeek/app; + } + + location /libs/ { + location ~ (.*\.map) { + return 404; + } + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "SAMEORIGIN" always; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + root /srv/conpeek/app; + } + + location /util/ { + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Content-Security-Policy-Report-Only "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: wss: blob: *; frame-ancestors 'none';worker-src https://{{ server_name }};report-uri /_csp" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "SAMEORIGIN" always; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + root /srv/conpeek/app; + } + + location /lang/ { + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "SAMEORIGIN" always; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + root /srv/conpeek/app; + } + + root /srv/conpeek/{{app_name}}; + index index.html; + + location /index.html { + add_header Content-Security-Policy-Report-Only "default-src 'self';script-src 'self' 'unsafe-inline' 'unsafe-eval';img-src 'self' * data: blob:;media-src 'self' * data: blob:;style-src 'self' 'unsafe-inline';frame-ancestors 'none';font-src 'self' 'unsafe-inline' data:;worker-src 'self' blob:;frame-src 'self' blob:;connect-src * blob:;form-action 'self';report-uri /_csp" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Cross-Origin-Opener-Policy "same-site" always; + add_header Cross-Origin-Resource-Policy "same-site" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header Referrer-Policy "same-origin" always; + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header Permissions-Policy "camera=(self \"https://*.{{app_installation_domain}}\"), microphone=(self \"https://*.{{app_installation_domain}}\"), geolocation=(), fullscreen=(self \"https://*.{{app_installation_domain}}\")" always; + add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate"; + expires 0; + try_files /index.html =404; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + } +} diff --git a/templates/nginx/nginx-file-server.tmpl b/templates/nginx/nginx-file-server.tmpl new file mode 100644 index 0000000..0806693 --- /dev/null +++ b/templates/nginx/nginx-file-server.tmpl @@ -0,0 +1,77 @@ +upstream {{ upstream_name }} { + server {{ ip_v4 }}:{{ service_port }}; +} +server { + listen {{ nginx_ip }}:443 ssl ; + server_name {{ server_name }}; + ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt; + ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key; + client_max_body_size 0; + + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_protocols TLSv1.3 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256"; + ssl_session_cache shared:TLS:2m; + ssl_buffer_size 4k; + + location / { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Credentials' $allow_credentials always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always; + add_header 'Vary' 'Origin' always; + add_header 'Cross-Origin-Resource-Policy' "cross-origin" always; + + if ($request_method = 'OPTIONS') { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header 'Vary' 'Origin' always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Credentials' $allow_credentials always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Length' 0; + return 204; + } + proxy_hide_header Access-Control-Allow-Origin; + proxy_hide_header Access-Control-Allow-Credentials; + proxy_hide_header Access-Control-Allow-Headers; + proxy_hide_header Access-Control-Allow-Methods; + proxy_pass http://{{ upstream_name }}; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location ~^/audio-video-recording/.*/play$ { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + if ($request_method = 'OPTIONS') { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header 'Vary' 'Origin' always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control'; + add_header 'Access-Control-Max-Age' 0; + add_header 'Content-Type' 'text/plain charset=UTF-8'; + add_header 'Content-Length' 0; + add_header 'Pragma' 'no-cache'; + add_header 'Expires' '0'; + add_header 'Cache-Control' 'no-cache, no-store, must-revalidate'; + return 204; + } + add_header Cross-Origin-Resource-Policy "cross-origin" always; + add_header 'Access-Control-Max-Age' 0; + add_header 'Pragma' 'no-cache'; + add_header 'Expires' '0'; + add_header 'Cache-Control' 'no-cache, no-store, must-revalidate'; + add_header 'Vary' 'Origin' always; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://{{ upstream_name }}; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + } + +} diff --git a/templates/nginx/nginx-messaging-server.tmpl b/templates/nginx/nginx-messaging-server.tmpl new file mode 100644 index 0000000..f90721e --- /dev/null +++ b/templates/nginx/nginx-messaging-server.tmpl @@ -0,0 +1,48 @@ +upstream {{ upstream_name }} { + server {{ ip_v4 }}:{{ service_port }}; +} +server { + listen {{ nginx_ip }}:443 ssl ; + server_name {{ server_name }}; + ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt; + ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key; + + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_protocols TLSv1.3 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256"; + ssl_session_cache shared:TLS:2m; + ssl_buffer_size 4k; + + location / { + proxy_hide_header 'Strict-Transport-Security'; + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Credentials' $allow_credentials always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control, CP-R-Token' always; + add_header 'Vary' 'Origin' always; + add_header 'Cross-Origin-Resource-Policy' "cross-origin" always; + + if ($request_method = 'OPTIONS') { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header 'Vary' 'Origin' always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Credentials' $allow_credentials always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control, CP-R-Token' always; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Length' 0; + return 204; + } + proxy_hide_header Access-Control-Allow-Origin; + proxy_hide_header Access-Control-Allow-Credentials; + proxy_hide_header Access-Control-Allow-Headers; + proxy_hide_header Access-Control-Allow-Methods; + proxy_pass http://{{ upstream_name }}; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} diff --git a/templates/nginx/nginx-prov.tmpl b/templates/nginx/nginx-prov.tmpl new file mode 100644 index 0000000..4d60b92 --- /dev/null +++ b/templates/nginx/nginx-prov.tmpl @@ -0,0 +1,25 @@ +upstream {{ upstream_name }} { + server {{ ip_v4 }}:{{ service_port }}; +} +server { + listen {{ nginx_ip }}:80; + listen {{ nginx_ip }}:443 ssl; + server_name {{ server_name }}; + ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt; + ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key; + + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_protocols TLSv1.3 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256"; + ssl_session_cache shared:TLS:2m; + ssl_buffer_size 4k; + + location / { + proxy_pass http://{{ upstream_name }}; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Protocol $scheme; + } +} diff --git a/templates/nginx/nginx-proxy.tmpl b/templates/nginx/nginx-proxy.tmpl new file mode 100644 index 0000000..6db893e --- /dev/null +++ b/templates/nginx/nginx-proxy.tmpl @@ -0,0 +1,47 @@ +upstream {{ upstream_name }} { + server {{ ip_v4 }}:{{ service_port }}; +} +server { + listen {{ nginx_ip }}:443 ssl ; + server_name {{ server_name }}; + ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt; + ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key; + + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_protocols TLSv1.3 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256"; + ssl_session_cache shared:TLS:2m; + ssl_buffer_size 4k; + + location / { + proxy_hide_header 'Strict-Transport-Security'; + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Credentials' $allow_credentials always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control, CP-R-Token' always; + add_header 'Vary' 'Origin' always; + + if ($request_method = 'OPTIONS') { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header 'Vary' 'Origin' always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Credentials' $allow_credentials always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control, CP-R-Token' always; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Length' 0; + return 204; + } + proxy_hide_header Access-Control-Allow-Origin; + proxy_hide_header Access-Control-Allow-Credentials; + proxy_hide_header Access-Control-Allow-Headers; + proxy_hide_header Access-Control-Allow-Methods; + proxy_pass http://{{ upstream_name }}; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} diff --git a/templates/nginx/nginx-web-socket.tmpl b/templates/nginx/nginx-web-socket.tmpl new file mode 100644 index 0000000..d1e6052 --- /dev/null +++ b/templates/nginx/nginx-web-socket.tmpl @@ -0,0 +1,34 @@ +upstream {{ upstream_name }} { + server {{ ip_v4 }}:{{ service_port }}; +} +server { + listen {{ nginx_ip }}:443 ssl ; + server_name {{ server_name }}; + ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt; + ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key; + + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_protocols TLSv1.3 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256"; + ssl_session_cache shared:TLS:2m; + ssl_buffer_size 4k; + + location / { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + if ($is_allowed_websocket_origin = "no") { + return 403; + } + proxy_pass http://{{ upstream_name }}; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_read_timeout 300; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Port $remote_port; + proxy_hide_header Access-Control-Allow-Origin; + add_header Access-Control-Allow-Origin $allow_origin always; + } +} diff --git a/templates/nginx/nginx.conf b/templates/nginx/nginx.conf new file mode 100644 index 0000000..19f9f03 --- /dev/null +++ b/templates/nginx/nginx.conf @@ -0,0 +1,106 @@ +user www-data; +worker_processes 8; +pid /run/nginx.pid; +worker_rlimit_nofile 8092; + +events { + worker_connections 32768; + # multi_accept on; +} + +http { + + ## + # Basic Settings + ## + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + types_hash_max_size 2048; + server_tokens off; + client_max_body_size 100M; + + server_names_hash_bucket_size 512; + # server_name_in_redirect off; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + ## + # Timeout Settings + ## + + keepalive_timeout 65; + proxy_send_timeout 600; + proxy_read_timeout 600; + proxy_connect_timeout 600; + send_timeout 600; + + ## + # SSL Settings + ## + + ssl_protocols TLSv1.2; # Dropping SSLv3, ref: POODLE + ssl_prefer_server_ciphers on; + ssl_session_cache shared:SSL:50m; + ssl_session_timeout 5m; + + ## + # Logging Settings + ## + log_format apm 'timestamp="$time_local" client=$remote_addr ' + 'request="$request" request_length=$request_length ' + 'bytes_sent=$bytes_sent ' + 'body_bytes_sent=$body_bytes_sent ' + 'referer=$http_referer ' + 'user_agent="$http_user_agent" ' + 'upstream_addr=$upstream_addr ' + 'upstream_status=$upstream_status ' + 'request_time=$request_time ' + 'upstream_response_time=$upstream_response_time ' + 'upstream_connect_time=$upstream_connect_time ' + 'upstream_header_time=$upstream_header_time ' + 'app_db_read_time=$upstream_http_db_read_time ' + 'app_db_write_time=$upstream_http_db_write_time ' + 'app_analysis_time=$upstream_http_analysis_time ' + 'app_other_time=$upstream_http_other_time '; + + log_format CSP escape=json '{"date":"$time_local", "IP address":"$remote_addr", "http_x_forwarded_for":"$http_x_forwarded_for", "status":"$status", "http_user_agent":"$http_user_agent", "body_bytes_sent":"$body_bytes_sent", "request":"$request","request_body": "$request_body"}'; + + access_log /var/log/nginx/access.log apm; + error_log /var/log/nginx/error.log; + + access_log syslog:server=localhost,facility=local7,tag=nginx,severity=info apm; + error_log syslog:server=localhost debug; + + ## + # Gzip Settings + ## + + gzip on; + gzip_disable "msie6"; + + + + # gzip_vary on; + # gzip_proxied any; + # gzip_comp_level 6; + # gzip_buffers 16 8k; + # gzip_http_version 1.1; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; + + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + ## + # Virtual Host Configs + ## + proxy_cache_path /tmp/cache levels=1:2 keys_zone=file_server_wizard_cache:512m; + + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/sites-enabled/*; +} diff --git a/templates/nginx/nginx.conf_frontend b/templates/nginx/nginx.conf_frontend new file mode 100644 index 0000000..cf4cc64 --- /dev/null +++ b/templates/nginx/nginx.conf_frontend @@ -0,0 +1,38 @@ +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + server_tokens off; + server_names_hash_bucket_size 512; + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + log_format CSP escape=json '{"date":"$time_local", "IP address":"$remote_addr", "http_x_forwarded_for":"$http_x_forwarded_for", "status":"$status", "http_user_agent":"$http_user_agent", "body_bytes_sent":"$body_bytes_sent", "request":"$request","request_body": "$request_body"}'; + + access_log /var/log/nginx/access.log main; + + access_log syslog:server=localhost,facility=local7,tag=nginx_frontend,severity=info main; + error_log syslog:server=localhost debug; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + include /etc/nginx/conf.d/*.conf; +} diff --git a/templates/nginx/tenant_plugin_frontend_template.tmpl b/templates/nginx/tenant_plugin_frontend_template.tmpl new file mode 100644 index 0000000..c312401 --- /dev/null +++ b/templates/nginx/tenant_plugin_frontend_template.tmpl @@ -0,0 +1,49 @@ +server { + listen {{ internal_ip }}:81; + server_name {{ server_name }}; + + location / { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Origin' $http_origin always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control'; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Type' 'text/plain charset=UTF-8'; + add_header 'Content-Length' 0; + return 204; + } + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + proxy_pass http://{{ internal_ip }}:{{ service_port }} ; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location /sdk { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header 'Access-Control-Allow-Origin' $http_origin always; + alias /srv/conpeek/apis/api_tenant_plugin/static/sdk; + } + + location /cdn { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + if ($request_method = 'OPTIONS') { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header 'Access-Control-Allow-Origin' $http_origin always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Type' 'text/plain; charset=utf-8'; + add_header 'Content-Length' 0; + return 204; + } + location ~ (index.html|.*\.json) { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header 'Pragma' 'no-cache'; + add_header 'Expires' '0'; + add_header 'Cache-Control' 'no-cache, no-store, must-revalidate'; + } + add_header 'Access-Control-Allow-Origin' $http_origin always; + alias /srv/conpeek/apis/api_tenant_plugin/static/cdn; + } +} diff --git a/templates/nginx/tenant_plugin_reverse_proxy_template.tmpl b/templates/nginx/tenant_plugin_reverse_proxy_template.tmpl new file mode 100644 index 0000000..c3b6771 --- /dev/null +++ b/templates/nginx/tenant_plugin_reverse_proxy_template.tmpl @@ -0,0 +1,71 @@ +upstream {{ upstream_name }} { + server {{ ip_v4 }}:{{ service_port }}; +} + +server { + listen {{ nginx_ip }}:443 ssl; + server_name {{ server_name }}; + ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt; + ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key; + + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_protocols TLSv1.3 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256"; + ssl_session_cache shared:TLS:2m; + ssl_buffer_size 4k; + + location / { + add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Credentials' $allow_credentials always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always; + add_header 'Vary' 'Origin' always; + + if ($request_method = 'OPTIONS') { + add_header 'Vary' 'Origin' always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Credentials' $allow_credentials always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Length' 0; + return 204; + } + proxy_hide_header Access-Control-Allow-Origin; + proxy_hide_header Access-Control-Allow-Credentials; + proxy_hide_header Access-Control-Allow-Headers; + proxy_hide_header Access-Control-Allow-Methods; + proxy_pass http://{{ upstream_name }}; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location /socket/connect { + proxy_pass http://{{ ip_v4 }}:{{ service_port }}; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_read_timeout 300; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location /cdn { + add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always; + proxy_pass http://{{ ip_v4 }}:81; + proxy_redirect http://{{ server_name }}:81 https://{{ server_name }}; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location /sdk { + add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always; + proxy_pass http://{{ ip_v4 }}:81; + proxy_redirect http://{{ server_name }}:81 https://{{ server_name }}; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} diff --git a/templates/nginx/tenant_web_polling_frontend_template.tmpl b/templates/nginx/tenant_web_polling_frontend_template.tmpl new file mode 100644 index 0000000..2b683c7 --- /dev/null +++ b/templates/nginx/tenant_web_polling_frontend_template.tmpl @@ -0,0 +1,20 @@ +server { + listen {{ internal_ip }}:81; + server_name {{ server_name }}; + + location / { + if ($request_method = 'OPTIONS') { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; + add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Type' 'text/plain; charset=utf-8'; + add_header 'Content-Length' 0; + return 204; + } + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + alias /srv/conpeek/apis/api_tenant_web_polling; + } +} diff --git a/templates/nginx/tenant_web_polling_reverse_proxy_template.tmpl b/templates/nginx/tenant_web_polling_reverse_proxy_template.tmpl new file mode 100644 index 0000000..aeecdf7 --- /dev/null +++ b/templates/nginx/tenant_web_polling_reverse_proxy_template.tmpl @@ -0,0 +1,55 @@ +upstream {{ upstream_name }} { + server {{ ip_v4 }}:{{ service_port }}; +} + +server { + listen {{ nginx_ip }}:443 ssl; + server_name {{ server_name }}; + ssl_certificate /etc/ssl/certs/{{ network_domain }}.crt; + ssl_certificate_key /etc/ssl/private/{{ network_domain }}.key; + + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_protocols TLSv1.3 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256|ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:!TLS_AES_128_GCM_SHA256"; + ssl_session_cache shared:TLS:2m; + ssl_buffer_size 4k; + + location / { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + proxy_pass http://{{ ip_v4 }}:81; + proxy_redirect http://{{ server_name }}:81 https://{{ server_name }}; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location /api { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex" always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Credentials' $allow_credentials always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always; + add_header 'Vary' 'Origin' always; + + if ($request_method = 'OPTIONS') { + add_header 'Strict-Transport-Security' "max-age=63072000; includeSubDomains; preload" always; + add_header 'Vary' 'Origin' always; + add_header 'Access-Control-Allow-Origin' $allow_origin always; + add_header 'Access-Control-Allow-Credentials' $allow_credentials always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Access-Control-Allow-Origin, Authorization, Origin, X-Requested-With, Content-Type, Accept, Expires, Cache-Control' always; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Length' 0; + return 204; + } + proxy_hide_header Access-Control-Allow-Origin; + proxy_hide_header Access-Control-Allow-Credentials; + proxy_hide_header Access-Control-Allow-Headers; + proxy_hide_header Access-Control-Allow-Methods; + proxy_pass http://{{ upstream_name }}; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} diff --git a/templates/rabbitmq/rabbit_init.sh b/templates/rabbitmq/rabbit_init.sh new file mode 100644 index 0000000..0e25c7b --- /dev/null +++ b/templates/rabbitmq/rabbit_init.sh @@ -0,0 +1,10 @@ +AMQP_USER=root +AMQP_PASS=2cTZCL@oWXKA +echo "AMQP Installation" +echo "Add user $AMQP_USER" +docker exec -i rabbitmq rabbitmqctl add_user $AMQP_USER $AMQP_PASS +echo "Set Permissions to user $AMQP_USER" +docker exec -i rabbitmq rabbitmqctl set_permissions $AMQP_USER ".*" ".*" ".*" +echo "Set Administrator user tag to $AMQP_USER" +docker exec -i rabbitmq rabbitmqctl set_user_tags $AMQP_USER administrator +docker exec -i rabbitmq rabbitmqctl delete_user guest diff --git a/templates/rabbitmq/rabbitmq.config b/templates/rabbitmq/rabbitmq.config new file mode 100644 index 0000000..fd4c0b9 --- /dev/null +++ b/templates/rabbitmq/rabbitmq.config @@ -0,0 +1 @@ +[{rabbit, [{credit_flow_default_credit, {0, 0}}]}]. \ No newline at end of file diff --git a/util.py b/util.py new file mode 100644 index 0000000..d0a86b9 --- /dev/null +++ b/util.py @@ -0,0 +1,111 @@ +import json +import os +import pathlib +import re +import shutil + +DEFAULT = '\033[0m' + + +class Constants: + sip_trunk_operators = ["default", "tmobile", "systegra"] + +class Settings: + output_directory = None + + +def print_grey(*values): + print('\033[37m', *values, DEFAULT) + + +def print_red(*values): + print('\033[91m', *values, DEFAULT) + + +def print_black_light(*values): + print('\033[90m', *values, DEFAULT) + + +def print_yellow(*values): + print('\033[93m', *values, DEFAULT) + + +def print_green(*values): + print('\033[92m', *values, DEFAULT) + + +def get_minimal_configuration(): + with open(os.path.join(get_templates_path(), "basic_indexes_tenant_data.json"), 'rb') as file: + tenant_data = json.load(file) + return tenant_data + + +def get_templates_path(): + current_folder = pathlib.Path(__file__).parent.resolve() + return os.path.join(current_folder, "templates") + + +def get_output_path(): + if Settings.output_directory: + return Settings.output_directory + current_folder = pathlib.Path(__file__).parent.resolve() + return os.path.join(current_folder, "output") + + +def copy_file(src_file, dest_dir): + + dst = shutil.copy(src_file, dest_dir) + + # CRLF TO LF LINE ENDING: + with open(dst, 'rb') as open_file: + content = open_file.read() + + # Windows ➡ Unix + content = content.replace(b'\r\n', b'\n') + + with open(dst, 'wb') as open_file: + open_file.write(content) + + +def copy_directory(source_dir, destination_dir): + """ + Copies the entire contents of 'source_dir' to 'destination_dir'. + Both the directories and files inside are copied. + If 'destination_dir' does not exist, it will be created. + """ + # Check if the source directory exists + if not os.path.exists(source_dir): + print_red(f"The source directory {source_dir} does not exist.") + return + + # Check if the destination directory already exists + if os.path.exists(destination_dir): + print_red(f"The destination directory {destination_dir} already exists.") + return + + # Copy the directory + try: + shutil.copytree(source_dir, destination_dir) + print_black_light(f"Directory copied from {source_dir} to {destination_dir}") + except Exception as e: + print_red(f"Failed to copy directory: {e}") + + +def basic_on_location_sed(inputfile, replaced_variable, new_variable): + file = open(inputfile, 'r') + output_text = file.read() + output_text = re.sub(replaced_variable, new_variable, output_text) + with open(inputfile, "w") as file: + file.write(output_text) + + +def get_token(name): + token_path = os.path.join(get_output_path(), "tokens", name) + + # Check if the destination directory already exists + if not os.path.exists(token_path): + print_red(f"The token {token_path} not exists.") + return + + file = open(token_path, 'r') + return str(file.read())