├── .env ├── .github └── workflows │ └── sipssert.yml ├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── docker-compose.yml ├── docs ├── components.md ├── devel.md ├── getting-started.md ├── homer.md ├── provisioning.md ├── setup.md └── testing.md ├── etc ├── freeswitch │ ├── conf │ │ └── 00_vars.sh │ └── dialplan │ │ └── public.xml ├── mysql │ ├── 00_config_db.sh │ ├── 10_config_acc.sh │ ├── 10_config_dialplan.sh │ ├── 10_config_domain.sh │ ├── 10_config_rtpproxy.sh │ ├── 10_config_subscriber.sh │ ├── 20_create_dids.sh │ └── functions └── opensips-cp │ ├── docker-entrypoint.d │ ├── 00_config_db.sh │ ├── 10_config_user_management.sh │ ├── 20_config_alias_management.sh │ ├── 30_config_drouting.sh │ └── user_management │ │ ├── acls.inc.php │ │ └── user_management_acls.php │ └── image │ └── modules.inc.php ├── run-sipssert.sh └── tests ├── 01.register_disabled ├── scenario.yml └── scripts │ ├── check-register.py │ ├── disable_user.sh │ ├── enable_user.sh │ └── sipp-register.xml ├── 01.register_enabled ├── scenario.yml └── scripts │ ├── check-register.py │ └── sipp-register.xml ├── 02.call ├── scenario.yml └── scripts │ ├── callee.xml │ ├── caller.xml │ └── sipp-register.xml ├── 02.call_disabled_callee ├── scenario.yml └── scripts │ ├── callee.xml │ ├── caller-fail.xml │ ├── caller.xml │ ├── disable_user.sh │ ├── enable_user.sh │ └── sipp-register.xml ├── 02.call_disabled_caller ├── scenario.yml └── scripts │ ├── caller.xml │ ├── disable_user.sh │ ├── enable_user.sh │ └── sipp-register.xml ├── 03.call_unregistered_callee ├── scenario.yml └── scripts │ ├── caller.xml │ ├── check-register.py │ └── sipp-register.xml ├── 03.call_vm_always ├── scenario.yml └── scripts │ ├── caller.xml │ ├── disable_vm.sh │ ├── enable_vm.sh │ └── sipp-register.xml ├── 03.call_vm_not_found ├── scenario.yml └── scripts │ ├── caller.xml │ ├── check-register.py │ ├── disable_vm.sh │ ├── enable_vm.sh │ └── sipp-register.xml ├── 04.call_callee_reject ├── scenario.yml └── scripts │ ├── callee.xml │ ├── caller.xml │ └── sipp-register.xml ├── 04.call_vm_busy ├── scenario.yml └── scripts │ ├── callee.xml │ ├── caller.xml │ ├── disable_vm.sh │ ├── enable_vm.sh │ └── sipp-register.xml ├── 05.call_no_answer ├── scenario.yml └── scripts │ ├── callee.xml │ ├── caller.xml │ └── sipp-register.xml ├── 05.call_vm_no_answer ├── scenario.yml └── scripts │ ├── callee.xml │ ├── caller.xml │ ├── disable_vm.sh │ ├── enable_vm.sh │ └── sipp-register.xml ├── 06.db_dnd ├── scenario.yml └── scripts │ ├── callee.xml │ ├── caller.xml │ ├── caller_busy.xml │ ├── set_user_dnd.sh │ ├── sipp-register.xml │ └── unset_user_dnd.sh ├── 06.star_dnd ├── scenario.yml └── scripts │ ├── callee.xml │ ├── caller.xml │ ├── caller_busy.xml │ ├── check_dnd_off.sh │ ├── check_dnd_on.sh │ ├── dnd_off.xml │ ├── dnd_on.xml │ └── sipp-register.xml ├── 06.star_dnd_with_vm ├── scenario.yml └── scripts │ ├── callee.xml │ ├── caller.xml │ ├── caller_vm.xml │ ├── check_dnd_off.sh │ ├── check_dnd_on.sh │ ├── disable_vm.sh │ ├── dnd_off.xml │ ├── dnd_on.xml │ ├── enable_vm.sh │ └── sipp-register.xml ├── 07.cf_always ├── scenario.yml └── scripts │ ├── add_cf_uri.sh │ ├── caller.xml │ ├── cf-user.xml │ ├── disable_user.sh │ ├── enable_user.sh │ ├── remove_cf_uri.sh │ └── sipp-register.xml ├── 07.cf_busy ├── scenario.yml └── scripts │ ├── add_cf_uri.sh │ ├── callee.xml │ ├── caller.xml │ ├── cf-user.xml │ ├── disable_user.sh │ ├── enable_user.sh │ ├── remove_cf_uri.sh │ └── sipp-register.xml ├── 07.cf_no_answer ├── scenario.yml └── scripts │ ├── add_cf_uri.sh │ ├── callee.xml │ ├── caller.xml │ ├── cf-user.xml │ ├── disable_user.sh │ ├── enable_user.sh │ ├── remove_cf_uri.sh │ └── sipp-register.xml ├── 07.cf_not_found ├── scenario.yml └── scripts │ ├── add_cf_uri.sh │ ├── caller.xml │ ├── disable_user.sh │ ├── enable_user.sh │ ├── remove_cf_uri.sh │ ├── responder.xml │ └── sipp-register.xml ├── 08.call_did ├── scenario.yml └── scripts │ ├── callee.xml │ ├── caller.xml │ └── sipp-register.xml ├── 09.unknown_domain_callee ├── scenario.yml └── scripts │ ├── callee.xml │ ├── caller.xml │ └── sipp-register.xml ├── 09.unknown_domain_caller ├── scenario.yml └── scripts │ └── caller.xml ├── 10.listen_vm_disabled ├── scenario.yml └── scripts │ ├── caller.xml │ └── sipp-register.xml ├── 10.listen_vm_enabled ├── scenario.yml └── scripts │ ├── caller.xml │ ├── disable_vm.sh │ ├── enable_vm.sh │ └── sipp-register.xml ├── 11.call_gateway ├── scenario.yml └── scripts │ ├── allow_pstn.sh │ ├── caller.xml │ ├── deny_pstn.sh │ ├── gateway.xml │ └── sipp-register.xml ├── 11.call_gateway2 ├── scenario.yml └── scripts │ ├── allow_pstn.sh │ ├── caller.xml │ ├── deny_pstn.sh │ ├── gateway.xml │ └── sipp-register.xml ├── 11.gateway_call_did ├── scenario.yml └── scripts │ ├── callee.xml │ ├── gateway.xml │ └── sipp-register.xml ├── cleanup_tasks ├── delete_did.sh ├── delete_gateway.sh ├── delete_rule.sh └── remove_domain.sh ├── config.yml ├── defines.yml ├── init_tasks ├── add_did.sh ├── add_domain.sh ├── add_gateway.sh ├── add_rule.sh └── enable_user.sh └── run.yml /.env: -------------------------------------------------------------------------------- 1 | HOST_IP=192.168.1.129 2 | 3 | NETWORK=172.72.0.0/24 4 | 5 | OPENSIPS_IP=172.72.0.2 6 | 7 | MYSQL_IP=172.72.0.3 8 | MYSQL_ROOT_PASSWORD=root 9 | MYSQL_DATABASE=opensips 10 | MYSQL_USER=opensips 11 | MYSQL_PASSWORD=opensipsrw 12 | MYSQL_PORT=3306 13 | 14 | CP_IP=172.72.0.4 15 | 16 | RTPPROXY_IP=172.72.0.5 17 | RTPPROXY_PORT=7899 18 | MINPORT=30000 19 | MAXPORT=30100 20 | 21 | FREESWITCH_IP=172.72.0.6 22 | 23 | ENABLE_HOMER=no 24 | HOMER_IP=${HOST_IP} 25 | HOMER_PORT=9060 26 | 27 | DEFAULT_DOMAIN=domain.sip 28 | -------------------------------------------------------------------------------- /.github/workflows/sipssert.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Run SIPSsert tests 3 | 4 | on: 5 | push: 6 | pull_request: 7 | schedule: 8 | - cron: '0 2 * * Mon' 9 | 10 | jobs: 11 | test: 12 | 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | 17 | - name: Checkout Repository 18 | uses: actions/checkout@v4 19 | with: 20 | submodules: recursive 21 | 22 | - name: Setup Environment 23 | run: | 24 | HOST_IP=$(hostname -I | cut -d ' ' -f 1) 25 | sed "s/^HOST_IP=.*/HOST_IP=$HOST_IP/g" -i .env 26 | while read line; do 27 | [ "$line" = "" ] && continue; 28 | echo "$line" >> $GITHUB_ENV 29 | done < .env 30 | shell: bash 31 | 32 | - name: Setup Docker Compose 33 | uses: hoverkraft-tech/compose-action@v2.0.2 34 | 35 | - name: Prepare SIPssert 36 | uses: OpenSIPS/SIPssert/.github/actions/Prepare_SIPssert@main 37 | with: 38 | sipssert-repo: OpenSIPS/SIPSsert 39 | 40 | - name: Run Test 41 | uses: OpenSIPS/SIPssert/.github/actions/Run_Tests@main 42 | with: 43 | directory: tests 44 | tests: . 45 | 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | etc/opensips/opensips-cli.cfg 2 | logs/ 3 | etc/opensips-cp/docker-entrypoint.d/functions -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "etc/opensips"] 2 | path = etc/opensips 3 | url = https://github.com/OpenSIPS/opensips-softswitch-ce-config.git 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenSIPS SoftSwitch - Community Edition 2 | 3 | [![Run SIPSsert tests](https://github.com/OpenSIPS/opensips-softswitch-ce/actions/workflows/sipssert.yml/badge.svg)](https://github.com/OpenSIPS/opensips-softswitch-ce/actions/workflows/sipssert.yml) 4 | 5 | This project contains a fully functional OpenSIPS setup used as a SoftSwitch 6 | that provides the following features: 7 | 8 | * SIP Proxy with **support for TCP and UDP** 9 | * **topology hiding** for all calls 10 | * **dialplans** for user and did formats 11 | * star codes to **enable/disable DND** 12 | * **call forward** URIs for each user: 13 | * **always forward** 14 | * **busy forward** 15 | * **no answer forward** 16 | * **not found forward** 17 | * **ACLs** for each user: 18 | * **User Enabled** 19 | * **Force NAT** 20 | * **Enable PSTN** 21 | * **DND** 22 | * **VM Enabled** 23 | * **VM Permanent Redirect** 24 | * **VM Redirect Not Found** 25 | * **VM Redirect on Busy** 26 | * **VM Redirect on No Answer** 27 | * **RTPProxy** for voice traffic 28 | * **FreeSWITCH** for media services: 29 | * **voicemails** 30 | * **announcements** 31 | 32 | ## Getting Started 33 | 34 | The simplest way to get the project running is to setup [Docker](https://www.docker.com/) on your host and then run: 35 | 36 | ``` shell 37 | git clone --recursive https://github.com/OpenSIPS/opensips-softswitch-ce.git 38 | cd softswitch 39 | 40 | # configure your private IP address before launching the containers 41 | MY_IP=10.0.0.23; sed -i 's/HOST_IP=.*/HOST_IP='$MY_IP'/g' .env 42 | 43 | docker compose up 44 | ``` 45 | 46 | For more information about setup, please check the [Setup 47 | page](docs/setup.md). 48 | 49 | Once everything is initialized, you should be able to access the OpenSIPS 50 | Control Panel using the following credentials: 51 | 52 | * URL: [http://localhost/cp](http://localhost/cp) 53 | * User: `admin` 54 | * Password: `opensips` 55 | 56 | For more information about provisioning, please check the [Provisioning 57 | page](docs/provisioning.md). 58 | 59 | 60 | At this point you can follow the [Getting Started](docs/getting-started.md) 61 | tutorial to test the OpenSIPS SoftSwitch Community Edition. 62 | 63 | ## Testing 64 | 65 | OpenSIPS SoftwSwitch comes with a set of tests that you can run once the setup 66 | is complete: 67 | ``` shell 68 | ./run-sipssert.sh 69 | ``` 70 | 71 | For more information, please check the [Testing page](docs/testing.md). 72 | 73 | ## OpenSIPS 74 | 75 | OpenSIPS configuration is developed in a separate git repository that can be 76 | found [here](https://github.com/OpenSIPS/opensips-softswitch-ce-config.git). 77 | 78 | ## Homer 79 | 80 | In order to be able to visualize SoftSwitch call flows, it is recommended to 81 | setup the [Homer](https://github.com/sipcapture/homer) tool by following [these](docs/homer.md) 82 | steps. 83 | 84 | ## Documentation 85 | 86 | Documentation pages contain the following topics: 87 | 88 | * [Setup](docs/setup.md) - contains information about how to install and setup 89 | * [Getting Started](docs/getting-started.md) - show how you can use the 90 | SoftSwitch to test certain scenarios 91 | * [Components](docs/components.md) - list of components used in the project 92 | * [Provisioning](docs/provisioning.md) - useful information about provisioning 93 | the platform 94 | * [Testing](docs/testing.md) - information about testing the platform 95 | * [Homer](docs/homer.md) - information about setting up Homer server 96 | * [Devel](docs/devel.md) - information about development 97 | 98 | 99 | ## Contribute 100 | 101 | This project is Community driven, therefore any contribution is welcome. Feel 102 | free to open a pull request for any fix/feature you find useful. 103 | 104 | ## License 105 | 106 | 107 | [License-GPLv3]: https://www.gnu.org/licenses/gpl-3.0.en.html "GNU GPLv3" 108 | [Logo-CC_BY]: https://i.creativecommons.org/l/by/4.0/88x31.png "Creative Common Logo" 109 | [License-CC_BY]: https://creativecommons.org/licenses/by/4.0/legalcode "Creative Common License" 110 | 111 | The `OpenSIPS SoftSwitch Community Edition` source code is licensed under the [GNU General Public License v3.0][License-GPLv3] 112 | 113 | All documentation files (i.e. `.md` extension) are licensed under the [Creative Common License 4.0][License-CC_BY] 114 | 115 | ![Creative Common Logo][Logo-CC_BY] 116 | 117 | © 2024 - SIP Point Consulting SRL 118 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | mysql: 3 | build: 4 | dockerfile_inline: | 5 | FROM mysql:latest 6 | # get the latest/newest opensips-mysql-dbschema package 7 | RUN echo "https://yum.opensips.org/3.6/nightly/el/9/x86_64/$(curl -s -L https://yum.opensips.org/3.6/nightly/el/9/x86_64 | grep -oE "opensips-mysql-dbschema[^r]*.rpm" | tail -1)" | xargs rpm -i 8 | container_name: mysql 9 | volumes: 10 | - ./etc/mysql:/docker-entrypoint-initdb.d 11 | - db:/var/lib/mysql 12 | env_file: 13 | - .env 14 | environment: 15 | - MYSQL_IP=localhost 16 | healthcheck: 17 | test: mysql -u ${MYSQL_USER} -p'${MYSQL_PASSWORD}' opensips -e 'SHOW TABLES LIKE "location"' 2>&1 | grep -q location 18 | interval: 10s 19 | timeout: 1s 20 | retries: 5 21 | start_period: 20s 22 | networks: 23 | localnetwork: 24 | ipv4_address: ${MYSQL_IP} 25 | 26 | opensips: 27 | image: opensips/opensips:softswitch-ce 28 | container_name: opensips 29 | volumes: 30 | - ./etc/opensips:/etc/opensips 31 | ports: 32 | - 5060:5060/udp 33 | - 5060:5060/tcp 34 | expose: 35 | - 9060/tcp 36 | env_file: 37 | - .env 38 | depends_on: 39 | mysql: 40 | condition: service_healthy 41 | command: 42 | - -p /etc/opensips/substenv.sh 43 | networks: 44 | localnetwork: 45 | ipv4_address: ${OPENSIPS_IP} 46 | 47 | opensips-cp: 48 | build: 49 | context: ./etc/opensips-cp/image 50 | dockerfile_inline: FROM opensips/opensips-cp:latest 51 | container_name: opensips-cp 52 | env_file: 53 | - .env 54 | ports: 55 | - 80:80 56 | expose: 57 | - 9060/tcp 58 | depends_on: 59 | mysql: 60 | condition: service_healthy 61 | volumes: 62 | - ./etc/opensips-cp/docker-entrypoint.d:/docker-entrypoint.d 63 | - type: bind 64 | source: ./etc/mysql/functions 65 | target: /docker-entrypoint.d/functions 66 | networks: 67 | localnetwork: 68 | ipv4_address: ${CP_IP} 69 | 70 | rtpproxy: 71 | image: sippylabs/rtpproxy 72 | container_name: rtpproxy 73 | env_file: 74 | - .env 75 | ports: 76 | - "${MINPORT}-${MAXPORT}:${MINPORT}-${MAXPORT}/udp" 77 | networks: 78 | localnetwork: 79 | ipv4_address: ${RTPPROXY_IP} 80 | command: -s udp:${RTPPROXY_IP}:${RTPPROXY_PORT} -l ${RTPPROXY_IP} -m ${MINPORT} -M ${MAXPORT} -A ${HOST_IP} 81 | 82 | freeswitch: 83 | image: opensips/freeswitch-ce 84 | container_name: freeswitch 85 | env_file: 86 | - .env 87 | volumes: 88 | - ./etc/freeswitch/dialplan:/etc/freeswitch/dialplan 89 | - ./etc/freeswitch/conf:/docker-entrypoint.d 90 | cap_add: 91 | - SYS_NICE 92 | networks: 93 | localnetwork: 94 | ipv4_address: ${FREESWITCH_IP} 95 | 96 | volumes: 97 | db: 98 | 99 | networks: 100 | localnetwork: 101 | name: softswitch-br 102 | driver: bridge 103 | driver_opts: 104 | com.docker.network.bridge.host_binding_ipv4: "${HOST_IP}" 105 | com.docker.network.bridge.name: softswitch-br 106 | ipam: 107 | config: 108 | - subnet: ${NETWORK} 109 | -------------------------------------------------------------------------------- /docs/components.md: -------------------------------------------------------------------------------- 1 | # OpenSIPS SoftSwitch - Community Edition - Components 2 | 3 | This platform uses the following compoents/docker images: 4 | 5 | - **mysql**: MySQL database server; used to store OpenSIPS data; 6 | - *ports*: **3306** (by default, but can be changed in [.env](/.env) file at `MYSQL_PORT`) 7 | - this port can be used to connect to the database from outside Docker environment 8 | and manually inspect the database; use `MYSQL_USER`, `MYSQL_PASSWORD` and `MYSQL_DATABASE` from [.env](/.env) file 9 | - **opensips**: OpenSIPS SIP server; used to handle SIP traffic; 10 | - *ports*: **5060** (for both UDP and TCP connections), **8888** (for OpenSIPS Management Interface) 11 | - **8888** can be used to send MI commands to OpenSIPS server from outside Docker environment (e.g. using `opensips-cli` tool) 12 | - **opensips-cp**: OpenSIPS Control Panel; used to manage SoftSwitch platform; 13 | - *ports*: **80** (used to access the web interface from browser) 14 | - you can access it at `http://localhost/cp` with default credentials `admin:opensips` 15 | - **rtpproxy**: RTP proxy server; used to handle RTP traffic; 16 | - *ports*: **MINPORT**-**MAXPORT** (by default, **30000**-**30100**, but can be changed in [.env](/.env) file) 17 | - these ports are meant to be used to send voice traffic 18 | - **freeswitch**: FreeSWITCH media server; used for voicemails and announcements; **no ports opened** to the world; 19 | -------------------------------------------------------------------------------- /docs/devel.md: -------------------------------------------------------------------------------- 1 | # OpenSIPS SoftSwitch - Community Edition - Development 2 | 3 | This document contains information about development of the platform. 4 | 5 | ## Structure 6 | 7 | This repository contains the following directory structure: 8 | 9 | * [**docs/**](/docs/): contains documentation files 10 | * [**etc/**](/etc/): 11 | * [**opensips/**](/etc/opensips/): subproject for OpenSIPS configuration files; contains [opensips.cfg](/etc/opensips/opensips.cfg) and other configuration files 12 | * [**opensips-cp/**](/etc/opensips-cp/): 13 | * [**docker-entrypoint.d/**](/etc/opensips-cp/docker-entrypoint.d/): scripts that are executed when the container starts (e.g. to set up the database) 14 | * [**user_management/**](/etc/opensips-cp/docker-entrypoint.d/user_management/): php files for that implement ACLs for user management tool 15 | * [**image/**](/etc/opensips-cp/image/): [modules.inc.php](/etc/opensips-cp/image/modules.inc.php) file where modules can be enabled/disabled for OpenSIPS Control Panel 16 | * [**mysql/**](/etc/mysql/): scripts to initialize the MySQL database schema 17 | * [**freeswitch/**](/etc/freeswitch/): 18 | * [**conf/**](/etc/freeswitch/conf/): scripts that are executed when the container starts 19 | * [**dialplan/**](/etc/freeswitch/dialplan/): xml files that define voicemail and announcements extensions for FreeSWITCH 20 | * [**sipssert/**](/sipssert/): contains a suite of tests for the platform to be run with SIPssert framework 21 | * [**docker-compose.yml**](/docker-compose.yml): main file that defines services, networks and volumes for the platform 22 | * [**.env**](/.env): environment file that contains configuration for the platform 23 | * [**run-sipssert.sh**](/run-sipssert.sh): script that runs the SIPssert tests (in a Docker container, no need to install SIPssert locally) 24 | -------------------------------------------------------------------------------- /docs/getting-started.md: -------------------------------------------------------------------------------- 1 | # OpenSIPS SoftSwitch - Community Edition - Getting Started 2 | 3 | Once the setup of the platform is completely done, you can follow this 4 | guide that shows you how you can get the platform provisioned. 5 | 6 | OpenSIPS Control Panel is the simplest way to do this. You can access it at [http://localhost/cp](http://localhost/cp) using the following credentials: 7 | * username: `admin` 8 | * password: `opensips` 9 | 10 | ## Domains 11 | 12 | Besides the default `domain.sip` that is created when the platform is started, you can add more domains using the OpenSIPS Control Panel. From the left panel, select `System` -> `Domains`, fill in the domain name and click `Add New Domain`, then `Reload on Server` (to refresh the OpenSIPS cache). 13 | 14 | ## Users 15 | 16 | You can also add users using Control Panel web interface. From the left panel, go to `Users` -> `User Management` and click `Add New`. Fill in the user details (mandatory fields are `Username`, `Domain`, `Password`) and click `Register`. You can enable/disable one user by clicking on his `ACLs` button and ticking the `User Enabled` checkbox. 17 | 18 | ## Voicemail 19 | 20 | Each user can have a voicemail box. To enable voicemail for a user, go to `Users` -> `User Management`, click on ACLS button for the user you want to enable voicemail for, and tick the `VM Enabled` checkbox. 21 | Now you must select what scenarios will trigger the voicemail redirect. In the same `ACLs` window, you can select the following: 22 | * `VM Permanent Redirect` - if enabled, the call will always be redirected to voicemail 23 | * `VM Redirect Not Found` - if enabled, the call will be redirected to voicemail if the callee is not found 24 | * `VM Redirect on Busy` - if enabled, the call will be redirected to voicemail if the callee rejects the call 25 | * `VM Redirect on No Answer` - if enabled, the call will be redirected to voicemail if the callee does not answer 26 | 27 | ## Call Forward 28 | 29 | When you add a new user (or edit an existing one), you can set up call forwarding for him. There are 4 scenarios: 30 | * `Always Forward` - if present, the call will always be forwarded to the URI specified in this field 31 | * `Busy Forward` - if present, the call will be forwarded to the URI specified in this field if the callee rejects the call 32 | * `No Answer Forward` - if present, the call will be forwarded to the URI specified in this field if the callee does not answer 33 | * `Not Found Forward` - if present, the call will be forwarded to the URI specified in this field if the callee is not found 34 | 35 | You must use SIP URIs like: `sip:cf_user@domain.sip`. 36 | 37 | ## DIDs 38 | 39 | From the OpenSIPS Control Panel, you can add DIDs to users. Go to `Users` -> `Alias Management` and click on the `Add New Alias` button. Fill in the required fields and click `Create`. 40 | 41 | ## PSTN Routing 42 | 43 | You can also tweak inbound and outbound routing for PSTN calls using Control Panel web interface. From the left panel, go to `System` -> `Dynamic Routing`. There are three tabs: 44 | * **Gateways** - here you can manage gateways 45 | * **Carriers** - here you can manage carriers 46 | * **Rules** - here you can manage routing rules 47 | 48 | To allow one user to make PSTN calls, you must enable the `Enable PSTN` ACL for him. 49 | -------------------------------------------------------------------------------- /docs/homer.md: -------------------------------------------------------------------------------- 1 | # OpenSIPS SoftSwitch - Community Edition - Homer 2 | 3 | The [Homer](https://github.com/sipcapture/homer) project can be used to capture and analyze call flows. 4 | There is a containerized version of Homer available [here](https://github.com/sipcapture/homer-docker). 5 | 6 | ## Installation 7 | 8 | To install Homer, you need to clone the repository and start the containers: 9 | 10 | ```shell 11 | git clone https://github.com/sipcapture/homer-docker.git 12 | cd homer-docker/all-in-one 13 | docker compose up -d # or docker-compose up -d 14 | ``` 15 | 16 | A web interface will be available at [http://localhost:3000](http://localhost:3000) with the following credentials: 17 | * username: `admin` 18 | * password: `admin` 19 | 20 | Homer will listen for HEP traffic on port 9060 and will be accessible via port forwarding from the host machine. 21 | 22 | After setting up Homer, you need to enable it in the environment file; edit 23 | `.env` and switch the `ENABLE_HOMER=yes`; Make sure `HOMER_IP` and 24 | `HOMER_PORT` variables are pointing to the correct values (`HOST_IP:9060`). 25 | -------------------------------------------------------------------------------- /docs/provisioning.md: -------------------------------------------------------------------------------- 1 | # OpenSIPS SoftSwitch - Community Edition - Provisioning 2 | 3 | The SoftSwitch can be provisioned through different interfaces 4 | 5 | ## OpenSIPS Control Panel 6 | 7 | The simplest way to provision the SoftSwitch is through the OpenSIPS Control Panel. You can access it at [http://localhost/cp](http://localhost/cp) using the following credentials: 8 | * username: `admin` 9 | * password: `opensips` 10 | 11 | Here you can use various web interface tools to manage: **users**, **aliases**, **domains**, **PSTN traffic**, **dialplans**. 12 | You can also send **MI commands** to OpenSIPS or view **statistics** and **logs**. 13 | 14 | ## OpenSIPS CLI 15 | 16 | You can run CLI commands by running the following command to execute `opensips-cli` in the OpenSIPS container: 17 | ```shell 18 | docker exec -it opensips opensips-cli # to enter in interactive mode 19 | Welcome to OpenSIPS Command Line Interface! 20 | (opensips-cli): 21 | 22 | # or run a single command, for example: 23 | docker exec -it opensips opensips-cli -x mi reload_routes 24 | ``` 25 | 26 | ## MySQL 27 | 28 | You can also provision the SoftSwitch by directly accessing the MySQL database. 29 | 30 | ```shell 31 | # using a Docker exec command to access the MySQL container 32 | docker exec -it mysql mysql -uopensips -popensipsrw -D opensips 33 | 34 | # or use the IP address and port 35 | mysql -h $MYSQL_IP --port=$MYSQL_PORT -uopensips -popensipsrw -D opensips 36 | ``` 37 | -------------------------------------------------------------------------------- /docs/setup.md: -------------------------------------------------------------------------------- 1 | # OpenSIPS SoftSwitch - Community Edition - Setup 2 | 3 | ## Prerequisites 4 | 5 | To run this platform, you need to have [Docker](https://www.docker.com/) and [Docker 6 | Compose](https://docs.docker.com/compose/) installed on your machine. Also, `git` is another requirement to clone the repository. 7 | 8 | ## Network 9 | 10 | The platform uses a bridge network to connect the containers. This means that the containers can communicate with each other using their IP addresses. The IP addresses are set in the [.env](/.env) file. 11 | 12 | To access the containers from outside this network, port forwarding is used to map the ports from the host machine to the containers. (e.g. OpenSIPS-CP container will be accessible at `localhost:80`). 13 | 14 | Containers may also have access to every service on the host machine that is listening on some port. This is why the **HOST_IP** address is set in the [.env](/.env) file and you **MUST** set it to the IP address of an interface from the host machine. 15 | 16 | ## Configuration 17 | 18 | There is the `.env` file where you can set up the following variables: 19 | - `HOST_IP`: IP address of a interface from the host machine; defaults to the 20 | first IP associated on the host 21 | - `NETWORK`: IP addresses class for Docker containers in CIDR notation (IP/mask); 22 | default is `172.72.0.0/24` 23 | - `OPENSIPS_IP`: IP address of the OpenSIPS container; default is `172.72.0.2` 24 | - `MYSQL_IP`: IP address of the MySQL container; default is `172.72.0.3` 25 | - `MYSQL_ROOT_PASSWORD`: root password for MySQL container; default is `root` 26 | - `MYSQL_DATABASE`: database name for OpenSIPS; default is `opensips` 27 | - `MYSQL_USER`: database user for OpenSIPS; default is `opensips` 28 | - `MYSQL_PASSWORD`: password for OpenSIPS database user; default is 29 | `opensipsrw` 30 | - `CP_IP`: IP address of the OpenSIPS-CP container; default is `172.72.0.4` 31 | - `RTPPROXY_IP`: IP address of the RTPProxy container; default is `172.72.0.5` 32 | - `RTPPROXY_PORT`: listening port for RTPProxy; default is `7899` 33 | - `MINPORT`: minimum of the port range for RTPProxy; default is `30000` 34 | - `MAXPORT`: maximum of the port range for RTPProxy; default is `30100` 35 | - `FREESWITCH_IP`: IP address of the FreeSWITCH container; default is 36 | `172.72.0.6` 37 | - `ENABLE_HOMER`: enable or disable Homer SIP capture (`yes`/`no`); check the [Homer](homer.md) section to enable it; default is `no`/disabled 38 | - `HOMER_IP`: Homer IP used to trace the traffic; check the [Homer](homer.md); default is `HOST_IP` 39 | - `HOMER_Port`: Homer port used to trace the traffic; check the [Homer](homer.md); default is `9060` 40 | - `DEFAULT_DOMAIN`: a default domain provided for OpenSIPS; default is 41 | `domain.sip` 42 | 43 | ## Start Service 44 | 45 | Once the configuration is finalized (i.e. editting the `.env` file), you can 46 | start the service using: 47 | ``` shell 48 | docker-compose up # if you use the standalone Docker Compose 49 | 50 | # use --build when you need to rebuild the images (e.g. after editing the modules.inc.php) 51 | docker-compose up --build 52 | 53 | # or 54 | docker compose up --build # if you use the Docker Compose plugin 55 | 56 | # add -d to run in detached mode 57 | docker-compose up --build -d 58 | ``` 59 | -------------------------------------------------------------------------------- /docs/testing.md: -------------------------------------------------------------------------------- 1 | # OpenSIPS SoftSwitch - Community Edition - Testing 2 | 3 | OpenSIPS SoftSwitch comes with a set of tests to validate the correctness of 4 | the platform. 5 | 6 | ## Testing 7 | 8 | The following tests suite is available: 9 | * [01.register_disabled](/sipssert/01.register_disabled/): checks that a disabled user cannot register 10 | * [01.register_enabled](/sipssert/01.register_enabled/): tests that an enabled user can register 11 | * [02.call](/sipssert/02.call/): verifies that a user - *caller* can call another user - *callee* 12 | * [02.call_disabled_callee](/sipssert/02.call_disabled_callee/): checks that a disabled user cannot receive calls; first, *caller* and *callee* register, then *callee* is disabled and *caller* tries to call *callee* 2 times: first time the call is completed, the second time, after 70 seconds, the call is rejected (because *callee*'s REGISTER expires) 13 | * [02.call_disabled_caller](/sipssert/02.call_disabled_caller/): tests that a disabled *caller* cannot make calls 14 | * [03.call_unregistered_callee](/sipssert/03.call_unregistered_callee/): checks that a call with an unregistered *callee* is rejected 15 | * [03.call_vm_not_found](/sipssert/03.call_vm_not_found/): checks that a call with an unregistered *callee* is redirected to voicemail if *callee* has voicemail enabled for *not found* scenario 16 | * [04.call_callee_reject](/sipssert/04.call_callee_reject/): checks that a call rejected by *callee* is correctly handled 17 | * [04.call_vm_busy](/sipssert/04.call_vm_busy/): tests that a call rejected by *callee* is redirected to voicemail if *callee* has voicemail enabled for *busy* scenario 18 | * [05.call_no_answer](/sipssert/05.call_no_answer/): checks that a call with no answer is correctly handled 19 | * [05.call_vm_no_answer](/sipssert/05.call_vm_no_answer/): verifies that a call with no answer is redirected to voicemail if *callee* has voicemail enabled for *no answer* scenario 20 | * [06.db_dnd](/sipssert/06.db_dnd/): checks if DND ACL works correctly by enabling/disabling it in the database 21 | * [06.star_dnd](/sipssert/06.star_dnd/): tests if DND ACL works correctly by using the star code to enable/disable it 22 | * [06.star_dnd_with_vm](/sipssert/06.star_dnd_with_vm/): checks if DND ACL works correctly by using the star code to enable/disable it, when voicemail is enabled for *callee* for *busy* scenario 23 | * [07.cf_always](/sipssert/07.cf_always/): tests that a call is always forwarded to a different URI if *callee* has call forwarding enabled for *always* scenario 24 | * [07.cf_busy](/sipssert/07.cf_busy/): verifies that a rejected call is forwarded to a different URI if *callee* has call forwarding enabled for *busy* scenario 25 | * [07.cf_no_answer](/sipssert/07.cf_no_answer/): tests that a call with no answer is forwarded to a different URI if *callee* has call forwarding enabled for *no answer* scenario 26 | * [07.cf_not_found](/sipssert/07.cf_not_found/): checks that a call with an unregistered *callee* is forwarded to a different URI if *callee* has call forwarding enabled for *not found* scenario 27 | * [08.call_did](/sipssert/08.call_did/): checks if *callee* can receive calls on a DID assigned to him 28 | * [09.unknown_domain_callee](/sipssert/09.unknown_domain_callee/): tests that a call to a local IP address is completed 29 | * [09.unknown_domain_caller](/sipssert/09.unknown_domain_caller/): verifies that a call from an unknown domain is rejected 30 | * [10.listen_vm_disabled](/sipssert/10.listen_vm_disabled/): checks that a user cannot listen to voicemail if voicemail is disabled 31 | * [10.listen_vm_enabled](/sipssert/10.listen_vm_enabled/): tests that a user can listen to voicemail if voicemail is enabled 32 | * [11.call_gateway](/sipssert/11.call_gateway/): checks that a call to a known gateway is completed 33 | * [11.gateway_call_did](/sipssert/11.gateway_call_did/): tests that a call coming from a known gateway is completed 34 | 35 | ## Running the tests 36 | 37 | The following command will start a Docker container that will run these SIPssert scenarios: 38 | ``` shell 39 | ./run-sipssert.sh 40 | 41 | # or, if you want to run a specific test 42 | ./run-sipssert.sh sipssert/ -t 01.register_enabled 43 | ``` 44 | -------------------------------------------------------------------------------- /etc/freeswitch/conf/00_vars.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | eval "sed -E -i 's/external_sip_ip=[^\"]+/external_sip_ip=${FREESWITCH_IP}/' /etc/freeswitch/vars.xml" 4 | eval "sed -E -i 's/external_rtp_ip=[^\"]+/external_rtp_ip=${FREESWITCH_IP}/' /etc/freeswitch/vars.xml" 5 | -------------------------------------------------------------------------------- /etc/freeswitch/dialplan/public.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /etc/mysql/00_config_db.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Installing OpenSIPS database schema..." 4 | 5 | cd "$(dirname "$0")" 6 | . functions 7 | 8 | TABLE_FILES=( 9 | "acc-create.sql" 10 | "alias_db-create.sql" 11 | "auth_db-create.sql" 12 | "dialog-create.sql" 13 | "dialplan-create.sql" 14 | "dispatcher-create.sql" 15 | "domain-create.sql" 16 | "drouting-create.sql" 17 | "presence-create.sql" 18 | "rtpproxy-create.sql" 19 | "sqlops-create.sql" 20 | "usrloc-create.sql" 21 | ) 22 | 23 | add_table /usr/share/opensips/mysql/standard-create.sql 24 | 25 | for file in "${TABLE_FILES[@]}"; do 26 | add_table /usr/share/opensips/mysql/$file 27 | done 28 | -------------------------------------------------------------------------------- /etc/mysql/10_config_acc.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Configuring OpenSIPS acc table..." 4 | 5 | cd "$(dirname "$0")" 6 | . functions 7 | 8 | add_column acc caller_ip 9 | add_column acc caller_ua 10 | add_column acc callee_ip 11 | add_column acc callee_ua 12 | add_column acc caller_id 13 | add_column acc callee_id 14 | add_column acc leg_status 15 | -------------------------------------------------------------------------------- /etc/mysql/10_config_dialplan.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Configuring OpenSIPS CP Dialplan Tool ..." 4 | 5 | add_dp_rule() { 6 | local attr="$1" 7 | local regex="$2" 8 | local subst="$3" 9 | local repl="$4" 10 | 11 | [ -n "$subst" ] && subst="'$subst'" || subst=NULL 12 | [ -n "$repl" ] && repl="'$repl'" || repl=NULL 13 | 14 | mysql -h ${MYSQL_IP} -u ${MYSQL_USER} -p"${MYSQL_PASSWORD}" -D"${MYSQL_DATABASE}" -e \ 15 | "INSERT INTO dialplan (dpid, match_op, match_exp, subst_exp, repl_exp, attrs) 16 | SELECT 1, 1, '${regex}', ${subst}, ${repl}, '${attr}' 17 | WHERE NOT EXISTS ( 18 | SELECT 1 FROM dialplan WHERE dpid = 1 AND attrs = '${attr}');" 19 | } 20 | 21 | add_dp_rule DP_DID '^(\\+|00|011)?[1-9][0-9]{6,}$' '^(\\+|00|011)?([1-9][0-9]{6,})$' '\\2' 22 | add_dp_rule DP_USER '^[a-zA-Z][a-zA-Z0-9\\-_\\.]{4,}$' 23 | add_dp_rule DP_DND_ON '^\\*78$' 24 | add_dp_rule DP_DND_OFF '^\\*79$' 25 | add_dp_rule DP_VMLISTEN '^\\*98$' 26 | -------------------------------------------------------------------------------- /etc/mysql/10_config_domain.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Configuring OpenSIPS CP Domain Tool ..." 4 | 5 | mysql -h ${MYSQL_IP} -u ${MYSQL_USER} -p"${MYSQL_PASSWORD}" -D"${MYSQL_DATABASE}" -e \ 6 | "INSERT INTO domain (domain) 7 | SELECT '${DEFAULT_DOMAIN}' 8 | WHERE NOT EXISTS ( 9 | SELECT 1 FROM domain WHERE domain = '${DEFAULT_DOMAIN}');" 10 | -------------------------------------------------------------------------------- /etc/mysql/10_config_rtpproxy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Configuring OpenSIPS CP RTPProxy Tool ..." 4 | 5 | mysql -h ${MYSQL_IP} -u ${MYSQL_USER} -p"${MYSQL_PASSWORD}" -D ${MYSQL_DATABASE} -e \ 6 | "INSERT INTO rtpproxy_sockets (rtpproxy_sock, set_id) 7 | SELECT 'udp:${RTPPROXY_IP}:${RTPPROXY_PORT}', 0 8 | WHERE NOT EXISTS ( 9 | SELECT 1 FROM rtpproxy_sockets WHERE rtpproxy_sock = 'udp:${RTPPROXY_IP}:${RTPPROXY_PORT}');" 10 | 11 | -------------------------------------------------------------------------------- /etc/mysql/10_config_subscriber.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Configuring OpenSIPS subscriber table..." 4 | 5 | cd "$(dirname "$0")" 6 | . functions 7 | 8 | add_column subscriber cli 9 | add_column subscriber acls 'varchar(32) DEFAULT "" NOT NULL' 10 | add_column subscriber cfaw_uri 11 | add_column subscriber cfbs_uri 12 | add_column subscriber cfna_uri 13 | add_column subscriber cfnf_uri 14 | -------------------------------------------------------------------------------- /etc/mysql/20_create_dids.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Configuring DIDs Table ..." 4 | 5 | TABLE_EXISTS=$(mysql -h ${MYSQL_IP} -u ${MYSQL_USER} -p"${MYSQL_PASSWORD}" -D"${MYSQL_DATABASE}" -e \ 6 | "SELECT 1 FROM information_schema.tables WHERE table_schema = '${MYSQL_DATABASE}' AND table_name = 'dids';") 7 | 8 | if [ -n "$TABLE_EXISTS" ]; then 9 | echo "Table dids already exists" 10 | else 11 | echo "Creating dids table" 12 | mysql -h ${MYSQL_IP} -u ${MYSQL_USER} -p"${MYSQL_PASSWORD}" -D"${MYSQL_DATABASE}" -e \ 13 | "INSERT INTO version (table_name, table_version) values ('dids','1');" 14 | 15 | mysql -h ${MYSQL_IP} -u ${MYSQL_USER} -p"${MYSQL_PASSWORD}" -D"${MYSQL_DATABASE}" -e \ 16 | "CREATE TABLE dids ( 17 | id INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, 18 | alias_username CHAR(64) DEFAULT '' NOT NULL, 19 | alias_domain CHAR(64) DEFAULT '' NOT NULL, 20 | username CHAR(64) DEFAULT '' NOT NULL, 21 | domain CHAR(64) DEFAULT '' NOT NULL, 22 | CONSTRAINT alias_idx UNIQUE (alias_username, alias_domain) 23 | ) ENGINE=InnoDB;" 24 | 25 | mysql -h ${MYSQL_IP} -u ${MYSQL_USER} -p"${MYSQL_PASSWORD}" -D"${MYSQL_DATABASE}" -e \ 26 | "CREATE INDEX target_idx ON dids (username, domain);" 27 | fi 28 | -------------------------------------------------------------------------------- /etc/mysql/functions: -------------------------------------------------------------------------------- 1 | add_column() { 2 | table_name=$1 3 | column_name=$2 4 | column_options=${3:-'VARCHAR(255) DEFAULT NULL'} 5 | 6 | COLUMN_EXISTS=$(mysql -h ${MYSQL_IP} -u ${MYSQL_USER} -p"${MYSQL_PASSWORD}" -D ${MYSQL_DATABASE} -e \ 7 | "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '${table_name}' AND COLUMN_NAME = '${column_name}';") 8 | 9 | [ -z "$COLUMN_EXISTS" ] && mysql -h ${MYSQL_IP} -u ${MYSQL_USER} -p"${MYSQL_PASSWORD}" -D ${MYSQL_DATABASE} -e \ 10 | "ALTER TABLE ${table_name} ADD COLUMN ${column_name} ${column_options};" 11 | } 12 | 13 | add_parameter() { 14 | module_name=$1 15 | param_name=$2 16 | value=$3 17 | 18 | mysql -h ${MYSQL_IP} -u ${MYSQL_USER} -p"${MYSQL_PASSWORD}" -D ${MYSQL_DATABASE} -e \ 19 | "INSERT INTO ocp_tools_config (module, param, value) 20 | SELECT '${module_name}', '${param_name}', ${value} 21 | WHERE NOT EXISTS ( 22 | SELECT 1 FROM ocp_tools_config WHERE module = '${module_name}' AND param = '${param_name}');" 23 | } 24 | 25 | extract_table_name() { 26 | local sql_file="$1" 27 | 28 | table_name=$(grep -m 1 -oP 'CREATE TABLE\s+\K[`'\'']?(\w+)[`'\'']?' $sql_file | grep -oP '[`'\'']?\K\w+') 29 | 30 | echo $table_name 31 | } 32 | 33 | add_table() { 34 | local sql_file="$1" 35 | 36 | echo "Adding tables from $sql_file" 37 | 38 | mysql --force -h ${MYSQL_IP} -u ${MYSQL_USER} -p"${MYSQL_PASSWORD}" -D ${MYSQL_DATABASE} < $sql_file 39 | } 40 | -------------------------------------------------------------------------------- /etc/opensips-cp/docker-entrypoint.d/00_config_db.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd "$(dirname "$0")" 4 | . functions 5 | 6 | echo "Configuring OpenSIPS-CP database connection..." 7 | 8 | sed -i "s/localhost/${MYSQL_IP}/g" /var/www/html/opensips-cp/config/db.inc.php 9 | 10 | sed -i "s/127.0.0.1/${OPENSIPS_IP}/g" /var/www/html/opensips-cp/config/db_schema.mysql 11 | 12 | add_table /var/www/html/opensips-cp/config/db_schema.mysql 13 | -------------------------------------------------------------------------------- /etc/opensips-cp/docker-entrypoint.d/10_config_user_management.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd "$(dirname "$0")" 4 | . functions 5 | 6 | echo "Configuring OpenSIPS CP User Management Tool ..." 7 | 8 | # Password Mode 9 | add_parameter user_management passwd_mode '1' 10 | 11 | # ACLs 12 | cp -u user_management/acls.inc.php /var/www/html/opensips-cp/config/tools/users/user_management/ 13 | cp -u user_management/user_management_acls.php /var/www/html/opensips-cp/web/tools/users/user_management/ 14 | 15 | add_parameter user_management subs_extra_actions "UNHEX('7B2261636C73223A7B22686561646572223A2241434C73222C2269636F6E223A222E2E5C2F2E2E5C2F2E2E5C2F696D616765735C2F73686172655C2F6163636573732E706E67222C22616374696F6E223A225365742041434C73222C22616374696F6E5F66696C65223A22757365725F6D616E6167656D656E745F61636C732E706870222C22616374696F6E5F66756E63223A2266756E6374696F6E202824726573756C7429207B2072657475726E205C226A6176617363726970743A3B5C5C5C22206F6E636C69636B3D5C5C5C2272756E5F696E5F77696E646F772827757365725F6D616E6167656D656E745F61636C732E7068703F7569643D5C222E24726573756C745B276964275D2E5C2227295C223B7D227D7D')" 16 | 17 | add_parameter user_management subs_extra "UNHEX('7B22636661775F757269223A7B22686561646572223A22416C7761797320466F7277617264222C22696E666F223A22416C7761797320666F72776172642063616C6C7320746F207468697320555249222C2273686F775F696E5F6D61696E5F666F726D223A747275652C2273686F775F696E5F6164645F666F726D223A747275652C2273686F775F696E5F656469745F666F726D223A747275652C2269735F6F7074696F6E616C223A2279222C2273656172636861626C65223A66616C73657D2C22636662735F757269223A7B22686561646572223A224275737920466F7277617264222C22696E666F223A225768656E20627573792C20666F7277617264207468652063616C6C20746F207468697320555249222C2273686F775F696E5F6D61696E5F666F726D223A747275652C2273686F775F696E5F6164645F666F726D223A747275652C2273686F775F696E5F656469745F666F726D223A747275652C2269735F6F7074696F6E616C223A2279222C2273656172636861626C65223A66616C73657D2C2263666E615F757269223A7B22686561646572223A224E6F20416E7377657220466F7277617264222C22696E666F223A225768656E207468657265206973206E6F20616E737765722C20666F7277617264207468652063616C6C20746F207468697320555249222C2273686F775F696E5F6D61696E5F666F726D223A747275652C2273686F775F696E5F6164645F666F726D223A747275652C2273686F775F696E5F656469745F666F726D223A747275652C2269735F6F7074696F6E616C223A2279222C2273656172636861626C65223A66616C73657D2C2263666E665F757269223A7B22686561646572223A224E6F7420466F756E6420466F7277617264222C22696E666F223A225768656E2063616C6C6565206973206E6F7420666F756E642C20666F7277617264207468652063616C6C20746F207468697320555249222C2273686F775F696E5F6D61696E5F666F726D223A747275652C2273686F775F696E5F6164645F666F726D223A747275652C2273686F775F696E5F656469745F666F726D223A747275652C2269735F6F7074696F6E616C223A2279222C2273656172636861626C65223A66616C73657D7D')" 18 | 19 | add_parameter user_management user_format_func "UNHEX('66756E6374696F6E28247573657229207B0D0A202020207265717569726528226D695F636F6D6D2E70687022293B0D0A202020207265717569726528226366675F636F6D6D2E70687022293B0D0A0D0A20202020246D695F636F6E6E6563746F7273203D206765745F70726F7879735F62795F6173736F635F6964286765745F73657474696E67735F76616C7565282774616C6B5F746F5F746869735F6173736F635F69642729293B0D0A0D0A20202020246572726F7273203D205B5D3B0D0A0D0A2020202069662028656D70747928246D695F636F6E6E6563746F72732929207B0D0A202020202020202072657475726E2066616C73653B0D0A202020207D0D0A0D0A2020202024726573756C74203D206D695F636F6D6D616E64282264705F7472616E736C617465222C205B226470696422203D3E20312C2022696E70757422203D3E2024757365725D2C20246D695F636F6E6E6563746F72735B305D2C20246572726F7273293B0D0A0D0A202020206966202821656D70747928246572726F72732929207B0D0A202020202020202072657475726E2066616C73653B0D0A202020207D0D0A0D0A2020202072657475726E2024726573756C745B2241545452494255544553225D203D3D202244505F55534552223B0D0A7D')" 20 | -------------------------------------------------------------------------------- /etc/opensips-cp/docker-entrypoint.d/20_config_alias_management.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd "$(dirname "$0")" 4 | . functions 5 | 6 | echo "Configuring OpenSIPS CP Alias Management Tool ..." 7 | 8 | add_parameter alias_management table_aliases "'{\"DIDs\":\"dids\"}'" 9 | add_parameter alias_management implicit_domain '1' 10 | add_parameter alias_management suppress_alias_type '1' 11 | -------------------------------------------------------------------------------- /etc/opensips-cp/docker-entrypoint.d/30_config_drouting.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd "$(dirname "$0")" 4 | . functions 5 | 6 | echo "Configuring OpenSIPS CP Dynamic Routing Tool..." 7 | 8 | add_parameter drouting tabs "'gateways.php,carriers.php,rules.php'" 9 | add_parameter drouting group_ids_file "'{\"1\":\"Default\"}'" 10 | add_parameter drouting gw_attributes_mode "'none'" 11 | add_parameter drouting carrier_attributes_mode "'none'" 12 | -------------------------------------------------------------------------------- /etc/opensips-cp/docker-entrypoint.d/user_management/acls.inc.php: -------------------------------------------------------------------------------- 1 | "User Enabled", 25 | "N" => "Force NAT", 26 | "P" => "Enable PSTN", 27 | "D" => "DND", 28 | "4" => "VM Enabled", 29 | "5" => "VM Permanent Redirect", 30 | "6" => "VM Redirect Not Found", 31 | "7" => "VM Redirect on Busy", 32 | "8" => "VM Redirect on No Answer" 33 | ); 34 | 35 | ?> 36 | -------------------------------------------------------------------------------- /etc/opensips-cp/docker-entrypoint.d/user_management/user_management_acls.php: -------------------------------------------------------------------------------- 1 | prepare($sql); 23 | if ($stm===FALSE || $stm->execute( array($acls, $uid) )===FALSE) { 24 | $errors[] = 'Failed to update subscriber\'s ACLS'; 25 | } 26 | }else{ 27 | $errors[] = "User with Read-Only Rights"; 28 | } 29 | 30 | return; 31 | } 32 | 33 | # otherwise, we query for the user 34 | $stm = $link->prepare($sql); 35 | if ($stm === false) { 36 | die('Failed to issue query ['.$sql.'], error message : ' . print_r($link->errorInfo(), true)); 37 | } 38 | $stm->execute( array($uid) ); 39 | $info = $stm->fetchAll(PDO::FETCH_ASSOC)[0]; 40 | 41 | // we consider 20 as a reasonable number of acls / row 42 | $max_rows = 20; 43 | if (sizeof($config_user_acls) <= $max_rows) { 44 | $height = 80 + sizeof($config_user_acls) * 25; 45 | $columns = 1; 46 | } else { 47 | $height = 580; 48 | $columns = ceil(sizeof($config_user_acls) / $max_rows); 49 | } 50 | 51 | ?> 52 |
53 | ACLs for subscriber @ 54 |
55 |
56 | 57 |
58 | 59 | 60 | 0) { 63 | $keys = array_keys($config_user_acls); 64 | $size = count($keys); 65 | for ($r = 0; $r < min($size, $max_rows); $r++) { 66 | echo(''); 67 | for ($c = 0; $c < $columns; $c++) { 68 | $index = $c * $max_rows + $r; 69 | if ($index < $size) { 70 | $k = $keys[$index]; 71 | $v = $config_user_acls[$k]; 72 | $checked = (strpos($acls, (string)$k) === false)?false:true; 73 | echo(''); 76 | } else { 77 | echo(''); 78 | } 79 | } 80 | echo(''); 81 | } 82 | } 83 | ?> 84 |

85 | 86 |
87 |
88 | 89 |
90 |
91 |
92 | 93 |
94 | 95 | -------------------------------------------------------------------------------- /etc/opensips-cp/image/modules.inc.php: -------------------------------------------------------------------------------- 1 | array ( 29 | "enabled" => true, 30 | "name" => "Access" 31 | ), 32 | "boxes_config" => array ( 33 | "enabled" => true, 34 | "name" => "Boxes" 35 | ), 36 | "db_config" => array ( 37 | "enabled" => true, 38 | "name" => "DB config" 39 | ) 40 | ); 41 | 42 | $config_modules = array ( 43 | "dashboard" => array ( 44 | "enabled" => true, 45 | "name" => "Dashboard", 46 | "icon" => "images/icon-dashboard.png", 47 | "modules" => array ( 48 | "dashboard" => array ( 49 | "enabled" => true, 50 | "name" => "Dashboard", 51 | "path" => "system/dashboard" 52 | ), 53 | ) 54 | ), 55 | "users" => array ( 56 | "enabled" => true, 57 | "name" => "Users", 58 | "icon" => "images/icon-user.svg", 59 | "modules" => array ( 60 | "user_management" => array ( 61 | "enabled" => true, 62 | "name" => "User Management" 63 | ), 64 | "alias_management" => array ( 65 | "enabled" => true, 66 | "name" => "Alias Management" 67 | ), 68 | "group_management" => array ( 69 | "enabled" => false, 70 | "name" => "Group Management" 71 | ), 72 | ) 73 | ), 74 | "system" => array ( 75 | "enabled" => true, 76 | "name" => "System", 77 | "icon" => "images/icon-system.svg", 78 | "modules" => array ( 79 | "addresses" => array ( 80 | "enabled" => false, 81 | "name" => "Addresses" 82 | ), 83 | "callcenter" => array ( 84 | "enabled" => false, 85 | "name" => "Callcenter" 86 | ), 87 | "cdrviewer" => array ( 88 | "enabled" => true, 89 | "name" => "CDR Viewer" 90 | ), 91 | "dialog" => array ( 92 | "enabled" => true, 93 | "name" => "Dialog" 94 | ), 95 | "dialplan" => array ( 96 | "enabled" => true, 97 | "name" => "Dialplan" 98 | ), 99 | "dispatcher" => array ( 100 | "enabled" => true, 101 | "name" => "Dispatcher" 102 | ), 103 | "domains" => array ( 104 | "enabled" => true, 105 | "name" => "Domains" 106 | ), 107 | "drouting" => array ( 108 | "enabled" => true, 109 | "name" => "Dynamic Routing" 110 | ), 111 | "clusterer" => array ( 112 | "enabled" => false, 113 | "name" => "Clusterer" 114 | ), 115 | "keepalived" => array ( 116 | "enabled" => false, 117 | "name" => "Keepalived" 118 | ), 119 | "loadbalancer" => array ( 120 | "enabled" => false, 121 | "name" => "Load Balancer" 122 | ), 123 | "mi" => array ( 124 | "enabled" => true, 125 | "name" => "MI Commands" 126 | ), 127 | "monit" => array ( 128 | "enabled" => false, 129 | "name" => "Monit" 130 | ), 131 | "rtpproxy" => array ( 132 | "enabled" => true, 133 | "name" => "RTPProxy" 134 | ), 135 | "rtpengine" => array ( 136 | "enabled" => false, 137 | "name" => "RTPEngine" 138 | ), 139 | "siptrace" => array ( 140 | "enabled" => false, 141 | "name" => "SIP Trace" 142 | ), 143 | "smonitor" => array ( 144 | "enabled" => true, 145 | "name" => "Statistics Monitor" 146 | ), 147 | "statusreport" => array ( 148 | "enabled" => true, 149 | "name" => "Status Report" 150 | ), 151 | "tls_mgm" => array ( 152 | "enabled" => false, 153 | "name" => "TLS Management" 154 | ), 155 | "uac_registrant" => array ( 156 | "enabled" => false, 157 | "name" => "UAC Registrant" 158 | ), 159 | "smpp" => array ( 160 | "enabled" => false, 161 | "name" => "SMPP Gateway" 162 | ), 163 | "tcp_mgm" => array ( 164 | "enabled" => false, 165 | "name" => "TCP Management" 166 | ), 167 | "tracer" => array ( 168 | "enabled" => false, 169 | "name" => "Tracer" 170 | ), 171 | ) 172 | ), 173 | ); 174 | 175 | 176 | 177 | 178 | ?> 179 | -------------------------------------------------------------------------------- /run-sipssert.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | TESTS_DIR=${1:-tests} 4 | test -n "$1" && shift 5 | 6 | docker run --rm -t \ 7 | --env-file .env \ 8 | -v /var/run/docker.sock:/var/run/docker.sock \ 9 | -v "$(pwd)/${TESTS_DIR}":"$(pwd)/${TESTS_DIR}" \ 10 | -w "$(pwd)/${TESTS_DIR}" \ 11 | opensips/sipssert . $@ 12 | -------------------------------------------------------------------------------- /tests/01.register_disabled/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 30 3 | 4 | init_tasks: 5 | - name: Disable ACL caller 6 | type: mysql-client 7 | script: scripts/disable_user.sh 8 | args: {{ caller }} {{ default_domain }} 9 | 10 | - name: Disable ACL callee 11 | type: mysql-client 12 | script: scripts/disable_user.sh 13 | args: {{ callee }} {{ default_domain }} 14 | 15 | tasks: 16 | - name: Register caller 17 | type: uac-sipp 18 | username: {{ caller }} 19 | password: "{{ caller_password }}" 20 | config_file: scripts/sipp-register.xml 21 | ip: {{ caller_ip }} 22 | port: {{ caller_port }} 23 | 24 | - name: Register callee 25 | type: uac-sipp 26 | username: {{ callee }} 27 | password: "{{ callee_password }}" 28 | config_file: scripts/sipp-register.xml 29 | ip: {{ callee_ip }} 30 | port: {{ callee_port }} 31 | 32 | - name: MI check Not Registered caller 33 | type: opensips-mi 34 | script: scripts/check-register.py 35 | args: {{ caller }} 36 | require: 37 | after: 38 | task: Register caller 39 | wait: 1 40 | 41 | - name: MI check Not Registered callee 42 | type: opensips-mi 43 | script: scripts/check-register.py 44 | args: {{ callee }} 45 | require: 46 | after: 47 | task: Register callee 48 | wait: 1 49 | 50 | cleanup_tasks: 51 | - name: Enable ACL caller 52 | type: mysql-client 53 | script: scripts/enable_user.sh 54 | args: {{ caller }} {{ default_domain }} 55 | 56 | - name: Enable ACL callee 57 | type: mysql-client 58 | script: scripts/enable_user.sh 59 | args: {{ callee }} {{ default_domain }} 60 | -------------------------------------------------------------------------------- /tests/01.register_disabled/scripts/check-register.py: -------------------------------------------------------------------------------- 1 | from opensips.mi import OpenSIPSMI, OpenSIPSMIException 2 | import sys 3 | import os 4 | 5 | conn = os.getenv('CONN', 'http') 6 | url = os.getenv('URL', 'http://localhost:8888/mi') 7 | handler = OpenSIPSMI(conn=conn, url=url) 8 | 9 | if len(sys.argv) < 2: 10 | print("FAILED: Usage: check-register.py ") 11 | sys.exit(1) 12 | 13 | username = sys.argv[1] 14 | 15 | out = handler.execute('ul_dump') 16 | l = len(out['Domains'][0]['AORs']) 17 | 18 | found = False 19 | 20 | for i in range(l): 21 | if out['Domains'][0]['AORs'][i]['AOR'].startswith(username): 22 | found = True 23 | break 24 | 25 | if found: 26 | print("FAILED: User %s found" % username) 27 | sys.exit(1) 28 | 29 | print("SUCCESS: User %s not found" % username) 30 | sys.exit(0) 31 | -------------------------------------------------------------------------------- /tests/01.register_disabled/scripts/disable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(acls, 'E', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/01.register_disabled/scripts/enable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, 'E') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/01.register_disabled/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/01.register_enabled/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 30 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Register callee 14 | type: uac-sipp 15 | username: {{ callee }} 16 | password: "{{ callee_password }}" 17 | config_file: scripts/sipp-register.xml 18 | ip: {{ callee_ip }} 19 | port: {{ callee_port }} 20 | 21 | - name: MI check Register caller 22 | type: opensips-mi 23 | script: scripts/check-register.py 24 | args: {{ caller }} 25 | require: 26 | after: 27 | task: Register caller 28 | wait: 1 29 | 30 | - name: MI check Register callee 31 | type: opensips-mi 32 | script: scripts/check-register.py 33 | args: {{ callee }} 34 | require: 35 | after: 36 | task: Register callee 37 | wait: 1 38 | 39 | cleanup_tasks: 40 | - name: Delete caller AOR 41 | type: opensips-mi 42 | args: ul_rm location {{ caller }}@{{ default_domain }} 43 | 44 | - name: Delete callee AOR 45 | type: opensips-mi 46 | args: ul_rm location {{ callee }}@{{ default_domain }} 47 | -------------------------------------------------------------------------------- /tests/01.register_enabled/scripts/check-register.py: -------------------------------------------------------------------------------- 1 | from opensips.mi import OpenSIPSMI, OpenSIPSMIException 2 | import sys 3 | import os 4 | 5 | conn = os.getenv('CONN', 'http') 6 | url = os.getenv('URL', 'http://localhost:8888/mi') 7 | handler = OpenSIPSMI(conn=conn, url=url) 8 | 9 | if len(sys.argv) < 2: 10 | print("FAILED: Usage: check-register.py ") 11 | sys.exit(1) 12 | 13 | username = sys.argv[1] 14 | 15 | out = handler.execute('ul_dump') 16 | l = len(out['Domains'][0]['AORs']) 17 | 18 | found = False 19 | 20 | for i in range(l): 21 | if out['Domains'][0]['AORs'][i]['AOR'].startswith(username): 22 | found = True 23 | break 24 | 25 | if not found: 26 | print("FAILED: User %s not found" % username) 27 | sys.exit(1) 28 | 29 | print("SUCCESS: User %s found" % username) 30 | sys.exit(0) 31 | -------------------------------------------------------------------------------- /tests/01.register_enabled/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/02.call/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Register callee 14 | type: uac-sipp 15 | username: {{ callee }} 16 | password: "{{ callee_password }}" 17 | config_file: scripts/sipp-register.xml 18 | ip: {{ callee_ip }} 19 | port: {{ callee_port }} 20 | 21 | - name: Caller UAC 22 | type: uac-sipp 23 | username: {{ caller }} 24 | password: "{{ caller_password }}" 25 | config_file: scripts/caller.xml 26 | ip: {{ caller_ip }} 27 | port: {{ caller_port }} 28 | require: 29 | - after: 30 | task: Register caller 31 | 32 | - name: Callee UAC 33 | type: uas-sipp 34 | username: {{ callee }} 35 | password: "{{ callee_password }}" 36 | config_file: scripts/callee.xml 37 | ip: {{ callee_ip }} 38 | port: {{ callee_port }} 39 | require: 40 | - after: 41 | task: Register callee 42 | - started: 43 | task: Caller UAC 44 | 45 | cleanup_tasks: 46 | - name: Delete caller AOR 47 | type: opensips-mi 48 | args: ul_rm location {{ caller }}@{{ default_domain }} 49 | 50 | - name: Delete callee AOR 51 | type: opensips-mi 52 | args: ul_rm location {{ callee }}@{{ default_domain }} 53 | -------------------------------------------------------------------------------- /tests/02.call/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/02.call_disabled_callee/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 120 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Register callee 14 | type: uac-sipp 15 | username: {{ callee }} 16 | password: "{{ callee_password }}" 17 | config_file: scripts/sipp-register.xml 18 | ip: {{ callee_ip }} 19 | port: {{ callee_port }} 20 | 21 | - name: Disable ACL callee 22 | type: mysql-client 23 | script: scripts/disable_user.sh 24 | args: {{ callee }} {{ default_domain }} 25 | require: 26 | after: 27 | task: Register callee 28 | wait: 1 29 | 30 | - name: Caller UAC 31 | type: uac-sipp 32 | username: {{ caller }} 33 | password: "{{ caller_password }}" 34 | config_file: scripts/caller.xml 35 | ip: {{ caller_ip }} 36 | port: {{ caller_port }} 37 | require: 38 | - after: 39 | task: Disable ACL callee 40 | 41 | - name: Callee UAC 42 | type: uas-sipp 43 | username: {{ callee }} 44 | password: "{{ callee_password }}" 45 | config_file: scripts/callee.xml 46 | ip: {{ callee_ip }} 47 | port: {{ callee_port }} 48 | require: 49 | - after: 50 | task: Disable ACL callee 51 | - started: 52 | task: Caller UAC 53 | 54 | - name: Fail caller UAC 55 | type: uac-sipp 56 | username: {{ caller }} 57 | password: "{{ caller_password }}" 58 | config_file: scripts/caller-fail.xml 59 | ip: {{ caller_ip }} 60 | port: {{ caller_port }} 61 | require: 62 | - after: 63 | task: Register callee 64 | wait: 70 65 | 66 | - name: Enable ACL callee 67 | type: mysql-client 68 | script: scripts/enable_user.sh 69 | args: {{ callee }} {{ default_domain }} 70 | require: 71 | after: 72 | task: Fail caller UAC 73 | wait: 1 74 | 75 | cleanup_tasks: 76 | - name: Delete caller AOR 77 | type: opensips-mi 78 | args: ul_rm location {{ caller }}@{{ default_domain }} 79 | 80 | - name: Delete callee AOR 81 | type: opensips-mi 82 | args: ul_rm location {{ callee }}@{{ default_domain }} 83 | -------------------------------------------------------------------------------- /tests/02.call_disabled_callee/scripts/caller-fail.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | \ 5 | 6 | 7 | 8 | 14 | To: 15 | From: ;tag=[call_number] 16 | Call-ID: [scenario]_fail:///[call_id] 17 | CSeq: 1 INVITE 18 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 19 | Content-Type: application/sdp 20 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 21 | Allow-Events: presence, kpml, talk, as-feature-event 22 | Content-Length: [len] 23 | 24 | v=0 25 | o=Z 0 21195650 IN IP4 [local_ip] 26 | s=Z 27 | c=IN IP4 [local_ip] 28 | t=0 0 29 | m=audio 43126 RTP/AVP 106 9 98 101 0 8 3 30 | a=rtpmap:106 opus/48000/2 31 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 32 | a=rtpmap:98 telephone-event/48000 33 | a=fmtp:98 0-16 34 | a=rtpmap:101 telephone-event/8000 35 | a=fmtp:101 0-16 36 | a=sendrecv 37 | a=rtcp-mux 38 | 39 | ]]> 40 | 41 | 42 | 43 | 44 | 45 | 46 | 52 | To: 53 | From: ;tag=[call_number] 54 | Call-ID: [scenario]_fail:///[call_id] 55 | CSeq: 1 ACK 56 | Content-Length: 0 57 | ]]> 58 | 59 | 60 | 61 | 67 | To: 68 | From: ;tag=[call_number] 69 | Call-ID: [scenario]_fail:///[call_id] 70 | CSeq: 2 INVITE 71 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 72 | Content-Type: application/sdp 73 | [authentication] 74 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 75 | Allow-Events: presence, kpml, talk, as-feature-event 76 | Content-Length: [len] 77 | 78 | v=0 79 | o=Z 0 21457613 IN IP4 [local_ip] 80 | s=Z 81 | c=IN IP4 [local_ip] 82 | t=0 0 83 | m=audio 43265 RTP/AVP 106 9 98 101 0 8 3 84 | a=rtpmap:106 opus/48000/2 85 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 86 | a=rtpmap:98 telephone-event/48000 87 | a=fmtp:98 0-16 88 | a=rtpmap:101 telephone-event/8000 89 | a=fmtp:101 0-16 90 | a=sendrecv 91 | a=rtcp-mux 92 | 93 | ]]> 94 | 95 | 96 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | [peer_tag_param] 112 | From: ;tag=[call_number] 113 | Call-ID: [scenario]_fail:///[call_id] 114 | CSeq: 2 ACK 115 | Content-Length: 0 116 | 117 | ]]> 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /tests/02.call_disabled_callee/scripts/disable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(acls, 'E', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/02.call_disabled_callee/scripts/enable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, 'E') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/02.call_disabled_callee/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/02.call_disabled_caller/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Disable ACL caller 14 | type: mysql-client 15 | script: scripts/disable_user.sh 16 | args: {{ caller }} {{ default_domain }} 17 | require: 18 | after: 19 | task: Register caller 20 | wait: 1 21 | 22 | - name: Caller UAC 23 | type: uac-sipp 24 | username: {{ caller }} 25 | password: "{{ caller_password }}" 26 | config_file: scripts/caller.xml 27 | ip: {{ caller_ip }} 28 | port: {{ caller_port }} 29 | require: 30 | - after: 31 | task: Disable ACL caller 32 | wait: 1 33 | 34 | - name: Enable ACL caller 35 | type: mysql-client 36 | script: scripts/enable_user.sh 37 | args: {{ caller }} {{ default_domain }} 38 | require: 39 | after: 40 | task: Caller UAC 41 | wait: 1 42 | 43 | cleanup_tasks: 44 | - name: Delete caller AOR 45 | type: opensips-mi 46 | args: ul_rm location {{ caller }}@{{ default_domain }} 47 | -------------------------------------------------------------------------------- /tests/02.call_disabled_caller/scripts/caller.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | \ 5 | 6 | 7 | 8 | 14 | To: 15 | From: ;tag=[call_number] 16 | Call-ID: [scenario]:///[call_id] 17 | CSeq: 1 INVITE 18 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 19 | Content-Type: application/sdp 20 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 21 | Allow-Events: presence, kpml, talk, as-feature-event 22 | Content-Length: [len] 23 | 24 | v=0 25 | o=Z 0 21195650 IN IP4 [local_ip] 26 | s=Z 27 | c=IN IP4 [local_ip] 28 | t=0 0 29 | m=audio 43126 RTP/AVP 106 9 98 101 0 8 3 30 | a=rtpmap:106 opus/48000/2 31 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 32 | a=rtpmap:98 telephone-event/48000 33 | a=fmtp:98 0-16 34 | a=rtpmap:101 telephone-event/8000 35 | a=fmtp:101 0-16 36 | a=sendrecv 37 | a=rtcp-mux 38 | 39 | ]]> 40 | 41 | 42 | 43 | 44 | 45 | 46 | 52 | To: 53 | From: ;tag=[call_number] 54 | Call-ID: [scenario]:///[call_id] 55 | CSeq: 1 ACK 56 | Content-Length: 0 57 | ]]> 58 | 59 | 60 | 61 | 67 | To: 68 | From: ;tag=[call_number] 69 | Call-ID: [scenario]:///[call_id] 70 | CSeq: 2 INVITE 71 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 72 | Content-Type: application/sdp 73 | [authentication] 74 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 75 | Allow-Events: presence, kpml, talk, as-feature-event 76 | Content-Length: [len] 77 | 78 | v=0 79 | o=Z 0 21457613 IN IP4 [local_ip] 80 | s=Z 81 | c=IN IP4 [local_ip] 82 | t=0 0 83 | m=audio 43265 RTP/AVP 106 9 98 101 0 8 3 84 | a=rtpmap:106 opus/48000/2 85 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 86 | a=rtpmap:98 telephone-event/48000 87 | a=fmtp:98 0-16 88 | a=rtpmap:101 telephone-event/8000 89 | a=fmtp:101 0-16 90 | a=sendrecv 91 | a=rtcp-mux 92 | 93 | ]]> 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | [peer_tag_param] 108 | From: ;tag=[call_number] 109 | Call-ID: [scenario]:///[call_id] 110 | CSeq: 2 ACK 111 | Content-Length: 0 112 | 113 | ]]> 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /tests/02.call_disabled_caller/scripts/disable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(acls, 'E', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/02.call_disabled_caller/scripts/enable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, 'E') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/02.call_disabled_caller/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/03.call_unregistered_callee/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Check callee not registered 14 | type: opensips-mi 15 | script: scripts/check-register.py 16 | args: {{ callee }} 17 | 18 | - name: Caller UAC 19 | type: uac-sipp 20 | username: {{ caller }} 21 | password: "{{ caller_password }}" 22 | config_file: scripts/caller.xml 23 | ip: {{ caller_ip }} 24 | port: {{ caller_port }} 25 | require: 26 | - after: 27 | task: Check callee not registered 28 | 29 | cleanup_tasks: 30 | - name: Delete caller AOR 31 | type: opensips-mi 32 | args: ul_rm location {{ caller }}@{{ default_domain }} 33 | -------------------------------------------------------------------------------- /tests/03.call_unregistered_callee/scripts/caller.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | \ 5 | 6 | 7 | 8 | 14 | To: 15 | From: ;tag=[call_number] 16 | Call-ID: [scenario]:///[call_id] 17 | CSeq: 1 INVITE 18 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 19 | Content-Type: application/sdp 20 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 21 | Allow-Events: presence, kpml, talk, as-feature-event 22 | Content-Length: [len] 23 | 24 | v=0 25 | o=Z 0 21195650 IN IP4 [local_ip] 26 | s=Z 27 | c=IN IP4 [local_ip] 28 | t=0 0 29 | m=audio 43126 RTP/AVP 106 9 98 101 0 8 3 30 | a=rtpmap:106 opus/48000/2 31 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 32 | a=rtpmap:98 telephone-event/48000 33 | a=fmtp:98 0-16 34 | a=rtpmap:101 telephone-event/8000 35 | a=fmtp:101 0-16 36 | a=sendrecv 37 | a=rtcp-mux 38 | 39 | ]]> 40 | 41 | 42 | 43 | 44 | 45 | 46 | 52 | To: 53 | From: ;tag=[call_number] 54 | Call-ID: [scenario]:///[call_id] 55 | CSeq: 1 ACK 56 | Content-Length: 0 57 | ]]> 58 | 59 | 60 | 61 | 67 | To: 68 | From: ;tag=[call_number] 69 | Call-ID: [scenario]:///[call_id] 70 | CSeq: 2 INVITE 71 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 72 | Content-Type: application/sdp 73 | [authentication] 74 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 75 | Allow-Events: presence, kpml, talk, as-feature-event 76 | Content-Length: [len] 77 | 78 | v=0 79 | o=Z 0 21457613 IN IP4 [local_ip] 80 | s=Z 81 | c=IN IP4 [local_ip] 82 | t=0 0 83 | m=audio 43265 RTP/AVP 106 9 98 101 0 8 3 84 | a=rtpmap:106 opus/48000/2 85 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 86 | a=rtpmap:98 telephone-event/48000 87 | a=fmtp:98 0-16 88 | a=rtpmap:101 telephone-event/8000 89 | a=fmtp:101 0-16 90 | a=sendrecv 91 | a=rtcp-mux 92 | 93 | ]]> 94 | 95 | 96 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | [peer_tag_param] 112 | From: ;tag=[call_number] 113 | Call-ID: [scenario]:///[call_id] 114 | CSeq: 2 ACK 115 | Content-Length: 0 116 | 117 | ]]> 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /tests/03.call_unregistered_callee/scripts/check-register.py: -------------------------------------------------------------------------------- 1 | from opensips.mi import OpenSIPSMI, OpenSIPSMIException 2 | import sys 3 | import os 4 | 5 | conn = os.getenv('CONN', 'http') 6 | url = os.getenv('URL', 'http://localhost:8888/mi') 7 | handler = OpenSIPSMI(conn=conn, url=url) 8 | 9 | if len(sys.argv) < 2: 10 | print("FAILED: Usage: check-register.py ") 11 | sys.exit(1) 12 | 13 | username = sys.argv[1] 14 | 15 | out = handler.execute('ul_dump') 16 | l = len(out['Domains'][0]['AORs']) 17 | 18 | found = False 19 | 20 | for i in range(l): 21 | if out['Domains'][0]['AORs'][i]['AOR'].startswith(username): 22 | found = True 23 | break 24 | 25 | if found: 26 | print("FAILED: User %s found" % username) 27 | sys.exit(1) 28 | 29 | print("SUCCESS: User %s not found" % username) 30 | sys.exit(0) 31 | -------------------------------------------------------------------------------- /tests/03.call_unregistered_callee/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/03.call_vm_always/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | init_tasks: 5 | - name: Enable VM ALWAYS for callee 6 | type: mysql-client 7 | script: scripts/enable_vm.sh 8 | args: {{ callee }} {{ default_domain }} 9 | 10 | tasks: 11 | - name: Register caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Register callee 20 | type: uac-sipp 21 | username: {{ callee }} 22 | password: "{{ callee_password }}" 23 | config_file: scripts/sipp-register.xml 24 | ip: {{ callee_ip }} 25 | port: {{ callee_port }} 26 | 27 | - name: Caller UAC 28 | type: uac-sipp 29 | username: {{ caller }} 30 | password: "{{ caller_password }}" 31 | config_file: scripts/caller.xml 32 | ip: {{ caller_ip }} 33 | port: {{ caller_port }} 34 | require: 35 | - after: Register caller 36 | - after: Register callee 37 | 38 | cleanup_tasks: 39 | - name: Delete caller AOR 40 | type: opensips-mi 41 | args: ul_rm location {{ caller }}@{{ default_domain }} 42 | 43 | - name: Delete callee AOR 44 | type: opensips-mi 45 | args: ul_rm location {{ callee }}@{{ default_domain }} 46 | 47 | - name: Disable VM ALWAYS for callee 48 | type: mysql-client 49 | script: scripts/disable_vm.sh 50 | args: {{ callee }} {{ default_domain }} 51 | -------------------------------------------------------------------------------- /tests/03.call_vm_always/scripts/disable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(REPLACE(acls, '4', ''), '5', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/03.call_vm_always/scripts/enable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, '45') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/03.call_vm_always/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/03.call_vm_not_found/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | init_tasks: 5 | - name: Enable VM NOT FOUND for callee 6 | type: mysql-client 7 | script: scripts/enable_vm.sh 8 | args: {{ callee }} {{ default_domain }} 9 | 10 | tasks: 11 | - name: Register caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Check callee not registered 20 | type: opensips-mi 21 | script: scripts/check-register.py 22 | args: {{ callee }} 23 | 24 | - name: Caller UAC 25 | type: uac-sipp 26 | username: {{ caller }} 27 | password: "{{ caller_password }}" 28 | config_file: scripts/caller.xml 29 | ip: {{ caller_ip }} 30 | port: {{ caller_port }} 31 | require: 32 | - after: 33 | task: Register caller 34 | wait: 1 35 | 36 | cleanup_tasks: 37 | - name: Delete caller AOR 38 | type: opensips-mi 39 | args: ul_rm location {{ caller }}@{{ default_domain }} 40 | 41 | - name: Disable VM NOT FOUND for callee 42 | type: mysql-client 43 | script: scripts/disable_vm.sh 44 | args: {{ callee }} {{ default_domain }} 45 | -------------------------------------------------------------------------------- /tests/03.call_vm_not_found/scripts/check-register.py: -------------------------------------------------------------------------------- 1 | from opensips.mi import OpenSIPSMI, OpenSIPSMIException 2 | import sys 3 | import os 4 | 5 | conn = os.getenv('CONN', 'http') 6 | url = os.getenv('URL', 'http://localhost:8888/mi') 7 | handler = OpenSIPSMI(conn=conn, url=url) 8 | 9 | if len(sys.argv) < 2: 10 | print("FAILED: Usage: check-register.py ") 11 | sys.exit(1) 12 | 13 | username = sys.argv[1] 14 | 15 | out = handler.execute('ul_dump') 16 | l = len(out['Domains'][0]['AORs']) 17 | 18 | found = False 19 | 20 | for i in range(l): 21 | if out['Domains'][0]['AORs'][i]['AOR'].startswith(username): 22 | found = True 23 | break 24 | 25 | if found: 26 | print("FAILED: User %s found" % username) 27 | sys.exit(1) 28 | 29 | print("SUCCESS: User %s not found" % username) 30 | sys.exit(0) 31 | -------------------------------------------------------------------------------- /tests/03.call_vm_not_found/scripts/disable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(REPLACE(acls, '4', ''), '6', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/03.call_vm_not_found/scripts/enable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, '46') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/03.call_vm_not_found/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/04.call_callee_reject/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Register callee 14 | type: uac-sipp 15 | username: {{ callee }} 16 | password: "{{ callee_password }}" 17 | config_file: scripts/sipp-register.xml 18 | ip: {{ callee_ip }} 19 | port: {{ callee_port }} 20 | 21 | - name: Caller UAC 22 | type: uac-sipp 23 | username: {{ caller }} 24 | password: "{{ caller_password }}" 25 | config_file: scripts/caller.xml 26 | ip: {{ caller_ip }} 27 | port: {{ caller_port }} 28 | require: 29 | - after: 30 | task: Register caller 31 | 32 | - name: Callee UAC 33 | type: uas-sipp 34 | username: {{ callee }} 35 | password: "{{ callee_password }}" 36 | config_file: scripts/callee.xml 37 | ip: {{ callee_ip }} 38 | port: {{ callee_port }} 39 | require: 40 | - after: 41 | task: Register callee 42 | - started: 43 | task: Caller UAC 44 | 45 | cleanup_tasks: 46 | - name: Delete caller AOR 47 | type: opensips-mi 48 | args: ul_rm location {{ caller }}@{{ default_domain }} 49 | 50 | - name: Delete callee AOR 51 | type: opensips-mi 52 | args: ul_rm location {{ callee }}@{{ default_domain }} 53 | -------------------------------------------------------------------------------- /tests/04.call_callee_reject/scripts/callee.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 60 | Content-Length: 0 61 | 62 | ]]> 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 79 | 80 | 90 | 91 | 92 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /tests/04.call_callee_reject/scripts/caller.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | \ 5 | 6 | 7 | 8 | 14 | To: 15 | From: ;tag=[call_number] 16 | Call-ID: [scenario]:///[call_id] 17 | CSeq: 1 INVITE 18 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 19 | Content-Type: application/sdp 20 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 21 | Allow-Events: presence, kpml, talk, as-feature-event 22 | Content-Length: [len] 23 | 24 | v=0 25 | o=Z 0 21195650 IN IP4 [local_ip] 26 | s=Z 27 | c=IN IP4 [local_ip] 28 | t=0 0 29 | m=audio 43126 RTP/AVP 106 9 98 101 0 8 3 30 | a=rtpmap:106 opus/48000/2 31 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 32 | a=rtpmap:98 telephone-event/48000 33 | a=fmtp:98 0-16 34 | a=rtpmap:101 telephone-event/8000 35 | a=fmtp:101 0-16 36 | a=sendrecv 37 | a=rtcp-mux 38 | 39 | ]]> 40 | 41 | 42 | 43 | 44 | 45 | 46 | 52 | To: 53 | From: ;tag=[call_number] 54 | Call-ID: [scenario]:///[call_id] 55 | CSeq: 1 ACK 56 | Content-Length: 0 57 | ]]> 58 | 59 | 60 | 61 | 67 | To: 68 | From: ;tag=[call_number] 69 | Call-ID: [scenario]:///[call_id] 70 | CSeq: 2 INVITE 71 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 72 | Content-Type: application/sdp 73 | [authentication] 74 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 75 | Allow-Events: presence, kpml, talk, as-feature-event 76 | Content-Length: [len] 77 | 78 | v=0 79 | o=Z 0 21457613 IN IP4 [local_ip] 80 | s=Z 81 | c=IN IP4 [local_ip] 82 | t=0 0 83 | m=audio 43265 RTP/AVP 106 9 98 101 0 8 3 84 | a=rtpmap:106 opus/48000/2 85 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 86 | a=rtpmap:98 telephone-event/48000 87 | a=fmtp:98 0-16 88 | a=rtpmap:101 telephone-event/8000 89 | a=fmtp:101 0-16 90 | a=sendrecv 91 | a=rtcp-mux 92 | 93 | ]]> 94 | 95 | 96 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /tests/04.call_callee_reject/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/04.call_vm_busy/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | init_tasks: 5 | - name: Enable VM BUSY for callee 6 | type: mysql-client 7 | script: scripts/enable_vm.sh 8 | args: {{ callee }} {{ default_domain }} 9 | 10 | tasks: 11 | - name: Register caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Register callee 20 | type: uac-sipp 21 | username: {{ callee }} 22 | password: "{{ callee_password }}" 23 | config_file: scripts/sipp-register.xml 24 | ip: {{ callee_ip }} 25 | port: {{ callee_port }} 26 | 27 | - name: Caller UAC 28 | type: uac-sipp 29 | username: {{ caller }} 30 | password: "{{ caller_password }}" 31 | config_file: scripts/caller.xml 32 | ip: {{ caller_ip }} 33 | port: {{ caller_port }} 34 | require: 35 | - after: 36 | task: Register caller 37 | wait: 1 38 | 39 | - name: Callee UAC 40 | type: uac-sipp 41 | username: {{ callee }} 42 | password: "{{ callee_password }}" 43 | config_file: scripts/callee.xml 44 | ip: {{ callee_ip }} 45 | port: {{ callee_port }} 46 | require: 47 | - after: 48 | task: Register callee 49 | wait: 1 50 | 51 | cleanup_tasks: 52 | - name: Delete caller AOR 53 | type: opensips-mi 54 | args: ul_rm location {{ caller }}@{{ default_domain }} 55 | 56 | - name: Delete callee AOR 57 | type: opensips-mi 58 | args: ul_rm location {{ callee }}@{{ default_domain }} 59 | 60 | - name: Disable VM BUSY for callee 61 | type: mysql-client 62 | script: scripts/disable_vm.sh 63 | args: {{ callee }} {{ default_domain }} 64 | -------------------------------------------------------------------------------- /tests/04.call_vm_busy/scripts/callee.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 60 | Content-Length: 0 61 | 62 | ]]> 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 79 | 80 | 90 | 91 | 92 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /tests/04.call_vm_busy/scripts/disable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(REPLACE(acls, '4', ''), '7', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/04.call_vm_busy/scripts/enable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, '47') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/04.call_vm_busy/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/05.call_no_answer/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Register callee 14 | type: uac-sipp 15 | username: {{ callee }} 16 | password: "{{ callee_password }}" 17 | config_file: scripts/sipp-register.xml 18 | ip: {{ callee_ip }} 19 | port: {{ callee_port }} 20 | 21 | - name: Caller UAC 22 | type: uac-sipp 23 | username: {{ caller }} 24 | password: "{{ caller_password }}" 25 | config_file: scripts/caller.xml 26 | ip: {{ caller_ip }} 27 | port: {{ caller_port }} 28 | require: 29 | - after: 30 | task: Register caller 31 | 32 | - name: Callee UAC 33 | type: uas-sipp 34 | username: {{ callee }} 35 | password: "{{ callee_password }}" 36 | config_file: scripts/callee.xml 37 | ip: {{ callee_ip }} 38 | port: {{ callee_port }} 39 | require: 40 | - after: 41 | task: Register callee 42 | - started: 43 | task: Caller UAC 44 | 45 | cleanup_tasks: 46 | - name: Delete caller AOR 47 | type: opensips-mi 48 | args: ul_rm location {{ caller }}@{{ default_domain }} 49 | 50 | - name: Delete callee AOR 51 | type: opensips-mi 52 | args: ul_rm location {{ callee }}@{{ default_domain }} 53 | -------------------------------------------------------------------------------- /tests/05.call_no_answer/scripts/callee.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 60 | Content-Length: 0 61 | 62 | ]]> 63 | 64 | 65 | 66 | 67 | 68 | 69 | 78 | Content-Length: 0 79 | 80 | ]]> 81 | 82 | 83 | 84 | 94 | 95 | 96 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /tests/05.call_no_answer/scripts/caller.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | \ 5 | 6 | 7 | 8 | 14 | To: 15 | From: ;tag=[call_number] 16 | Call-ID: [scenario]:///[call_id] 17 | CSeq: 1 INVITE 18 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 19 | Content-Type: application/sdp 20 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 21 | Allow-Events: presence, kpml, talk, as-feature-event 22 | Content-Length: [len] 23 | 24 | v=0 25 | o=Z 0 21195650 IN IP4 [local_ip] 26 | s=Z 27 | c=IN IP4 [local_ip] 28 | t=0 0 29 | m=audio 43126 RTP/AVP 106 9 98 101 0 8 3 30 | a=rtpmap:106 opus/48000/2 31 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 32 | a=rtpmap:98 telephone-event/48000 33 | a=fmtp:98 0-16 34 | a=rtpmap:101 telephone-event/8000 35 | a=fmtp:101 0-16 36 | a=sendrecv 37 | a=rtcp-mux 38 | 39 | ]]> 40 | 41 | 42 | 43 | 44 | 45 | 46 | 52 | To: 53 | From: ;tag=[call_number] 54 | Call-ID: [scenario]:///[call_id] 55 | CSeq: 1 ACK 56 | Content-Length: 0 57 | ]]> 58 | 59 | 60 | 61 | 67 | To: 68 | From: ;tag=[call_number] 69 | Call-ID: [scenario]:///[call_id] 70 | CSeq: 2 INVITE 71 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 72 | Content-Type: application/sdp 73 | [authentication] 74 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 75 | Allow-Events: presence, kpml, talk, as-feature-event 76 | Content-Length: [len] 77 | 78 | v=0 79 | o=Z 0 21457613 IN IP4 [local_ip] 80 | s=Z 81 | c=IN IP4 [local_ip] 82 | t=0 0 83 | m=audio 43265 RTP/AVP 106 9 98 101 0 8 3 84 | a=rtpmap:106 opus/48000/2 85 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 86 | a=rtpmap:98 telephone-event/48000 87 | a=fmtp:98 0-16 88 | a=rtpmap:101 telephone-event/8000 89 | a=fmtp:101 0-16 90 | a=sendrecv 91 | a=rtcp-mux 92 | 93 | ]]> 94 | 95 | 96 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /tests/05.call_no_answer/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/05.call_vm_no_answer/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | init_tasks: 5 | - name: Enable VM NO ANSWER for callee 6 | type: mysql-client 7 | script: scripts/enable_vm.sh 8 | args: {{ callee }} {{ default_domain }} 9 | 10 | tasks: 11 | - name: Register caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Register callee 20 | type: uac-sipp 21 | username: {{ callee }} 22 | password: "{{ callee_password }}" 23 | config_file: scripts/sipp-register.xml 24 | ip: {{ callee_ip }} 25 | port: {{ callee_port }} 26 | 27 | - name: Caller UAC 28 | type: uac-sipp 29 | username: {{ caller }} 30 | password: "{{ caller_password }}" 31 | config_file: scripts/caller.xml 32 | ip: {{ caller_ip }} 33 | port: {{ caller_port }} 34 | require: 35 | - after: 36 | task: Register caller 37 | wait: 1 38 | 39 | - name: Callee UAC 40 | type: uac-sipp 41 | username: {{ callee }} 42 | password: "{{ callee_password }}" 43 | config_file: scripts/callee.xml 44 | ip: {{ callee_ip }} 45 | port: {{ callee_port }} 46 | require: 47 | - after: 48 | task: Register callee 49 | wait: 1 50 | 51 | cleanup_tasks: 52 | - name: Delete caller AOR 53 | type: opensips-mi 54 | args: ul_rm location {{ caller }}@{{ default_domain }} 55 | 56 | - name: Delete callee AOR 57 | type: opensips-mi 58 | args: ul_rm location {{ callee }}@{{ default_domain }} 59 | 60 | - name: Disable VM NO ANSWER for callee 61 | type: mysql-client 62 | script: scripts/disable_vm.sh 63 | args: {{ callee }} {{ default_domain }} 64 | -------------------------------------------------------------------------------- /tests/05.call_vm_no_answer/scripts/callee.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 60 | Content-Length: 0 61 | 62 | ]]> 63 | 64 | 65 | 66 | 67 | 68 | 69 | 78 | Content-Length: 0 79 | 80 | ]]> 81 | 82 | 83 | 84 | 94 | 95 | 96 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /tests/05.call_vm_no_answer/scripts/disable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(REPLACE(acls, '4', ''), '8', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/05.call_vm_no_answer/scripts/enable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, '48') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/05.call_vm_no_answer/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/06.db_dnd/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 60 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Register callee 14 | type: uac-sipp 15 | username: {{ callee }} 16 | password: "{{ callee_password }}" 17 | config_file: scripts/sipp-register.xml 18 | ip: {{ callee_ip }} 19 | port: {{ callee_port }} 20 | 21 | - name: DND ACL callee 22 | type: mysql-client 23 | script: scripts/set_user_dnd.sh 24 | args: {{ callee }} {{ default_domain }} 25 | require: 26 | after: 27 | task: Register callee 28 | 29 | - name: Caller UAC Busy 30 | type: uac-sipp 31 | username: {{ caller }} 32 | password: "{{ caller_password }}" 33 | config_file: scripts/caller_busy.xml 34 | ip: {{ caller_ip }} 35 | port: {{ caller_port }} 36 | require: 37 | - after: 38 | task: DND ACL callee 39 | 40 | - name: DND OFF ACL callee 41 | type: mysql-client 42 | script: scripts/unset_user_dnd.sh 43 | args: {{ callee }} {{ default_domain }} 44 | require: 45 | after: 46 | task: Caller UAC Busy 47 | 48 | - name: Caller UAC 49 | type: uac-sipp 50 | username: {{ caller }} 51 | password: "{{ caller_password }}" 52 | config_file: scripts/caller.xml 53 | ip: {{ caller_ip }} 54 | port: {{ caller_port }} 55 | require: 56 | - after: 57 | task: DND OFF ACL callee 58 | 59 | - name: Callee UAC 60 | type: uac-sipp 61 | username: {{ callee }} 62 | password: "{{ callee_password }}" 63 | config_file: scripts/callee.xml 64 | ip: {{ callee_ip }} 65 | port: {{ callee_port }} 66 | require: 67 | - after: 68 | task: DND OFF ACL callee 69 | 70 | cleanup_tasks: 71 | - name: Delete caller AOR 72 | type: opensips-mi 73 | args: ul_rm location {{ caller }}@{{ default_domain }} 74 | 75 | - name: Delete callee AOR 76 | type: opensips-mi 77 | args: ul_rm location {{ callee }}@{{ default_domain }} 78 | -------------------------------------------------------------------------------- /tests/06.db_dnd/scripts/caller_busy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | \ 5 | 6 | 7 | 8 | 14 | To: 15 | From: ;tag=[call_number] 16 | Call-ID: [scenario]_fail:///[call_id] 17 | CSeq: 1 INVITE 18 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 19 | Content-Type: application/sdp 20 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 21 | Allow-Events: presence, kpml, talk, as-feature-event 22 | Content-Length: [len] 23 | 24 | v=0 25 | o=Z 0 21195650 IN IP4 [local_ip] 26 | s=Z 27 | c=IN IP4 [local_ip] 28 | t=0 0 29 | m=audio 43126 RTP/AVP 106 9 98 101 0 8 3 30 | a=rtpmap:106 opus/48000/2 31 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 32 | a=rtpmap:98 telephone-event/48000 33 | a=fmtp:98 0-16 34 | a=rtpmap:101 telephone-event/8000 35 | a=fmtp:101 0-16 36 | a=sendrecv 37 | a=rtcp-mux 38 | 39 | ]]> 40 | 41 | 42 | 43 | 44 | 45 | 46 | 52 | To: 53 | From: ;tag=[call_number] 54 | Call-ID: [scenario]_fail:///[call_id] 55 | CSeq: 1 ACK 56 | Content-Length: 0 57 | ]]> 58 | 59 | 60 | 61 | 67 | To: 68 | From: ;tag=[call_number] 69 | Call-ID: [scenario]_fail:///[call_id] 70 | CSeq: 2 INVITE 71 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 72 | Content-Type: application/sdp 73 | [authentication] 74 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 75 | Allow-Events: presence, kpml, talk, as-feature-event 76 | Content-Length: [len] 77 | 78 | v=0 79 | o=Z 0 21457613 IN IP4 [local_ip] 80 | s=Z 81 | c=IN IP4 [local_ip] 82 | t=0 0 83 | m=audio 43265 RTP/AVP 106 9 98 101 0 8 3 84 | a=rtpmap:106 opus/48000/2 85 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 86 | a=rtpmap:98 telephone-event/48000 87 | a=fmtp:98 0-16 88 | a=rtpmap:101 telephone-event/8000 89 | a=fmtp:101 0-16 90 | a=sendrecv 91 | a=rtcp-mux 92 | 93 | ]]> 94 | 95 | 96 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | [peer_tag_param] 112 | From: ;tag=[call_number] 113 | Call-ID: [scenario]_fail:///[call_id] 114 | CSeq: 2 ACK 115 | Content-Length: 0 116 | 117 | ]]> 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /tests/06.db_dnd/scripts/set_user_dnd.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, 'D') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/06.db_dnd/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/06.db_dnd/scripts/unset_user_dnd.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(acls, 'D', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/06.star_dnd/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 60 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Register callee 14 | type: uac-sipp 15 | username: {{ callee }} 16 | password: "{{ callee_password }}" 17 | config_file: scripts/sipp-register.xml 18 | ip: {{ callee_ip }} 19 | port: {{ callee_port }} 20 | 21 | - name: Set Callee DND 22 | type: uac-sipp 23 | username: {{ callee }} 24 | password: "{{ callee_password }}" 25 | config_file: scripts/dnd_on.xml 26 | ip: {{ callee_ip }} 27 | port: {{ callee_port }} 28 | require: 29 | after: 30 | task: Register callee 31 | 32 | - name: Check DND ACL 33 | type: mysql-client 34 | script: scripts/check_dnd_on.sh 35 | args: {{ callee }} {{ default_domain }} 36 | require: 37 | after: 38 | task: Set Callee DND 39 | 40 | - name: Caller BUSY 41 | type: uac-sipp 42 | username: {{ caller }} 43 | password: "{{ caller_password }}" 44 | config_file: scripts/caller_busy.xml 45 | ip: {{ caller_ip }} 46 | port: {{ caller_port }} 47 | require: 48 | after: 49 | task: Check DND ACL 50 | 51 | - name: Reset Callee DND 52 | type: uac-sipp 53 | username: {{ callee }} 54 | password: "{{ callee_password }}" 55 | config_file: scripts/dnd_off.xml 56 | ip: {{ callee_ip }} 57 | port: {{ callee_port }} 58 | require: 59 | after: 60 | task: Caller BUSY 61 | 62 | - name: Check DND OFF ACL 63 | type: mysql-client 64 | script: scripts/check_dnd_off.sh 65 | args: {{ callee }} {{ default_domain }} 66 | require: 67 | after: 68 | task: Reset Callee DND 69 | 70 | - name: Caller UAC 71 | type: uac-sipp 72 | username: {{ caller }} 73 | password: "{{ caller_password }}" 74 | config_file: scripts/caller.xml 75 | ip: {{ caller_ip }} 76 | port: {{ caller_port }} 77 | require: 78 | after: 79 | task: Check DND OFF ACL 80 | 81 | - name: Callee UAS 82 | type: uas-sipp 83 | username: {{ callee }} 84 | password: "{{ callee_password }}" 85 | config_file: scripts/callee.xml 86 | ip: {{ callee_ip }} 87 | port: {{ callee_port }} 88 | require: 89 | after: 90 | task: Check DND OFF ACL 91 | 92 | cleanup_tasks: 93 | - name: Delete caller AOR 94 | type: opensips-mi 95 | args: ul_rm location {{ caller }}@{{ default_domain }} 96 | 97 | - name: Delete callee AOR 98 | type: opensips-mi 99 | args: ul_rm location {{ callee }}@{{ default_domain }} 100 | -------------------------------------------------------------------------------- /tests/06.star_dnd/scripts/caller_busy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | \ 5 | 6 | 7 | 8 | 14 | To: 15 | From: ;tag=[call_number] 16 | Call-ID: [scenario]_fail:///[call_id] 17 | CSeq: 1 INVITE 18 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 19 | Content-Type: application/sdp 20 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 21 | Allow-Events: presence, kpml, talk, as-feature-event 22 | Content-Length: [len] 23 | 24 | v=0 25 | o=Z 0 21195650 IN IP4 [local_ip] 26 | s=Z 27 | c=IN IP4 [local_ip] 28 | t=0 0 29 | m=audio 43126 RTP/AVP 106 9 98 101 0 8 3 30 | a=rtpmap:106 opus/48000/2 31 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 32 | a=rtpmap:98 telephone-event/48000 33 | a=fmtp:98 0-16 34 | a=rtpmap:101 telephone-event/8000 35 | a=fmtp:101 0-16 36 | a=sendrecv 37 | a=rtcp-mux 38 | 39 | ]]> 40 | 41 | 42 | 43 | 44 | 45 | 46 | 52 | To: 53 | From: ;tag=[call_number] 54 | Call-ID: [scenario]_fail:///[call_id] 55 | CSeq: 1 ACK 56 | Content-Length: 0 57 | ]]> 58 | 59 | 60 | 61 | 67 | To: 68 | From: ;tag=[call_number] 69 | Call-ID: [scenario]_fail:///[call_id] 70 | CSeq: 2 INVITE 71 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 72 | Content-Type: application/sdp 73 | [authentication] 74 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 75 | Allow-Events: presence, kpml, talk, as-feature-event 76 | Content-Length: [len] 77 | 78 | v=0 79 | o=Z 0 21457613 IN IP4 [local_ip] 80 | s=Z 81 | c=IN IP4 [local_ip] 82 | t=0 0 83 | m=audio 43265 RTP/AVP 106 9 98 101 0 8 3 84 | a=rtpmap:106 opus/48000/2 85 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 86 | a=rtpmap:98 telephone-event/48000 87 | a=fmtp:98 0-16 88 | a=rtpmap:101 telephone-event/8000 89 | a=fmtp:101 0-16 90 | a=sendrecv 91 | a=rtcp-mux 92 | 93 | ]]> 94 | 95 | 96 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | [peer_tag_param] 112 | From: ;tag=[call_number] 113 | Call-ID: [scenario]_fail:///[call_id] 114 | CSeq: 2 ACK 115 | Content-Length: 0 116 | 117 | ]]> 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /tests/06.star_dnd/scripts/check_dnd_off.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "SELECT username FROM subscriber WHERE username = '$1' AND domain = '$2' AND acls NOT LIKE '%D%';" | grep "$1" -------------------------------------------------------------------------------- /tests/06.star_dnd/scripts/check_dnd_on.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "SELECT username FROM subscriber WHERE username = '$1' AND domain = '$2' AND acls LIKE '%D%';" | grep "$1" -------------------------------------------------------------------------------- /tests/06.star_dnd/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/06.star_dnd_with_vm/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 60 3 | 4 | init_tasks: 5 | - name: Enable VM BUSY for callee 6 | type: mysql-client 7 | script: scripts/enable_vm.sh 8 | args: {{ callee }} {{ default_domain }} 9 | 10 | tasks: 11 | - name: Register caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Register callee 20 | type: uac-sipp 21 | username: {{ callee }} 22 | password: "{{ callee_password }}" 23 | config_file: scripts/sipp-register.xml 24 | ip: {{ callee_ip }} 25 | port: {{ callee_port }} 26 | 27 | - name: Set Callee DND 28 | type: uac-sipp 29 | username: {{ callee }} 30 | password: "{{ callee_password }}" 31 | config_file: scripts/dnd_on.xml 32 | ip: {{ callee_ip }} 33 | port: {{ callee_port }} 34 | require: 35 | after: 36 | task: Register callee 37 | 38 | - name: Check DND ACL 39 | type: mysql-client 40 | script: scripts/check_dnd_on.sh 41 | args: {{ callee }} {{ default_domain }} 42 | require: 43 | after: 44 | task: Set Callee DND 45 | 46 | - name: Caller VM 47 | type: uac-sipp 48 | username: {{ caller }} 49 | password: "{{ caller_password }}" 50 | config_file: scripts/caller_vm.xml 51 | ip: {{ caller_ip }} 52 | port: {{ caller_port }} 53 | require: 54 | after: 55 | task: Check DND ACL 56 | 57 | - name: Reset Callee DND 58 | type: uac-sipp 59 | username: {{ callee }} 60 | password: "{{ callee_password }}" 61 | config_file: scripts/dnd_off.xml 62 | ip: {{ callee_ip }} 63 | port: {{ callee_port }} 64 | require: 65 | after: 66 | task: Caller VM 67 | 68 | - name: Check DND OFF ACL 69 | type: mysql-client 70 | script: scripts/check_dnd_off.sh 71 | args: {{ callee }} {{ default_domain }} 72 | require: 73 | after: 74 | task: Reset Callee DND 75 | 76 | - name: Caller UAC 77 | type: uac-sipp 78 | username: {{ caller }} 79 | password: "{{ caller_password }}" 80 | config_file: scripts/caller.xml 81 | ip: {{ caller_ip }} 82 | port: {{ caller_port }} 83 | require: 84 | after: 85 | task: Check DND OFF ACL 86 | 87 | - name: Callee UAS 88 | type: uas-sipp 89 | username: {{ callee }} 90 | password: "{{ callee_password }}" 91 | config_file: scripts/callee.xml 92 | ip: {{ callee_ip }} 93 | port: {{ callee_port }} 94 | require: 95 | after: 96 | task: Check DND OFF ACL 97 | 98 | cleanup_tasks: 99 | - name: Delete caller AOR 100 | type: opensips-mi 101 | args: ul_rm location {{ caller }}@{{ default_domain }} 102 | 103 | - name: Delete callee AOR 104 | type: opensips-mi 105 | args: ul_rm location {{ callee }}@{{ default_domain }} 106 | 107 | - name: Disable VM BUSY for callee 108 | type: mysql-client 109 | script: scripts/disable_vm.sh 110 | args: {{ callee }} {{ default_domain }} 111 | -------------------------------------------------------------------------------- /tests/06.star_dnd_with_vm/scripts/check_dnd_off.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "SELECT username FROM subscriber WHERE username = '$1' AND domain = '$2' AND acls NOT LIKE '%D%';" | grep "$1" -------------------------------------------------------------------------------- /tests/06.star_dnd_with_vm/scripts/check_dnd_on.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "SELECT username FROM subscriber WHERE username = '$1' AND domain = '$2' AND acls LIKE '%D%';" | grep "$1" -------------------------------------------------------------------------------- /tests/06.star_dnd_with_vm/scripts/disable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(REPLACE(acls, '4', ''), '7', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/06.star_dnd_with_vm/scripts/enable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, '47') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/06.star_dnd_with_vm/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/07.cf_always/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 60 3 | 4 | init_tasks: 5 | - name: Add CF Always URI for callee 6 | type: mysql-client 7 | script: scripts/add_cf_uri.sh 8 | args: {{ callee }} {{ default_domain }} sip:{{ cf_user }}@{{ default_domain }} 9 | 10 | tasks: 11 | - name: Register caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Register call forward user 20 | type: uac-sipp 21 | username: {{ cf_user }} 22 | password: "{{ cf_pass }}" 23 | config_file: scripts/sipp-register.xml 24 | ip: {{ cf_ip }} 25 | port: {{ cf_port }} 26 | 27 | - name: Caller UAC 28 | type: uac-sipp 29 | username: {{ caller }} 30 | password: "{{ caller_password }}" 31 | config_file: scripts/caller.xml 32 | ip: {{ caller_ip }} 33 | port: {{ caller_port }} 34 | keys: 35 | task_tag: nocallee 36 | require: 37 | after: Register caller 38 | after: Register call forward user 39 | 40 | - name: CF User UAC 41 | type: uas-sipp 42 | username: {{ cf_user }} 43 | password: "{{ cf_pass }}" 44 | config_file: scripts/cf-user.xml 45 | ip: {{ cf_ip }} 46 | port: {{ cf_port }} 47 | require: 48 | after: Register caller 49 | after: Register call forward user 50 | 51 | - name: Register Callee 52 | type: uac-sipp 53 | username: {{ callee }} 54 | password: "{{ callee_password }}" 55 | config_file: scripts/sipp-register.xml 56 | ip: {{ callee_ip }} 57 | port: {{ callee_port }} 58 | require: 59 | after: Caller UAC 60 | after: CF User UAC 61 | 62 | - name: Caller UAC 2 63 | type: uac-sipp 64 | username: {{ caller }} 65 | password: "{{ caller_password }}" 66 | config_file: scripts/caller.xml 67 | ip: {{ caller_ip }} 68 | port: {{ caller_port }} 69 | keys: 70 | task_tag: withcallee 71 | require: 72 | after: Register Callee 73 | 74 | - name: CF User UAC 2 75 | type: uas-sipp 76 | username: {{ cf_user }} 77 | password: "{{ cf_pass }}" 78 | config_file: scripts/cf-user.xml 79 | ip: {{ cf_ip }} 80 | port: {{ cf_port }} 81 | require: 82 | after: Register Callee 83 | 84 | cleanup_tasks: 85 | - name: Delete caller AOR 86 | type: opensips-mi 87 | args: ul_rm location {{ caller }}@{{ default_domain }} 88 | 89 | - name: Delete callee AOR 90 | type: opensips-mi 91 | args: ul_rm location {{ callee }}@{{ default_domain }} 92 | 93 | - name: Delete call forward user AOR 94 | type: opensips-mi 95 | args: ul_rm location {{ cf_user }}@{{ default_domain }} 96 | 97 | - name: Remove CF Always URI for callee 98 | type: mysql-client 99 | script: scripts/remove_cf_uri.sh 100 | args: {{ callee }} {{ default_domain }} 101 | -------------------------------------------------------------------------------- /tests/07.cf_always/scripts/add_cf_uri.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET cfaw_uri='$3' WHERE username='$1' AND domain='$2';" -------------------------------------------------------------------------------- /tests/07.cf_always/scripts/disable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(acls, 'E', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/07.cf_always/scripts/enable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, 'E') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/07.cf_always/scripts/remove_cf_uri.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET cfaw_uri=NULL WHERE username='$1' AND domain='$2';" -------------------------------------------------------------------------------- /tests/07.cf_always/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/07.cf_busy/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 60 3 | 4 | init_tasks: 5 | - name: Add CF Busy URI for callee 6 | type: mysql-client 7 | script: scripts/add_cf_uri.sh 8 | args: {{ callee }} {{ default_domain }} sip:{{ cf_user }}@{{ default_domain }} 9 | 10 | tasks: 11 | - name: Register Caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Register call forward user 20 | type: uac-sipp 21 | username: {{ cf_user }} 22 | password: "{{ cf_pass }}" 23 | config_file: scripts/sipp-register.xml 24 | ip: {{ cf_ip }} 25 | port: {{ cf_port }} 26 | 27 | - name: Register Callee 28 | type: uac-sipp 29 | username: {{ callee }} 30 | password: "{{ callee_password }}" 31 | config_file: scripts/sipp-register.xml 32 | ip: {{ callee_ip }} 33 | port: {{ callee_port }} 34 | 35 | - name: Caller UAC 36 | type: uac-sipp 37 | username: {{ caller }} 38 | password: "{{ caller_password }}" 39 | config_file: scripts/caller.xml 40 | ip: {{ caller_ip }} 41 | port: {{ caller_port }} 42 | require: 43 | after: Register Caller 44 | after: Register call forward user 45 | after: Register Callee 46 | 47 | - name: CF User UAC 48 | type: uas-sipp 49 | username: {{ cf_user }} 50 | password: "{{ cf_pass }}" 51 | config_file: scripts/cf-user.xml 52 | ip: {{ cf_ip }} 53 | port: {{ cf_port }} 54 | require: 55 | after: Register Caller 56 | after: Register call forward user 57 | after: Register Callee 58 | 59 | - name: Callee UAC 60 | type: uas-sipp 61 | username: {{ callee }} 62 | password: "{{ callee_password }}" 63 | config_file: scripts/callee.xml 64 | ip: {{ callee_ip }} 65 | port: {{ callee_port }} 66 | require: 67 | after: Register Caller 68 | after: Register call forward user 69 | after: Register Callee 70 | 71 | cleanup_tasks: 72 | - name: Delete caller AOR 73 | type: opensips-mi 74 | args: ul_rm location {{ caller }}@{{ default_domain }} 75 | 76 | - name: Delete callee AOR 77 | type: opensips-mi 78 | args: ul_rm location {{ callee }}@{{ default_domain }} 79 | 80 | - name: Delete call forward user AOR 81 | type: opensips-mi 82 | args: ul_rm location {{ cf_user }}@{{ default_domain }} 83 | 84 | - name: Remove CF Busy URI for callee 85 | type: mysql-client 86 | script: scripts/remove_cf_uri.sh 87 | args: {{ callee }} {{ default_domain }} 88 | -------------------------------------------------------------------------------- /tests/07.cf_busy/scripts/add_cf_uri.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET cfbs_uri='$3' WHERE username='$1' AND domain='$2';" -------------------------------------------------------------------------------- /tests/07.cf_busy/scripts/callee.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 60 | Content-Length: 0 61 | 62 | ]]> 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 79 | 80 | 90 | 91 | 92 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /tests/07.cf_busy/scripts/disable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(acls, 'E', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/07.cf_busy/scripts/enable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, 'E') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/07.cf_busy/scripts/remove_cf_uri.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET cfbs_uri=NULL WHERE username='$1' AND domain='$2';" -------------------------------------------------------------------------------- /tests/07.cf_busy/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/07.cf_no_answer/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 60 3 | 4 | init_tasks: 5 | - name: Add CF No Answer URI for callee 6 | type: mysql-client 7 | script: scripts/add_cf_uri.sh 8 | args: {{ callee }} {{ default_domain }} sip:{{ cf_user }}@{{ default_domain }} 9 | 10 | tasks: 11 | - name: Register Caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Register call forward user 20 | type: uac-sipp 21 | username: {{ cf_user }} 22 | password: "{{ cf_pass }}" 23 | config_file: scripts/sipp-register.xml 24 | ip: {{ cf_ip }} 25 | port: {{ cf_port }} 26 | 27 | - name: Register Callee 28 | type: uac-sipp 29 | username: {{ callee }} 30 | password: "{{ callee_password }}" 31 | config_file: scripts/sipp-register.xml 32 | ip: {{ callee_ip }} 33 | port: {{ callee_port }} 34 | 35 | - name: Caller UAC 36 | type: uac-sipp 37 | username: {{ caller }} 38 | password: "{{ caller_password }}" 39 | config_file: scripts/caller.xml 40 | ip: {{ caller_ip }} 41 | port: {{ caller_port }} 42 | require: 43 | after: Register Caller 44 | after: Register call forward user 45 | after: Register Callee 46 | 47 | - name: Callee UAC 48 | type: uas-sipp 49 | username: {{ callee }} 50 | password: "{{ callee_password }}" 51 | config_file: scripts/callee.xml 52 | ip: {{ callee_ip }} 53 | port: {{ callee_port }} 54 | require: 55 | after: Register Caller 56 | after: Register call forward user 57 | after: Register Callee 58 | 59 | - name: CF User UAC 60 | type: uas-sipp 61 | username: {{ cf_user }} 62 | password: "{{ cf_pass }}" 63 | config_file: scripts/cf-user.xml 64 | ip: {{ cf_ip }} 65 | port: {{ cf_port }} 66 | require: 67 | after: Callee UAC 68 | 69 | cleanup_tasks: 70 | - name: Delete caller AOR 71 | type: opensips-mi 72 | args: ul_rm location {{ caller }}@{{ default_domain }} 73 | 74 | - name: Delete callee AOR 75 | type: opensips-mi 76 | args: ul_rm location {{ callee }}@{{ default_domain }} 77 | 78 | - name: Delete call forward user AOR 79 | type: opensips-mi 80 | args: ul_rm location {{ cf_user }}@{{ default_domain }} 81 | 82 | - name: Remove CF No Answer URI for callee 83 | type: mysql-client 84 | script: scripts/remove_cf_uri.sh 85 | args: {{ callee }} {{ default_domain }} 86 | -------------------------------------------------------------------------------- /tests/07.cf_no_answer/scripts/add_cf_uri.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET cfna_uri='$3' WHERE username='$1' AND domain='$2';" -------------------------------------------------------------------------------- /tests/07.cf_no_answer/scripts/callee.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 60 | Content-Length: 0 61 | 62 | ]]> 63 | 64 | 65 | 66 | 67 | 68 | 69 | 78 | Content-Length: 0 79 | 80 | ]]> 81 | 82 | 83 | 84 | 94 | 95 | 96 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /tests/07.cf_no_answer/scripts/disable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(acls, 'E', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/07.cf_no_answer/scripts/enable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, 'E') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/07.cf_no_answer/scripts/remove_cf_uri.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET cfna_uri=NULL WHERE username='$1' AND domain='$2';" -------------------------------------------------------------------------------- /tests/07.cf_no_answer/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/07.cf_not_found/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 60 3 | 4 | init_tasks: 5 | - name: Add CF Not Found URI for callee 6 | type: mysql-client 7 | script: scripts/add_cf_uri.sh 8 | args: {{ callee }} {{ default_domain }} sip:{{ cf_user }}@{{ default_domain }} 9 | 10 | tasks: 11 | - name: Register caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Register call forward user 20 | type: uac-sipp 21 | username: {{ cf_user }} 22 | password: "{{ cf_pass }}" 23 | config_file: scripts/sipp-register.xml 24 | ip: {{ cf_ip }} 25 | port: {{ cf_port }} 26 | 27 | - name: Caller UAC 28 | type: uac-sipp 29 | username: {{ caller }} 30 | password: "{{ caller_password }}" 31 | config_file: scripts/caller.xml 32 | ip: {{ caller_ip }} 33 | port: {{ caller_port }} 34 | keys: 35 | task_tag: nocallee 36 | require: 37 | after: Register caller 38 | after: Register call forward user 39 | 40 | - name: CF User UAC 41 | type: uas-sipp 42 | username: {{ cf_user }} 43 | password: "{{ cf_pass }}" 44 | config_file: scripts/responder.xml 45 | ip: {{ cf_ip }} 46 | port: {{ cf_port }} 47 | require: 48 | after: Register caller 49 | after: Register call forward user 50 | 51 | - name: Register Callee 52 | type: uac-sipp 53 | username: {{ callee }} 54 | password: "{{ callee_password }}" 55 | config_file: scripts/sipp-register.xml 56 | ip: {{ callee_ip }} 57 | port: {{ callee_port }} 58 | require: 59 | after: Caller UAC 60 | after: CF User UAC 61 | 62 | - name: Caller UAC 2 63 | type: uac-sipp 64 | username: {{ caller }} 65 | password: "{{ caller_password }}" 66 | config_file: scripts/caller.xml 67 | ip: {{ caller_ip }} 68 | port: {{ caller_port }} 69 | keys: 70 | task_tag: withcallee 71 | require: 72 | after: Register Callee 73 | 74 | - name: Callee UAC 2 75 | type: uas-sipp 76 | username: {{ callee }} 77 | password: "{{ callee_password }}" 78 | config_file: scripts/responder.xml 79 | ip: {{ callee_ip }} 80 | port: {{ callee_port }} 81 | require: 82 | after: Register Callee 83 | 84 | cleanup_tasks: 85 | - name: Delete caller AOR 86 | type: opensips-mi 87 | args: ul_rm location {{ caller }}@{{ default_domain }} 88 | 89 | - name: Delete callee AOR 90 | type: opensips-mi 91 | args: ul_rm location {{ callee }}@{{ default_domain }} 92 | 93 | - name: Delete call forward user AOR 94 | type: opensips-mi 95 | args: ul_rm location {{ cf_user }}@{{ default_domain }} 96 | 97 | - name: Remove CF Not Found URI for callee 98 | type: mysql-client 99 | script: scripts/remove_cf_uri.sh 100 | args: {{ callee }} {{ default_domain }} 101 | -------------------------------------------------------------------------------- /tests/07.cf_not_found/scripts/add_cf_uri.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET cfnf_uri='$3' WHERE username='$1' AND domain='$2';" -------------------------------------------------------------------------------- /tests/07.cf_not_found/scripts/disable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(acls, 'E', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/07.cf_not_found/scripts/enable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, 'E') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/07.cf_not_found/scripts/remove_cf_uri.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET cfnf_uri=NULL WHERE username='$1' AND domain='$2';" -------------------------------------------------------------------------------- /tests/07.cf_not_found/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/08.call_did/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Register callee 14 | type: uac-sipp 15 | username: {{ callee }} 16 | password: "{{ callee_password }}" 17 | config_file: scripts/sipp-register.xml 18 | ip: {{ callee_ip }} 19 | port: {{ callee_port }} 20 | 21 | - name: Caller UAC 22 | type: uac-sipp 23 | username: {{ caller }} 24 | password: "{{ caller_password }}" 25 | config_file: scripts/caller.xml 26 | ip: {{ caller_ip }} 27 | port: {{ caller_port }} 28 | keys: 29 | callee_did: {{ callee_did }} 30 | require: 31 | - after: 32 | task: Register caller 33 | 34 | - name: Callee UAC 35 | type: uas-sipp 36 | username: {{ callee }} 37 | password: "{{ callee_password }}" 38 | config_file: scripts/callee.xml 39 | ip: {{ callee_ip }} 40 | port: {{ callee_port }} 41 | require: 42 | - started: 43 | task: Caller UAC 44 | 45 | cleanup_tasks: 46 | - name: Delete caller AOR 47 | type: opensips-mi 48 | args: ul_rm location {{ caller }}@{{ default_domain }} 49 | 50 | - name: Delete callee AOR 51 | type: opensips-mi 52 | args: ul_rm location {{ callee }}@{{ default_domain }} 53 | -------------------------------------------------------------------------------- /tests/08.call_did/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/09.unknown_domain_callee/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Caller UAC 14 | type: uac-sipp 15 | username: {{ caller }} 16 | password: "{{ caller_password }}" 17 | config_file: scripts/caller.xml 18 | ip: {{ caller_ip }} 19 | port: {{ caller_port }} 20 | keys: 21 | unknown_domain: {{ opensips_ip }}:{{ callee_port }} 22 | require: 23 | - after: 24 | task: Register caller 25 | 26 | - name: Callee UAC 27 | type: uas-sipp 28 | username: {{ callee }} 29 | password: "{{ callee_password }}" 30 | config_file: scripts/callee.xml 31 | ip: {{ callee_ip }} 32 | port: {{ callee_port }} 33 | require: 34 | - after: 35 | task: Register caller 36 | 37 | cleanup_tasks: 38 | - name: Delete caller AOR 39 | type: opensips-mi 40 | args: ul_rm location {{ caller }}@{{ default_domain }} 41 | 42 | - name: Delete callee AOR 43 | type: opensips-mi 44 | args: ul_rm location {{ callee }}@{{ default_domain }} 45 | -------------------------------------------------------------------------------- /tests/09.unknown_domain_callee/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/09.unknown_domain_caller/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | tasks: 5 | - name: Caller UAC 6 | type: uac-sipp 7 | config_file: scripts/caller.xml 8 | ip: {{ caller_ip }} 9 | port: {{ caller_port }} 10 | keys: 11 | unknown_domain: domain.unknown 12 | -------------------------------------------------------------------------------- /tests/09.unknown_domain_caller/scripts/caller.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | \ 5 | 6 | 7 | 8 | 14 | To: 15 | From: ;tag=[call_number] 16 | Call-ID: [scenario]:///[call_id] 17 | CSeq: 1 INVITE 18 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 19 | Content-Type: application/sdp 20 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 21 | Allow-Events: presence, kpml, talk, as-feature-event 22 | Content-Length: [len] 23 | 24 | v=0 25 | o=Z 0 21195650 IN IP4 [local_ip] 26 | s=Z 27 | c=IN IP4 [local_ip] 28 | t=0 0 29 | m=audio 43126 RTP/AVP 106 9 98 101 0 8 3 30 | a=rtpmap:106 opus/48000/2 31 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 32 | a=rtpmap:98 telephone-event/48000 33 | a=fmtp:98 0-16 34 | a=rtpmap:101 telephone-event/8000 35 | a=fmtp:101 0-16 36 | a=sendrecv 37 | a=rtcp-mux 38 | 39 | ]]> 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | [peer_tag_param] 54 | From: ;tag=[call_number] 55 | Call-ID: [scenario]:///[call_id] 56 | CSeq: 2 ACK 57 | Content-Length: 0 58 | 59 | ]]> 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /tests/10.listen_vm_disabled/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | tasks: 5 | - name: Register caller 6 | type: uac-sipp 7 | username: {{ caller }} 8 | password: "{{ caller_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ caller_ip }} 11 | port: {{ caller_port }} 12 | 13 | - name: Caller UAC 14 | type: uac-sipp 15 | username: {{ caller }} 16 | password: "{{ caller_password }}" 17 | config_file: scripts/caller.xml 18 | ip: {{ caller_ip }} 19 | port: {{ caller_port }} 20 | require: 21 | - after: 22 | task: Register caller 23 | 24 | cleanup_tasks: 25 | - name: Delete caller AOR 26 | type: opensips-mi 27 | args: ul_rm location {{ caller }}@{{ default_domain }} 28 | -------------------------------------------------------------------------------- /tests/10.listen_vm_disabled/scripts/caller.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | \ 5 | 6 | 7 | 8 | 14 | To: 15 | From: ;tag=[call_number] 16 | Call-ID: [scenario]:///[call_id] 17 | CSeq: 1 INVITE 18 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 19 | Content-Type: application/sdp 20 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 21 | Allow-Events: presence, kpml, talk, as-feature-event 22 | Content-Length: [len] 23 | 24 | v=0 25 | o=Z 0 21195650 IN IP4 [local_ip] 26 | s=Z 27 | c=IN IP4 [local_ip] 28 | t=0 0 29 | m=audio 43126 RTP/AVP 106 9 98 101 0 8 3 30 | a=rtpmap:106 opus/48000/2 31 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 32 | a=rtpmap:98 telephone-event/48000 33 | a=fmtp:98 0-16 34 | a=rtpmap:101 telephone-event/8000 35 | a=fmtp:101 0-16 36 | a=sendrecv 37 | a=rtcp-mux 38 | 39 | ]]> 40 | 41 | 42 | 43 | 44 | 45 | 46 | 52 | To: 53 | From: ;tag=[call_number] 54 | Call-ID: [scenario]:///[call_id] 55 | CSeq: 1 ACK 56 | Content-Length: 0 57 | ]]> 58 | 59 | 60 | 61 | 67 | To: 68 | From: ;tag=[call_number] 69 | Call-ID: [scenario]:///[call_id] 70 | CSeq: 2 INVITE 71 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 72 | Content-Type: application/sdp 73 | [authentication] 74 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 75 | Allow-Events: presence, kpml, talk, as-feature-event 76 | Content-Length: [len] 77 | 78 | v=0 79 | o=Z 0 21457613 IN IP4 [local_ip] 80 | s=Z 81 | c=IN IP4 [local_ip] 82 | t=0 0 83 | m=audio 43265 RTP/AVP 106 9 98 101 0 8 3 84 | a=rtpmap:106 opus/48000/2 85 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 86 | a=rtpmap:98 telephone-event/48000 87 | a=fmtp:98 0-16 88 | a=rtpmap:101 telephone-event/8000 89 | a=fmtp:101 0-16 90 | a=sendrecv 91 | a=rtcp-mux 92 | 93 | ]]> 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | [peer_tag_param] 108 | From: ;tag=[call_number] 109 | Call-ID: [scenario]:///[call_id] 110 | CSeq: 2 ACK 111 | Content-Length: 0 112 | 113 | ]]> 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /tests/10.listen_vm_disabled/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/10.listen_vm_enabled/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 40 3 | 4 | init_tasks: 5 | - name: Enable VM for caller 6 | type: mysql-client 7 | script: scripts/enable_vm.sh 8 | args: {{ caller }} {{ default_domain }} 9 | 10 | tasks: 11 | - name: Register caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Caller UAC 20 | type: uac-sipp 21 | username: {{ caller }} 22 | password: "{{ caller_password }}" 23 | config_file: scripts/caller.xml 24 | ip: {{ caller_ip }} 25 | port: {{ caller_port }} 26 | require: 27 | - after: 28 | task: Register caller 29 | 30 | cleanup_tasks: 31 | - name: Delete caller AOR 32 | type: opensips-mi 33 | args: ul_rm location {{ caller }}@{{ default_domain }} 34 | 35 | - name: Disable VM for caller 36 | type: mysql-client 37 | script: scripts/disable_vm.sh 38 | args: {{ caller }} {{ default_domain }} 39 | -------------------------------------------------------------------------------- /tests/10.listen_vm_enabled/scripts/disable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(acls, '4', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/10.listen_vm_enabled/scripts/enable_vm.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, '4') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/10.listen_vm_enabled/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/11.call_gateway/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 60 3 | 4 | init_tasks: 5 | - name: Allow PSTN for Caller 6 | type: mysql-client 7 | script: scripts/allow_pstn.sh 8 | args: {{ caller }} {{ default_domain }} 9 | 10 | tasks: 11 | - name: Register caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Caller UAC 20 | type: uac-sipp 21 | config_file: scripts/caller.xml 22 | username: {{ caller }} 23 | password: "{{ caller_password }}" 24 | ip: {{ caller_ip }} 25 | port: {{ caller_port }} 26 | keys: 27 | did: {{ outgoing_did }} 28 | require: 29 | - after: 30 | task: Register caller 31 | 32 | - name: Gateway UAS 33 | type: uas-sipp 34 | config_file: scripts/gateway.xml 35 | ip: {{ gateway1_ip }} 36 | port: {{ gateway1_port }} 37 | require: 38 | - started: 39 | task: Caller UAC 40 | 41 | cleanup_tasks: 42 | - name: Deny PSTN for Caller 43 | type: mysql-client 44 | script: scripts/deny_pstn.sh 45 | args: {{ caller }} {{ default_domain }} 46 | 47 | - name: Delete caller AOR 48 | type: opensips-mi 49 | args: ul_rm location {{ caller }}@{{ default_domain }} 50 | -------------------------------------------------------------------------------- /tests/11.call_gateway/scripts/allow_pstn.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, 'P') WHERE username = '$1' AND domain = '$2';" -------------------------------------------------------------------------------- /tests/11.call_gateway/scripts/deny_pstn.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(acls, 'P', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/11.call_gateway/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/11.call_gateway2/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 60 3 | 4 | init_tasks: 5 | - name: Allow PSTN for Caller 6 | type: mysql-client 7 | script: scripts/allow_pstn.sh 8 | args: {{ caller }} {{ default_domain }} 9 | 10 | tasks: 11 | - name: Register caller 12 | type: uac-sipp 13 | username: {{ caller }} 14 | password: "{{ caller_password }}" 15 | config_file: scripts/sipp-register.xml 16 | ip: {{ caller_ip }} 17 | port: {{ caller_port }} 18 | 19 | - name: Caller UAC 20 | type: uac-sipp 21 | config_file: scripts/caller.xml 22 | username: {{ caller }} 23 | password: "{{ caller_password }}" 24 | ip: {{ caller_ip }} 25 | port: {{ caller_port }} 26 | keys: 27 | did: {{ outgoing_did }} 28 | require: 29 | - after: 30 | task: Register caller 31 | 32 | - name: Gateway UAS 33 | type: uas-sipp 34 | config_file: scripts/gateway.xml 35 | ip: {{ gateway2_ip }} 36 | port: {{ gateway2_port }} 37 | require: 38 | - started: 39 | task: Caller UAC 40 | 41 | cleanup_tasks: 42 | - name: Deny PSTN for Caller 43 | type: mysql-client 44 | script: scripts/deny_pstn.sh 45 | args: {{ caller }} {{ default_domain }} 46 | 47 | - name: Delete caller AOR 48 | type: opensips-mi 49 | args: ul_rm location {{ caller }}@{{ default_domain }} 50 | -------------------------------------------------------------------------------- /tests/11.call_gateway2/scripts/allow_pstn.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, 'P') WHERE username = '$1' AND domain = '$2';" -------------------------------------------------------------------------------- /tests/11.call_gateway2/scripts/deny_pstn.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = REPLACE(acls, 'P', '') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/11.call_gateway2/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/11.gateway_call_did/scenario.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 30 3 | 4 | tasks: 5 | - name: Register callee 6 | type: uac-sipp 7 | username: {{ callee }} 8 | password: "{{ callee_password }}" 9 | config_file: scripts/sipp-register.xml 10 | ip: {{ callee_ip }} 11 | port: {{ callee_port }} 12 | 13 | - name: Callee UAC 14 | type: uas-sipp 15 | config_file: scripts/callee.xml 16 | ip: {{ callee_ip }} 17 | port: {{ callee_port }} 18 | require: Register callee 19 | 20 | - name: Gateway UAC 21 | type: uac-sipp 22 | config_file: scripts/gateway.xml 23 | ip: {{ gateway1_ip }} 24 | port: {{ gateway1_port }} 25 | keys: 26 | callee_did: {{ callee_did }} 27 | require: 28 | started: Callee UAC 29 | 30 | cleanup_tasks: 31 | - name: Delete callee AOR 32 | type: opensips-mi 33 | args: ul_rm location {{ callee }}@{{ default_domain }} 34 | -------------------------------------------------------------------------------- /tests/11.gateway_call_did/scripts/gateway.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | \ 5 | 6 | 7 | 8 | 14 | To: 15 | From: ;tag=[call_number] 16 | Call-ID: [scenario]:///[call_id] 17 | CSeq: 1 INVITE 18 | Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE 19 | Content-Type: application/sdp 20 | Supported: replaces, norefersub, extended-refer, timer, sec-agree, outbound, path, X-cisco-serviceuri 21 | Allow-Events: presence, kpml, talk, as-feature-event 22 | Content-Length: [len] 23 | 24 | v=0 25 | o=Z 0 21195650 IN IP4 [local_ip] 26 | s=Z 27 | c=IN IP4 [local_ip] 28 | t=0 0 29 | m=audio 43126 RTP/AVP 106 9 98 101 0 8 3 30 | a=rtpmap:106 opus/48000/2 31 | a=fmtp:106 sprop-maxcapturerate=16000; minptime=20; useinbandfec=1 32 | a=rtpmap:98 telephone-event/48000 33 | a=fmtp:98 0-16 34 | a=rtpmap:101 telephone-event/8000 35 | a=fmtp:101 0-16 36 | a=sendrecv 37 | a=rtcp-mux 38 | 39 | ]]> 40 | 41 | 42 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | [peer_tag_param] 63 | From: ;tag=[call_number] 64 | [routes] 65 | CSeq: 1 ACK 66 | Contact: 67 | Call-ID: [scenario]:///[call_id] 68 | Max-Forwards: 70 69 | Content-Length: 0 70 | 71 | ]]> 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | [peer_tag_param] 85 | From: ;tag=[call_number] 86 | [routes] 87 | CSeq: 2 BYE 88 | Contact: 89 | Call-ID: [scenario]:///[call_id] 90 | Max-Forwards: 70 91 | Content-Length: 0 92 | 93 | ]]> 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /tests/11.gateway_call_did/scripts/sipp-register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | From: ;tag=[call_number] 15 | Contact: ;transport=[transport] 16 | Expires: 60 17 | Call-ID: [scenario]-register-[service]:///[call_id] 18 | Supported: path 19 | Max-Forwards: 70 20 | CSeq: 1 REGISTER 21 | Content-Length: 0 22 | 23 | ]]> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | From: ;tag=[call_number] 36 | Contact: ;transport=[transport] 37 | Expires: 60 38 | [authentication] 39 | Call-ID: [scenario]-register-[service]:///[call_id] 40 | Supported: path 41 | Max-Forwards: 70 42 | CSeq: 2 REGISTER 43 | Content-Length: 0 44 | 45 | ]]> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/cleanup_tasks/delete_did.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "DELETE FROM dids WHERE alias_username='$1';" -------------------------------------------------------------------------------- /tests/cleanup_tasks/delete_gateway.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "DELETE FROM dr_gateways WHERE address = '$1';" -------------------------------------------------------------------------------- /tests/cleanup_tasks/delete_rule.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "DELETE FROM dr_rules WHERE prefix = '$1';" -------------------------------------------------------------------------------- /tests/cleanup_tasks/remove_domain.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "DELETE FROM domain WHERE domain = '$1';" 2 | -------------------------------------------------------------------------------- /tests/defines.yml: -------------------------------------------------------------------------------- 1 | caller: caller 2 | caller_password: 123456 3 | caller_port: 5065 4 | callee: callee 5 | callee_password: 123456 6 | callee_port: 5066 7 | default_domain: domain.test 8 | opensips_ip: {{ 'HOST_IP' | getenv }} 9 | opensips_port: 5060 10 | mi_ip: {{ 'OPENSIPS_IP' | getenv }} 11 | caller_ip: {{ 'HOST_IP' | getenv }} 12 | callee_ip: {{ 'HOST_IP' | getenv }} 13 | mysql_ip: {{ 'MYSQL_IP' | getenv }} 14 | mysql_user: {{ 'MYSQL_USER' | getenv }} 15 | mysql_password: {{ 'MYSQL_PASSWORD' | getenv }} 16 | database: opensips 17 | cf_user: callforward 18 | cf_pass: 123456 19 | cf_ip: {{ 'HOST_IP' | getenv }} 20 | cf_port: 5067 21 | callee_did: 1715201 22 | gateway1_ip: {{ 'HOST_IP' | getenv }} 23 | gateway1_port: 5100 24 | gateway2_ip: {{ 'HOST_IP' | getenv }} 25 | gateway2_port: 5200 26 | outgoing_did: 1225200 27 | -------------------------------------------------------------------------------- /tests/init_tasks/add_did.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "REPLACE INTO dids (alias_username, alias_domain, username, domain) VALUES ('$3', '$2', '$1', '$2');" 2 | -------------------------------------------------------------------------------- /tests/init_tasks/add_domain.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "REPLACE INTO domain (domain) VALUES ('$1');" 2 | -------------------------------------------------------------------------------- /tests/init_tasks/add_gateway.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "REPLACE INTO dr_gateways (gwid, type, address, strip, pri_prefix, attrs, probe_mode, state, socket, description) VALUES ('$1', 1, '$2', 0, '', '', 0, 0, '', '$3');" 2 | -------------------------------------------------------------------------------- /tests/init_tasks/add_rule.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "REPLACE INTO dr_rules VALUES (1, '1', $1, '', 0, '', '$2', 'N', NULL, NULL, '$3');" 2 | -------------------------------------------------------------------------------- /tests/init_tasks/enable_user.sh: -------------------------------------------------------------------------------- 1 | mysql opensips -e "UPDATE subscriber SET acls = CONCAT(acls, 'E') WHERE username = '$1' AND domain = '$2';" 2 | -------------------------------------------------------------------------------- /tests/run.yml: -------------------------------------------------------------------------------- 1 | --- 2 | logging: 3 | controller: 4 | level: DEBUG 5 | # console: true 6 | exclude: 7 | - 11.gateway_call_did 8 | os: 9 | - ubuntu-latest 10 | --------------------------------------------------------------------------------