copied from internal repo

This commit is contained in:
Dragroth
2026-01-22 12:37:26 +01:00
parent a475364582
commit 7451b63f62
118 changed files with 17182 additions and 0 deletions

0
__init__.py Normal file
View File

0
api/__init__.py Normal file
View File

78
api/base_api.py Normal file
View File

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

115
api/operator_api.py Normal file
View File

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

148
api/tenant_api.py Normal file
View File

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

View File

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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])

View File

@@ -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])

View File

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

View File

@@ -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"])

View File

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

View File

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

View File

@@ -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]))

0
lib/__init__.py Normal file
View File

292
lib/create_sip_trunk.py Normal file
View File

@@ -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"]
})

228
lib/create_tenant.py Normal file
View File

@@ -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()

72
main.py Normal file
View File

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

20
setup.py Normal file
View File

@@ -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=['']
)

View File

@@ -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"
}

View File

@@ -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 }};

View File

@@ -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";

View File

@@ -0,0 +1,5 @@
zone "{{ NETWORK_DOMAIN }}" IN {
type master;
file "db.{{ NETWORK_DOMAIN }}";
allow-update { none; };
};

View File

@@ -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; };
};

View File

@@ -0,0 +1,6 @@
zone "{{ NETWORK_DOMAIN }}" IN {
type master;
file "db.{{ NETWORK_DOMAIN }}";
allow-update { none; };
check-names ignore;
};

View File

@@ -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 }};

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

49
templates/env/basic_conpeek.ini vendored Normal file
View File

@@ -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

111
templates/env/config.env vendored Normal file
View File

@@ -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

View File

@@ -0,0 +1,22 @@
<configuration name="acl.conf" description="Network Lists">
<network-lists>
<!--
These ACL's are automatically created on startup.
rfc1918.auto - RFC1918 Space
nat.auto - RFC1918 Excluding your local lan.
localnet.auto - ACL for your local lan.
loopback.auto - ACL for your local lan.
-->
<list name="lan" default="allow">
<node type="deny" cidr="192.168.42.0/24"/>
<node type="allow" cidr="192.168.42.42/32"/>
</list>
<list name="domains" default="deny">
<node type="allow" domain="$${domain}"/>
</list>
</network-lists>
</configuration>

View File

@@ -0,0 +1,16 @@
<configuration name="cdr_csv.conf" description="CDR CSV Format">
<settings>
<param name="default-template" value="example"/>
<param name="rotate-on-hup" value="true"/>
<param name="legs" value="a"/>
</settings>
<templates>
<template name="sql">INSERT INTO cdr VALUES ("${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}", "${accountcode}");</template>
<template name="example">"${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}","${read_codec}","${write_codec}"</template>
<template name="snom">"${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}", "${accountcode}","${read_codec}","${write_codec}","${sip_user_agent}","${call_clientcode}","${sip_rtp_rxstat}","${sip_rtp_txstat}","${sofia_record_file}"</template>
<template name="linksys">"${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}","${read_codec}","${write_codec}","${sip_user_agent}","${sip_p_rtp_stat}"</template>
<template name="asterisk">"${accountcode}","${caller_id_number}","${destination_number}","${context}","${caller_id}","${channel_name}","${bridge_channel}","${last_app}","${last_arg}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${amaflags}","${uuid}","${userfield}"</template>
<template name="opencdrrate">"${uuid}","${signal_bond}","${direction}","${ani}","${destination_number}","${answer_stamp}","${end_stamp}","${billsec}","${accountcode}","${userfield}","${network_addr}","${regex('${original_caller_id_name}'|^.)}","${sip_gateway_name}"</template>
</templates>
</configuration>

View File

@@ -0,0 +1,68 @@
<configuration name="conference.conf" description="Audio Conference">
<caller-controls>
<group name="default">
<control action="mute" digits="0"/>
<control action="deaf mute" digits="*"/>
<control action="energy up" digits="9"/>
<control action="energy equ" digits="8"/>
<control action="energy dn" digits="7"/>
<control action="vol talk up" digits="3"/>
<control action="vol talk zero" digits="2"/>
<control action="vol talk dn" digits="1"/>
<control action="vol listen up" digits="6"/>
<control action="vol listen zero" digits="5"/>
<control action="vol listen dn" digits="4"/>
<control action="hangup" digits="#"/>
</group>
</caller-controls>
<profiles>
<profile name="default">
<param name="domain" value="$${domain}"/>
<param name="rate" value="8000"/>
<param name="interval" value="20"/>
<param name="energy-level" value="100"/>
<param name="caller-id-name" value="$${outbound_caller_name}"/>
<param name="caller-id-number" value="$${outbound_caller_id}"/>
<param name="comfort-noise" value="false"/>
<param name="conference-flags" value="video-floor-only|minimize-video-encoding"/>
<param name="video-mode" value="passthrough"/>
<param name="video-codec-bandwidth" value="2mb"/>
<param name="video-fps" value="20"/>
<param name="verbose-events" value="true"/>
<!-- File to play to acknowledge muted -->
<param name="muted-sound" value="conference/conf-muted.wav"/>
<!-- File to play to acknowledge unmuted -->
<param name="unmuted-sound" value="conference/conf-unmuted.wav"/>
<!-- File to play if you are alone in the conference -->
<param name="alone-sound" value="conference/conf-alone.wav"/>
<param name="moh-sound" value="$${hold_music}"/>
<!-- File to play when you join the conference -->
<param name="enter-sound" value="tone_stream://%(200,0,500,600,700)"/>
<!-- File to play when you leave the conference -->
<param name="exit-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
<!-- File to play when you are ejected from the conference -->
<param name="kicked-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
</profile>
<profile name="transcoded">
<param name="domain" value="$${domain}"/>
<param name="rate" value="8000"/>
<param name="interval" value="20"/>
<param name="energy-level" value="100"/>
<param name="caller-id-name" value="$${outbound_caller_name}"/>
<param name="caller-id-number" value="$${outbound_caller_id}"/>
<param name="comfort-noise" value="false"/>
<param name="conference-flags" value="video-floor-only|minimize-video-encoding"/>
<param name="video-mode" value="transcode"/>
<param name="video-codec-bandwidth" value="2mb"/>
<param name="video-fps" value="20"/>
<param name="verbose-events" value="true"/>
<param name="moh-sound" value="$${hold_music}"/>
<!-- File to play when you join the conference -->
<param name="enter-sound" value="tone_stream://%(200,0,500,600,700)"/>
<!-- File to play when you leave the conference -->
<param name="exit-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
<!-- File to play when you are ejected from the conference -->
<param name="kicked-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
</profile>
</profiles>
</configuration>

View File

@@ -0,0 +1,10 @@
<configuration name="console.conf" description="Console Logger">
<mappings>
<map name="all" value="console,debug,info,notice,warning,err,crit,alert"/>
</mappings>
<settings>
<param name="colorize" value="true"/>
<param name="loglevel" value="debug"/>
</settings>
</configuration>

View File

@@ -0,0 +1,3 @@
<configuration name="db.conf" description="LIMIT DB Configuration">
<settings/>
</configuration>

View File

@@ -0,0 +1,9 @@
<configuration name="event_socket.conf" description="Socket Client">
<settings>
<param name="nat-map" value="false"/>
<param name="listen-ip" value="ES_IP"/>
<param name="listen-port" value="ES_PORT"/>
<param name="password" value="ClueCon"/>
<param name="apply-inbound-acl" value="any_v4.auto"/>
</settings>
</configuration>

View File

@@ -0,0 +1,128 @@
<configuration name="httapi.conf" description="HT-TAPI Hypertext Telephony API">
<settings>
<!-- print xml on the console -->
<param name="debug" value="true"/>
<!-- time to keep audio files when discovered they were deleted from the http server -->
<param name="file-not-found-expires" value="300"/>
<!-- how often to re-check the server to make sure the remote file has not changed -->
<param name="file-cache-ttl" value="300"/>
</settings>
<profiles>
<profile name="default">
<!-- default params for conference action tags -->
<conference>
<param name="default-profile" value="default"/>
</conference>
<!-- default params for dial action tags -->
<dial>
<param name="context" value="default"/>
<param name="dialplan" value="XML"/>
</dial>
<!-- permissions -->
<permissions>
<!-- <permission name="all" value="true"/> -->
<!--<permission name="none" value="true"/> -->
<permission name="set-params" value="true"/>
<permission name="set-vars" value="false">
<!-- default to "deny" or "allow" -->
<!-- type attr can be "deny" or "allow" nothing defaults to opposite of the list default so allow in this case -->
<!--
<variable-list default="deny">
<variable name="caller_id_name"/>
<variable name="hangup"/>
</variable-list>
-->
</permission>
<permission name="get-vars" value="false">
<!-- default to "deny" or "allow" -->
<!-- type attr can be "deny" or "allow" nothing defaults to opposite of the list default so allow in this case -->
<!--
<variable-list default="deny">
<variable name="caller_id_name"/>
<variable name="hangup"/>
</variable-list>
-->
</permission>
<permission name="extended-data" value="false"/>
<permission name="execute-apps" value="true">
<!-- default to "deny" or "allow" -->
<application-list default="deny">
<!-- type attr can be "deny" or "allow" nothing defaults to opposite of the list default so allow in this case -->
<application name="info"/>
<application name="hangup"/>
</application-list>
</permission>
<permission name="expand-vars-in-tag-body" value="false">
<!-- default to "deny" or "allow" -->
<!-- type attr can be "deny" or "allow" nothing defaults to opposite of the list default so allow in this case -->
<!--
<variable-list default="deny">
<variable name="caller_id_name"/>
<variable name="hangup"/>
</variable-list>
<api-list default="deny">
<api name="expr"/>
<api name="lua"/>
</api-list>
-->
</permission>
<permission name="dial" value="true"/>
<permission name="dial-set-context" value="false"/>
<permission name="dial-set-dialplan" value="false"/>
<permission name="dial-set-cid-name" value="false"/>
<permission name="dial-set-cid-number" value="false"/>
<permission name="dial-full-originate" value="false"/>
<permission name="conference" value="true"/>
<permission name="conference-set-profile" value="false"/>
</permissions>
<params>
<!-- default url can be overridden by app data -->
<param name="gateway-url" value="http://www.freeswitch.org/api/index.cgi" />
<!-- set this to provide authentication credentials to the server -->
<!--<param name="gateway-credentials" value="muser:mypass"/>-->
<!--<param name="auth-scheme" value="basic"/>-->
<!-- optional: this will enable the CA root certificate check by libcurl to
verify that the certificate was issued by a major Certificate Authority.
note: default value is disabled. only enable if you want this! -->
<!--<param name="enable-cacert-check" value="true"/>-->
<!-- optional: verify that the server is actually the one listed in the cert -->
<!-- <param name="enable-ssl-verifyhost" value="true"/> -->
<!-- optional: these options can be used to specify custom SSL certificates
to use for HTTPS communications. Either use both options or neither.
Specify your public key with 'ssl-cert-path' and the private key with
'ssl-key-path'. If your private key has a password, specify it with
'ssl-key-password'. -->
<!-- <param name="ssl-cert-path" value="$${certs_dir}/public_key.pem"/> -->
<!-- <param name="ssl-key-path" value="$${certs_dir}/private_key.pem"/> -->
<!-- <param name="ssl-key-password" value="MyPrivateKeyPassword"/> -->
<!-- optional timeout -->
<!-- <param name="timeout" value="10"/> -->
<!-- optional: use a custom CA certificate in PEM format to verify the peer
with. This is useful if you are acting as your own certificate authority.
note: only makes sense if used in combination with "enable-cacert-check." -->
<!-- <param name="ssl-cacert-file" value="$${certs_dir}/cacert.pem"/> -->
<!-- optional: specify the SSL version to force HTTPS to use. Valid options are
"SSLv3" and "TLSv1". Otherwise libcurl will auto-negotiate the version. -->
<!-- <param name="ssl-version" value="TLSv1"/> -->
<!-- optional: enables cookies and stores them in the specified file. -->
<!-- <param name="cookie-file" value="$${temp_dir}/cookie-mod_xml_curl.txt"/> -->
<!-- one or more of these imply you want to pick the exact variables that are transmitted -->
<!--<param name="enable-post-var" value="Caller-Unique-ID"/>-->
<param name="enable-file-formats" value="false"/>
</params>
</profile>
</profiles>
</configuration>

View File

@@ -0,0 +1,17 @@
<configuration name="local_stream.conf" description="stream files from local dir">
<directory name="default" path="/usr/local/freeswitch/announcement/moh">
<param name="rate" value="8000"/>
<param name="shuffle" value="true"/>
<param name="channels" value="1"/>
<param name="interval" value="20"/>
<param name="timer-name" value="soft"/>
</directory>
<directory name="moh" path="/usr/local/freeswitch/announcement/moh">
<param name="rate" value="8000"/>
<param name="shuffle" value="true"/>
<param name="channels" value="1"/>
<param name="interval" value="20"/>
<param name="timer-name" value="soft"/>
</directory>
</configuration>

View File

@@ -0,0 +1,24 @@
<configuration name="logfile.conf" description="File Logging">
<settings>
<param name="rotate-on-hup" value="true"/>
</settings>
<profiles>
<profile name="default">
<settings>
<!-- At this length in bytes rotate the log file (0 for never) -->
<param name="logfile" value="/var/log/freeswitch/freeswitch.log"/>
<param name="rollover" value="10485760"/>
<param name="uuid" value="true" />
</settings>
<mappings>
<!--
name can be a file name, function name or 'all'
value is one or more of debug,info,notice,warning,err,crit,alert,all
-->
<map name="all" value="debug,info,notice,warning,err,crit,alert"/>
</mappings>
</profile>
</profiles>
</configuration>

View File

@@ -0,0 +1,50 @@
<configuration name="modules.conf" description="Modules">
<modules>
<!-- Loggers (I'd load these first) -->
<load module="mod_console"/>
<load module="mod_logfile"/>
<!-- XML Interfaces -->
<load module="mod_xml_rpc"/>
<!-- Event Handlers -->
<load module="mod_cdr_csv"/>
<load module="mod_event_socket"/>
<!-- Endpoints -->
<load module="mod_sofia"/>
<load module="mod_loopback"/>
<!-- Applications -->
<!--load module="mod_signalwire"/-->
<load module="mod_commands"/>
<load module="mod_conference"/>
<load module="mod_db"/>
<load module="mod_dptools"/>
<load module="mod_expr"/>
<load module="mod_hash"/>
<load module="mod_esf"/>
<!-- Dialplan Interfaces -->
<load module="mod_dialplan_xml"/>
<!-- Codec Interfaces -->
<!-- File Format Interfaces -->
<load module="mod_sndfile"/>
<load module="mod_native_file"/>
<!-- Addictional Conpeek modules-->
<load module="mod_xml_curl"/>
<load module="mod_verto"/>
<load module="mod_shout"/>
<load module="mod_httapi"/>
<load module="mod_spandsp"/>
<load module="mod_local_stream"/>
<load module="mod_tone_stream"/>
<load module="mod_lua"/>
<load module="mod_rtc"/>
</modules>
</configuration>

View File

@@ -0,0 +1,10 @@
<configuration name="sofia.conf" description="sofia Endpoint">
<global_settings>
<param name="log-level" value="0"/>
<param name="tracelevel" value="DEBUG"/>
</global_settings>
<profiles>
<X-PRE-PROCESS cmd="include" data="../sip_profiles/*.xml"/>
</profiles>
</configuration>

View File

@@ -0,0 +1,41 @@
<configuration name="switch.conf" description="Core Configuration">
<cli-keybindings>
<key name="1" value="help"/>
<key name="2" value="status"/>
<key name="3" value="show channels"/>
<key name="4" value="show calls"/>
<key name="5" value="sofia status"/>
<key name="6" value="reloadxml"/>
<key name="7" value="console loglevel 0"/>
<key name="8" value="console loglevel 7"/>
<key name="9" value="sofia status profile line"/>
<key name="10" value="sofia profile line siptrace on"/>
<key name="11" value="sofia profile line siptrace off"/>
<key name="12" value="version"/>
</cli-keybindings>
<default-ptimes>
</default-ptimes>
<settings>
<param name="colorize-console" value="true"/>
<param name="dialplan-timestamps" value="false"/>
<param name="switchname" value="FS_DOMAIN"/>
<param name="max-db-handles" value="64"/>
<param name="db-handle-timeout" value="10"/>
<param name="max-sessions" value="100000"/>
<param name="sessions-per-second" value="600"/>
<param name="loglevel" value="debug"/>
<param name="mailer-app" value="sendmail"/>
<param name="mailer-app-args" value="-t"/>
<param name="dump-cores" value="yes"/>
<param name="rtp-start-port" value="RTP_START_PORT"/>
<param name="rtp-end-port" value="RTP_END_PORT"/>
<param name="rtp-enable-zrtp" value="false"/>
<param name="rtp-retain-crypto-keys" value="true"/>
<param name="rtp-port-usage-robustness" value="true"/>
<param name="verbose-channel-events" value="true"/>
</settings>
</configuration>

View File

@@ -0,0 +1,661 @@
<configuration name="timezones.conf" description="Timezones">
<timezones>
<zone name="Africa/Abidjan" value="GMT0" />
<zone name="Africa/Accra" value="GMT0" />
<zone name="Africa/Addis_Ababa" value="EAT-3" />
<zone name="Africa/Algiers" value="CET-1" />
<zone name="Africa/Asmara" value="EAT-3" />
<zone name="Africa/Asmera" value="EAT-3" />
<zone name="Africa/Bamako" value="GMT0" />
<zone name="Africa/Bangui" value="WAT-1" />
<zone name="Africa/Banjul" value="GMT0" />
<zone name="Africa/Bissau" value="GMT0" />
<zone name="Africa/Blantyre" value="CAT-2" />
<zone name="Africa/Brazzaville" value="WAT-1" />
<zone name="Africa/Bujumbura" value="CAT-2" />
<zone name="Africa/Cairo" value="EET-2EEST,M4.5.5/0,M10.5.4/24" />
<zone name="Africa/Casablanca" value="STD-1" />
<zone name="Africa/Ceuta" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Africa/Conakry" value="GMT0" />
<zone name="Africa/Dakar" value="GMT0" />
<zone name="Africa/Dar_es_Salaam" value="EAT-3" />
<zone name="Africa/Djibouti" value="EAT-3" />
<zone name="Africa/Douala" value="WAT-1" />
<zone name="Africa/El_Aaiun" value="STD-1" />
<zone name="Africa/Freetown" value="GMT0" />
<zone name="Africa/Gaborone" value="CAT-2" />
<zone name="Africa/Harare" value="CAT-2" />
<zone name="Africa/Johannesburg" value="SAST-2" />
<zone name="Africa/Juba" value="CAT-2" />
<zone name="Africa/Kampala" value="EAT-3" />
<zone name="Africa/Khartoum" value="CAT-2" />
<zone name="Africa/Kigali" value="CAT-2" />
<zone name="Africa/Kinshasa" value="WAT-1" />
<zone name="Africa/Lagos" value="WAT-1" />
<zone name="Africa/Libreville" value="WAT-1" />
<zone name="Africa/Lome" value="GMT0" />
<zone name="Africa/Luanda" value="WAT-1" />
<zone name="Africa/Lubumbashi" value="CAT-2" />
<zone name="Africa/Lusaka" value="CAT-2" />
<zone name="Africa/Malabo" value="WAT-1" />
<zone name="Africa/Maputo" value="CAT-2" />
<zone name="Africa/Maseru" value="SAST-2" />
<zone name="Africa/Mbabane" value="SAST-2" />
<zone name="Africa/Mogadishu" value="EAT-3" />
<zone name="Africa/Monrovia" value="GMT0" />
<zone name="Africa/Nairobi" value="EAT-3" />
<zone name="Africa/Ndjamena" value="WAT-1" />
<zone name="Africa/Niamey" value="WAT-1" />
<zone name="Africa/Nouakchott" value="GMT0" />
<zone name="Africa/Ouagadougou" value="GMT0" />
<zone name="Africa/Porto-Novo" value="WAT-1" />
<zone name="Africa/Sao_Tome" value="GMT0" />
<zone name="Africa/Timbuktu" value="GMT0" />
<zone name="Africa/Tripoli" value="EET-2" />
<zone name="Africa/Tunis" value="CET-1" />
<zone name="Africa/Windhoek" value="CAT-2" />
<zone name="America/Adak" value="HST10HDT,M3.2.0,M11.1.0" />
<zone name="America/Anchorage" value="AKST9AKDT,M3.2.0,M11.1.0" />
<zone name="America/Anguilla" value="AST4" />
<zone name="America/Antigua" value="AST4" />
<zone name="America/Araguaina" value="STD3" />
<zone name="America/Argentina/Buenos_Aires" value="STD3" />
<zone name="America/Argentina/Catamarca" value="STD3" />
<zone name="America/Argentina/ComodRivadavia" value="STD3" />
<zone name="America/Argentina/Cordoba" value="STD3" />
<zone name="America/Argentina/Jujuy" value="STD3" />
<zone name="America/Argentina/La_Rioja" value="STD3" />
<zone name="America/Argentina/Mendoza" value="STD3" />
<zone name="America/Argentina/Rio_Gallegos" value="STD3" />
<zone name="America/Argentina/Salta" value="STD3" />
<zone name="America/Argentina/San_Juan" value="STD3" />
<zone name="America/Argentina/San_Luis" value="STD3" />
<zone name="America/Argentina/Tucuman" value="STD3" />
<zone name="America/Argentina/Ushuaia" value="STD3" />
<zone name="America/Aruba" value="AST4" />
<zone name="America/Asuncion" value="STD4DST,M10.1.0/0,M3.4.0/0" />
<zone name="America/Atikokan" value="EST5" />
<zone name="America/Atka" value="HST10HDT,M3.2.0,M11.1.0" />
<zone name="America/Bahia" value="STD3" />
<zone name="America/Bahia_Banderas" value="CST6" />
<zone name="America/Barbados" value="AST4" />
<zone name="America/Belem" value="STD3" />
<zone name="America/Belize" value="CST6" />
<zone name="America/Blanc-Sablon" value="AST4" />
<zone name="America/Boa_Vista" value="STD4" />
<zone name="America/Bogota" value="STD5" />
<zone name="America/Boise" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="America/Buenos_Aires" value="STD3" />
<zone name="America/Cambridge_Bay" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="America/Campo_Grande" value="STD4" />
<zone name="America/Cancun" value="EST5" />
<zone name="America/Caracas" value="STD4" />
<zone name="America/Catamarca" value="STD3" />
<zone name="America/Cayenne" value="STD3" />
<zone name="America/Cayman" value="EST5" />
<zone name="America/Chicago" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Chihuahua" value="CST6" />
<zone name="America/Ciudad_Juarez" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="America/Coral_Harbour" value="EST5" />
<zone name="America/Cordoba" value="STD3" />
<zone name="America/Costa_Rica" value="CST6" />
<zone name="America/Creston" value="MST7" />
<zone name="America/Cuiaba" value="STD4" />
<zone name="America/Curacao" value="AST4" />
<zone name="America/Danmarkshavn" value="GMT0" />
<zone name="America/Dawson" value="MST7" />
<zone name="America/Dawson_Creek" value="MST7" />
<zone name="America/Denver" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="America/Detroit" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Dominica" value="AST4" />
<zone name="America/Edmonton" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="America/Eirunepe" value="STD5" />
<zone name="America/El_Salvador" value="CST6" />
<zone name="America/Ensenada" value="PST8PDT,M3.2.0,M11.1.0" />
<zone name="America/Fort_Nelson" value="MST7" />
<zone name="America/Fort_Wayne" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Fortaleza" value="STD3" />
<zone name="America/Glace_Bay" value="AST4ADT,M3.2.0,M11.1.0" />
<zone name="America/Godthab" value="STD2DST,M3.5.0/-1,M10.5.0/0" />
<zone name="America/Goose_Bay" value="AST4ADT,M3.2.0,M11.1.0" />
<zone name="America/Grand_Turk" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Grenada" value="AST4" />
<zone name="America/Guadeloupe" value="AST4" />
<zone name="America/Guatemala" value="CST6" />
<zone name="America/Guayaquil" value="STD5" />
<zone name="America/Guyana" value="STD4" />
<zone name="America/Halifax" value="AST4ADT,M3.2.0,M11.1.0" />
<zone name="America/Havana" value="CST5CDT,M3.2.0/0,M11.1.0/1" />
<zone name="America/Hermosillo" value="MST7" />
<zone name="America/Indiana/Indianapolis" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Indiana/Knox" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Indiana/Marengo" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Indiana/Petersburg" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Indiana/Tell_City" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Indiana/Vevay" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Indiana/Vincennes" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Indiana/Winamac" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Indianapolis" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Inuvik" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="America/Iqaluit" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Jamaica" value="EST5" />
<zone name="America/Jujuy" value="STD3" />
<zone name="America/Juneau" value="AKST9AKDT,M3.2.0,M11.1.0" />
<zone name="America/Kentucky/Louisville" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Kentucky/Monticello" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Knox_IN" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Kralendijk" value="AST4" />
<zone name="America/La_Paz" value="STD4" />
<zone name="America/Lima" value="STD5" />
<zone name="America/Los_Angeles" value="PST8PDT,M3.2.0,M11.1.0" />
<zone name="America/Louisville" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Lower_Princes" value="AST4" />
<zone name="America/Maceio" value="STD3" />
<zone name="America/Managua" value="CST6" />
<zone name="America/Manaus" value="STD4" />
<zone name="America/Marigot" value="AST4" />
<zone name="America/Martinique" value="AST4" />
<zone name="America/Matamoros" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Mazatlan" value="MST7" />
<zone name="America/Mendoza" value="STD3" />
<zone name="America/Menominee" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Merida" value="CST6" />
<zone name="America/Metlakatla" value="AKST9AKDT,M3.2.0,M11.1.0" />
<zone name="America/Mexico_City" value="CST6" />
<zone name="America/Miquelon" value="STD3DST,M3.2.0,M11.1.0" />
<zone name="America/Moncton" value="AST4ADT,M3.2.0,M11.1.0" />
<zone name="America/Monterrey" value="CST6" />
<zone name="America/Montevideo" value="STD3" />
<zone name="America/Montreal" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Montserrat" value="AST4" />
<zone name="America/Nassau" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/New_York" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Nipigon" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Nome" value="AKST9AKDT,M3.2.0,M11.1.0" />
<zone name="America/Noronha" value="STD2" />
<zone name="America/North_Dakota/Beulah" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/North_Dakota/Center" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/North_Dakota/New_Salem" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Nuuk" value="STD2DST,M3.5.0/-1,M10.5.0/0" />
<zone name="America/Ojinaga" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Panama" value="EST5" />
<zone name="America/Pangnirtung" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Paramaribo" value="STD3" />
<zone name="America/Phoenix" value="MST7" />
<zone name="America/Port-au-Prince" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Port_of_Spain" value="AST4" />
<zone name="America/Porto_Acre" value="STD5" />
<zone name="America/Porto_Velho" value="STD4" />
<zone name="America/Puerto_Rico" value="AST4" />
<zone name="America/Punta_Arenas" value="STD3" />
<zone name="America/Rainy_River" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Rankin_Inlet" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Recife" value="STD3" />
<zone name="America/Regina" value="CST6" />
<zone name="America/Resolute" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Rio_Branco" value="STD5" />
<zone name="America/Rosario" value="STD3" />
<zone name="America/Santa_Isabel" value="PST8PDT,M3.2.0,M11.1.0" />
<zone name="America/Santarem" value="STD3" />
<zone name="America/Santiago" value="STD4DST,M9.1.6/24,M4.1.6/24" />
<zone name="America/Santo_Domingo" value="AST4" />
<zone name="America/Sao_Paulo" value="STD3" />
<zone name="America/Scoresbysund" value="STD1DST,M3.5.0/0,M10.5.0/1" />
<zone name="America/Shiprock" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="America/Sitka" value="AKST9AKDT,M3.2.0,M11.1.0" />
<zone name="America/St_Barthelemy" value="AST4" />
<zone name="America/St_Johns" value="NST3:30NDT,M3.2.0,M11.1.0" />
<zone name="America/St_Kitts" value="AST4" />
<zone name="America/St_Lucia" value="AST4" />
<zone name="America/St_Thomas" value="AST4" />
<zone name="America/St_Vincent" value="AST4" />
<zone name="America/Swift_Current" value="CST6" />
<zone name="America/Tegucigalpa" value="CST6" />
<zone name="America/Thule" value="AST4ADT,M3.2.0,M11.1.0" />
<zone name="America/Thunder_Bay" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Tijuana" value="PST8PDT,M3.2.0,M11.1.0" />
<zone name="America/Toronto" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="America/Tortola" value="AST4" />
<zone name="America/Vancouver" value="PST8PDT,M3.2.0,M11.1.0" />
<zone name="America/Virgin" value="AST4" />
<zone name="America/Whitehorse" value="MST7" />
<zone name="America/Winnipeg" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="America/Yakutat" value="AKST9AKDT,M3.2.0,M11.1.0" />
<zone name="America/Yellowknife" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="Antarctica/Casey" value="STD-11" />
<zone name="Antarctica/Davis" value="STD-7" />
<zone name="Antarctica/DumontDUrville" value="STD-10" />
<zone name="Antarctica/Macquarie" value="AEST-10AEDT,M10.1.0,M4.1.0/3" />
<zone name="Antarctica/Mawson" value="STD-5" />
<zone name="Antarctica/McMurdo" value="NZST-12NZDT,M9.5.0,M4.1.0/3" />
<zone name="Antarctica/Palmer" value="STD3" />
<zone name="Antarctica/Rothera" value="STD3" />
<zone name="Antarctica/South_Pole" value="NZST-12NZDT,M9.5.0,M4.1.0/3" />
<zone name="Antarctica/Syowa" value="STD-3" />
<zone name="Antarctica/Troll" value="STD-0DST-2,M3.5.0/1,M10.5.0/3" />
<zone name="Antarctica/Vostok" value="STD-6" />
<zone name="Arctic/Longyearbyen" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Asia/Aden" value="STD-3" />
<zone name="Asia/Almaty" value="STD-6" />
<zone name="Asia/Amman" value="STD-3" />
<zone name="Asia/Anadyr" value="STD-12" />
<zone name="Asia/Aqtau" value="STD-5" />
<zone name="Asia/Aqtobe" value="STD-5" />
<zone name="Asia/Ashgabat" value="STD-5" />
<zone name="Asia/Ashkhabad" value="STD-5" />
<zone name="Asia/Atyrau" value="STD-5" />
<zone name="Asia/Baghdad" value="STD-3" />
<zone name="Asia/Bahrain" value="STD-3" />
<zone name="Asia/Baku" value="STD-4" />
<zone name="Asia/Bangkok" value="STD-7" />
<zone name="Asia/Barnaul" value="STD-7" />
<zone name="Asia/Beirut" value="EET-2EEST,M3.5.0/0,M10.5.0/0" />
<zone name="Asia/Bishkek" value="STD-6" />
<zone name="Asia/Brunei" value="STD-8" />
<zone name="Asia/Calcutta" value="IST-5:30" />
<zone name="Asia/Chita" value="STD-9" />
<zone name="Asia/Choibalsan" value="STD-8" />
<zone name="Asia/Chongqing" value="CST-8" />
<zone name="Asia/Chungking" value="CST-8" />
<zone name="Asia/Colombo" value="STD-5:30" />
<zone name="Asia/Dacca" value="STD-6" />
<zone name="Asia/Damascus" value="STD-3" />
<zone name="Asia/Dhaka" value="STD-6" />
<zone name="Asia/Dili" value="STD-9" />
<zone name="Asia/Dubai" value="STD-4" />
<zone name="Asia/Dushanbe" value="STD-5" />
<zone name="Asia/Famagusta" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Asia/Gaza" value="EET-2EEST,M3.4.4/50,M10.4.4/50" />
<zone name="Asia/Harbin" value="CST-8" />
<zone name="Asia/Hebron" value="EET-2EEST,M3.4.4/50,M10.4.4/50" />
<zone name="Asia/Ho_Chi_Minh" value="STD-7" />
<zone name="Asia/Hong_Kong" value="HKT-8" />
<zone name="Asia/Hovd" value="STD-7" />
<zone name="Asia/Irkutsk" value="STD-8" />
<zone name="Asia/Istanbul" value="STD-3" />
<zone name="Asia/Jakarta" value="WIB-7" />
<zone name="Asia/Jayapura" value="WIT-9" />
<zone name="Asia/Jerusalem" value="IST-2IDT,M3.4.4/26,M10.5.0" />
<zone name="Asia/Kabul" value="STD-4:30" />
<zone name="Asia/Kamchatka" value="STD-12" />
<zone name="Asia/Karachi" value="PKT-5" />
<zone name="Asia/Kashgar" value="STD-6" />
<zone name="Asia/Kathmandu" value="STD-5:45" />
<zone name="Asia/Katmandu" value="STD-5:45" />
<zone name="Asia/Khandyga" value="STD-9" />
<zone name="Asia/Kolkata" value="IST-5:30" />
<zone name="Asia/Krasnoyarsk" value="STD-7" />
<zone name="Asia/Kuala_Lumpur" value="STD-8" />
<zone name="Asia/Kuching" value="STD-8" />
<zone name="Asia/Kuwait" value="STD-3" />
<zone name="Asia/Macao" value="CST-8" />
<zone name="Asia/Macau" value="CST-8" />
<zone name="Asia/Magadan" value="STD-11" />
<zone name="Asia/Makassar" value="WITA-8" />
<zone name="Asia/Manila" value="PST-8" />
<zone name="Asia/Muscat" value="STD-4" />
<zone name="Asia/Nicosia" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Asia/Novokuznetsk" value="STD-7" />
<zone name="Asia/Novosibirsk" value="STD-7" />
<zone name="Asia/Omsk" value="STD-6" />
<zone name="Asia/Oral" value="STD-5" />
<zone name="Asia/Phnom_Penh" value="STD-7" />
<zone name="Asia/Pontianak" value="WIB-7" />
<zone name="Asia/Pyongyang" value="KST-9" />
<zone name="Asia/Qatar" value="STD-3" />
<zone name="Asia/Qostanay" value="STD-6" />
<zone name="Asia/Qyzylorda" value="STD-5" />
<zone name="Asia/Rangoon" value="STD-6:30" />
<zone name="Asia/Riyadh" value="STD-3" />
<zone name="Asia/Saigon" value="STD-7" />
<zone name="Asia/Sakhalin" value="STD-11" />
<zone name="Asia/Samarkand" value="STD-5" />
<zone name="Asia/Seoul" value="KST-9" />
<zone name="Asia/Shanghai" value="CST-8" />
<zone name="Asia/Singapore" value="STD-8" />
<zone name="Asia/Srednekolymsk" value="STD-11" />
<zone name="Asia/Taipei" value="CST-8" />
<zone name="Asia/Tashkent" value="STD-5" />
<zone name="Asia/Tbilisi" value="STD-4" />
<zone name="Asia/Tehran" value="STD-3:30" />
<zone name="Asia/Tel_Aviv" value="IST-2IDT,M3.4.4/26,M10.5.0" />
<zone name="Asia/Thimbu" value="STD-6" />
<zone name="Asia/Thimphu" value="STD-6" />
<zone name="Asia/Tokyo" value="JST-9" />
<zone name="Asia/Tomsk" value="STD-7" />
<zone name="Asia/Ujung_Pandang" value="WITA-8" />
<zone name="Asia/Ulaanbaatar" value="STD-8" />
<zone name="Asia/Ulan_Bator" value="STD-8" />
<zone name="Asia/Urumqi" value="STD-6" />
<zone name="Asia/Ust-Nera" value="STD-10" />
<zone name="Asia/Vientiane" value="STD-7" />
<zone name="Asia/Vladivostok" value="STD-10" />
<zone name="Asia/Yakutsk" value="STD-9" />
<zone name="Asia/Yangon" value="STD-6:30" />
<zone name="Asia/Yekaterinburg" value="STD-5" />
<zone name="Asia/Yerevan" value="STD-4" />
<zone name="Atlantic/Azores" value="STD1DST,M3.5.0/0,M10.5.0/1" />
<zone name="Atlantic/Bermuda" value="AST4ADT,M3.2.0,M11.1.0" />
<zone name="Atlantic/Canary" value="WET0WEST,M3.5.0/1,M10.5.0" />
<zone name="Atlantic/Cape_Verde" value="STD1" />
<zone name="Atlantic/Faeroe" value="WET0WEST,M3.5.0/1,M10.5.0" />
<zone name="Atlantic/Faroe" value="WET0WEST,M3.5.0/1,M10.5.0" />
<zone name="Atlantic/Jan_Mayen" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Atlantic/Madeira" value="WET0WEST,M3.5.0/1,M10.5.0" />
<zone name="Atlantic/Reykjavik" value="GMT0" />
<zone name="Atlantic/South_Georgia" value="STD2" />
<zone name="Atlantic/St_Helena" value="GMT0" />
<zone name="Atlantic/Stanley" value="STD3" />
<zone name="Australia/ACT" value="AEST-10AEDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/Adelaide" value="ACST-9:30ACDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/Brisbane" value="AEST-10" />
<zone name="Australia/Broken_Hill" value="ACST-9:30ACDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/Canberra" value="AEST-10AEDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/Currie" value="AEST-10AEDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/Darwin" value="ACST-9:30" />
<zone name="Australia/Eucla" value="STD-8:45" />
<zone name="Australia/Hobart" value="AEST-10AEDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/LHI" value="STD-10:30DST-11,M10.1.0,M4.1.0" />
<zone name="Australia/Lindeman" value="AEST-10" />
<zone name="Australia/Lord_Howe" value="STD-10:30DST-11,M10.1.0,M4.1.0" />
<zone name="Australia/Melbourne" value="AEST-10AEDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/NSW" value="AEST-10AEDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/North" value="ACST-9:30" />
<zone name="Australia/Perth" value="AWST-8" />
<zone name="Australia/Queensland" value="AEST-10" />
<zone name="Australia/South" value="ACST-9:30ACDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/Sydney" value="AEST-10AEDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/Tasmania" value="AEST-10AEDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/Victoria" value="AEST-10AEDT,M10.1.0,M4.1.0/3" />
<zone name="Australia/West" value="AWST-8" />
<zone name="Australia/Yancowinna" value="ACST-9:30ACDT,M10.1.0,M4.1.0/3" />
<zone name="Brazil/Acre" value="STD5" />
<zone name="Brazil/DeNoronha" value="STD2" />
<zone name="Brazil/East" value="STD3" />
<zone name="Brazil/West" value="STD4" />
<zone name="CET" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="CST6CDT" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="Canada/Atlantic" value="AST4ADT,M3.2.0,M11.1.0" />
<zone name="Canada/Central" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="Canada/Eastern" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="Canada/Mountain" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="Canada/Newfoundland" value="NST3:30NDT,M3.2.0,M11.1.0" />
<zone name="Canada/Pacific" value="PST8PDT,M3.2.0,M11.1.0" />
<zone name="Canada/Saskatchewan" value="CST6" />
<zone name="Canada/Yukon" value="MST7" />
<zone name="Chile/Continental" value="STD4DST,M9.1.6/24,M4.1.6/24" />
<zone name="Chile/EasterIsland" value="STD6DST,M9.1.6/22,M4.1.6/22" />
<zone name="Cuba" value="CST5CDT,M3.2.0/0,M11.1.0/1" />
<zone name="EET" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="EST" value="EST5" />
<zone name="EST5EDT" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="Egypt" value="EET-2EEST,M4.5.5/0,M10.5.4/24" />
<zone name="Eire" value="IST-1GMT0,M10.5.0,M3.5.0/1" />
<zone name="Etc/GMT" value="GMT0" />
<zone name="Etc/GMT+0" value="GMT0" />
<zone name="Etc/GMT+1" value="GMT1" />
<zone name="Etc/GMT+10" value="GMT10" />
<zone name="Etc/GMT+11" value="GMT11" />
<zone name="Etc/GMT+12" value="GMT12" />
<zone name="Etc/GMT+2" value="GMT2" />
<zone name="Etc/GMT+3" value="GMT3" />
<zone name="Etc/GMT+4" value="GMT4" />
<zone name="Etc/GMT+5" value="GMT5" />
<zone name="Etc/GMT+6" value="GMT6" />
<zone name="Etc/GMT+7" value="GMT7" />
<zone name="Etc/GMT+8" value="GMT8" />
<zone name="Etc/GMT+9" value="GMT9" />
<zone name="Etc/GMT-0" value="GMT0" />
<zone name="Etc/GMT-1" value="GMT-1" />
<zone name="Etc/GMT-10" value="GMT-10" />
<zone name="Etc/GMT-11" value="GMT-11" />
<zone name="Etc/GMT-12" value="GMT-12" />
<zone name="Etc/GMT-13" value="GMT-13" />
<zone name="Etc/GMT-14" value="GMT-14" />
<zone name="Etc/GMT-2" value="GMT-2" />
<zone name="Etc/GMT-3" value="GMT-3" />
<zone name="Etc/GMT-4" value="GMT-4" />
<zone name="Etc/GMT-5" value="GMT-5" />
<zone name="Etc/GMT-6" value="GMT-6" />
<zone name="Etc/GMT-7" value="GMT-7" />
<zone name="Etc/GMT-8" value="GMT-8" />
<zone name="Etc/GMT-9" value="GMT-9" />
<zone name="Etc/GMT0" value="GMT0" />
<zone name="Etc/Greenwich" value="GMT0" />
<zone name="Etc/UCT" value="UTC0" />
<zone name="Etc/UTC" value="UTC0" />
<zone name="Etc/Universal" value="UTC0" />
<zone name="Etc/Zulu" value="UTC0" />
<zone name="Europe/Amsterdam" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Andorra" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Astrakhan" value="STD-4" />
<zone name="Europe/Athens" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Belfast" value="GMT0BST,M3.5.0/1,M10.5.0" />
<zone name="Europe/Belgrade" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Berlin" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Bratislava" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Brussels" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Bucharest" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Budapest" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Busingen" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Chisinau" value="EET-2EEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Copenhagen" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Dublin" value="IST-1GMT0,M10.5.0,M3.5.0/1" />
<zone name="Europe/Gibraltar" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Guernsey" value="GMT0BST,M3.5.0/1,M10.5.0" />
<zone name="Europe/Helsinki" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Isle_of_Man" value="GMT0BST,M3.5.0/1,M10.5.0" />
<zone name="Europe/Istanbul" value="STD-3" />
<zone name="Europe/Jersey" value="GMT0BST,M3.5.0/1,M10.5.0" />
<zone name="Europe/Kaliningrad" value="EET-2" />
<zone name="Europe/Kiev" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Kirov" value="MSK-3" />
<zone name="Europe/Kyiv" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Lisbon" value="WET0WEST,M3.5.0/1,M10.5.0" />
<zone name="Europe/Ljubljana" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/London" value="GMT0BST,M3.5.0/1,M10.5.0" />
<zone name="Europe/Luxembourg" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Madrid" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Malta" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Mariehamn" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Minsk" value="STD-3" />
<zone name="Europe/Monaco" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Moscow" value="MSK-3" />
<zone name="Europe/Nicosia" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Oslo" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Paris" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Podgorica" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Prague" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Riga" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Rome" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Samara" value="STD-4" />
<zone name="Europe/San_Marino" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Sarajevo" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Saratov" value="STD-4" />
<zone name="Europe/Simferopol" value="MSK-3" />
<zone name="Europe/Skopje" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Sofia" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Stockholm" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Tallinn" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Tirane" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Tiraspol" value="EET-2EEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Ulyanovsk" value="STD-4" />
<zone name="Europe/Uzhgorod" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Vaduz" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Vatican" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Vienna" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Vilnius" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Volgograd" value="MSK-3" />
<zone name="Europe/Warsaw" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Zagreb" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Europe/Zaporozhye" value="EET-2EEST,M3.5.0/3,M10.5.0/4" />
<zone name="Europe/Zurich" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Factory" value="STD0" />
<zone name="GB" value="GMT0BST,M3.5.0/1,M10.5.0" />
<zone name="GB-Eire" value="GMT0BST,M3.5.0/1,M10.5.0" />
<zone name="GMT" value="GMT0" />
<zone name="GMT+0" value="GMT0" />
<zone name="GMT-0" value="GMT0" />
<zone name="GMT0" value="GMT0" />
<zone name="Greenwich" value="GMT0" />
<zone name="HST" value="HST10" />
<zone name="Hongkong" value="HKT-8" />
<zone name="Iceland" value="GMT0" />
<zone name="Indian/Antananarivo" value="EAT-3" />
<zone name="Indian/Chagos" value="STD-6" />
<zone name="Indian/Christmas" value="STD-7" />
<zone name="Indian/Cocos" value="STD-6:30" />
<zone name="Indian/Comoro" value="EAT-3" />
<zone name="Indian/Kerguelen" value="STD-5" />
<zone name="Indian/Mahe" value="STD-4" />
<zone name="Indian/Maldives" value="STD-5" />
<zone name="Indian/Mauritius" value="STD-4" />
<zone name="Indian/Mayotte" value="EAT-3" />
<zone name="Indian/Reunion" value="STD-4" />
<zone name="Iran" value="STD-3:30" />
<zone name="Israel" value="IST-2IDT,M3.4.4/26,M10.5.0" />
<zone name="Jamaica" value="EST5" />
<zone name="Japan" value="JST-9" />
<zone name="Kwajalein" value="STD-12" />
<zone name="Libya" value="EET-2" />
<zone name="MET" value="MET-1MEST,M3.5.0,M10.5.0/3" />
<zone name="MST" value="MST7" />
<zone name="MST7MDT" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="Mexico/BajaNorte" value="PST8PDT,M3.2.0,M11.1.0" />
<zone name="Mexico/BajaSur" value="MST7" />
<zone name="Mexico/General" value="CST6" />
<zone name="NZ" value="NZST-12NZDT,M9.5.0,M4.1.0/3" />
<zone name="NZ-CHAT" value="STD-12:45DST,M9.5.0/2:45,M4.1.0/3:45" />
<zone name="Navajo" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="PRC" value="CST-8" />
<zone name="PST8PDT" value="PST8PDT,M3.2.0,M11.1.0" />
<zone name="Pacific/Apia" value="STD-13" />
<zone name="Pacific/Auckland" value="NZST-12NZDT,M9.5.0,M4.1.0/3" />
<zone name="Pacific/Bougainville" value="STD-11" />
<zone name="Pacific/Chatham" value="STD-12:45DST,M9.5.0/2:45,M4.1.0/3:45" />
<zone name="Pacific/Chuuk" value="STD-10" />
<zone name="Pacific/Easter" value="STD6DST,M9.1.6/22,M4.1.6/22" />
<zone name="Pacific/Efate" value="STD-11" />
<zone name="Pacific/Enderbury" value="STD-13" />
<zone name="Pacific/Fakaofo" value="STD-13" />
<zone name="Pacific/Fiji" value="STD-12" />
<zone name="Pacific/Funafuti" value="STD-12" />
<zone name="Pacific/Galapagos" value="STD6" />
<zone name="Pacific/Gambier" value="STD9" />
<zone name="Pacific/Guadalcanal" value="STD-11" />
<zone name="Pacific/Guam" value="ChST-10" />
<zone name="Pacific/Honolulu" value="HST10" />
<zone name="Pacific/Johnston" value="HST10" />
<zone name="Pacific/Kanton" value="STD-13" />
<zone name="Pacific/Kiritimati" value="STD-14" />
<zone name="Pacific/Kosrae" value="STD-11" />
<zone name="Pacific/Kwajalein" value="STD-12" />
<zone name="Pacific/Majuro" value="STD-12" />
<zone name="Pacific/Marquesas" value="STD9:30" />
<zone name="Pacific/Midway" value="SST11" />
<zone name="Pacific/Nauru" value="STD-12" />
<zone name="Pacific/Niue" value="STD11" />
<zone name="Pacific/Norfolk" value="STD-11DST,M10.1.0,M4.1.0/3" />
<zone name="Pacific/Noumea" value="STD-11" />
<zone name="Pacific/Pago_Pago" value="SST11" />
<zone name="Pacific/Palau" value="STD-9" />
<zone name="Pacific/Pitcairn" value="STD8" />
<zone name="Pacific/Pohnpei" value="STD-11" />
<zone name="Pacific/Ponape" value="STD-11" />
<zone name="Pacific/Port_Moresby" value="STD-10" />
<zone name="Pacific/Rarotonga" value="STD10" />
<zone name="Pacific/Saipan" value="ChST-10" />
<zone name="Pacific/Samoa" value="SST11" />
<zone name="Pacific/Tahiti" value="STD10" />
<zone name="Pacific/Tarawa" value="STD-12" />
<zone name="Pacific/Tongatapu" value="STD-13" />
<zone name="Pacific/Truk" value="STD-10" />
<zone name="Pacific/Wake" value="STD-12" />
<zone name="Pacific/Wallis" value="STD-12" />
<zone name="Pacific/Yap" value="STD-10" />
<zone name="Poland" value="CET-1CEST,M3.5.0,M10.5.0/3" />
<zone name="Portugal" value="WET0WEST,M3.5.0/1,M10.5.0" />
<zone name="ROC" value="CST-8" />
<zone name="ROK" value="KST-9" />
<zone name="Singapore" value="STD-8" />
<zone name="Turkey" value="STD-3" />
<zone name="UCT" value="UTC0" />
<zone name="US/Alaska" value="AKST9AKDT,M3.2.0,M11.1.0" />
<zone name="US/Aleutian" value="HST10HDT,M3.2.0,M11.1.0" />
<zone name="US/Arizona" value="MST7" />
<zone name="US/Central" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="US/East-Indiana" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="US/Eastern" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="US/Hawaii" value="HST10" />
<zone name="US/Indiana-Starke" value="CST6CDT,M3.2.0,M11.1.0" />
<zone name="US/Michigan" value="EST5EDT,M3.2.0,M11.1.0" />
<zone name="US/Mountain" value="MST7MDT,M3.2.0,M11.1.0" />
<zone name="US/Pacific" value="PST8PDT,M3.2.0,M11.1.0" />
<zone name="US/Samoa" value="SST11" />
<zone name="UTC" value="UTC0" />
<zone name="Universal" value="UTC0" />
<zone name="W-SU" value="MSK-3" />
<zone name="WET" value="WET0WEST,M3.5.0/1,M10.5.0" />
<zone name="Zulu" value="UTC0" />
</timezones>
</configuration>

View File

@@ -0,0 +1,79 @@
<configuration name="verto.conf" description="HTML5 Verto Endpoint">
<settings>
<param name="debug" value="10"/>
</settings>
<profiles>
<profile name="verto-routing">
<param name="bind-local" value="VERTO_IP:9800" secure="false"/>
<param name="secure-combined" value="/etc/ssl/certs/conpeek_ssl.crt"/>
<param name="secure-chain" value="/etc/ssl/certs/conpeek_ssl.crt"/>
<param name="userauth" value="true"/>
<param name="blind-reg" value="false"/>
<param name="context" value="line_verto"/>
<param name="dialplan" value="XML"/>
<param name="mcast-ip" value="224.1.1.1"/>
<param name="mcast-port" value="1337"/>
<param name="local-network" value="INTERNAL_NET_ADDRESS/INTERNAL_NET_MASK"/>
<param name="apply-candidate-acl" value="any_v4.auto"/>
<param name="rtp-ip" value="INTERNAL_IP"/>
<param name="outbound-codec-string" value="PCMA,vp8"/>
<param name="inbound-codec-string" value="PCMA,vp8"/>
<param name="timer-name" value="soft"/>
</profile>
<profile name="verto-stun">
<param name="bind-local" value="VERTO_IP:9801" secure="false"/>
<param name="secure-combined" value="/etc/ssl/certs/conpeek_ssl.crt"/>
<param name="secure-chain" value="/etc/ssl/certs/conpeek_ssl.crt"/>
<param name="userauth" value="true"/>
<param name="blind-reg" value="false"/>
<param name="context" value="line_verto"/>
<param name="dialplan" value="XML"/>
<param name="mcast-ip" value="224.1.1.1"/>
<param name="mcast-port" value="1337"/>
<param name="local-network" value="INTERNAL_NET_ADDRESS/INTERNAL_NET_MASK"/>
<param name="apply-candidate-acl" value="any_v4.auto"/>
<param name="rtp-ip" value="INTERNAL_IP"/>
<param name="outbound-codec-string" value="PCMA,vp8"/>
<param name="inbound-codec-string" value="PCMA,vp8"/>
<param name="timer-name" value="soft"/>
</profile>
<profile name="verto-no-stun">
<param name="bind-local" value="VERTO_IP:9802" secure="false"/>
<param name="secure-combined" value="/etc/ssl/certs/conpeek_ssl.crt"/>
<param name="secure-chain" value="/etc/ssl/certs/conpeek_ssl.crt"/>
<param name="userauth" value="true"/>
<param name="blind-reg" value="false"/>
<param name="context" value="line_verto"/>
<param name="dialplan" value="XML"/>
<param name="mcast-ip" value="224.1.1.1"/>
<param name="mcast-port" value="1337"/>
<param name="local-network" value="EXTERNAL_NET_ADDRESS/EXTERNAL_NET_MASK"/>
<param name="apply-candidate-acl" value="localnet.auto"/>
<param name="apply-candidate-acl" value="wan_v4.auto"/>
<param name="apply-candidate-acl" value="rfc1918.auto"/>
<param name="apply-candidate-acl" value="any_v4.auto"/>
<param name="rtp-ip" value="EXTERNAL_IP"/>
<param name="outbound-codec-string" value="PCMA,vp8"/>
<param name="inbound-codec-string" value="PCMA,vp8"/>
<param name="timer-name" value="soft"/>
</profile>
<profile name="verto-ext-stun">
<param name="bind-local" value="VERTO_IP:9803" secure="false"/>
<param name="secure-combined" value="/etc/ssl/certs/conpeek_ssl.crt"/>
<param name="secure-chain" value="/etc/ssl/certs/conpeek_ssl.crt"/>
<param name="userauth" value="true"/>
<param name="blind-reg" value="false"/>
<param name="context" value="line_verto"/>
<param name="dialplan" value="XML"/>
<param name="mcast-ip" value="224.1.1.1"/>
<param name="mcast-port" value="1337"/>
<param name="local-network" value="INTERNAL_NET_ADDRESS/INTERNAL_NET_MASK"/>
<param name="apply-candidate-acl" value="INTERNAL_IP/32"/>
<param name="rtp-ip" value="INTERNAL_IP"/>
<!-- <param name="ext-rtp-ip" value="EXTERNAL_IP"/> -->
<param name="outbound-codec-string" value="PCMA,vp8"/>
<param name="inbound-codec-string" value="PCMA,vp8"/>
<param name="timer-name" value="soft"/>
</profile>
</profiles>
</configuration>

View File

@@ -0,0 +1,7 @@
<configuration name="xml_curl.conf" description="cURL XML Gateway">
<bindings>
<binding name="directory">
<param name="gateway-url" value="http://127.0.0.1:9600/" bindings="directory"/>
</binding>
</bindings>
</configuration>

View File

@@ -0,0 +1,12 @@
<configuration name="xml_rpc.conf" description="XML RPC">
<settings>
<!-- The port where you want to run the http service (default 8080) -->
<param name="http-port" value="8080"/>
<!-- if all 3 of the following params exist all http traffic will require auth -->
<param name="auth-realm" value="freeswitch"/>
<param name="auth-user" value="freeswitch"/>
<param name="auth-pass" value="$${xml_rpc_password}"/>
<!-- <param name="commands-to-log" value=".*"/> -->
</settings>
</configuration>

View File

@@ -0,0 +1,9 @@
<include>
<context name="bridge_failed">
<extension name="bridge_failed">
<condition field="destination_number" expression="bridge_failed">
<action application="park"/>
</condition>
</extension>
</context>
</include>

View File

@@ -0,0 +1,18 @@
<include>
<context name="external">
<extension name="external">
<condition field="destination_number" expression="^\+*\d+$">
<action application="set" data="rtp_jitter_buffer_during_bridge=true"/>
<action application="set" data="jitterbuffer_msec=5p:16p:"/>
<action application="set" data="rtp_jitter_buffer_plc=true"/>
<action application="set" data="force_transfer_context=systemtransfer"/>
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="park_after_bridge=false"/>
<!-- <action application="playback" data="silence_stream://2000"/> -->
<action application="export" data="nolocal:bridge_generate_comfort_noise=-1"/>
<action application="event" data="Event-Subclass=GatewayCall,Event-Name=CUSTOM"/>
<action application="park"/>
</condition>
</extension>
</context>
</include>

View File

@@ -0,0 +1,19 @@
<include>
<context name="gateway">
<extension name="gateway">
<condition field="destination_number" expression="(.*)">
<action application="set" data="continue_on_fail=false"/>
<action application="set" data="transfer_on_fail=USER_BUSY,SUBSCRIBER_ABSENT,USER_NOT_REGISTERED bridge_failed XML bridge_failed" />
<action application="set" data="hangup_after_bridge=false"/>
<action application="set" data="park_after_bridge=true"/>
<action application="set" data="session_server=${sip_h_X-Session-Server-Name}"/>
<action application="set" data="tenant_domain=${sip_h_X-Tenant-Domain}"/>
<action application="set" data="sip_refer_continue_after_reply=true"/>
<action application="export" data="force_transfer_context=linetransfer"/>
<action application="export" data="force_redirect_context=lineredirect"/>
<action application="event" data="Event-Subclass=GatewayInbound,Event-Name=CUSTOM,No-Dispatch=True"/>
<action application="park"/>
</condition>
</extension>
</context>
</include>

View File

@@ -0,0 +1,14 @@
<include>
<context name="internal">
<extension name="internal">
<condition field="destination_number" expression="^\+*\d+$">
<action application="export" data="force_transfer_context=systemtransfer"/>
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="park_after_bridge=false"/>
<action application="set" data="bridge_generate_comfort_noise=-1"/>
<action application="event" data="Event-Subclass=GatewayCall,Event-Name=CUSTOM"/>
<action application="park"/>
</condition>
</extension>
</context>
</include>

View File

@@ -0,0 +1,21 @@
<include>
<context name="line">
<extension name="line">
<condition field="destination_number" expression="(.*)">
<action application="set" data="continue_on_fail=false"/>
<action application="set" data="transfer_on_fail=USER_BUSY,SUBSCRIBER_ABSENT,USER_NOT_REGISTERED bridge_failed XML bridge_failed" />
<action application="set" data="hangup_after_bridge=false"/>
<action application="set" data="park_after_bridge=true"/>
<action application="set" data="rtp_jitter_buffer_during_bridge=true"/>
<action application="set" data="jitterbuffer_msec=5p:16p:"/>
<action application="set" data="rtp_jitter_buffer_plc=true"/>
<action application="export" data="disable_q850_reason=true"/>
<action application="export" data="sip_ignore_remote_cause=true"/>
<action application="export" data="force_transfer_context=linetransfer"/>
<action application="export" data="force_redirect_context=lineredirect"/>
<action application="event" data="Event-Subclass=LineInbound,Event-Name=CUSTOM,No-Dispatch=True"/>
<action application="park"/>
</condition>
</extension>
</context>
</include>

View File

@@ -0,0 +1,21 @@
<include>
<context name="line_verto">
<extension name="line_verto">
<condition field="destination_number" expression="(.*)">
<action application="set" data="rtp_jitter_buffer_during_bridge=true"/>
<action application="set" data="jitterbuffer_msec=5p:16p:"/>
<action application="set" data="rtp_jitter_buffer_plc=true"/>
<action application="set" data="continue_on_fail=false"/>
<action application="set" data="transfer_on_fail=USER_BUSY,SUBSCRIBER_ABSENT,USER_NOT_REGISTERED bridge_failed XML bridge_failed" />
<action application="set" data="hangup_after_bridge=false"/>
<action application="set" data="park_after_bridge=true"/>
<action application="set" data="record_concat_video=true"/>
<action application="export" data="rtp_rewrite_timestamps=true"/>
<action application="export" data="force_transfer_context=linetransfer"/>
<action application="export" data="force_redirect_context=lineredirect"/>
<action application="lua" data="webchannel_inbound.lua"/>
<action application="park"/>
</condition>
</extension>
</context>
</include>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<include>
<context name="lineredirect">
<extension name="lineredirect">
<condition field="destination_number" expression="(.*)">
<action application="set" data="continue_on_fail=true"/>
<action application="set" data="hangup_after_bridge=false"/>
<action application="set" data="park_after_bridge=true"/>
<action application="set" data="force_redirect_context=lineredirect"/>
<action application="event" data="Event-Subclass=LineInboundRedirect,Event-Name=CUSTOM,No-Dispatch=True"/>
<action application="park"/>
</condition>
</extension>
</context>
</include>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<include>
<context name="linetransfer">
<extension name="linetransfer">
<condition field="destination_number" expression="(.*)">
<action application="set" data="continue_on_fail=true"/>
<action application="set" data="hangup_after_bridge=false"/>
<action application="set" data="park_after_bridge=true"/>
<action application="set" data="force_transfer_context=linetransfer"/>
<action application="set" data="tenant_domain=magia"/>
<action application="event" data="Event-Subclass=LineInboundTransfer,Event-Name=CUSTOM,No-Dispatch=True"/>
<action application="park"/>
</condition>
</extension>
</context>
</include>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<include>
<context name="systemtransfer">
<extension name="systemtransfer">
<condition field="destination_number" expression="(.*)">
<!--<action application="set" data="sip_refer_continue_after_reply=true"/>-->
<action application="event" data="Event-Subclass=GatewayCall,Event-Name=CUSTOM,No-Dispatch=True"/>
<action application="park"/>
</condition>
</extension>
</context>
</include>

View File

@@ -0,0 +1,17 @@
<include>
<context name="virtual_contact">
<extension name="virtual_contact">
<condition field="destination_number" expression="^\+4810.*$">
<action application="set" data="virtual_call=YES"/>
<action application="event" data="Event-Subclass=VirtualCallContact,Event-Name=CUSTOM"/>
<action application="ring_ready"/>
<action application="park"/>
</condition>
</extension>
<extension name="virtual_contact">
<condition field="destination_number" expression="^(\+48.*)$">
<action application='bridge' data='sofia/GATEWAY_NAME_external_1_5100/$1@INTERNAL_IP:5060'/>
</condition>
</extension>
</context>
</include>

View File

@@ -0,0 +1,11 @@
<include>
<context name="virtual">
<extension name="virtual">
<condition field="destination_number" expression=".*">
<action application="event" data="Event-Subclass=VirtualCall,Event-Name=CUSTOM"/>
<action application="ring_ready"/>
<action application="park"/>
</condition>
</extension>
</context>
</include>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0"?>
<document type="freeswitch/xml">
<X-PRE-PROCESS cmd="include" data="vars.xml"/>
<section name="configuration" description="Various Configuration">
<X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
</section>
<section name="dialplan" description="Regex/XML Dialplan">
<X-PRE-PROCESS cmd="include" data="dialplan/*.xml"/>
</section>
</document>

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -0,0 +1,45 @@
<?xml version="1.0">
<profile name="gateway0">
<aliases>
</aliases>
<gateways>
</gateways>
<domains>
<domain name="all" alias="false" parse="false"/>
</domains>
<settings>
<param name="user-agent-string" value="Conpeek"/>
<param name="dialplan" value="XML"/>
<param name="sip-port" value="5080"/>
<param name="rtp-ip" value="INTERNAL_IP"/>
<param name="sip-ip" value="INTERNAL_IP"/>
<param name="ext-rtp-ip" value="INTERNAL_IP"/>
<param name="ext-sip-ip" value="INTERNAL_IP"/>
<param name="context" value="gateway"/>
<param name="auth-all-packets" value="false"/>
<param name="auth-calls" value="false"/>
<param name="challenge-realm" value="auto_from"/>
<param name="debug" value="false"/>
<param name="dtmf-duration" value="2000"/>
<param name="hold-music" value="$${hold_music}"/>
<param name="inbound-codec-negotiation" value="generous"/>
<param name="inbound-codec-prefs" value="PCMA"/>
<param name="inbound-late-negotiation" value="true"/>
<param name="inbound-reg-force-matching-username" value="true"/>
<param name="inbound-zrtp-passthru" value="true"/>
<param name="local-network-acl" value="localnet.auto"/>
<param name="log-auth-failures" value="false"/>
<param name="nonce-ttl" value="60"/>
<param name="outbound-codec-prefs" value="PCMA"/>
<param name="rfc2833-pt" value="101"/>
<param name="rtp-timer-name" value="soft"/>
<param name="sip-capture" value="no"/>
<param name="sip-trace" value="no"/>
<param name="vad" value="none"/>
<param name="suppress-cng" value="true"/>
<param name="fire-transfer-events" value="true"/>
<param name="manage-presence" value="true"/>
<param name="force-register-domain" value="conpeek.com"/>
<param name="force-register-db-domain" value="conpeek.com"/>
</settings>
</profile>

View File

@@ -0,0 +1,41 @@
<?xml version="1.0">
<profile name="gw1_internal0">
<aliases>
</aliases>
<domains>
<domain name="all" alias="false" parse="false"/>
</domains>
<settings>
<param name="user-agent-string" value="Conpeek"/>
<param name="dialplan" value="XML"/>
<param name="sip-port" value="5090"/>
<param name="rtp-ip" value="INTERNAL_IP"/>
<param name="sip-ip" value="INTERNAL_IP"/>
<param name="ext-rtp-ip" value="INTERNAL_IP"/>
<param name="ext-sip-ip" value="INTERNAL_IP"/>
<param name="context" value="internal"/>
<param name="auth-all-packets" value="false"/>
<param name="auth-calls" value="false"/>
<param name="challenge-realm" value="auto_from"/>
<param name="debug" value="false"/>
<param name="dtmf-duration" value="2000"/>
<param name="hold-music" value="$${hold_music}"/>
<param name="inbound-codec-negotiation" value="generous"/>
<param name="inbound-codec-prefs" value="PCMA"/>
<param name="inbound-late-negotiation" value="true"/>
<param name="inbound-reg-force-matching-username" value="true"/>
<param name="inbound-zrtp-passthru" value="true"/>
<param name="local-network-acl" value="localnet.auto"/>
<param name="log-auth-failures" value="false"/>
<param name="nonce-ttl" value="60"/>
<param name="outbound-codec-prefs" value="PCMA"/>
<param name="rfc2833-pt" value="101"/>
<param name="rtp-timer-name" value="soft"/>
<param name="sip-capture" value="no"/>
<param name="sip-trace" value="no"/>
<param name="vad" value="none"/>
<param name="suppress-cng" value="true"/>
<param name="t38-passthru" value="true"/>
</settings>
</profile>

View File

@@ -0,0 +1,54 @@
<?xml version="1.0">
<profile name="line0_an1">
<aliases>
</aliases>
<gateways>
</gateways>
<domains>
<domain name="all" alias="false" parse="false"/>
</domains>
<settings>
<param name="user-agent-string" value="Conpeek"/>
<param name="dialplan" value="XML"/>
<param name="sip-port" value="5070"/>
<param name="rtp-ip" value="INTERNAL_IP"/>
<param name="sip-ip" value="INTERNAL_IP"/>
<param name="ext-rtp-ip" value="EXT_RTP_IP"/>
<param name="ext-sip-ip" value="INTERNAL_IP"/>
<param name="context" value="line"/>
<param name="tls" value="true"/>
<param name="tls-bind-params" value="transport=tls"/>
<param name="tls-sip-port" value="5050"/>
<param name="tls-version" value="tlsv1.2"/>
<param name="auth-all-packets" value="false"/>
<param name="auth-calls" value="true"/>
<param name="debug" value="false"/>
<param name="dtmf-duration" value="2000"/>
<param name="hold-music" value="$${hold_music}"/>
<param name="inbound-codec-negotiation" value="generous"/>
<param name="inbound-codec-prefs" value="PCMA,H264"/>
<param name="inbound-late-negotiation" value="true"/>
<param name="inbound-reg-force-matching-username" value="true"/>
<param name="inbound-zrtp-passthru" value="true"/>
<param name="log-auth-failures" value="false"/>
<param name="manual-redirect" value="true"/>
<param name="nonce-ttl" value="60"/>
<param name="outbound-codec-prefs" value="PCMA,H264"/>
<param name="rfc2833-pt" value="101"/>
<param name="rtp-timer-name" value="soft"/>
<param name="sip-capture" value="no"/>
<param name="sip-trace" value="no"/>
<param name="watchdog-enabled" value="no"/>
<param name="watchdog-event-timeout" value="30000"/>
<param name="watchdog-step-timeout" value="30000"/>
<param name="vad" value="none"/>
<param name="suppress-cng" value="true"/>
<param name="fire-transfer-events" value="true"/>
<param name="manage-presence" value="true"/>
<param name="enable-timer" value="false"/>
<param name="session-timeout" value="1800"/>
<param name="force-register-domain" value="conpeek.com"/>
<param name="force-register-db-domain" value="conpeek.com"/>
<param name="local-network-acl" value="LOCAL_NETWORK_ACL"/>
</settings>
</profile>

View File

@@ -0,0 +1,94 @@
<include>
<X-PRE-PROCESS cmd="set" data="xml_rpc_password=XML_RPC_PASSWORD"/>
<X-PRE-PROCESS cmd="set" data="default_password=Q3G2omiUNgD67fgwP6Xa"/>
<X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/en/us/callie"/>
<X-PRE-PROCESS cmd="set" data="domain=$${local_ip_v4}"/>
<X-PRE-PROCESS cmd="set" data="domain_name=$${domain}"/>
<X-PRE-PROCESS cmd="set" data="hold_music=local_stream://moh"/>
<X-PRE-PROCESS cmd="set" data="use_profile=external"/>
<X-PRE-PROCESS cmd="set" data="rtp_sdes_suites=AEAD_AES_256_GCM_8|AEAD_AES_128_GCM_8|AES_CM_256_HMAC_SHA1_80|AES_CM_192_HMAC_SHA1_80|AES_CM_128_HMAC_SHA1_80|AES_CM_256_HMAC_SHA1_32|AES_CM_192_HMAC_SHA1_32|AES_CM_128_HMAC_SHA1_32|AES_CM_128_NULL_AUTH"/>
<X-PRE-PROCESS cmd="set" data="zrtp_secure_media=true"/>
<X-PRE-PROCESS cmd="set" data="global_codec_prefs=OPUS,G722,PCMU,PCMA,VP8,H261,H263,H263-1998,H263-2000,H264"/>
<X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=OPUS,G722,PCMU,PCMA,VP8,H261,H263,H263-1998,H263-2000,H264"/>
<X-PRE-PROCESS cmd="set" data="xmpp_client_profile=xmppc"/>
<X-PRE-PROCESS cmd="set" data="xmpp_server_profile=xmpps"/>
<X-PRE-PROCESS cmd="set" data="bind_server_ip=auto"/>
<X-PRE-PROCESS cmd="set" data="external_rtp_ip=stun:stun.freeswitch.org"/>
<X-PRE-PROCESS cmd="set" data="external_sip_ip=stun:stun.freeswitch.org"/>
<X-PRE-PROCESS cmd="set" data="unroll_loops=true"/>
<X-PRE-PROCESS cmd="set" data="outbound_caller_name=Conpeek"/>
<X-PRE-PROCESS cmd="set" data="outbound_caller_id=0000000000"/>
<X-PRE-PROCESS cmd="set" data="call_debug=false"/>
<X-PRE-PROCESS cmd="set" data="console_loglevel=info"/>
<X-PRE-PROCESS cmd="set" data="default_areacode=918"/>
<X-PRE-PROCESS cmd="set" data="default_country=US"/>
<X-PRE-PROCESS cmd="set" data="presence_privacy=false"/>
<X-PRE-PROCESS cmd="set" data="au-ring=%(400,200,383,417);%(400,2000,383,417)"/>
<X-PRE-PROCESS cmd="set" data="be-ring=%(1000,3000,425)"/>
<X-PRE-PROCESS cmd="set" data="ca-ring=%(2000,4000,440,480)"/>
<X-PRE-PROCESS cmd="set" data="cn-ring=%(1000,4000,450)"/>
<X-PRE-PROCESS cmd="set" data="cy-ring=%(1500,3000,425)"/>
<X-PRE-PROCESS cmd="set" data="cz-ring=%(1000,4000,425)"/>
<X-PRE-PROCESS cmd="set" data="de-ring=%(1000,4000,425)"/>
<X-PRE-PROCESS cmd="set" data="dk-ring=%(1000,4000,425)"/>
<X-PRE-PROCESS cmd="set" data="dz-ring=%(1500,3500,425)"/>
<X-PRE-PROCESS cmd="set" data="eg-ring=%(2000,1000,475,375)"/>
<X-PRE-PROCESS cmd="set" data="es-ring=%(1500,3000,425)"/>
<X-PRE-PROCESS cmd="set" data="fi-ring=%(1000,4000,425)"/>
<X-PRE-PROCESS cmd="set" data="fr-ring=%(1500,3500,440)"/>
<X-PRE-PROCESS cmd="set" data="hk-ring=%(400,200,440,480);%(400,3000,440,480)"/>
<X-PRE-PROCESS cmd="set" data="hu-ring=%(1250,3750,425)"/>
<X-PRE-PROCESS cmd="set" data="il-ring=%(1000,3000,400)"/>
<X-PRE-PROCESS cmd="set" data="in-ring=%(400,200,425,375);%(400,2000,425,375)"/>
<X-PRE-PROCESS cmd="set" data="jp-ring=%(1000,2000,420,380)"/>
<X-PRE-PROCESS cmd="set" data="ko-ring=%(1000,2000,440,480)"/>
<X-PRE-PROCESS cmd="set" data="pk-ring=%(1000,2000,400)"/>
<X-PRE-PROCESS cmd="set" data="pl-ring=%(1000,4000,425)"/>
<X-PRE-PROCESS cmd="set" data="ro-ring=%(1850,4150,475,425)"/>
<X-PRE-PROCESS cmd="set" data="rs-ring=%(1000,4000,425)"/>
<X-PRE-PROCESS cmd="set" data="ru-ring=%(800,3200,425)"/>
<X-PRE-PROCESS cmd="set" data="sa-ring=%(1200,4600,425)"/>
<X-PRE-PROCESS cmd="set" data="tr-ring=%(2000,4000,450)"/>
<X-PRE-PROCESS cmd="set" data="uk-ring=%(400,200,400,450);%(400,2000,400,450)"/>
<X-PRE-PROCESS cmd="set" data="us-ring=%(2000,4000,440,480)"/>
<X-PRE-PROCESS cmd="set" data="bong-ring=v=-7;%(100,0,941.0,1477.0);v=-7;>=2;+=.1;%(1400,0,350,440)"/>
<X-PRE-PROCESS cmd="set" data="beep=%(1000,0,640)"/>
<X-PRE-PROCESS cmd="set" data="sit=%(274,0,913.8);%(274,0,1370.6);%(380,0,1776.7)"/>
<X-PRE-PROCESS cmd="set" data="df_us_ssn=(?!219099999|078051120)(?!666|000|9\d{2})\d{3}(?!00)\d{2}(?!0{4})\d{4}"/>
<X-PRE-PROCESS cmd="set" data="df_luhn=?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35\d{3})\d{11}"/>
<XX-PRE-PROCESS cmd="set" data="digits_dialed_filter=(($${df_luhn})|($${df_us_ssn}))"/>
<X-PRE-PROCESS cmd="set" data="default_provider=example.com"/>
<X-PRE-PROCESS cmd="set" data="default_provider_username=joeuser"/>
<X-PRE-PROCESS cmd="set" data="default_provider_password=password"/>
<X-PRE-PROCESS cmd="set" data="default_provider_from_domain=example.com"/>
<X-PRE-PROCESS cmd="set" data="default_provider_register=false"/>
<X-PRE-PROCESS cmd="set" data="default_provider_contact=5000"/>
<X-PRE-PROCESS cmd="set" data="sip_tls_version=tlsv1,tlsv1.1,tlsv1.2"/>
<X-PRE-PROCESS cmd="set" data="sip_tls_ciphers=ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"/>
<X-PRE-PROCESS cmd="set" data="internal_auth_calls=true"/>
<X-PRE-PROCESS cmd="set" data="internal_sip_port=5060"/>
<X-PRE-PROCESS cmd="set" data="internal_tls_port=5061"/>
<X-PRE-PROCESS cmd="set" data="internal_ssl_enable=false"/>
<X-PRE-PROCESS cmd="set" data="external_auth_calls=false"/>
<X-PRE-PROCESS cmd="set" data="external_sip_port=5080"/>
<X-PRE-PROCESS cmd="set" data="external_tls_port=5081"/>
<X-PRE-PROCESS cmd="set" data="external_ssl_enable=false"/>
<X-PRE-PROCESS cmd="set" data="rtp_video_max_bandwidth_in=2mb"/>
<X-PRE-PROCESS cmd="set" data="rtp_video_max_bandwidth_out=2mb"/>
<X-PRE-PROCESS cmd="set" data="suppress_cng=true"/>
<X-PRE-PROCESS cmd="set" data="rtp_liberal_dtmf=true"/>
<X-PRE-PROCESS cmd="set" data="video_mute_png=$${images_dir}/default-mute.png"/>
<X-PRE-PROCESS cmd="set" data="video_no_avatar_png=$${images_dir}/default-avatar.png"/>
<X-PRE-PROCESS cmd="set" data="media_mix_inbound_outbound_codecs=true"/>
<X-PRE-PROCESS cmd="set" data="refuse_t38=false"/>
<X-PRE-PROCESS cmd="set" data="fax_enable_t38=true"/>
</include>

View File

@@ -0,0 +1,46 @@
<?xml version="1.0">
<profile name="SIP_PROFILE_NAME">
<aliases>
</aliases>
<domains>
<domain name="all" alias="false" parse="false"/>
</domains>
<gateways>
<gateway name="SIP_TRUNK_NAME_WITH_PORT">
<param name="username" value="SIP_TRUNK_USERNAME"/>
<param name="password" value="SIP_TRUNK_PASSWORD"/>
<param name="extension" value="auto_to_user"/>
<param name="proxy" value="SIP_TRUNK_PROXY"/>
<param name="expire-seconds" value="60"/>
<param name="register" value="false"/>
<param name="caller-id-in-from" value="true"/>
<param name="ping" value="30"/>
</gateway>
</gateways>
<settings>
<param name="debug" value="0"/>
<param name="sip-trace" value="no"/>
<param name="sip-capture" value="no"/>
<param name="rfc2833-pt" value="101"/>
<param name="sip-port" value="SIP_TRUNK_INTERNAL_PORT"/>
<param name="dialplan" value="XML"/>
<param name="context" value="external"/>
<param name="dtmf-duration" value="2000"/>
<param name="inbound-codec-prefs" value="PCMA"/>
<param name="outbound-codec-prefs" value="PCMA"/>
<param name="rtp-timer-name" value="soft"/>
<param name="local-network-acl" value="localnet.auto"/>
<param name="manage-presence" value="false"/>
<param name="inbound-codec-negotiation" value="generous"/>
<param name="nonce-ttl" value="60"/>
<param name="auth-calls" value="false"/>
<param name="inbound-late-negotiation" value="true"/>
<param name="rtp-ip" value="INTERNAL_IP"/>
<param name="sip-ip" value="INTERNAL_IP"/>
<param name="ext-rtp-ip" value="EXTERNAL_IP"/>
<param name="ext-sip-ip" value="EXTERNAL_IP"/>
<param name="t38-passthru" value="true"/>
<param name="user-agent-string" value="Conpeek"/>
<param name="rtcp-audio-interval-msec" value="3000"/>
</settings>
</profile>

View File

@@ -0,0 +1,44 @@
<?xml version="1.0">
<profile name="SIP_PROFILE_NAME">
<aliases>
</aliases>
<domains>
<domain name="all" alias="false" parse="false"/>
</domains>
<gateways>
<gateway name="SIP_TRUNK_NAME_WITH_PORT">
<param name="extension" value="auto_to_user"/>
<param name="proxy" value="SIP_TRUNK_PROXY"/>
<param name="expire-seconds" value="60"/>
<param name="register" value="false"/>
<param name="caller-id-in-from" value="true"/>
<param name="ping" value="30"/>
</gateway>
</gateways>
<settings>
<param name="debug" value="0"/>
<param name="sip-trace" value="no"/>
<param name="sip-capture" value="no"/>
<param name="rfc2833-pt" value="101"/>
<param name="sip-port" value="SIP_TRUNK_INTERNAL_PORT"/>
<param name="dialplan" value="XML"/>
<param name="context" value="external"/>
<param name="dtmf-duration" value="2000"/>
<param name="inbound-codec-prefs" value="PCMA"/>
<param name="outbound-codec-prefs" value="PCMA"/>
<param name="rtp-timer-name" value="soft"/>
<param name="local-network-acl" value="localnet.auto"/>
<param name="manage-presence" value="false"/>
<param name="inbound-codec-negotiation" value="generous"/>
<param name="nonce-ttl" value="60"/>
<param name="auth-calls" value="false"/>
<param name="inbound-late-negotiation" value="true"/>
<param name="rtp-ip" value="INTERNAL_IP"/>
<param name="sip-ip" value="INTERNAL_IP"/>
<param name="ext-rtp-ip" value="EXTERNAL_IP"/>
<param name="ext-sip-ip" value="EXTERNAL_IP"/>
<param name="t38-passthru" value="true"/>
<param name="user-agent-string" value="Conpeek"/>
<param name="rtcp-audio-interval-msec" value="3000"/>
</settings>
</profile>

View File

@@ -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

View File

@@ -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"

View File

@@ -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: <sip:{}:{}>'.format(KSR.pv.get('$Ri'), KamailioServer.SIP_PORT))
logging.debug('append Path: <sip:{}:{}>'.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('(.*)<sip:(.+)@(.+)>(.*)')
m = contact_pattern.match(hContact)
if m:
new_header = 'Contact: {}<sip:{}@{}.{}>{}\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: <sip:{}:5060;lr>\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: <sip:{}:5060;lr>\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()

View File

@@ -0,0 +1,7 @@
<VirtualHost *:83>
ServerAdmin webmaster@localhost
DocumentRoot ${APACHE_DOCUMENT_ROOT}
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

View File

@@ -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

View File

@@ -0,0 +1,9 @@
Listen 83
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -0,0 +1,2 @@
basic_auth_users:
prometheus: PROMETHEUS_PASSWORD

View File

@@ -0,0 +1 @@
docker exec mongo mongosh --authenticationDatabase admin -u root -p MASTER_PASSWORD --eval "use operator_1" --eval "$(cat text_to_speech.js)"

View File

@@ -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 });

11
templates/nginx/custom.sh Normal file
View File

@@ -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

View File

@@ -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";
}

View File

@@ -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;
}

Some files were not shown because too many files have changed in this diff Show More