From 9cec80d11d784b0d51ba2b34dd9547135f381487 Mon Sep 17 00:00:00 2001 From: AP Orlebeke Date: Fri, 5 Apr 2024 04:55:28 -0400 Subject: [PATCH 01/99] typo --- .../Asterisk-Architecture-The-Big-Picture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Fundamentals/Asterisk-Architecture/Asterisk-Architecture-The-Big-Picture.md b/docs/Fundamentals/Asterisk-Architecture/Asterisk-Architecture-The-Big-Picture.md index c43d68a11c..e8984145c0 100644 --- a/docs/Fundamentals/Asterisk-Architecture/Asterisk-Architecture-The-Big-Picture.md +++ b/docs/Fundamentals/Asterisk-Architecture/Asterisk-Architecture-The-Big-Picture.md @@ -5,7 +5,7 @@ pageid: 4817479 Before we dive too far into the various types of modules, let's first take a step back and look at the overall architecture of Asterisk. -Asterisk a big program with many components, with complex relationships. To be able to use it, you don't have to know how everything relates in extreme detail. Below is a simplified diagram intended to illustrate the relationships of some major components to each other and to entities outside Asterisk. It is useful to understand how a component may relate to things outside Asterisk as Asterisk is not typically operating without some connectivity or interaction with other network devices or files on the local system. +Asterisk is a big program with many components, with complex relationships. To be able to use it, you don't have to know how everything relates in extreme detail. Below is a simplified diagram intended to illustrate the relationships of some major components to each other and to entities outside Asterisk. It is useful to understand how a component may relate to things outside Asterisk as Asterisk is not typically operating without some connectivity or interaction with other network devices or files on the local system. An Asterisk System ================== From a1b5eceef62fb098ebe1ac3c8fe35703ceaec946 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Fri, 5 Apr 2024 07:46:22 -0600 Subject: [PATCH 02/99] Add Certified Asterisk 20.7 API Documentation --- docs/.pages | 1 + docs/Certified-Asterisk_20.7_Documentation/Upgrading.md | 5 +++++ docs/Certified-Asterisk_20.7_Documentation/WhatsNew.md | 7 +++++++ docs/Certified-Asterisk_20.7_Documentation/index.md | 5 +++++ 4 files changed, 18 insertions(+) create mode 100644 docs/Certified-Asterisk_20.7_Documentation/Upgrading.md create mode 100644 docs/Certified-Asterisk_20.7_Documentation/WhatsNew.md create mode 100644 docs/Certified-Asterisk_20.7_Documentation/index.md diff --git a/docs/.pages b/docs/.pages index ffd98993a9..eebd98b5c7 100644 --- a/docs/.pages +++ b/docs/.pages @@ -14,6 +14,7 @@ nav: - Asterisk_20_Documentation - Asterisk_21_Documentation - Certified-Asterisk_18.9_Documentation + - Certified-Asterisk_20.7_Documentation - Test-Suite-Documentation - Historical-Documentation diff --git a/docs/Certified-Asterisk_20.7_Documentation/Upgrading.md b/docs/Certified-Asterisk_20.7_Documentation/Upgrading.md new file mode 100644 index 0000000000..ef3c96af42 --- /dev/null +++ b/docs/Certified-Asterisk_20.7_Documentation/Upgrading.md @@ -0,0 +1,5 @@ +--- +title: Upgrading to Certified Asterisk 20.7 +--- + +For a complete list upgrade information in Certified Asterisk 20.7 please see the [ChangeLogs](https://github.com/asterisk/asterisk/tree/releases/certified-20.7/ChangeLogs) included with Certified Asterisk 20.7. diff --git a/docs/Certified-Asterisk_20.7_Documentation/WhatsNew.md b/docs/Certified-Asterisk_20.7_Documentation/WhatsNew.md new file mode 100644 index 0000000000..edbc686d0b --- /dev/null +++ b/docs/Certified-Asterisk_20.7_Documentation/WhatsNew.md @@ -0,0 +1,7 @@ +--- +title: New in Certified 20.7 +--- + +# What's New in Certified Asterisk 20.7 + +For a complete list of changes and new things in Certified Asterisk 20.7 please see the [ChangeLogs](https://github.com/asterisk/asterisk/tree/releases/certified-20.7/ChangeLogs) included with Certified Asterisk 20.7. diff --git a/docs/Certified-Asterisk_20.7_Documentation/index.md b/docs/Certified-Asterisk_20.7_Documentation/index.md new file mode 100644 index 0000000000..b404eaf812 --- /dev/null +++ b/docs/Certified-Asterisk_20.7_Documentation/index.md @@ -0,0 +1,5 @@ +--- +title: Certified Asterisk 20.7 Documentation +--- + +# This is documentation specific to Certified Asterisk 20.7 From 47b0572479bd7c9cfca458a06f46c75f70a2d4d3 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Mon, 22 Apr 2024 06:26:28 -0600 Subject: [PATCH 03/99] astxml2markdown.py: Fix documentation paths for certified branches --- utils/astxml2markdown.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/utils/astxml2markdown.py b/utils/astxml2markdown.py index 394b8461f1..eb42671645 100755 --- a/utils/astxml2markdown.py +++ b/utils/astxml2markdown.py @@ -171,10 +171,16 @@ def build_seealso_references(self, node): link = refnode.text.replace(" ", "_") if self.parent.get(type) is not None: - link = '[%s %s%s](/Asterisk_%s_Documentation/API_Documentation/%s/%s%s)' % ( - self.parent[type], link, module, - self.args['branch'], - self.parent[type].replace(' ', '_'), link, module) + if "certified" in self.args['branch']: + link = '[%s %s%s](/Certified-Asterisk_%s_Documentation/API_Documentation/%s/%s%s)' % ( + self.parent[type], link, module, + self.args['branch'].replace('certified/', ''), + self.parent[type].replace(' ', '_'), link, module) + else: + link = '[%s %s%s](/Asterisk_%s_Documentation/API_Documentation/%s/%s%s)' % ( + self.parent[type], link, module, + self.args['branch'], + self.parent[type].replace(' ', '_'), link, module) else: link = '{{%s}}\n' % link From fda236000d6d2975130344ced43feb4eefa178b3 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Mon, 13 May 2024 07:57:04 -0600 Subject: [PATCH 04/99] Asterisk Architecture: Fixup the Types of Modules page --- .../Types-of-Asterisk-Modules/index.md | 48 ++++++------------- 1 file changed, 15 insertions(+), 33 deletions(-) diff --git a/docs/Fundamentals/Asterisk-Architecture/Types-of-Asterisk-Modules/index.md b/docs/Fundamentals/Asterisk-Architecture/Types-of-Asterisk-Modules/index.md index e29bace9da..ba50a503c7 100644 --- a/docs/Fundamentals/Asterisk-Architecture/Types-of-Asterisk-Modules/index.md +++ b/docs/Fundamentals/Asterisk-Architecture/Types-of-Asterisk-Modules/index.md @@ -1,23 +1,11 @@ ---- -title: Overview -pageid: 4817485 ---- +# Types of Asterisk Modules There are many different types of modules, each providing their own functionality and capabilities to Asterisk. Configuration of loading is described in [Configuring the Asterisk Module Loader](/Configuration/Core-Configuration/Configuring-the-Asterisk-Module-Loader). +/// tip +Use the [CLI](/Operation/Asterisk-Command-Line-Interface) command `module show` to see all the loaded modules in your Asterisk system. See the command usage for details on how to filter the results shown with a pattern. - - -!!! tip ** Use the [CLI](/Operation/Asterisk-Command-Line-Interface) command **module show - to see all the loaded modules in your Asterisk system. See the command usage for details on how to filter the results shown with a pattern. - - Click here for example "module show" output... -[//]: # (end-tip) - - - - - +Example: ``` mypbx\*CLI> module show Module Description Use Count Status Support Level @@ -26,53 +14,47 @@ app_agent_pool.so Call center agent pool applications 0 Running core app_alarmreceiver.so Alarm Receiver for Asterisk 0 Running extended app_amd.so Answering Machine Detection Application 0 Running extended app_authenticate.so Authentication Application 0 Running core - - - ---- - ``` +/// -Various Module Types -==================== +## Various Module Types -* **Channel Drivers** +### Channel Drivers Channel drivers communicate with devices outside of Asterisk, and translate that particular signaling or protocol to the core. -* **Dialplan Applications** +### Dialplan Applications Applications provide call functionality to the system. An application might answer a call, play a sound prompt, hang up a call or provide more complex behavior such as queuing, voicemail or conferencing feature sets. -* **Dialplan Functions** +### Dialplan Functions Functions are used to retrieve, set or manipulate various settings on a call. A function might be used to set the Caller ID on an outbound call, for example. -* **Resources** +### Resources As the name suggests, resources provide resources to Asterisk and its modules. Common examples of resources include music on hold and call parking. -* **CODECs** +### CODECs A CODEC (which is an acronym for COder/DECoder) is a module for encoding or decoding audio or video. Typically codecs are used to encode media so that it takes less bandwidth. These are essential to translating audio between the audio codecs and payload types used by different devices. -* **File Format Drivers** +### File Format Drivers File format drivers are used to save media to disk in a particular file format, and to convert those files back to media streams on the network. -* **Call Detail Record (CDR) Drivers** +### Call Detail Record (CDR) Drivers CDR drivers write call logs to a disk or to a database. -* **Call Event Log (CEL) Drivers** +### Call Event Log (CEL) Drivers Call event logs are similar to call detail records, but record more detail about what happened inside of Asterisk during a particular call. -* **Bridge Drivers** +### Bridge Drivers Bridge drivers are used by the bridging architecture in Asterisk, and provide various methods of bridging call media between participants in a call. - The next sub-sections will include detail on each of the module types. From 6fd49f7de36a00090d01160347e916726b7a1803 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Mon, 13 May 2024 08:50:05 -0600 Subject: [PATCH 05/99] STIR/SHAKEN: Fix typos in stir_shaken.conf file --- docs/Deployment/STIR-SHAKEN/stir_shaken.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Deployment/STIR-SHAKEN/stir_shaken.conf b/docs/Deployment/STIR-SHAKEN/stir_shaken.conf index 4025ec8940..c7ee89230e 100644 --- a/docs/Deployment/STIR-SHAKEN/stir_shaken.conf +++ b/docs/Deployment/STIR-SHAKEN/stir_shaken.conf @@ -132,7 +132,7 @@ with their certificate authority certificate. You should give the CA certificate to any recipients who expect to receive calls from you although this has probably already been done by the issuing authority. -The "id" of this object MUST be a canonicalized telephone nmumber which +The "id" of this object MUST be a canonicalized telephone number which starts with a country code. The only valid characters are the numbers 0-9, '#' and '*'. @@ -413,7 +413,7 @@ Must be set to "profile" Default: none --- endpoint_behhavior-------------------------------------------------- +-- endpoint_behavior-------------------------------------------------- Actions to be performed for endpoints referencing this profile. Must be one of: - off - From 0b276767b4caef73de01b5eacc7ba84847f719c2 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Mon, 13 May 2024 09:19:35 -0600 Subject: [PATCH 06/99] STIR_SHAKEN: Update and clarify caller-id/TN object matching --- docs/Deployment/STIR-SHAKEN/index.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/docs/Deployment/STIR-SHAKEN/index.md b/docs/Deployment/STIR-SHAKEN/index.md index ce19077478..70b0ff5ac6 100644 --- a/docs/Deployment/STIR-SHAKEN/index.md +++ b/docs/Deployment/STIR-SHAKEN/index.md @@ -202,7 +202,18 @@ although this has probably already been done by the issuing authority. The "id" of this object MUST be a canonicalized telephone nmumber which starts with a country code. The only valid characters are the numbers -0-9, '#' and '*'. +0-9, '#' and '*'. With the 18.23.0, 20.8.0 and 21.3.0 releases of Asterisk, +caller-ids are canonicalized before searching for "tn" objects. Previously, +caller-ids had to match "tn" ids exactly. + +/// warning +The STIR-SHAKEN subsystem takes "caller-id" from the channel exactly like +the `CALLERID(num)` dialplan function. If you create or modify outgoing SIP +headers like `From` or `P-Asserted-Identity` and they don't match what's on the +channel, the information in the outgoing Identity header won't match +the the headers. This may cause the remote end to fail to validate +your attestation. +/// The default values for all of the "tn" parameters come from the "[attestation](#attestation-object)" and "[profile](#profile-object)" objects. @@ -561,7 +572,7 @@ Compared to verification, attestation is simple. 1. If the profile name set in `stir_shaken_profile` doesn't exist, skip attestation and continue the call. 1. If the [attestation](#attestation) `global_disable` flag is true, skip attestation and continue the call. 1. If the [profile](#profile-object) `endpoint_behavior` parameter isn't `attest` or `on`, skip attestation and continue the call. -1. If there's no "tn" object matching the caller-id, skip attestation and continue the call. +1. If there's no "tn" object matching the caller-id, skip attestation and continue the call. With the 18.23.0, 20.8.0 and 21.3.0 releases of Asterisk, the caller-id is canonicalized (everything except 0-9, # and * are removed) before a "tn" object is searched for. Previously, the caller-id had to match the "tn" id exactly so a caller-id of "+1234567890" would NOT match a "tn" id of "1234567890". 1. Finally create and sign the Identity header using the `private_key_file`, `public_cert_url`, `attest_level` and `send_mky` parameters from [tn](#tn-object), [profile](#profile-object) or [attestation](#attestation-object). If this fails, the call will be terminated. ## References From d8cd23e8415542645c5c4acd44844fc03a0bc29c Mon Sep 17 00:00:00 2001 From: "Joshua C. Colp" Date: Mon, 17 Jun 2024 10:44:48 -0300 Subject: [PATCH 07/99] Asterisk-Security-Vulnerabilities.md: We no longer use the security address. --- .../Asterisk-Security-Vulnerabilities.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/About-the-Project/Asterisk-Security-Vulnerabilities.md b/docs/About-the-Project/Asterisk-Security-Vulnerabilities.md index e33f969ba4..294c15ac63 100644 --- a/docs/About-the-Project/Asterisk-Security-Vulnerabilities.md +++ b/docs/About-the-Project/Asterisk-Security-Vulnerabilities.md @@ -23,7 +23,7 @@ The Asterisk project takes the issue of its users security seriously. If you bel The Issue Tracker is Public! The [Asterisk Issue Tracker](https://github.com/asterisk/asterisk/issues) is a public site, and all bug reports against Asterisk can be viewed openly by the public. While this results in a transparent, open process - which is good - reporting a security vulnerability on the issue tracker without properly selecting "[Report a vulnerability](https://github.com/asterisk/asterisk/security/advisories/new)" on the [New Issue page](https://github.com/asterisk/asterisk/issues/new/choose) makes the entire Asterisk user community vulnerable. - Reporting a vulnerability will automatically restrict who can view the information. If you have any difficulties with that we'll help; please follow the instructions here and e-mail the team at [security@asterisk.org.](mailto:security@asterisk.org) + Reporting a vulnerability will automatically restrict who can view the information. [//]: # (end-warning) @@ -43,13 +43,9 @@ What Can Be Reported? Reporting a Security Vulnerability ================================== -1. Send an e-mail to the Asterisk Development Team by e-mailing [security@asterisk.org.](mailto:security@asterisk.org) Include the following: - 1. A summary of the suspected vulnerability, e.g., 'Remotely exploitable buffer overflow in the FOO channel driver' - 2. A detailed explanation of how the vulnerability can be exploited and/or reproduced. Test drivers/cases that can be used to demonstrate the vulnerability are highly appreciated. -2. A developer will respond to your inquiry. If you'd like, e-mails can be signed and/or encrypted. -3. Once the developer confirms the security vulnerability is discussed and confirmed you will be asked to report a vulnerability on the Asterisk issue tracker. **You must use the "[Report a vulnerability](https://github.com/asterisk/asterisk/security/advisories/new)" option on the [New Issue page](https://github.com/asterisk/asterisk/issues/new/choose) or the information will be publicly disclosed.** +All security vulnerabilities should be reported on the GitHub project. **You must use the "[Report a vulnerability](https://github.com/asterisk/asterisk/security/advisories/new)" option on the [New Issue page](https://github.com/asterisk/asterisk/issues/new/choose) or the information will be publicly disclosed.** -Security vulnerabilities are treated seriously by the developer community, and the Asterisk Development Team always attempts to address vulnerabilities in a timely fashion. Sometimes, external influences may impact when a security release can be made; feel free to e-mail the developer assigned to the issue or [security@asterisk.org](mailto:security@asterisk.org) to discuss the schedule for a security release for your issue. +Security vulnerabilities are treated seriously by the developer community, and the Asterisk Development Team always attempts to address vulnerabilities in a timely fashion. Sometimes, external influences may impact when a security release can be made; feel free to comment on the security vulnerability to discuss the schedule for a security release for your issue. From ec2725b4e52aeb1bf96c809c553dfbf752aa79bb Mon Sep 17 00:00:00 2001 From: Florian Floimair Date: Wed, 22 May 2024 14:52:29 +0200 Subject: [PATCH 08/99] Use kbd tag when referring to keys on keyboard This will render beautiful keyboard keys when converted to html but will also produce valid text-only output for command line markdown readers. Additionally one occasion where this also previously wasn't rendered at all (not even as text) due to an incorrect prefix was fixed. --- .../Applications/External-IVR-Interface.md | 8 ++++---- .../Dialplan/Special-Dialplan-Extensions.md | 2 +- .../ARI-and-Channels-Handling-DTMF.md | 10 +++++----- .../ARI-and-Media-Part-1-Recording.md | 18 +++++++++--------- .../ARI-and-Media-Part-2-Playbacks.md | 18 +++++++++--------- .../Record-Application.md | 2 +- ...ng-Menuselect-to-Select-Asterisk-Options.md | 4 ++-- .../CLI-Syntax-and-Help-Commands.md | 4 ++-- docs/Test-Suite-Documentation/Using-Python3.md | 2 +- 9 files changed, 34 insertions(+), 34 deletions(-) diff --git a/docs/Configuration/Applications/External-IVR-Interface.md b/docs/Configuration/Applications/External-IVR-Interface.md index 5c379f53c9..cec8edfb9c 100644 --- a/docs/Configuration/Applications/External-IVR-Interface.md +++ b/docs/Configuration/Applications/External-IVR-Interface.md @@ -67,10 +67,10 @@ texttag,timestamp[,data] The tag can be one of the following characters: -* `0-9` - DTMF event for keys 0 through 9 -* `A-D` - DTMF event for keys A through D -* `*` - DTMF event for key \* -* `#` - DTMF event for key # +* `0-9` - DTMF event for keys 0 through 9 +* `A-D` - DTMF event for keys A through D +* `*` - DTMF event for key * +* `#` - DTMF event for key # * `H` - The channel was hung up by the connected party * `E` - The script requested an exit * `Z` - The previous command was unable to be executed. There may be a data element if appropriate, see specific commands below for details diff --git a/docs/Configuration/Dialplan/Special-Dialplan-Extensions.md b/docs/Configuration/Dialplan/Special-Dialplan-Extensions.md index 2607e6e3df..5d9b6a46f9 100644 --- a/docs/Configuration/Dialplan/Special-Dialplan-Extensions.md +++ b/docs/Configuration/Dialplan/Special-Dialplan-Extensions.md @@ -22,7 +22,7 @@ Here we'll list all of the special built-in dialplan extensions and their usage. a: Assistant extension ---------------------- -This extension is similar to the **o** extension, only it gets triggered when the caller presses the asterisk (\*) key while recording a voice mail message. This is typically used to reach an assistant. +This extension is similar to the **o** extension, only it gets triggered when the caller presses the asterisk (*) key while recording a voice mail message. This is typically used to reach an assistant. e: Exception Catchall extension ------------------------------- diff --git a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Handling-DTMF.md b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Handling-DTMF.md index 35433a80f9..37ebe70b73 100644 --- a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Handling-DTMF.md +++ b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Handling-DTMF.md @@ -16,7 +16,7 @@ While this concept is relatively straight forward, handling DTMF is quite common This example mimics the [automated attendant/IVR dialplan example](/Deployment/Basic-PBX-Functionality/Auto-attendant-and-IVR-Menus/Handling-Special-Extensions). It does the following: * Plays a menu to the user which is cancelled when the user takes some action. -* If the user presses 1 or 2, the digit is repeated to the user and the menu restarted. +* If the user presses 1 or 2, the digit is repeated to the user and the menu restarted. * If the user presses an invalid digit, a prompt informing the user that the digit was invalid is played to the user and the menu restarted. * If the user fails to press anything within some period of time, a prompt asking the user if they are still present is played to the user and the menu restarted. @@ -350,7 +350,7 @@ def cancel_timeout(channel): ``` -Finally, we need to actually do *something* when the user presses a `1` or a `2`. We could do anything here - but in our case, we're merely going to play back the number that they pressed and restart the menu. +Finally, we need to actually do *something* when the user presses a 1 or a 2. We could do anything here - but in our case, we're merely going to play back the number that they pressed and restart the menu. ```python def handle_extension_one(channel): @@ -586,7 +586,7 @@ client.run(apps='channel-aa') ### channel-aa.py in action -The following shows the output of `channel-aa.py` when a PJSIP channel presses `1`, `2`, `8`, then times out. Finally they hang up. +The following shows the output of `channel-aa.py` when a PJSIP channel presses 1, 2, 8, then times out. Finally they hang up. ``` Channel PJSIP/alice-00000001 has entered the application @@ -833,7 +833,7 @@ function cancelTimeout(channel) { ``` -Finally, we need to actually do *something* when the user presses a `1` or a `2`. We could do anything here - but in our case, we're merely going to play back the number that they pressed and restart the menu. +Finally, we need to actually do *something* when the user presses a 1 or a 2. We could do anything here - but in our case, we're merely going to play back the number that they pressed and restart the menu. ```javascript function handleDtmf(channel, digit) { @@ -1038,7 +1038,7 @@ function clientLoaded (err, client) { ### channel-aa.js in action -The following shows the output of `channel-aa.js` when a PJSIP channel presses `1`, `2`, `8`, then times out. Finally they hang up. +The following shows the output of `channel-aa.js` when a PJSIP channel presses 1, 2, 8, then times out. Finally they hang up. ``` Channel PJSIP/alice-00000001 has entered the application diff --git a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-1-Recording.md b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-1-Recording.md index ff8860dcfe..aaa59b467a 100644 --- a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-1-Recording.md +++ b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-1-Recording.md @@ -142,7 +142,7 @@ This way, when calling any three-digit extension that begins with the number '3' Basic Voice Mail Recording ========================== -We've seen a lot of the underlying concepts for our application, so let's actually make something useful now. We'll start with a very simple application that allows callers to record a message upon entering the application. When the caller has completed recording the message, the caller may press the '#' key or may hang up to accept the recording. Here is a state machine diagram for the application: +We've seen a lot of the underlying concepts for our application, so let's actually make something useful now. We'll start with a very simple application that allows callers to record a message upon entering the application. When the caller has completed recording the message, the caller may press the # key or may hang up to accept the recording. Here is a state machine diagram for the application: ![](record.png) @@ -372,7 +372,7 @@ var HungUpState = require('./hungup_state'); ``` -The following is a sample output of a user calling the application and pressing the '#' key when finished recording +The following is a sample output of a user calling the application and pressing the # key when finished recording ``` Channel PJSIP/200-00000003 recording voicemail for 305 @@ -391,7 +391,7 @@ silverseagreenReader Exercise 1solidblackCurrently, the voicemails being recorde Cancelling a Recording ====================== -Now we have a simple application set up to record a message, but it's pretty bare at the moment. Let's start expanding some. One feature we can add is the ability to press a DTMF key while recording a voice mail to cancel the current recording and re-start the recording process. We'll use the DTMF '\*' key to accomplish this. The updated state machine diagram looks like the following: +Now we have a simple application set up to record a message, but it's pretty bare at the moment. Let's start expanding some. One feature we can add is the ability to press a DTMF key while recording a voice mail to cancel the current recording and re-start the recording process. We'll use the DTMF * key to accomplish this. The updated state machine diagram looks like the following: ![](record-with-retry.png) @@ -446,7 +446,7 @@ jstrue function on_dtmf(event, channel) { ``` -The first part of the method is the same as it was before, but we have added extra handling for when the user presses the '\*' key. The `cancel()` method for live recordings causes the live recording to be stopped and for it not to be stored on the file system. +The first part of the method is the same as it was before, but we have added extra handling for when the user presses the * key. The `cancel()` method for live recordings causes the live recording to be stopped and for it not to be stored on the file system. We also need to add our new transition while setting up our state machine. Our `VoiceMailCall::setup_state_machine()` method now looks like: @@ -488,7 +488,7 @@ jstruethis.setup_state_machine = function() { ``` -This is exactly the same as it was, except for the penultimate line adding the ``Event.DTMF_STAR`` transition. Here is sample output for when a user calls in, presses '\*' twice, and then presses '#' to complete the call +This is exactly the same as it was, except for the penultimate line adding the ``Event.DTMF_STAR`` transition. Here is sample output for when a user calls in, presses * twice, and then presses # to complete the call ``` Channel PJSIP/200-00000007 recording voicemail for 305 @@ -519,7 +519,7 @@ Modify the `RecordingState` to allow for a DTMF digit of your choice to cancel t Operating on Stored Recordings ============================== -So far, we've recorded a channel, stopped a live recording, and cancelled a live recording. Now let's turn our attention to operations that can be performed on stored recordings. An obvious operation to start with is to play back the stored recording. We're going to make another modification to our voice mail recording application that adds a "reviewing" state after a voicemail is recorded. In this state, a user that has recorded a voice mail will hear the recorded message played back to him/her. The user may press the '#' key or hang up in order to accept the recorded message, or the user may press '\*' to erase the stored recording and record a new message in its place. Below is the updated state diagram with the new "reviewing" state added. +So far, we've recorded a channel, stopped a live recording, and cancelled a live recording. Now let's turn our attention to operations that can be performed on stored recordings. An obvious operation to start with is to play back the stored recording. We're going to make another modification to our voice mail recording application that adds a "reviewing" state after a voicemail is recorded. In this state, a user that has recorded a voice mail will hear the recorded message played back to him/her. The user may press the # key or hang up in order to accept the recorded message, or the user may press * to erase the stored recording and record a new message in its place. Below is the updated state diagram with the new "reviewing" state added. ![](record-with-review.png) @@ -712,7 +712,7 @@ this.setup_state_machine = function() { ``` -The following is the output from a sample call. The user records audio, then presses '#'. Upon hearing the recording, the user decides to record again, so the user presses '\*'. After re-recording, the user presses '#'. The user hears the new version of the recording played back and is satisfied with it, so the user presses '#' to accept the recording. +The following is the output from a sample call. The user records audio, then presses #. Upon hearing the recording, the user decides to record again, so the user presses *. After re-recording, the user presses #. The user hears the new version of the recording played back and is satisfied with it, so the user presses # to accept the recording. ``` Channel PJSIP/200-00000009 recording voicemail for 305 @@ -734,9 +734,9 @@ Ending voice mail call from PJSIP/200-00000009 silverseagreenReader Exercise 5solidblackIn the previous section we introduced the ability to delete a stored recording. Stored recordings have a second operation available to them: [copying](/Latest_API/API_Documentation/Asterisk_REST_Interface/Recordings_REST_API/#copystored). The `copy()` method of a stored recording can be used to copy the stored recording from one location to another. -For this exercise modify `ReviewingState` to let a DTMF key of your choice copy the message to a different mailbox on the system. When a user presses this DTMF key, the state machine should transition into a new state called "copying." The "copying" state should gather DTMF from the user to determine which mailbox the message should be copied to. If '#' is entered, then the message is sent to the mailbox the user has typed in. If '\*' is entered, then the copying operation is cancelled. Both a '#' and a '\*' should cause the state machine to transition back into `ReviewingState`. +For this exercise modify `ReviewingState` to let a DTMF key of your choice copy the message to a different mailbox on the system. When a user presses this DTMF key, the state machine should transition into a new state called "copying." The "copying" state should gather DTMF from the user to determine which mailbox the message should be copied to. If # is entered, then the message is sent to the mailbox the user has typed in. If * is entered, then the copying operation is cancelled. Both a # and a * should cause the state machine to transition back into `ReviewingState`. -As an example, let's say that you have set DTMF '0' to be the key that the user presses in `ReviewingState` to copy the message. The user presses '0'. The user then presses '3' '2' '0' '#'. The message should be copied to mailbox "320", and the user should start hearing the message played back again. Now let's say the user presses '0' to copy the message again. The user then presses '3' '2' '1' '0' '\*'. The message should not be copied to any mailbox, and the user should start hearing the message played back again. +As an example, let's say that you have set DTMF 0 to be the key that the user presses in `ReviewingState` to copy the message. The user presses 0. The user then presses 3 2 0 #. The message should be copied to mailbox "320", and the user should start hearing the message played back again. Now let's say the user presses 0 to copy the message again. The user then presses 3 2 1 0 *. The message should not be copied to any mailbox, and the user should start hearing the message played back again. Recording Bridges ================= diff --git a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-2-Playbacks.md b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-2-Playbacks.md index 918e77066f..187e26980e 100644 --- a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-2-Playbacks.md +++ b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-2-Playbacks.md @@ -210,7 +210,7 @@ this.setup_state_machine = function() { ``` -Here is a sample run where the user cuts off the greeting by pressing the '#' key, records a greeting and presses the '#' key, and after listening to the recording presses the '#' key once more. +Here is a sample run where the user cuts off the greeting by pressing the # key, records a greeting and presses the # key, and after listening to the recording presses the # key once more. ``` Channel PJSIP/200-0000000b recording voicemail for 305 @@ -237,14 +237,14 @@ So far in our voice mail application, we have stopped playbacks, but there are a For this, we will write a new application. This new application will allow a caller to listen to the voicemails that are stored in a specific mailbox. When the caller enters the application, a prompt is played to the caller saying which message number the caller is hearing. When the message number finishes playing (or if the caller interrupts the playback with '#'), then the caller hears the specified message in the voicemail box. While listening to the voicemail, the caller can do several things: -* Press the '1' key to go back 3 seconds in the current message playback. -* Press the '2' key to pause or unpause the current message playback. -* Press the '3' key to go forward 3 seconds in the current message playback. -* Press the '4' key to play to the previous message. -* Press the '5' key to restart the current message playback. -* Press the '6' key to play to the next message. -* Press the '\*' key to delete the current message and play the next message. -* Press the '#' key to end the call. +* Press the 1' key to go back 3 seconds in the current message playback. +* Press the 2 key to pause or unpause the current message playback. +* Press the 3 key to go forward 3 seconds in the current message playback. +* Press the 4 key to play to the previous message. +* Press the 5 key to restart the current message playback. +* Press the 6 key to play to the next message. +* Press the * key to delete the current message and play the next message. +* Press the # key to end the call. If all messages in a mailbox are deleted or if the mailbox contained no messages to begin with, then "no more messages" is played back to the user, and the call is completed. diff --git a/docs/Deployment/Basic-PBX-Functionality/Auto-attendant-and-IVR-Menus/Record-Application.md b/docs/Deployment/Basic-PBX-Functionality/Auto-attendant-and-IVR-Menus/Record-Application.md index 2a6c8b9f8b..4b55eda19b 100644 --- a/docs/Deployment/Basic-PBX-Functionality/Auto-attendant-and-IVR-Menus/Record-Application.md +++ b/docs/Deployment/Basic-PBX-Functionality/Auto-attendant-and-IVR-Menus/Record-Application.md @@ -3,7 +3,7 @@ title: Record Application pageid: 4817379 --- -For creating your own auto-attendant or IVR menus, you're probably going to want to record your own custom prompts. An easy way to do this is with the **Record()** application. The **Record()** application plays a beep, and then begins recording audio until you press the hash key (**#**) on your keypad. It then saves the audio to the filename specified as the first parameter to the application and continues on to the next priority in the extension. If you hang up the call before pressing the hash key, the audio will not be recorded. For example, the following extension records a sound prompt called **custom-menu** in the **gsm** format in the **en/** sub-directory, and then plays it back to you. +For creating your own auto-attendant or IVR menus, you're probably going to want to record your own custom prompts. An easy way to do this is with the **Record()** application. The **Record()** application plays a beep, and then begins recording audio until you press the # key on your keypad. It then saves the audio to the filename specified as the first parameter to the application and continues on to the next priority in the extension. If you hang up the call before pressing the hash key, the audio will not be recorded. For example, the following extension records a sound prompt called **custom-menu** in the **gsm** format in the **en/** sub-directory, and then plays it back to you. ```javascript title=" " linenums="1" exten => 6597,1,Answer(500) diff --git a/docs/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Using-Menuselect-to-Select-Asterisk-Options.md b/docs/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Using-Menuselect-to-Select-Asterisk-Options.md index 6f657c7c89..1927830629 100644 --- a/docs/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Using-Menuselect-to-Select-Asterisk-Options.md +++ b/docs/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Using-Menuselect-to-Select-Asterisk-Options.md @@ -22,13 +22,13 @@ The next step in the build process is to tell Asterisk which [modules](/Fundamen Terminal must be at least 80 x 27. ``` -The **Menuselect** menu should look like the screen-shot below. On the left-hand side, you have a list of categories, such as **Applications**, **Channel** **Drivers**, and **PBX** **Modules**. On the right-hand side, you'll see a list of modules that correspond with the select category. At the bottom of the screen you'll see two buttons. You can use the **Tab** key to cycle between the various sections, and press the **Enter** key to select or unselect a particular module. If you see **[\*]** next to a module name, it signifies that the module has been selected. If you see **\*XXX** next to a module name, it signifies that the select module cannot be built, as one of its dependencies is missing. In that case, you can look at the bottom of the screen for the line labeled **Depends** **upon**: for a description of the missing dependency. +The **Menuselect** menu should look like the screen-shot below. On the left-hand side, you have a list of categories, such as **Applications**, **Channel** **Drivers**, and **PBX** **Modules**. On the right-hand side, you'll see a list of modules that correspond with the select category. At the bottom of the screen you'll see two buttons. You can use the **Tab** key to cycle between the various sections, and press the **Enter** key to select or unselect a particular module. If you see **[\*]** next to a module name, it signifies that the module has been selected. If you see **\*XXX** next to a module name, it signifies that the select module cannot be built, as one of its dependencies is missing. In that case, you can look at the bottom of the screen for the line labeled **Depends** **upon**: for a description of the missing dependency. ![](menuselect.png) When you're first learning your way around Asterisk on a test system, you'll probably want to stick with the default settings in **Menuselect**. If you're building a production system, however, you may not wish to build all of the various modules, and instead only build the modules that your system is using. -When you are finished selecting the modules and options you'd like in **Menuselect**, press **F12** to save and exit, or highlight the **Save** **and** **Exit** button and press enter. +When you are finished selecting the modules and options you'd like in **Menuselect**, press **F12** to save and exit, or highlight the **Save** **and** **Exit** button and press enter. ![](image2993.png) diff --git a/docs/Operation/Asterisk-Command-Line-Interface/CLI-Syntax-and-Help-Commands.md b/docs/Operation/Asterisk-Command-Line-Interface/CLI-Syntax-and-Help-Commands.md index 1c2e0d888a..f6db3e7fc8 100644 --- a/docs/Operation/Asterisk-Command-Line-Interface/CLI-Syntax-and-Help-Commands.md +++ b/docs/Operation/Asterisk-Command-Line-Interface/CLI-Syntax-and-Help-Commands.md @@ -6,7 +6,7 @@ pageid: 28315594 Command Syntax and Availability =============================== -Commands follow a general syntax of ** **. +Commands follow a general syntax of **` `**. For example: @@ -33,7 +33,7 @@ Finding Help at the CLI Command-line Completion ----------------------- -The Asterisk CLI supports command-line completion on all commands, including many arguments. To use it, simply press the **** key at any time while entering the beginning of any command. If the command can be completed unambiguously, it will do so, otherwise it will complete as much of the command as possible. Additionally, Asterisk will print a list of all possible matches, if possible. +The Asterisk CLI supports command-line completion on all commands, including many arguments. To use it, simply press the **Tab** key at any time while entering the beginning of any command. If the command can be completed unambiguously, it will do so, otherwise it will complete as much of the command as possible. Additionally, Asterisk will print a list of all possible matches, if possible. On this Page diff --git a/docs/Test-Suite-Documentation/Using-Python3.md b/docs/Test-Suite-Documentation/Using-Python3.md index e8dbaf257d..86f4fc1613 100644 --- a/docs/Test-Suite-Documentation/Using-Python3.md +++ b/docs/Test-Suite-Documentation/Using-Python3.md @@ -75,7 +75,7 @@ Install Asterisk * Add **`--enable-dev-mode`** and optionally, **`--disable-binary-modules`** to your **`./configure`** command line. Disabling the binary modules just prevents the need to download the external codecs and res_digium_phone. * In menuselect... + Under **Compiler Flags - Development**, enable **DONT_OPTIMIZE**, **MALLOC_DEBUG**, **`DO_CRASH`** and **`TEST_FRAMEWORK`** and disable **`COMPILE_DOUBLE`**. - + Make sure all modules are enabled. You don't need the **Test Modules** though. If you enter **Test Modules** and press **`F7`**, you can quickly disable all modules. + + Make sure all modules are enabled. You don't need the **Test Modules** though. If you enter **Test Modules** and press **F7**, you can quickly disable all modules. * Build and install Asterisk and the development header files. ```bash title=" " linenums="1" From 5508fffe57c5d72ed68fec84d24d313b9e94a26e Mon Sep 17 00:00:00 2001 From: Antonin <30664047+YngProgrammer@users.noreply.github.com> Date: Sun, 23 Jun 2024 21:14:54 +0200 Subject: [PATCH 09/99] Update "make" command argument "config" is not a valid argument for the "make" command when dealing with dahdi-linux-complete-3.4.0+3.4.0 (according to its makefile) --- .../Prerequisites/Building-and-Installing-DAHDI.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Prerequisites/Building-and-Installing-DAHDI.md b/docs/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Prerequisites/Building-and-Installing-DAHDI.md index f6ce51489f..e5fd79a5c7 100644 --- a/docs/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Prerequisites/Building-and-Installing-DAHDI.md +++ b/docs/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Prerequisites/Building-and-Installing-DAHDI.md @@ -44,7 +44,7 @@ Starting with DAHDI-Linux-complete version 2.8.0+2.8.0, all files necessary to i [root@server dahdi-linux-complete-2.X.Y+2.X.Y]# make install -[root@server dahdi-linux-complete-2.X.Y+2.X.Y]# make config +[root@server dahdi-linux-complete-2.X.Y+2.X.Y]# make install-config ``` From 3384e9bacd3b4b954bc9729bc7091fb5bf93c3af Mon Sep 17 00:00:00 2001 From: George Joseph Date: Thu, 11 Jul 2024 08:56:30 -0600 Subject: [PATCH 10/99] Fixed Asterisk 20 and 21 Upgrading pages --- docs/Asterisk_20_Documentation/Upgrading.md | 555 +++++++++++++++++++- docs/Asterisk_21_Documentation/Upgrading.md | 2 +- 2 files changed, 552 insertions(+), 5 deletions(-) diff --git a/docs/Asterisk_20_Documentation/Upgrading.md b/docs/Asterisk_20_Documentation/Upgrading.md index 0a4fdbf5c8..c59285480c 100644 --- a/docs/Asterisk_20_Documentation/Upgrading.md +++ b/docs/Asterisk_20_Documentation/Upgrading.md @@ -1,6 +1,553 @@ ---- -title: Upgrading to Asterisk 20 ---- +# Upgrading to Asterisk 20 -For a complete list upgrade information in Asterisk 20 please see the [UPGRADE.txt document](https://raw.githubusercontent.com/asterisk/asterisk/20/UPGRADE.txt) included with Asterisk 20. +## Functionality changes from Asterisk 19.0.0 to Asterisk 20.0.0 + +### New EXPORT function + * A new function, EXPORT, allows writing variables + and functions on other channels, the complement + of the IMPORT function. + +### app_amd + * An audio file to play during AMD processing can + now be specified to the AMD application or configured + in the amd.conf configuration file. + +### app_bridgewait + * Adds the n option to not answer the channel when + the BridgeWait application is called. + +### features + * The Bridge application now has the n "no answer" option + that can be used to prevent the channel from being + automatically answered prior to bridging. + +### func_strings + * Three new functions, TRIM, LTRIM, and RTRIM, are + now available for trimming leading and trailing + whitespace. + +### res_pjsip + * A new option named "peer_supported" has been added to the endpoint option + 100rel. When set to this option, Asterisk sends provisional responses + reliably if the peer supports it. If the peer does not support reliable + provisional responses, Asterisk sends them normally. + +### Transfer feature + * The following capabilities have been added to the + transfer feature: + + - The transfer initiation announcement prompt can + now be customized in features.conf. + + - The TRANSFER_EXTEN variable now can be set on the + transferer's channel in order to allow the transfer + function to automatically attempt to go to the extension + contained in this variable, if it exists. The transfer + context behavior is not changed (TRANSFER_CONTEXT is used + if it exists; otherwise the default context is used). + +### app_confbridge + * Adds the end_marked_any option which can be used + to kick users from a conference after any + marked user leaves (including marked users). + +### db + * The DBPrefixGet AMI action now allows retrieving + all of the DB keys beginning with a particular + prefix. + +### locks + * A new AMI event, DeadlockStart, is now available + when Asterisk is compiled with DETECT_DEADLOCKS, + and can indicate that a deadlock has occured. + +### res_geolocation + * Added processing for the 'confidence' element. + * Added documentation to some APIs. + * removed a lot of complex code related to the very-off-nominal + case of needing to process multiple location info sources. + * Create a new 'ast_geoloc_eprofile_to_pidf' API that just takes + one eprofile instead of a datastore of multiples. + * Plugged a huge leak in XML processing that arose from + insufficient documentation by the libxml/libxslt authors. + * Refactored stylesheets to be more efficient. + * Renamed 'profile_action' to 'profile_precedence' to better + reflect it's purpose. + * Added the config option for 'allow_routing_use' which + sets the value of the 'Geolocation-Routing' header. + * Removed the GeolocProfileCreate and GeolocProfileDelete + dialplan apps. + * Changed the GEOLOC_PROFILE dialplan function as follows: + * Removed the 'profile' argument. + * Automatically create a profile if it doesn't exist. + * Delete a profile if 'inheritable' is set to no. + * Fixed various bugs and leaks + * Updated Asterisk WiKi documentation. + + Added 4 built-in profiles: + "" + "" + "" + "" + The profiles are empty except for having their precedence + set. + + Added profile parameter "suppress_empty_ca_elements" that + will cause Civic Address elements that are empty to be + suppressed from the outgoing PIDF-LO document. + + You can now specify the location object's format, location_info, + method, location_source and confidence parameters directly on + a profile object for simple scenarios where the location + information isn't common with any other profiles. This is + mutually exclusive with setting location_reference on the + profile. + + Added an 'a' option to the GEOLOC_PROFILE function to allow + variable lists like location_info_refinement to be appended + to instead of replacing the entire list. + + Added an 'r' option to the GEOLOC_PROFILE function to resolve all + variables before a read operation and after a Set operation. + +### res_musiconhold_answeredonly + * This change adds an option, answeredonly, that will prevent music + on hold on channels that are not answered. + +### res_pjsip + * TLS transports in res_pjsip can now reload their TLS certificate + and private key files, provided the filename of them has not + changed. + +### Applications + * added support for Danish syntax, playing the correct plural sound file + dependen on where you have 1 or multipe messages + based on the existing SE/NO code + + * added that we set DIALEDPEERNUMBER on the outgoing channels + so it is avalible in b(content^extension^line) + this add the same behaviour as Dial + +### Channel-agnostic MF support + * A SendMF application and PlayMF manager + application are now included to send + arbitrary standard R1 MF tones on the + current channel or another specified channel. + +### Core + * Bundled PJProject Build + + The build process has been updated to make pjproject troubleshooting + and development easier. See third-party/pjproject/README-hacking.md or + https://wiki.asterisk.org/wiki/display/AST/Bundled+PJProject + for more info. + +### Handle non-standard Meter metric type safely + * A meter_support flag has been introduced that defaults to true to maintain current behaviour. + If disabled, a counter metric type will be used instead wherever a meter metric type was used, + the counter will have a "_meter" suffix appended to the metric name. + +### MessageSend + * The MessageSend AMI action has been updated to allow the Destination + and the To addresses to be provided separately. This brings the + MessageSend manager command in line with the capabilities of the + MessageSend dialplan application. + +### ToneScan application + * A new application, ToneScan, allows for + synchronous detection of call progress + signals such as dial tone, busy tone, + Special Information Tones, and modems. + +### ami + * An AMI event now exists for "Wink". + + * AMI events can now be globally disabled using + the disabledevents [general] setting. + +### app_confbridge + * Added the hear_own_join_sound option to the confbridge user profile to + control who hears the sound_join audio file. When set to 'yes' the user + entering the conference and the participants already in the conference + will hear the sound_join audio file. When set to 'no' the user entering + the conference will not hear the sound_join audio file, but the + participants already in the conference will hear the sound_join audio file. + + * Adds the CONFBRIDGE_CHANNELS function which can + be used to retrieve a list of channels in a ConfBridge, + optionally filtered by a particular category. This + list can then be used with functions like SHIFT, POP, + UNSHIFT, etc. + +### app_dtmfstore + * New application which collects digits + dialed and stores them into + a specified variable. + +### app_mf + * Adds MF receiver and sender applications to support + the R1 MF signaling protocol, including integration + with the Dial application. + + * Adds an option to ReceiveMF to cap the + number of digits read at a user-specified + maximum. + +### app_milliwatt + * The Milliwatt application's existing behavior is + incorrect in that it plays a constant tone, which + is not how digital milliwatt test lines actually + work. + + An option is added so that a proper milliwatt test + tone can be provided, including a 1 second silent + interval every 10 seconds. However, for compatability + reasons, the default behavior remains unchanged. + +### app_morsecode + * Extends the Morsecode application by adding support for + American Morse code and adds a configurable option + for the frequency used in off intervals. + +### app_originate + * Codecs can now be specified for dialplan-originated + calls, as with call files and the manager action. + By default, only the slin codec is now used, instead + of all the slin* codecs. + +### app_playback + * A new option 'mix' is added to the Playback application that + will play by filename and say.conf. It will look on the format of the + name, if it is like say format it will play with say.conf if not it + will play the file name. + +### app_queue + * Reload behavior in app_queue has been changed so + queue and agent stats are not reset during full + app_queue module reloads. The queue reset stats + CLI command may still be used to reset stats while + Asterisk is running. + + * Add field to save the time value when a member enter a queue. + Shows this time in seconds using 'queue show' command and the + field LoginTime for responses for AMI the events. + + The output for the CLI command `queue show` is changed by added a + extra data field for the information of the time login time for each + member. + + * added that we set DIALEDPEERNUMBER on the outgoing channels + so it is avalible in b(content^extension^line) + this add the same behaviour as Dial + + * Load queues and members from Realtime for + AMI actions: QueuePause, QueueStatus and QueueSummary, + Applications: PauseQueueMember and UnpauseQueueMember. + + * Added a new AMI action: QueueWithdrawCaller + This AMI action makes it possible to withdraw a caller from a queue + back to the dialplan. The call will be signaled to leave the queue + whenever it can, hence, it not guaranteed that the call will leave + the queue. + + Optional custom data can be passed in the request, in the WithdrawInfo + parameter. If the call successfully withdrawn the queue, + it can be retrieved using the QUEUE_WITHDRAW_INFO variable. + + This can be useful for certain uses, such as dispatching the call + to a specific extension. + + * The m option now allows an override music on hold + class to be specified for the Queue application + within the dialplan. + +### app_queue.c + * Allow multiple files to be streamed for agent announcement. + +### app_queues + * adding support for playing the correct en/et for nordic languages + + * Don't play sound_thanks if there is no leading hold_time message + When the only announcement is hold time, and there is no hold time (0 min, 0 sec), asterisk will say "thank you for your patience" + +### app_read + * A new option allows the digit '#' to be read literally, + rather than used exclusively as the input terminator + character. + +### app_sendtext + * A ReceiveText application has been added that can be + used in conjunction with the SendText application. + +### app_voicemail + * Add a new 'S' option to VoiceMail which prevents the instructions + (vm-intro) from being played if a busy/unavailable/temporary greeting + from the voicemail user is played. This is similar to the existing 's' + option except that instructions will still be played if no user + greeting is available. + + * added support for Danish syntax, playing the correct plural sound file + dependen on where you have 1 or multipe messages + based on the existing SE/NO code + + * The r option has been added, which prevents deletion + of messages from VoiceMailMain, which can be + useful for shared mailboxes. + +### apps + * A new option 'mix' is added to the Playback application that + will play by filename and say.conf. It will look on the format of the + name, if it is like say format it will play with say.conf if not it + will play the file name. + +### ari + * Expose channel driver's unique id (which is the Call-ID for SIP/PJSIP) + to ARI channel resources as 'protocol_id'. + + ASTERISK-30027 + +### ast_coredumper + * New options: + --pid= + Allows specification of an Asterisk instance when trying to + and the script can't determine it itself. + --libdir= + Allows specification of a non-standard installation directory + containing the Asterisk modules. + --(no-)rename + Renames the coredump and the output files with readable + timestamps. This is the default. + Removed unneeded or confusing options: + --append-coredumps + --conffile + --no-default-search + --tarball-uniqueid + Changed Variables: + COREDUMPS is now just "/tmp/core!(*.txt)" + DATEFORMAT is renamed to DATEOPTS and defaults to '-u +%FT%H-%M-%SZ' + Changed behavior: + If you use 'running' or 'RUNNING' you no longer need to specify + '--no-default-search' to ignore existing coredumps. + +### cdr + * A new CDR option, channeldefaultenabled, allows controlling + whether CDR is enabled or disabled by default on + newly created channels. The default behavior remains + unchanged from previous versions of Asterisk (new + channels will have CDR enabled, as long as CDR is + enabled globally). + +### chan_dahdi + * Previously, cadences were appended on dahdi restart, + rather than reloaded. This prevented cadences from + being updated and maxed out the available cadences + if reloaded multiple times. This behavior is fixed + so that reloading cadences is idempotent and cadences + can actually be reloaded. + + * A POLARITY function is now available that allows + getting or setting the polarity on a channel + from the dialplan. + +### chan_iax2 + * ANI2 (OLI) is now transmitted over IAX2 calls + as an information element. + + * Both a secret and an outkey may be specified at dial time, + since encryption is possible with RSA authentication. + +### chan_pjsip + * Add function PJSIP_HEADERS() to get list of headers by pattern in the same way as SIP_HEADERS() do. + + Add ability to read header by pattern using PJSIP_HEADER(). + + * added global config option "allow_sending_180_after_183" + + Allow Asterisk to send 180 Ringing to an endpoint + after 183 Session Progress has been send. + If disabled Asterisk will instead send only a + 183 Session Progress to the endpoint. + + * Hook flash events can now be sent on a PJSIP channel + if requested to do so. + +### chan_sip + * Session timers get removed on UPDATE + Fix if Asterisk receives a SIP REFER with Session-Timers UAC + that Asterisk maintains Session-Timers when sending UPDATE request + +### chan_sip.c + * resolve issue with pickup on device that uses "183" and not "180" + +### channel_internal_api + * CHANNEL(lastcontext) and CHANNEL(lastexten) + are now available for use in the dialplan. + +### cli + * The "module refresh" command has been added, + which allows unloading and then loading a + module with a single command. + + * A new CLI command 'dialplan eval function' has been + added which allows users to test the behavior of + dialplan function calls directly from the CLI. + +### func_channel + * Adds the CHANNEL_EXISTS function to check for the existence + of a channel by name or unique ID. + +### func_db + * The function DB_KEYCOUNT has been added, which + returns the cardinality of the keys at a specified + prefix in AstDB, i.e. the number of keys at a + given prefix. + +### func_env.c + * Two new functions, DIRNAME and BASENAME, are now + included which allow users to obtain the directory + or the base filename of any file. + +### func_evalexten + * This adds the EVAL_EXTEN function which may be + used to evaluate data at dialplan extensions. + +### func_framedrop + * New function to selectively drop specified frames + in either direction on a channel. + +### func_json + * The JSON_DECODE dialplan function can now be used + to parse JSON strings, such as in conjunction with + CURL for using API responses. + +### func_odbc + * A SQL_ESC_BACKSLASHES dialplan function has been added which + escapes backslashes. Usage of this is dependent on whether the + database in use can use backslashes to escape ticks or not. If + it can, then usage of this prevents a broken SQL query depending + on how the SQL query is constructed. + +### func_scramble + * Adds an audio scrambler function that may be used to + distort voice audio on a channel as a privacy + enhancement. + +### func_strings + * A new STRBETWEEN function is now included which + allows a substring to be inserted between characters + in a string. This is particularly useful for transforming + dial strings, such as adding pauses between digits + for a string of digits that are sent to another channel. + +### func_vmcount + * Multiple mailboxes may now be specified instead of just one. + +### logger + * Added the ability to define custom log levels in logger.conf + and use them in the Log dialplan application. Also adds a + logger show levels CLI command. + +### res_agi + * Agi command 'exec' can now be enabled + to evaluate dialplan functions and variables + by setting the variable AGIEXECFULL to yes. + +### res_cliexec + * A new CLI command, dialplan exec application, has + been added which allows dialplan applications to be + executed at the CLI, useful for some quick testing + without needing to write dialplan. + +### res_fax_spandsp + * Adds support for spandsp 3.0.0. + +### res_geolocation + * Added res_geolocation which creates the core capabilities + to manipulate Geolocation information on SIP INVITEs. + +### res_parking + * An m option to Park and ParkAndAnnounce now allows + specifying a music on hold class override. + +### res_pjproject + * In pjproject.conf you can now map pjproject log levels + to the Asterisk TRACE log level. The default mappings + have therefore changed so that only pjproject levels + 3 and 4 are mapped to DEBUG and 5 and 6 are now mapped + to TRACE. Previously 3, 4, 5, and 6 were all mapped to + DEBUG. + +### res_pjsip + * A new transport option 'allow_wildcard_certs' has been added that when it + and 'verify_server' are both set to 'yes', enables verification against + wildcards, i.e. '*.' in certs for common, and subject alt names of type DNS + for TLS transport types. Names must start with the wildcard. Partial wildcards, + e.g. 'f*.example.com' and 'foo.*.com' are not allowed. As well, names only + match against a single level meaning '*.example.com' matches 'foo.example.com', + but not 'foo.bar.example.com'. + +### res_pjsip_geolocation + * Added res_pjsip_geolocation which gives chan_pjsip + the ability to use the core geolocation capabilities. + +### res_pjsip_header_funcs + * Add function PJSIP_RESPONSE_HEADERS() to get list of header names from 200 response, in the same way as PJSIP_HEADERS() from the request. + + Add function PJSIP_RESPONSE_HEADER() to read header from 200 response, in the same way as PJSIP_HEADER() from the request. + +### res_pjsip_pubsub + * A new resource_list option, resource_display_name, indicates + whether display name of resource or the resource name being + provided for RLS entries. + If this option is enabled, the Display Name will be provided. + This option is disabled by default to remain the previous behavior. + If the 'event' set to 'presence' or 'dialog' the non-empty HINT name + will be set as the Display Name. + The 'message-summary' is not supported yet. + + * The Resource List Subscriptions (RLS) is dynamic now. + The asterisk now updates current subscriptions to reflect the changes + to the list on subscription refresh. If list items are added, + removed, updated or do not exist anymore, the asterisk regenerates + the resource list. + +### res_pjsip_registrar + * Adds new PJSIP AOR option remove_unavailable to either + remove unavailable contacts when a REGISTER exceeds + max_contacts when remove_existing is disabled, or + prioritize unavailable contacts over other existing + contacts when remove_existing is enabled. + +### res_pjsip_t38 + * In res_pjsip_sdp_rtp, the bind_rtp_to_media_address option and the + fallback use of the transport's bind address solve problems sending + media on systems that cannot send ipv4 packets on ipv6 sockets, and + certain other situations. This change extends both of these behaviors + to UDPTL sessions as well in res_pjsip_t38, to fix fax-specific + problems on these systems, introducing a new option + endpoint/t38_bind_udptl_to_media_address. + +### res_rtp_asterisk + * When the address of the STUN server (stunaddr) is a name resolved via DNS, the + stunaddr will be recurringly resolved when the DNS answer Time-To-Live (TTL) + expires. This allows the STUN server to change its IP address without having to + reload the res_rtp_asterisk module. + +### res_tonedetect + * Arbitrary tone detection is now available through a + WaitForTone application (blocking) and a TONE_DETECT + function (non-blocking). + +### say.c + * Adds SAYFILES function to retrieve the file names that would + be played by corresponding Say applications, such as + SayDigits, SayAlpha, etc. + + Additionally adds SayMoney and SayOrdinal applications. + +### stasis_channels + * Expose channel driver's unique id (which is the Call-ID for SIP/PJSIP) + to ARI channel resources as 'protocol_id'. + + ASTERISK-30027 diff --git a/docs/Asterisk_21_Documentation/Upgrading.md b/docs/Asterisk_21_Documentation/Upgrading.md index 2598b69f61..c0b86be12a 100644 --- a/docs/Asterisk_21_Documentation/Upgrading.md +++ b/docs/Asterisk_21_Documentation/Upgrading.md @@ -2,4 +2,4 @@ title: Upgrading to Asterisk 21 --- -For a complete list upgrade information in Asterisk 21 please see the [UPGRADE.txt document](https://raw.githubusercontent.com/asterisk/asterisk/21/UPGRADE.txt) included with Asterisk 21. +For a complete list upgrade information in Asterisk 21 please see the [ChangeLog-21.0.0 document](https://raw.githubusercontent.com/asterisk/asterisk/releases/21/ChangeLogs/ChangeLog-21.0.0.md) included with Asterisk 21. From 9352ff29ee420052ff8c83512e97497495919908 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Sun, 21 Jul 2024 13:03:13 -0600 Subject: [PATCH 11/99] STIR-SHAKEN: Additional config params and more certificate info --- docs/Deployment/STIR-SHAKEN/index.md | 214 ++++++++- docs/Deployment/STIR-SHAKEN/stir_shaken.conf | 459 ------------------- 2 files changed, 197 insertions(+), 476 deletions(-) delete mode 100644 docs/Deployment/STIR-SHAKEN/stir_shaken.conf diff --git a/docs/Deployment/STIR-SHAKEN/index.md b/docs/Deployment/STIR-SHAKEN/index.md index 70b0ff5ac6..805eb9eb14 100644 --- a/docs/Deployment/STIR-SHAKEN/index.md +++ b/docs/Deployment/STIR-SHAKEN/index.md @@ -65,13 +65,13 @@ Although [RFC-8226 section 9](https://www.rfc-editor.org/rfc/rfc8226#section-9) shall contain a single SPC value.". Asterisk therefore will fail to verify a certificate whose TNAuthList extension contains something other than an SPC code. It was apparently envisioned that a facility would be made available to verify that a particular SPC has the authority over a particular telephone number. To our knowledge, that facility doesn't yet exist. This means that there is currently no way for Asterisk to verify that the SPC in the certificate has the authority over the TN in the Identity header. - /// + ## Asterisk Implementation ### Configuration -All configuration is done via the stir_shaken.conf file. The sample [stir_shaken.conf](stir_shaken.conf) is heavily commented. +All configuration is done via the stir_shaken.conf file. The sample [stir_shaken.conf](https://github.com/asterisk/asterisk/raw/master/configs/samples/stir_shaken.conf.sample) is heavily commented. There are 4 object types used by the STIR/SHAKEN process... @@ -279,38 +279,84 @@ CA certififcate to you separately. Default: no ##### ca_file -Path to a single file containing a CA certificate or certificate chain -to be used to validate the certificates in incoming requests. +Path to a file containing one or more CA certs in PEM format. +These certs are used to verify the chain of trust for the +certificate retrieved from the X5U Identity header parameter. This +file must have the root CA certificate, the certificate of the +issuer of the X5U certificate, and any intermediate certificates +between them. Default: none +See Also: [Certificate and CRL Notes](#certificate-and-crl-notes) below ##### ca_path -Path to a directory containing one or more CA certificates to be used -to validate the certificates in incoming requests. The files in that -directory must contain only one certificate each and the directory -must be hashed using the OpenSSL 'c_rehash' utility. +Path to a directory containing one or more hashed CA certs. +See ca_file above. +For this option, each certificate must be placed in its own +PEM file in the directory specified and hashed with the +following command: +`openssl rehash ` -Default: none +Default: none +See Also: [Certificate and CRL Notes](#certificate-and-crl-notes) below NOTE: Both ca_file and ca_path can be specified but at least one MUST be. ##### crl_file -Path to a single file containing a CA certificate revocation list -to be used to validate the certificates in incoming requests. +Path to a file containing one or more CRLs in PEM format. +If you with to check if the certificate in the X5U Identity header +parameter has been revoked, you'll need the certificate revocation +list generated by the issuer. NOTE: CRLs are sometimes distributed +in DER format instead of PEM format. You can covert a DER file to +PEM with the folowing command: +`openssl crl -inform DER -in crl.der -outform PEM -out crl.pem` -Default: none +Default: none +See Also: [Certificate and CRL Notes](#certificate-and-crl-notes) below ##### crl_path -Path to a directory containing one or more CA certificate revocation -lists to be used to validate the certificates in incoming requests. -The files in that directory must contain only one certificate each and -the directory must be hashed using the OpenSSL 'c_rehash' utility. +Path to a directory containing one or more hashed CRLs. +See crl_file above. +For this option, each CRL must be placed in its own +PEM file in the directory specified and hashed with the +following command: +`openssl rehash ` -Default: none +Default: none +See Also: [Certificate and CRL Notes](#certificate-and-crl-notes) below NOTE: Neither crl_file nor crl_path are required. +##### untrusted_cert_file +Path to a file containing one or more untrusted certs in PEM format. +Unfortunately, sometimes the CRLs are signed by a different CA +than the certificate being verified. In this case, you'll need to +provide the certificate belonging to the issuer of the CRL. That +certificate is considered "untrusted" by OpenSSL and can't be placed +in the ca_file or ca_path. It has to be specified here. + +Default: none +See Also: [Certificate and CRL Notes](#certificate-and-crl-notes) below. +Added in Asterisk releases 18.25.0, 20.10.0, 21.5.0, certified-20.7-cert2 + +##### untrusted_cert_path +Path to a directory containing one or more hashed untrusted certs used +to verify CRLs. +See untrusted_cert_file above. +For this option, each certificates must be placed in its own +PEM file in the directory specified and hashed with the +following command: +`openssl rehash ` + +Default: none +See Also: [Certificate and CRL Notes](#certificate-and-crl-notes) below. +Added in Asterisk releases 18.25.0, 20.10.0, 21.5.0, certified-20.7-cert2 + +NOTE: Neither untrusted_cert_file nor untrusted_cert_path are required +unless you're verifying CRLs that aren't signed by the same CA as the +X5U certificate. + ##### cert_cache_dir Incoming Identity headers will have a URL pointing to the certificate used to sign the header. To prevent us from having to retrieve the @@ -575,6 +621,140 @@ Compared to verification, attestation is simple. 1. If there's no "tn" object matching the caller-id, skip attestation and continue the call. With the 18.23.0, 20.8.0 and 21.3.0 releases of Asterisk, the caller-id is canonicalized (everything except 0-9, # and * are removed) before a "tn" object is searched for. Previously, the caller-id had to match the "tn" id exactly so a caller-id of "+1234567890" would NOT match a "tn" id of "1234567890". 1. Finally create and sign the Identity header using the `private_key_file`, `public_cert_url`, `attest_level` and `send_mky` parameters from [tn](#tn-object), [profile](#profile-object) or [attestation](#attestation-object). If this fails, the call will be terminated. +## Certificate and CRL Notes + +Verifying the certificate retrieved by following the link in the received +X5U Identity header parameter can be a tricky business. At a mimimum, you'll +need the certificate of the X5U certificate's issuer. If the X5U certificate +was signed by an intermediate certificate authority, you'll need that certificate +plus any others up the chain to the issuer's root certificate authority. +If you plan on verifying whether the X5U certificate has been revoked or not, +you'll need the issuer's certificate revokation list and if the CRL was not +signed by the same CA chain as the X5U certificate, you'll need the chain +for the CRL as well. + +If the X5U certificate was produced by an entity that knows how to +properly set up and operate a PKI infrastructure, there are some easy +steps you can take to find those certificates yourself. If not, you +are unfortunately at their mercy to provide you with the proper files. +anyway... + +A properly constructed X5U certificate will have two X509 extensions +that can help you get the issuer's certificate and, optionally, a CRL. +If you have the URI in the X5U Identity header parameter, you can use +`curl` to retrieve it manually... + +``` +curl -o somecompany-x5u.pem https://somecompany.com/somecert.pem +``` + +You can now dump the contents of the certificate with `openssl`... + +``` +openssl x509 -in somecompany-x5u.pem -noout -text +Certificate: + + Issuer: CN=STO CA1 - SHAKEN Intermediate, O=Some Telecom Operator, OU=Certificate Authority, C=US + + X509v3 extensions: + Authority Information Access: + CA Issuers - URI:https://somecomnany.com/ca/certs/intermediate-ca.cer + X509v3 CRL Distribution Points: + Full Name: + URI:https://somecompany.com/crl CRL Issuer: + DirName:CN = STO PA1, O = Some Telecom Operator, OU = Policy Authority, C = US +``` +You'll notice a few things... +* The issuer is an intermediate certificate authority. +* The `Authority Information Access` extension has a URI to the intermediate CA's certificate. +* There's a `CRL Distribution Points` extension with a URI to the CRL. This may or may not be present. +* The CRL issuer isn't the same as this certificate's issuer. This is known as an "Indirect CRL". It's rare but it can happen. + +So, now it's a matter of following those URIs, dumping the objects, +and repeating until you reach the top. + +``` +curl -o intermediate1-ca.pem https://somecomnany.com/ca/certs/intermediate1-ca.cer +openssl x509 -in intermediate1-ca.pem -noout -text +``` +Look for intermediate-ca.cer's `Authority Information Access` extension, +download it, dump it, and repeat until you find the root CA certificate. +You'll know it because its Issuer and Subject will be the same and there +won't be a `Authority Information Access` extension. All of these certificates +will need to be supplied in either [verification - ca_file](#ca_file) or +[verification - ca_path](#ca_path). + +If there was a CRL specified and you wish to check whether the X5U +certificate was revoked or not, download and dump the CRL. + +``` +curl -o somecompany.crl https://somecompany.com/crl +openssl crl -in somecompany.crl -noout -text +``` + +The CRL should also have an `Authority Information Access` extension that has +the URI to the CRL issuer's certificate. If it's not the same as any of +the certificates already retrieved by the above process, perform the same +download and dump process as above until you get to the root CA certificate. +Any of these certificates that weren't already retrieved above will need to be +supplied in either [verification - untrusted_cert_file](#untrusted_cert_file) or +[verification - untrusted_cert_path](#untrusted_cert_path). + +The CRL itself will need to be supplied in either [verification - crl_file](#crl_file) or [verification - crl_path](#crl_path). Be aware though, some CRLs are +distributed in DER format instead of PEM format. You can check which format +was retrieved by running `file `. If the result is `ASCII text`, it's +already PEM format. If the result is `data`, it's DER format. Since asterisk can only +accept PEM format files, you'll need to convert the DER CRL into PEM format +with the following command: + +``` +openssl crl -inform DER -in somecompany.crl -outform PEM -out somecompany-crl.pem +``` + +You can test that you have all the files needed for a successful verification +by performing the following... + +Concatenate all the CA certificates downloaded into a single file. + +``` +cat intermediate1-ca.pem intermediate2-ca.pem root-ca.pem > somecompany-fullchain.pem +``` + +Concatenate all the untrusted certificates downloaded into a single file. +Don't include any CA certificates already downloaded previously. + +``` +cat untrusted1-ca.pem untrusted2-ca.pem untrusted-ca.pem > somecompany-untrusted.pem +``` + +Run the `openssl verify` command. + +``` +openssl verify -CAfile somecompany-fullchain.pem -CRLfile somecompany-crl.pem \ + -untrusted somecompany-untrusted.pem -crl_check -extended_crl somecert-x5u.pem +somecert-x5u.pem: OK +``` + +If you're not checking against a CRL, you can leave those bits out... + +``` +openssl verify -CAfile somecompany-fullchain.pem somecert-x5u.pem +somecert-x5u.pem: OK +``` + +You can use the same somecompany-fullchain.pem, somecompany-crl.pem, +and somecompany-untrusted.pem file as the values for the +[verification - ca_file](#ca_file), [verification - crl_file](#crl_file) +and [verification - untrusted_cert_file](#untrusted_cert_file) +stir_shaken.conf values. + +Starting in Asterisk versions, 18.25.0, 20.10.0, 21.5.0 and certified-20.7-cert2, +a new CLI command `stir_shaken verify certificate_file` is available. If you've properly +configured the ca, crl and untrusted_cert parameters in stir_shaken.conf, you can +check if Asterisk can verify a certificate with the following command: +`CLI> stir_shaken verify certificate_file `. +You'll get the same results you'd get with the `openssl verify` command. + ## References The best places to become familiar with STIR/SHAKEN itself are: diff --git a/docs/Deployment/STIR-SHAKEN/stir_shaken.conf b/docs/Deployment/STIR-SHAKEN/stir_shaken.conf deleted file mode 100644 index c7ee89230e..0000000000 --- a/docs/Deployment/STIR-SHAKEN/stir_shaken.conf +++ /dev/null @@ -1,459 +0,0 @@ -;-- - -There are 4 object types used by the STIR/SHAKEN process... - -The "attestation" object sets the parameters for creating an Identity -header which attests to the ownership of the caller id on outgoing -INVITE requests. - -One or more "tn" objects that are used to create the outgoing Identity -header. Each object's "id" is a specific caller-id telephone number -and the object contains the URL to the certificate that was used to -attest to the ownership of the caller-id, the level (A,B,C) of the -attestation you're making, and the private key the asterisk -attestation service will use to sign the Identity header. When -an outgoing INVITE request is placed, the attestation service will -look up the caller-id in the tn object list and if it's found, use -the information in the object to create the Identity header. - -The "verification" object sets the parameters for verification -of the Identity header and caller id on incoming INVITE requests. - -One or more "profile" objects that can be associated to channel -driver endpoints (currently only chan_pjsip). Profiles can set -whether verification, attestation, both or neither should be -performed on requests coming in to this endpoint or requests -going out from this endpoint. Additionally they can override -most of the attestation and verification options to make them -specific to an endpoint. When Asterisk loads the configs, it -creates "effective profiles" or "eprofiles" on the fly that are -the amalgamation of the attestation, verification and profile. -You can see them in the CLI with "stir_shaken show eprofiles". - -NOTE: The "tn" object can be configured to source its data from a -realtime database by configuring sorcery.conf and extconfig.conf. -Both of those files have examples for "stir_tn". There is also an -Alembic script in the "config" section of contrib/ast-db-manage that -will create the table. Since there can be only one "verification" -or "attestation" object, and will probably be only a few "profile" -objects, those objects aren't realtime enabled. - ---; - -;-- -======================================================================= - Attestation Object Description -======================================================================= -The "attestation" object sets the parameters for creating an Identity -header which attests to the ownership of the caller id on outgoing -INVITE requests. - -All parameters except 'global_disable" may be overridden in a "profile" -or "tn" object. - -Only one "attestation" object may exist. - -Parameters: - --- global_disable ----------------------------------------------------- -If set, globally disables the attestation service. No Identity headers -will be added to any outgoing INVITE requests. - -Default: no - --- private_key_file --------------------------------------------------- -The path to a file containing the private key you received from the -issuing authority. The file must NOT be group or world readable or -writable so make sure the user the asterisk process is running as is -the owner. - -Default: none - --- public_cert_url ---------------------------------------------------- -The URL to the certificate you received from the issueing authority. -They may give you a URL to use or you may have to host the certificate -yourself and provide your own URL here. - -Default: none - -WARNING: Make absolutely sure the file that's made public doesn't -accidentally include the privite key as well as the certificate. -If you set "check_tn_cert_public_url" in the "attestation" section -above, the tn will not be loaded and a "DANGER" message will be output -on the asterisk console if the file does contain a private key. - --- check_tn_cert_public_url ------------------------------------------- -Identity headers in outgoing requests must contain a URL that points -to the certificate used to sign the header. Setting this parameter -tells Asterisk to actually try to retrieve the certificates indicated -by "public_cert_url" parameters and fail loading that tn if the cert -can't be retrieved or if its 'Not Valid Before" -> 'Not Valid After" -date range doesn't include today. This is a network intensive process -so use with caution. - -Default: no - --- attest_level ------------------------------------------------------- -The level of the attestation you're making. -One of "A", "B", "C" - -Default: none - --- send_mky ----------------------------------------------------------- -If set and an outgoing call uses DTLS, an "mky" Media Key grant will -be added to the Identity header. Although RFC8224/8225 require this, -not many implementations support it so a remote verification service -may fail to verify the signature. - -Default: no - ------------------------------------------------------------------------ -Example "attestation" object: ---; - -;[attestation] -;global_disable = no -;private_key_path = /var/lib/asterisk/keys/stir_shaken/tns/multi-tns-key.pem -;public_cert_url = https://example.com/tncerts/multi-tns-cert.pem -;attest_level = C - -;-- -======================================================================= - TN Object Description -======================================================================= -Each "tn" object contains the parameters needed to create the Identity -header used to attest to the ownership of the caller-id on outgoing -requests. When an outgoing INVITE request is placed, the attestation -service will look up the caller-id in this list and if it's found, use -the information in the object to create the Identity header. -The private key and certificate needed to sign the Identity header are -usually provided to you by the telephone number issuing authority along -with their certificate authority certificate. You should give the CA -certificate to any recipients who expect to receive calls from you -although this has probably already been done by the issuing authority. - -The "id" of this object MUST be a canonicalized telephone number which -starts with a country code. The only valid characters are the numbers -0-9, '#' and '*'. - -Parameters: - --- type (required) ---------------------------------------------------- -Must be set to "tn" - -Default: none - --- private_key_file --------------------------------------------------- -The path to a file containing the private key you received from the -issuing authority. The file must NOT be group or world readable or -writable so make sure the user the asterisk process is running as is -the owner. - -Default: private_key_file from the profile or attestation objects. - --- public_cert_url ---------------------------------------------------- -The URL to the certificate you received from the issueing authority. -They may give you a URL to use or you may have to host the certificate -yourself and provide your own URL here. - -Default: public_cert_url from the profile or attestation objects. - -WARNING: Make absolutely sure the file that's made public doesn't -accidentally include the privite key as well as the certificate. -If you set "check_tn_cert_public_url" in the "attestation" section -above, the tn will not be loaded and a "DANGER" message will be output -on the asterisk console if the file does contain a private key. - --- attest_level ------------------------------------------------------- -The level of the attestation you're making. -One of "A", "B", "C" - -Default: attest_level from the profile or attestation objects. - ------------------------------------------------------------------------ -Example "tn" object: ---; - -;[18005551515] -;type = tn -;private_key_path = /var/lib/asterisk/keys/stir_shaken/tns/18005551515-key.pem -;public_cert_url = https://example.com/tncerts/18005551515-cert.pem -;attest_level = C - -;-- -======================================================================= - Verification Object Description -======================================================================= -The "verification" object sets the parameters for verification -of the Identity header on incoming INVITE requests. - -All parameters except 'global_disable" may be overridden in a "profile" -object. - -Only one "verification" object may exist. - -Parameters: - --- global_disable ----------------------------------------------------- -If set, globally disables the verification service. - -Default: no - --- load_system_certs--------------------------------------------------- -If set, loads the system Certificate Authority certificates -(usually located in /etc/pki/CA) into the trust store used to -validate the certificates in incoming requests. This is not -normally required as service providers will usually provide their -CA certififcate to you separately. - -Default: no - --- ca_file ----------------------------------------------------------- -Path to a single file containing a CA certificate or certificate chain -to be used to validate the certificates in incoming requests. - -Default: none - --- ca_path ----------------------------------------------------------- -Path to a directory containing one or more CA certificates to be used -to validate the certificates in incoming requests. The files in that -directory must contain only one certificate each and the directory -must be hashed using the OpenSSL 'c_rehash' utility. - -Default: none - -NOTE: Both ca_file and ca_path can be specified but at least one -MUST be. - --- crl_file ----------------------------------------------------------- -Path to a single file containing a CA certificate revocation list -to be used to validate the certificates in incoming requests. - -Default: none - --- crl_path ----------------------------------------------------------- -Path to a directory containing one or more CA certificate revocation -lists to be used to validate the certificates in incoming requests. -The files in that directory must contain only one certificate each and -the directory must be hashed using the OpenSSL 'c_rehash' utility. - -Default: none - -NOTE: Neither crl_file nor crl_path are required. - --- cert_cache_dir ----------------------------------------------------- -Incoming Identity headers will have a URL pointing to the certificate -used to sign the header. To prevent us from having to retrieve the -certificate for every request, we maintain a cache of them in the -'cert_cache_dir' specified. The directory will be checked for -existence and writability at startup. - -Default: /keys/stir_shaken/cache - --- curl_timeout ------------------------------------------------------- -The number of seconds we'll wait for a response when trying to retrieve -the certificate specified in the incoming Identity header's "x5u" -parameter. - -Default: 2 - --- max_cache_entry_age ------------------------------------------------ -Maximum age in seconds a certificate in the cache can reach before -re-retrieving it. - -Default: 86400 (24 hours per ATIS-1000074) - -NOTE: If, when retrieving the URL specified by the "x5u" parameter, -we receive a recognized caching directive in the HTTP response AND that -directive indicates caching for MORE than the value set here, we'll use -that time for the max_cache_entry_age. - --- max_cache_size ----------------------------------------------------- -Maximum number of entries the cache can hold. -Not presently implemented. - --- max_iat_age -------------------------------------------------------- -The "iat" parameter in the Identity header indicates the time the -sender actually created their attestation. If that is older than the -current time by the number of seconds set here, the request will be -considered "failed". - -Default: 15 - --- max_date_header_age ------------------------------------------------ -The sender MUST also send a SIP Date header in their request. If we -receive one that is older than the current time by the number of seconds -set here, the request will be considered "failed". - -Default: 15 - --- failure_action ----------------------------------------------------- -Indicates what will happen to requests that have failed verification. -Must be one of: -- continue - - Continue processing the request. You can use the STIR_SHAKEN - dialplan function to determine whether the request passed or failed - verification and take the action you deem appropriate. - -- reject_request - - Reject the request immediately using the SIP response codes - defined by RFC8224. - -- continue_return_reason - - Continue processing the request but, per RFC8224, send a SIP Reason - header back to the originator in the next provisional response - indicating the issue according to RFC8224. You can use the - STIR_SHAKEN dialplan function to determine whether the request - passed or failed verification and take the action you deem - appropriate. - -Default: continue - -NOTE: If you select "continue" or "continue_return_reason", and, -based on the results from the STIR_SHAKEN function, you determine you -want to terminate the call, you can use the PJSIPHangup() dialplan -application to reject the call using a STIR/SHAKEN-specific SIP -response code. - --- use_rfc9410_responses ---------------------------------------------- -If set, when sending Reason headers back to originators, the protocol -header parameter will be set to "STIR" rather than "SIP". This is a -new protocol defined in RFC9410 and may not be supported by all -participants. - -Default: no - --- relax_x5u_port_scheme_restrictions --------------------------------- -If set, the port and scheme restrictions imposed by ATIS-1000074 -section 5.3.1 that require the scheme to be "https" and the port to -be 443 or 8443 are relaxed. This will allow schemes like "http" -and ports other than the two mentioned to appear in x5u URLs received -in Identity headers. - -Default: no - -CAUTION: Setting this parameter could have serious security -implications and should only be use for testing. - --- relax_x5u_path_restrictions ---------------------------------------- -If set, the path restrictions imposed by ATIS-1000074 section 5.3.1 -that require the x5u URL to be rejected if it contains a query string, -path parameters, fragment identifier or user/password are relaxed. - -Default: no - -CAUTION: Setting this parameter could have serious security -implications and should only be use for testing. - --- x5u_permit/x5u_deny ------------------------------------------------ -When set, the IP address of the host in a received Identity header x5u -URL is checked against the acl created by this list of permit/deny -parameters. If the check fails, the x5u URL will be considered invalid -and verification will fail. This can prevent an attacker from sending -you a request pretending to be a known originator with a mailcious -certificate URL. (Server-side request forgery (SSRF)). -See acl.conf.sample to see examples of how to specify the permit/deny -parameters. - -Default: Deny all "Special-Purpose" IP addresses described in RFC 6890. -This includes the loopback addresses 127.0.0.0/8, private use networks such -as 10.0.0/8, 172.16.0.0/12 and 192.168.0.0/16, and the link local network -169.254.0.0/16 among others. - -CAUTION: Setting this parameter could have serious security -implications and should only be use for testing. - --- x5u_acl ------------------------------------------------------------ -Rather than providing individual permit/deny parameters, you can set -the acllist parameter to an acl list predefined in acl.conf. - -Default: none - -CAUTION: Setting this parameter could have serious security -implications and should only be use for testing. - ------------------------------------------------------------------------ -Example "verification" object: ---; - -;[verification] -;global_disable = yes -;load_system_certs = no -;ca_path = /var/lib/asterisk/keys/stir_shaken/verification_ca -;cert_cache_dir = /var/lib/asterisk/keys/stir_shaken/verification_cache -;failure_action = reject_request -;curl_timeout=5 -;max_iat_age=60 -;max_date_header_age=60 -;max_cache_entry_age = 300 -; For internal testing -;x5u_deny=0.0.0.0/0.0.0.0 -;x5u_permit=127.0.0.0/8 -;x5u_permit=192.168.100.0/24 -;relax_x5u_port_scheme_restrictions = yes -;relax_x5u_path_restrictions = yes - -;-- -======================================================================= - Profile Object Description -======================================================================= -A "profile" object can be associated to channel driver endpoint -(currently only chan_pjsip) and can set verification and attestation -parameters specific to endpoints using this profile. If you have -multiple upstream providers, this is the place to set parameters -specific to them. - -The "id" of this object is arbitrary and you'd specify it in the -"stir_shaken_profile" parameter of the endpoint. - -Parameters: - --- type (required) ---------------------------------------------------- -Must be set to "profile" - -Default: none - --- endpoint_behavior-------------------------------------------------- -Actions to be performed for endpoints referencing this profile. -Must be one of: -- off - - Don't do any STIR/SHAKEN processing. -- attest - - Attest on outgoing calls. -- verify - Verify incoming calls. -- on - - Attest outgoing calls and verify incoming calls. -Default: off - -All of the "verification" parameters defined above can be set on a profile -with the exception of 'global_disable'. - -All of the "attestation" parameters defined above can be set on a profile -with the exception of 'global_disable'. - -When Asterisk loads the configs, it creates "effective profiles" or -"eprofiles" on the fly that are the amalgamation of the attestation, -verification and profile. You can see them in the CLI with -"stir_shaken show eprofiles". - ------------------------------------------------------------------------ -Example "profile" object: ---; - -;[myprofile] -;type = profile -;endpoint_behavior = verify -;failure_action = continue_return_reason -;x5u_acl = myacllist - -;In pjsip.conf... -;[myendpoint] -;type = endpoint -;stir_shaken_profile = myprofile - -;In acl.conf... -;[myacllist] -;permit=0.0.0.0/0.0.0.0 -;deny=10.24.20.171 - From 2f076344457c1a19b9edd7155a8081674e30ac31 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Fri, 26 Jul 2024 13:33:09 -0600 Subject: [PATCH 12/99] Add instructions for `testsuite-test-pr` --- .../Code-Contribution.md | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/docs/Development/Policies-and-Procedures/Code-Contribution.md b/docs/Development/Policies-and-Procedures/Code-Contribution.md index 3e15814b74..1660b5c9a2 100644 --- a/docs/Development/Policies-and-Procedures/Code-Contribution.md +++ b/docs/Development/Policies-and-Procedures/Code-Contribution.md @@ -145,21 +145,59 @@ cherry-pick-to: 18 Each branch must be on a separate line and don't put anything else in the comment. When all the PR tests and checks have passed, an Asterisk Core developer will trigger the cherry-pick test process which will look for that comment. If the commit can't be cherry-picked cleanly to the branches you indicated or the tests fail, none of the commits will be merged. This is why it's important for you to make sure your commit cherry-picks cleanly before submitting the first pull request. -If you don't need your PR automatically cherry-picked, please add a comment stating `cherry-pick-to: none`. This saves us not having to ask if you want it cherry-picked. +If you don't need your PR automatically cherry-picked, please add a comment stating `cherry-pick-to: none`. This saves us not having to ask if you want it cherry-picked and suppresses the automated reminder. + +You have a minimum of two minutes from the time the PR is submitted before the automation will remind you to add either branch-specific entries or a `cherry-pick-to: none` entry. In reality, that check is done when the submit tests are completed so you probably have at least 30 minutes. /// note You can also add comments to a PR from the command line with `gh pr comment`. See the man page for more info. /// - /// warning -Don't add the cherry-pick-to lines to the commit message or the PR description. They're only searched for in PR comments. +Don't add the `cherry-pick-to` lines to the commit message or the PR description. They're only searched for in PR comments. /// /// warning **If you change your mind and don't want your PR automatically cherry-picked, edit the comment and replace the "cherry-pick-to" lines with a single `cherry-pick-to: none` line** Don't use formatting or other means to say "nevermind". The automation might not understand. /// +#### Test against a Testsuite PR + +If you've created a corresponding pull request in the Asterisk Testsuite, you can tell the automation to test your Asterisk PR using your Testsuite PR by adding a comment to the Asterisk PR with `testsuite-test-pr: ` as the content. For example: + +```text +testsuite-test-pr: 400 +``` + +That entry would tell the automation to checkout the testsuite PR 400 before running the testsuite tests for the Asterisk PR. You can add the `testsuite-test-pr` entry to the same comment you created for the `cherry-pick-to` entries if you prefer. + +/// warning +As with the `cherry-pick-to` entries, don't add the `testsuite-test-pr` entry to the commit message or the PR description. They're only searched for in PR comments. +/// + +You only have about two minutes from the time the PR is submitted before the automation actually starts the tests so you'll need to add the comment rather quickly. As noted above, you can easily add comments from the command line using `gh pr comment`. If you don't make it in time or you haven't written the test yet, you can always add the comment then ping someone on the Asterisk team to recheck the PR. + +/// note +Due to time constraints, only tests in the tests/channels, tests/fax, tests/extra_gates and tests/rest_api directories are run for pull request testing. If a test created by your Testsuite PR isn't in one of those directories, create a relative symlink to it in the tests/extra_gates directory and update the tests/extra_gates/tests.yml file to include it. For example... + +``` +tests/apps/a_new_test +tests/extra_gates/a_new_test -> ../apps/a_new_test +``` +Then, assuming `a_new_test` is a single test, add the following to tests/extra_tests/tests.yml: + +``` + - test: 'a_new_test' +``` + +Of course, if `a_new_test` is a directory of tests, you'd add: + +``` + - dir: 'a_new_test' +``` + +/// + ## Pull Request Review Process As with Gerrit reviews, a new PR triggers a set of tests and checks. If you browse to your PR and scroll to the bottom, you'll see the status of those checks listed. There are some differences to Gerrit however. From fa01f3324e3a223f284348def5ef0d7bfc1f048e Mon Sep 17 00:00:00 2001 From: Mike Bradeen Date: Wed, 14 Aug 2024 13:51:50 -0600 Subject: [PATCH 13/99] Create Asterisk 22 Placeholder --- docs/.pages | 1 + docs/About-the-Project/Asterisk-Versions.md | 1 + docs/Asterisk_22_Documentation/Upgrading.md | 4 ++++ docs/Asterisk_22_Documentation/WhatsNew.md | 5 +++++ docs/Asterisk_22_Documentation/index.md | 4 ++++ 5 files changed, 15 insertions(+) create mode 100644 docs/Asterisk_22_Documentation/Upgrading.md create mode 100644 docs/Asterisk_22_Documentation/WhatsNew.md create mode 100644 docs/Asterisk_22_Documentation/index.md diff --git a/docs/.pages b/docs/.pages index eebd98b5c7..480bddbe27 100644 --- a/docs/.pages +++ b/docs/.pages @@ -13,6 +13,7 @@ nav: - Asterisk_19_Documentation - Asterisk_20_Documentation - Asterisk_21_Documentation + - Asterisk_22_Documentation - Certified-Asterisk_18.9_Documentation - Certified-Asterisk_20.7_Documentation - Test-Suite-Documentation diff --git a/docs/About-the-Project/Asterisk-Versions.md b/docs/About-the-Project/Asterisk-Versions.md index 352f5fbdab..fb2eae3ac2 100644 --- a/docs/About-the-Project/Asterisk-Versions.md +++ b/docs/About-the-Project/Asterisk-Versions.md @@ -31,6 +31,7 @@ The following table shows the release time lines for all releases of Asterisk, i | 19.x | Standard | 2021-11-02 | 2022-11-02 | 2023-11-02 | EOL | | 20.x | LTS | 2022-10-19 | 2026-10-19 | 2027-10-19 | Fully Supported | | 21.x | Standard | 2023-10-18 | 2025-10-18 | 2026-10-18 | Fully Supported | +| 22.x | LTS | 2024-10-16 | 2028-10-16 | 2029-10-16 | Pre-Release | New releases of Asterisk will be made roughly once a year, alternating between standard and LTS releases. Within a given release series that is fully supported, bug fix updates are provided roughly every 4 to 6 weeks. For a release series that is receiving only maintenance for security fixes, updates are made on an as needed basis. diff --git a/docs/Asterisk_22_Documentation/Upgrading.md b/docs/Asterisk_22_Documentation/Upgrading.md new file mode 100644 index 0000000000..91bd5f9b54 --- /dev/null +++ b/docs/Asterisk_22_Documentation/Upgrading.md @@ -0,0 +1,4 @@ +--- +title: Upgrading to Asterisk 22 +--- +For a complete list upgrade information in Asterisk 22 please see the [UPGRADE.txt document](https://raw.githubusercontent.com/asterisk/asterisk/22/UPGRADE.txt) included with Asterisk 22. diff --git a/docs/Asterisk_22_Documentation/WhatsNew.md b/docs/Asterisk_22_Documentation/WhatsNew.md new file mode 100644 index 0000000000..56527373e5 --- /dev/null +++ b/docs/Asterisk_22_Documentation/WhatsNew.md @@ -0,0 +1,5 @@ +--- +title: New in 22 +--- +# What's New in Asterisk 22 +For a complete list of changes and new things in Asterisk 22 please see the [CHANGES document](https://raw.githubusercontent.com/asterisk/asterisk/22/CHANGES) included with Asterisk 22. diff --git a/docs/Asterisk_22_Documentation/index.md b/docs/Asterisk_22_Documentation/index.md new file mode 100644 index 0000000000..e913f28166 --- /dev/null +++ b/docs/Asterisk_22_Documentation/index.md @@ -0,0 +1,4 @@ +--- +title: Asterisk 22 Documentation +--- +# This is documentation specific to Asterisk 22 From f75dbe35b22a47d9d44f5553f58a311b84897c92 Mon Sep 17 00:00:00 2001 From: Frog Date: Wed, 31 Jul 2024 07:23:27 -0700 Subject: [PATCH 14/99] Update Hangup-Cause.md Improved/Fixed whitespace and formatting. --- .../Miscellaneous/Hangup-Cause.md | 52 +++++++++---------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/docs/Configuration/Miscellaneous/Hangup-Cause.md b/docs/Configuration/Miscellaneous/Hangup-Cause.md index 23b9c50988..ad3c0cba32 100644 --- a/docs/Configuration/Miscellaneous/Hangup-Cause.md +++ b/docs/Configuration/Miscellaneous/Hangup-Cause.md @@ -21,19 +21,19 @@ Used to obtain a comma separated list of all channels for which hangup causes ar The following example shows one way of accessing the channels that have hangup cause related information after a Dial has completed. In this particular example, a parallel dial occurs to both *SIP/foo* and *SIP/bar*. A hangup handler has been attached to the calling channel, which executes the subroutine at **handler,s,1** when the channel is hung up. This queries the HANGUPCAUSE\_KEYS function for the channels with hangup cause information and prints the information as a Verbose message. On the CLI, this would look something like: Channels with hangup cause information: SIP/bar-00000002,SIP/foo-00000001 +``` [default] - exten => s,1,NoOp() - same => n,Set(CHANNEL(hangup\_handler\_push)=handler,s,1) + same => n,Set(CHANNEL(hangup_handler_push)=handler,s,1) same => n,Dial(SIP/foo&SIP/bar,10) same => n,Hangup() [handler] - exten => s,1,NoOp() - same => n,Set(HANGUPCAUSE\_STRING=${HANGUPCAUSE\_KEYS()}) - same => n,Verbose(0, Channels with hangup cause information: ${HANGUPCAUSE\_STRING}) + same => n,Set(HANGUPCAUSE_STRING=${HANGUPCAUSE_KEYS()}) + same => n,Verbose(0, Channels with hangup cause information: ${HANGUPCAUSE_STRING}) same => n,Return() +``` ### HANGUPCAUSE Used to obtain hangup cause information for a specific channel. For a given channel, there are two sources of hangup cause information: @@ -46,45 +46,41 @@ Note that in some cases, the hangup causes returned may not be reflected in . Fo #### Example This example illustrates obtaining hangup cause information for a parallel dial to *SIP/foo* and *SIP/bar*. A hangup handler has been attached to the calling channel, which executes the subroutine at **handler,s,1** when the channel is hung up. This queries the hangup cause information using the HANGUPCAUSE\_KEYS function and the HANGUPCAUSE function. The channels returned from HANGUPCAUSE\_KEYS are parsed out, and each is queried for their hangup cause information. The technology specific cause code as well as the Asterisk cause code are printed to the CLI. - +``` [default] - exten => s,1,NoOp() - same => n,Set(CHANNEL(hangup\_handler\_push)=handler,s,1) + same => n,Set(CHANNEL(hangup_handler_push)=handler,s,1) same => n,Dial(SIP/foo&SIP/bar,10) same => n,Hangup() [handler] - exten => s,1,NoOp() - -same => n,Set(HANGUPCAUSE\_STRING=${HANGUPCAUSE\_KEYS()}) + same => n,Set(HANGUPCAUSE_STRING=${HANGUPCAUSE_KEYS()}) ; start loop -same => n(hu\_begin),NoOp() + same => n(hu_begin),NoOp() ; check exit condition (no more array to check) -same => n,GotoIf($[${LEN(${HANGUPCAUSE\_STRING})}=0]?hu\_exit) + same => n,GotoIf($[${LEN(${HANGUPCAUSE_STRING})}=0]?hu_exit) ; pull the next item -same => n,Set(ARRAY(item)=${HANGUPCAUSE\_STRING}) -same => n,Set(HANGUPCAUSE\_STRING=${HANGUPCAUSE\_STRING:${LEN(${item})}}) + same => n,Set(ARRAY(item)=${HANGUPCAUSE_STRING}) + same => n,Set(HANGUPCAUSE_STRING=${HANGUPCAUSE_STRING:${LEN(${item})}}) ; display the channel name and cause codes -same => n,Verbose(0, Got Channel ID ${item} with Technology Cause Code ${HANGUPCAUSE(${item},tech)}, Asterisk Cause Code ${HANGUPCAUSE(${item},ast)}) + same => n,Verbose(0, Got Channel ID ${item} with Technology Cause Code ${HANGUPCAUSE(${item},tech)}, Asterisk Cause Code ${HANGUPCAUSE(${item},ast)}) ; check exit condition (no more array to check) -same => n,GotoIf($[${LEN(${HANGUPCAUSE\_STRING})}=0]?hu\_exit) + same => n,GotoIf($[${LEN(${HANGUPCAUSE_STRING})}=0]?hu_exit) ; we still have entries to process, so strip the leading comma -same => n,Set(HANGUPCAUSE\_STRING=${HANGUPCAUSE\_STRING:1}) + same => n,Set(HANGUPCAUSE_STRING=${HANGUPCAUSE_STRING:1}) ; go back to the beginning of the loop -same => n,Goto(hu\_begin) - -same => n(hu\_exit),NoOp() -same => n,Return() - + same => n,Goto(hu_begin) + same => n(hu_exit),NoOp() + same => n,Return() +``` ### HangupCauseClear Used to remove all hangup cause information currently stored. @@ -92,17 +88,17 @@ Used to remove all hangup cause information currently stored. #### Example The following example clears the hangup cause information from the channel if *SIP/foo* fails to answer and execution continues in the dialplan. The hangup handler attached to the channel will thus only report the the name of the last channel dialled. - +``` exten => s,1,NoOp() - same => n,Set(CHANNEL(hangup\_handler\_push)=handler,s,1) + same => n,Set(CHANNEL(hangup_handler_push)=handler,s,1) same => n,Dial(SIP/foo,10) same => n,HangupCauseClear() same => n,Dial(SIP/bar,10) same => n,Hangup() [handler] - exten => s,1,NoOp() - same => n,Set(HANGUPCAUSE\_STRING=${HANGUPCAUSE\_KEYS()}) - same => n,Verbose(0, Channels with hangup cause information: ${HANGUPCAUSE\_STRING}) + same => n,Set(HANGUPCAUSE_STRING=${HANGUPCAUSE_KEYS()}) + same => n,Verbose(0, Channels with hangup cause information: ${HANGUPCAUSE_STRING}) same => n,Return() +``` From 9a5a93ddcd89c153808d7828671635a426594bae Mon Sep 17 00:00:00 2001 From: George Joseph Date: Thu, 22 Aug 2024 12:08:44 -0600 Subject: [PATCH 15/99] stir-shaken: Fix bad references to private_key_path in examples Should be private_key_file See asterisk issue 854 --- docs/Deployment/STIR-SHAKEN/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Deployment/STIR-SHAKEN/index.md b/docs/Deployment/STIR-SHAKEN/index.md index 805eb9eb14..7c7311136a 100644 --- a/docs/Deployment/STIR-SHAKEN/index.md +++ b/docs/Deployment/STIR-SHAKEN/index.md @@ -181,7 +181,7 @@ Default: no ``` [attestation] global_disable = no -private_key_path = /var/lib/asterisk/keys/stir_shaken/tns/multi-tns-key.pem +private_key_file = /var/lib/asterisk/keys/stir_shaken/tns/multi-tns-key.pem public_cert_url = https://example.com/tncerts/multi-tns-cert.pem attest_level = C ``` @@ -241,7 +241,7 @@ See the description under [attestation](#attestation-object) ``` [18005551515] type = tn -private_key_path = /var/lib/asterisk/keys/stir_shaken/tns/18005551515-key.pem +private_key_file = /var/lib/asterisk/keys/stir_shaken/tns/18005551515-key.pem public_cert_url = https://example.com/tncerts/18005551515-cert.pem attest_level = C ``` From da430953a94e93e6690dc1fe56cd65e8b1b955df Mon Sep 17 00:00:00 2001 From: George Joseph Date: Wed, 28 Aug 2024 11:23:49 -0600 Subject: [PATCH 16/99] Update ODBC instructions to include res_odbc_transaction --- .../ODBC/Configuring-res_odbc.md | 2 +- .../ODBC/Getting-Asterisk-Connected-to-MySQL-via-ODBC.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Configuration/Interfaces/Back-end-Database-and-Realtime-Connectivity/ODBC/Configuring-res_odbc.md b/docs/Configuration/Interfaces/Back-end-Database-and-Realtime-Connectivity/ODBC/Configuring-res_odbc.md index dc0c2325a1..409f7874da 100644 --- a/docs/Configuration/Interfaces/Back-end-Database-and-Realtime-Connectivity/ODBC/Configuring-res_odbc.md +++ b/docs/Configuration/Interfaces/Back-end-Database-and-Realtime-Connectivity/ODBC/Configuring-res_odbc.md @@ -22,7 +22,7 @@ Other pages on the wiki describe that process: [Using Menuselect to Select Asterisk Options](/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Using-Menuselect-to-Select-Asterisk-Options) -When using menuselect, verify that the **func_odbc** (you'll probably be using that one) and **res_odbc** (required) modules will be built. Then, build Asterisk and make sure those modules were built and exist in */usr/lib/asterisk/modules** (or whatever directory you use). +When using menuselect, verify that the **func_odbc** (you'll probably be using that one), **res_odbc** (required) and **res_odbc_transaction** (required) modules will be built. Then, build Asterisk and make sure those modules were built and exist in */usr/lib/asterisk/modules** (or whatever directory you use). Configure res_odbc.conf to connect to your ODBC installation ============================================================= diff --git a/docs/Configuration/Interfaces/Back-end-Database-and-Realtime-Connectivity/ODBC/Getting-Asterisk-Connected-to-MySQL-via-ODBC.md b/docs/Configuration/Interfaces/Back-end-Database-and-Realtime-Connectivity/ODBC/Getting-Asterisk-Connected-to-MySQL-via-ODBC.md index 5ed1036970..e4c48091d8 100644 --- a/docs/Configuration/Interfaces/Back-end-Database-and-Realtime-Connectivity/ODBC/Getting-Asterisk-Connected-to-MySQL-via-ODBC.md +++ b/docs/Configuration/Interfaces/Back-end-Database-and-Realtime-Connectivity/ODBC/Getting-Asterisk-Connected-to-MySQL-via-ODBC.md @@ -211,7 +211,7 @@ If you already had Asterisk installed from source and the modules you need are a ``` -Otherwise you should follow the typical Asterisk installation process to make sure modules such as res_odbc, res_config_odbc, cdr_odbc, cdr_adaptive_odbc and func_odbc have their dependencies fulfilled and that they will be built. +Make sure that at least the func_odbc, res_odbc and res_odbc_transaction modules are built and installed. You may also need the following modules depending on your use case: res_config_odbc, cdr_odbc, cdr_adaptive_odbc, cel_odbc. See [Building and Installing Asterisk](/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Building-and-Installing-Asterisk) and [Using Menuselect to Select Asterisk Options](/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Using-Menuselect-to-Select-Asterisk-Options). From 44f25acd0402314f6088bb1e481d6de1cc9d96b2 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Tue, 3 Sep 2024 07:30:36 -0600 Subject: [PATCH 17/99] ConfBridge Configuration: Fix formatting issues * Removed backslashes left over from conversion * Fixed headings to use proper notation. * Fixed a few table issues. * Fixed a few bullet list issues. Resolves: #99 --- .../ConfBridge/ConfBridge-Configuration.md | 70 +++++++------------ 1 file changed, 24 insertions(+), 46 deletions(-) diff --git a/docs/Configuration/Applications/Conferencing-Applications/ConfBridge/ConfBridge-Configuration.md b/docs/Configuration/Applications/Conferencing-Applications/ConfBridge/ConfBridge-Configuration.md index 835e5d0636..100aee7898 100644 --- a/docs/Configuration/Applications/Conferencing-Applications/ConfBridge/ConfBridge-Configuration.md +++ b/docs/Configuration/Applications/Conferencing-Applications/ConfBridge/ConfBridge-Configuration.md @@ -1,34 +1,20 @@ ---- -title: ConfBridge Configuration -pageid: 34014252 ---- - -ConfBridge Configuration -======================== +# ConfBridge Configuration ConfBridge Profiles and Menus are configured in the confbridge.conf configuration file - normally located at /etc/asterisk/confbridge.conf. The file contains three reserved sections: -* [general] -* [default_bridge] -* [default_user] - -The **[general]** section is currently unused, but is reserved for future use. - The **[default_bridge]** section contains all options invoked when ConfBridge is instantiated from the dialplan without a bridge profile argument. - The **[default_user]** section contains all options invoked when ConfBridge is instantiated from the dialplan without a user profile argument. +* `[general]`: Currently unused, but is reserved for future use. +* `[default_bridge]`: Contains all options invoked when ConfBridge is instantiated from the dialplan without a bridge profile argument. +* `[default_user]`: Contains all options invoked when ConfBridge is instantiated from the dialplan without a user profile argument. Each section contains a **type** definition. The type definition determines the function of the section. The three **types** are: -* bridge -* user -* menu - -**bridge** is used to denote Bridge Profile section definitions. - **user** is used to denote User Profile section definitions. - **menu** is used to denote Conference Menu section definitions. +* bridge: Used to denote Bridge Profile section definitions. +* user: Used to denote User Profile section definitions. +* menu: Used to denote Conference Menu section definitions. All other sections, defined by a section identifier encapsulated in square brackets, are user-definable. -On This Page**Example** +**Example** This is an example, using invalid options and functions, of a confbridge.conf configuration file, displaying the organizational layout. The various options and functions are described later in this page. @@ -59,8 +45,7 @@ otherDTMF=otherFunction ``` -Bridge Profile Configuration Options ------------------------------------- +## Bridge Profile Configuration Options A Bridge Profile provides the following configuration options: @@ -110,8 +95,7 @@ record_conference=yes ``` -User Profile Configuration Options ----------------------------------- +## User Profile Configuration Options A User Profile provides the following configuration options: @@ -133,13 +117,8 @@ A User Profile provides the following configuration options: | wait_marked | yes/no | Sets if the user must wait for another marked user to enter before joining the conference. By default, no. | | | end_marked | yes/no | If enabled, every user with this option in their profile will be removed from the conference when the last marked user exists the conference. | | | dsp_drop_silence | yes/no | Drops what Asterisk detects as silence from entering into the bridge. Enabling this option will drastically improve performance and help remove the buildup of background noise from the conference. This option is highly recommended for large conferences, due to its performance improvements. | | -| dsp_talking_threshold | integer in milliseconds | The time, in milliseconds, by default 160, of sound above what the DSP has established as base-line silence for a user, before that user is considered to be talking. This value affects several options:1. Audio is only mixed out of a user's incoming audio stream if talking is detected. If this value is set too loose, the user will hear themselves briefly each time they begin talking until the DSP has time to establish that they are in fact talking. -2. When talker detection AMI events are enabled, this value determines when talking has begun, which causes AMI events to fire. If this value is set too tight, AMI events may be falsely triggered by variants in the background noise of the caller. -3. The drop_silence option depends on this value to determine when the user's audio should be mixed into the bridge after periods of silence. If this value is too loose, the beginning of a user's speech will get cut off as they transition from silence to talking. - | | -| dsp_silence_threshold | integer in milliseconds | The time, in milliseconds, by default 2500, of sound falling within what the DSP has established as the baseline silence, before a user is considered to be silent. The best way to approach this option is to set it slightly above the maximum amount of milliseconds of silence a user may generate during natural speech. This value affects several operations:1. When talker detection AMI events are enabled, this value determines when the user has stopped talking after a period of talking. If this value is set too low, AMI events indicating that the user has stopped talking may get faslely sent out when the user briefly pauses during mid sentence. -2. The drop_silence option depends on this value to determine when the user's audio should begin to be dropped from the bridge, after the user stops talking. If this value is set too low, the user's audio stream may sound choppy to other participants. - | | +| dsp_talking_threshold | integer in milliseconds | The time, in milliseconds, by default 160, of sound above what the DSP has established as base-line silence for a user, before that user is considered to be talking. This value affects several options:
1. Audio is only mixed out of a user's incoming audio stream if talking is detected. If this value is set too loose, the user will hear themselves briefly each time they begin talking until the DSP has time to establish that they are in fact talking.
2. When talker detection AMI events are enabled, this value determines when talking has begun, which causes AMI events to fire. If this value is set too tight, AMI events may be falsely triggered by variants in the background noise of the caller.
3. The drop_silence option depends on this value to determine when the user's audio should be mixed into the bridge after periods of silence. If this value is too loose, the beginning of a user's speech will get cut off as they transition from silence to talking.| | +| dsp_silence_threshold | integer in milliseconds | The time, in milliseconds, by default 2500, of sound falling within what the DSP has established as the baseline silence, before a user is considered to be silent. The best way to approach this option is to set it slightly above the maximum amount of milliseconds of silence a user may generate during natural speech. This value affects several operations:
1. When talker detection AMI events are enabled, this value determines when the user has stopped talking after a period of talking. If this value is set too low, AMI events indicating that the user has stopped talking may get faslely sent out when the user briefly pauses during mid sentence.
2. The drop_silence option depends on this value to determine when the user's audio should begin to be dropped from the bridge, after the user stops talking. If this value is set too low, the user's audio stream may sound choppy to other participants.| | | talk_detection_events | yes/no | Sets whether or not notifications of when a user begins and ends talking should be sent out as events over AMI. By default, no. | | | denoise | yes/no | Whether or not a noise reduction filter should be applied to the audio before mixing. By default, off. This requires codec_speex to be built and installed. Do not confuse this option with drop_silence. denoise is useful if there is a lot of background noise for a user, as it attempts to remove the noise while still preserving the speech. This option does not remove silence from being mixed into the conference and does come at the cost of a slight performance hit. | | | jitterbuffer | yes/no | Whether or not to place a jitter buffer on the caller's audio stream before any audio mixing is performed. This option is highly recommended, but will add a slight delay to the audio and will incur a slight performance penalty. This option makes use of the JITTERBUFFER dialplan function's default adaptive jitter buffer. For a more fine-tuned jitter buffer, disable this option and use the JITTERBUFFER dialplan function on the calling channel, before it enters the ConfBridge application. | | @@ -162,8 +141,7 @@ pin=456 ``` -Conference Menu Configuration Options -------------------------------------- +## Conference Menu Configuration Options A Conference Menu provides the following configuration options: @@ -196,26 +174,26 @@ A Conference Menu provides the following configuration options: ``` [fancymenu] type=menu -\*=playback_and_continue(conf-togglemute&press&digits/1&silence/1&conf-leave&press&digits/2&silence/1&add-a-caller&press&digits/3&silence/1&conf-decrease-talking&press&digits/4&silence/1&reset-talking&press&digits/5&silence/1&increase-talking&press&digits/6&silence/1&conf-decrease-listening&press&digits/7&silence/1&conf-reset-listening&press&digits/8&silence/1&conf-increase-listening&press&digits/9&silence/1&conf-exit-menu&press&digits/0) -\*1=toggle_mute +*=playback_and_continue(conf-togglemute&press&digits/1&silence/1&conf-leave&press&digits/2&silence/1&add-a-caller&press&digits/3&silence/1&conf-decrease-talking&press&digits/4&silence/1&reset-talking&press&digits/5&silence/1&increase-talking&press&digits/6&silence/1&conf-decrease-listening&press&digits/7&silence/1&conf-reset-listening&press&digits/8&silence/1&conf-increase-listening&press&digits/9&silence/1&conf-exit-menu&press&digits/0) +*1=toggle_mute 1=toggle_mute -\*2=leave_conference +*2=leave_conference 2=leave_conference -\*3=dialplan_exec(addcallers,1,1) +*3=dialplan_exec(addcallers,1,1) 3=dialplan_exec(addcallers,1,1) -\*4=decrease_listening_volume +*4=decrease_listening_volume 4=decrease_listening_volume -\*5=reset_listening_volume +*5=reset_listening_volume 5=reset_listening_volume -\*6=increase_listening_volume +*6=increase_listening_volume 6=increase_listening_volume -\*7=decrease_talking_volume +*7=decrease_talking_volume 7=decrease_talking_volume -\*8=reset_talking_volume +*8=reset_talking_volume 8=reset_talking_volume -\*9=increase_talking_volume +*9=increase_talking_volume 9=increase_talking_volume -\*0=no_op +*0=no_op 0=no_op ``` From d5d039004b77dce65b0e6aa2a4dfdfa813e6f353 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Tue, 3 Sep 2024 11:29:50 -0600 Subject: [PATCH 18/99] Configuration/Interfaces/ARI: Fix lots of formatting errors Resolves: #102 Resolves: #103 --- .../ARI-and-Bridges-Basic-Mixing-Bridges.md | 798 ++++----- .../ARI-and-Channels-Handling-DTMF.md | 112 +- ...and-Channels-Manipulating-Channel-State.md | 422 ++--- ...-and-Channels-Simple-Media-Manipulation.md | 554 +++--- .../ARI-and-Media-Part-1-Recording.md | 876 +++++----- .../ARI-and-Media-Part-2-Playbacks.md | 1530 ++++++++--------- 6 files changed, 1947 insertions(+), 2345 deletions(-) diff --git a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Bridges/ARI-and-Bridges-Basic-Mixing-Bridges.md b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Bridges/ARI-and-Bridges-Basic-Mixing-Bridges.md index 12e08ccccd..97b9c704a2 100644 --- a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Bridges/ARI-and-Bridges-Basic-Mixing-Bridges.md +++ b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Bridges/ARI-and-Bridges-Basic-Mixing-Bridges.md @@ -1,24 +1,15 @@ ---- -title: ARI and Bridges: Basic Mixing Bridges -pageid: 29396220 ---- - -Mixing Bridges -============== +# Mixing Bridges In a mixing bridge, Asterisk shares media between all the channels in the bridge. Depending on the attributes the bridge was created with and the types of channels in the bridge, a mixing bridge may attempt to share the media in a variety of ways. They are, in order of best performance to lowest performance: * Direct packet sharing between devices - when there are two channels in a mixing bridge of similar types, it may be possible to have the media bypass Asterisk completely. In this type of bridge, the channels will pass media directly between each other, and Asterisk will simply monitor the state of the channels. However, because the media is not going through Asterisk, most features - such as recording, speech detection, DTMF, etc. - are not available. The `proxy_media` attribute or the `dtmf_events` attribute will prevent this mixing type from being used. * Native packet sharing through Asterisk - when there are two channels in a mixing bridge of similar types, but the media cannot flow directly between the devices, Asterisk will attempt to mix the media between the channels by directly passing media from one channel to the other, and vice versa. The media itself is not decoded, and so - much like when the media is directly shared between the devices - Asterisk cannot use many features. The `proxy_media` attribute or the `dtmf_events` attribute will prevent this mixing type from being used. -On This Page* Two party mixing - when there are two channels in a mixing bridge, regardless of the channel type, Asterisk will decode the media from each channel and pass it to the other participant. This mixing technology allows for all the various features of Asterisk to be used on the channels while they are in the bridge, but does not necessarily incur any penalties from transcoding. +* Two party mixing - when there are two channels in a mixing bridge, regardless of the channel type, Asterisk will decode the media from each channel and pass it to the other participant. This mixing technology allows for all the various features of Asterisk to be used on the channels while they are in the bridge, but does not necessarily incur any penalties from transcoding. * Multi-party mixing - when there are more than two channels in a mixing bridge, Asterisk will transcode the media from each participant into signed linear, mix the media from all participants together into a new media frame, then write the media back out to all participants. At all times, the bridge will attempt to mix the media in the most performant manner possible. As the situation in the bridge changes, Asterisk will switch the mixing technology to the best mixing technology available. -What Can Happen in a Mixing Bridge ----------------------------------- - - +## What Can Happen in a Mixing Bridge | Action | Bridge Response | | --- | --- | @@ -27,8 +18,7 @@ What Can Happen in a Mixing Bridge | Carol's channel - which is a DAHDI channel (poor Carol, calling from the PSTN) - is also added to the bridge via `POST /bridges/{bridge_id}/addChannel`. | Since we now have three channels in the bridge, Asterisk switches the mixing technology to multi-mix. Alice and Bob's media is sent back to Asterisk, and Asterisk mixes the media from Alice, Bob, and Carol together and then sends the new media to each channel. | | Eventually, Alice hangs up, leaving only Bob and Carol in the bridge. | Since Alice left, Asterisk switches back to the basic two-party mixing technology. We can't use a native mixing technology, as Bob and Carol's channels are incompatible, but we can use a mixing technology that is less expensive than the multi-mix technology. | -Example: Implementing a basic dial -================================== +## Example: Implementing a basic dial Dialing can be implemented by using the [`POST - /channels`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Channels_REST_API/#originate) operation and putting both the resulting channel and the original Stasis channel in a mixing bridge to allow media to flow between them. An endpoint should be specified along with the originate operation as well as a Stasis application name. This will cause the dialed channel to enter Stasis, where it can be added to a mixing bridge. It's also a good idea to use Stasis application arguments to flag that the dialed channel was dialed using originate in order to handle it differently from the original channel once it enters into the Stasis application. @@ -39,8 +29,7 @@ This example ARI application will do the following: 3. If either channel hangs up, the other channel will also be hung up. 4. Once the dialed channel exists the Stasis application, the mixing bridge will be destroyed. -Dialplan --------- +### Dialplan For this example, we'll use a Stasis application that species not only the application - `bridge-dial` - but also: @@ -49,23 +38,13 @@ For this example, we'll use a Stasis application that species not only the appli As an example, here is a dialplan that dials the `PJSIP/bob` endpoint: - - - ---- - - -extensions.conf - -``` +```text title="extensions.conf" linenums="1" exten => 1000,1,NoOp() same => n,Stasis(bridge-dial,inbound,PJSIP/bob) same => n,Hangup() - ``` -Python ------- +### Python As is typical for an ARI application, we'll start off by implementing a callback handler for the `StasisStart` event. In this particular case, our callback handler will be called in two conditions: @@ -79,66 +58,58 @@ In our `StasisStart` callback handler, we can expect to have two pieces of infor The following code shows the `StasisStart` callback handler for the `inbound` channel. Note that if the "type" is not `inbound`, we defer processing to another callback handler. We also tell the inbound channel to start ringing via the `ring` operation, and initiate an outbound dial by creating a new channel to the endpoint specified. Finally, we subscribe to the `StasisEnd` event for both channels, and instruct them to call a `safe_hangup` function on the opposing channel. This ensures that if either party hangs up, we hang up the person they were talking to. We'll show the implementation of that function shortly. +/// tip | Be careful of errors! +Note that we wrap the origination with a `try / except` block, in case the endpoint provided by the dialplan doesn't exist. When taking in input from a user or from the Asterisk dialplan, it is always good to be mindful of possible errors. +/// - - -!!! tip Be careful of errors! - Note that we wrap the origination with a `try / except` block, in case the endpoint provided by the dialplan doesn't exist. When taking in input from a user or from the Asterisk dialplan, it is always good to be mindful of possible errors. - - -[//]: # (end-tip) - -```python +```python linenums="1" def stasis_start_cb(channel_obj, ev): - """Handler for StasisStart""" - - channel = channel_obj.get('channel') - channel_name = channel.json.get('name') - args = ev.get('args') - - if not args: - print "Error: {} didn't provide any arguments!".format(channel_name) - return - - if args and args[0] != 'inbound': - # Only handle inbound channels here - return - - if len(args) != 2: - print "Error: {} didn't tell us who to dial".format(channel_name) - channel.hangup() - return - - print "{} entered our application".format(channel_name) - channel.ring() - - try: - print "Dialing {}".format(args[1]) - outgoing = client.channels.originate(endpoint=args[1], - app='bridge-dial', - appArgs='dialed') - except requests.HTTPError: - print "Whoops, pretty sure %s wasn't valid" % args[1] - channel.hangup() - return - - channel.on_event('StasisEnd', lambda \*args: safe_hangup(outgoing)) - outgoing.on_event('StasisEnd', lambda \*args: safe_hangup(channel)) - +"""Handler for StasisStart""" + + channel = channel_obj.get('channel') + channel_name = channel.json.get('name') + args = ev.get('args') + + if not args: + print("Error: {} didn't provide any arguments!".format(channel_name)) + return + + if args and args[0] != 'inbound': + # Only handle inbound channels here + return + + if len(args) != 2: + print("Error: {} didn't tell us who to dial".format(channel_name)) + channel.hangup() + return + + print("{} entered our application".format(channel_name)) + channel.ring() + + try: + print("Dialing {}".format(args[1])) + outgoing = client.channels.originate(endpoint=args[1], + app='bridge-dial', appArgs='dialed') + except requests.HTTPError: + print("Whoops, pretty sure %s wasn't valid" % args[1]) + channel.hangup() + return + + channel.on_event('StasisEnd', lambda \*args: safe_hangup(outgoing)) + outgoing.on_event('StasisEnd', lambda \*args: safe_hangup(channel)) ``` The `safe_hangup` function referenced above simply does a "safe" hangup on the channel provided. This is because it is entirely possible for both parties to hang up nearly simultaneously. Since our Python code is running in a separate process from Asterisk, we may be processing the hang up of the first party and instruct Asterisk to hang up the second party when they are already technically hung up! Again, it is always a good idea to view the processing of a communications application in an asynchronous fashion: we live in an asynchronous world, and a user can take an action at any moment in time. -```python +```python linenums="1" def safe_hangup(channel): - """Safely hang up the specified channel""" - try: - channel.hangup() - print "Hung up {}".format(channel.json.get('name')) - except requests.HTTPError as e: - if e.response.status_code != requests.codes.not_found: - raise e - + """Safely hang up the specified channel""" + try: + channel.hangup() + print("Hung up {}".format(channel.json.get('name'))) + except requests.HTTPError as e: + if e.response.status_code != requests.codes.not_found: + raise e ``` We now have to handle the outbound channel when it answers. Currently, when it answers it will be immediately placed in our Stasis application, which will call the `stasis_start_cb` we previously defined. While we could have some additional `if / else` blocks in that handler, we can also just apply a `StasisStart` callback to the outbound channel after we create it, and handle its entrance separately. @@ -152,45 +123,31 @@ When the outbound channel is answered, we need to do the following: This is shown in the following code: -```python +```python linenums="1" def outgoing_start_cb(channel_obj, ev): - """StasisStart handler for our dialed channel""" - - print "{} answered; bridging with {}".format(outgoing.json.get('name'), - channel.json.get('name')) - channel.answer() - - bridge = client.bridges.create(type='mixing') - bridge.addChannel(channel=[channel.id, outgoing.id]) - - # Clean up the bridge when done - channel.on_event('StasisEnd', lambda \*args: - safe_bridge_destroy(bridge)) - outgoing.on_event('StasisEnd', lambda \*args: - safe_bridge_destroy(bridge)) - - outgoing.on_event('StasisStart', outgoing_start_cb) - + """StasisStart handler for our dialed channel""" + + print("{} answered; bridging with {}".format(outgoing.json.get('name'), + channel.json.get('name')) + channel.answer() + + bridge = client.bridges.create(type='mixing') + bridge.addChannel(channel=[channel.id, outgoing.id]) + + # Clean up the bridge when done + channel.on_event('StasisEnd', lambda \*args: safe_bridge_destroy(bridge)) + outgoing.on_event('StasisEnd', lambda \*args: safe_bridge_destroy(bridge)) + +outgoing.on_event('StasisStart', outgoing_start_cb) ``` Note that the `safe_bridge_destroy` function is similar to the `safe_hangup` function, except that it attempts to safely destroy the mixing bridge, as opposed to hanging up the other party. - - - -### bridge-dial.py +#### bridge-dial.py The full source code for `bridge-dial.py` is shown below: - - - ---- - - -basic-dial.py - -```python +```python title="bridge-dial.py" linenums="1" #!/usr/bin/env python import logging @@ -201,88 +158,79 @@ logging.basicConfig(level=logging.ERROR) client = ari.connect('http://localhost:8088', 'asterisk', 'asterisk') - def safe_hangup(channel): - """Safely hang up the specified channel""" - try: - channel.hangup() - print "Hung up {}".format(channel.json.get('name')) - except requests.HTTPError as e: - if e.response.status_code != requests.codes.not_found: - raise e - + """Safely hang up the specified channel""" + try: + channel.hangup() + print("Hung up {}".format(channel.json.get('name'))) + except requests.HTTPError as e: + if e.response.status_code != requests.codes.not_found: + raise e def safe_bridge_destroy(bridge): - """Safely destroy the specified bridge""" - try: - bridge.destroy() - except requests.HTTPError as e: - if e.response.status_code != requests.codes.not_found: - raise e + """Safely destroy the specified bridge""" + try: + bridge.destroy() + except requests.HTTPError as e: + if e.response.status_code != requests.codes.not_found: + raise e def stasis_start_cb(channel_obj, ev): - """Handler for StasisStart""" - - channel = channel_obj.get('channel') - channel_name = channel.json.get('name') - args = ev.get('args') - - if not args: - print "Error: {} didn't provide any arguments!".format(channel_name) - return - - if args and args[0] != 'inbound': - # Only handle inbound channels here - return - - if len(args) != 2: - print "Error: {} didn't tell us who to dial".format(channel_name) - channel.hangup() - return - - print "{} entered our application".format(channel_name) - channel.ring() - - try: - print "Dialing {}".format(args[1]) - outgoing = client.channels.originate(endpoint=args[1], - app='bridge-dial', - appArgs='dialed') - except requests.HTTPError: - print "Whoops, pretty sure %s wasn't valid" % args[1] - channel.hangup() - return - - channel.on_event('StasisEnd', lambda \*args: safe_hangup(outgoing)) - outgoing.on_event('StasisEnd', lambda \*args: safe_hangup(channel)) + """Handler for StasisStart""" + + channel = channel_obj.get('channel') + channel_name = channel.json.get('name') + args = ev.get('args') + + if not args: + print("Error: {} didn't provide any arguments!".format(channel_name)) + return + + if args and args[0] != 'inbound': + # Only handle inbound channels here + return + + if len(args) != 2: + print("Error: {} didn't tell us who to dial".format(channel_name)) + channel.hangup() + return + + print("{} entered our application".format(channel_name)) + channel.ring() + + try: + print "Dialing {}".format(args[1]) + outgoing = client.channels.originate(endpoint=args[1], + app='bridge-dial', appArgs='dialed') + except requests.HTTPError: + print("Whoops, pretty sure %s wasn't valid" % args[1]) + channel.hangup() + return + + channel.on_event('StasisEnd', lambda \*args: safe_hangup(outgoing)) + outgoing.on_event('StasisEnd', lambda \*args: safe_hangup(channel)) def outgoing_start_cb(channel_obj, ev): - """StasisStart handler for our dialed channel""" - - print "{} answered; bridging with {}".format(outgoing.json.get('name'), - channel.json.get('name')) - channel.answer() - - bridge = client.bridges.create(type='mixing') - bridge.addChannel(channel=[channel.id, outgoing.id]) - - # Clean up the bridge when done - channel.on_event('StasisEnd', lambda \*args: - safe_bridge_destroy(bridge)) - outgoing.on_event('StasisEnd', lambda \*args: - safe_bridge_destroy(bridge)) - - outgoing.on_event('StasisStart', outgoing_start_cb) - + """StasisStart handler for our dialed channel""" + + print("{} answered; bridging with {}".format(outgoing.json.get('name'), + channel.json.get('name')) + channel.answer() + + bridge = client.bridges.create(type='mixing') + bridge.addChannel(channel=[channel.id, outgoing.id]) + + # Clean up the bridge when done + channel.on_event('StasisEnd', lambda \*args: safe_bridge_destroy(bridge)) + outgoing.on_event('StasisEnd', lambda \*args: safe_bridge_destroy(bridge)) + outgoing.on_event('StasisStart', outgoing_start_cb) client.on_channel_event('StasisStart', stasis_start_cb) - client.run(apps='bridge-dial') - ``` -### bridge-dial.py in action +#### bridge-dial.py in action The following shows the output of the `bridge-dial.py` script when a `PJSIP` channel for `alice` enters the application and dials a `PJSIP` channel for `bob`: @@ -294,163 +242,153 @@ Hung up PJSIP/Bob-00000002 ``` - - -JavaScript (Node.js) --------------------- +### JavaScript (Node.js) This example shows how to use anonymous functions to call functions with extra parameters that would otherwise require a closer. This can be done to reduce the number of nested callbacks required to implement the flow of an application. First, we look for an application argument in our `StasisStart` event callback to ensure that we will only originate a call if the channel entering Stasis is a channel that dialed our application extension we defined in the extensions.conf file above. We then play a sound on the channel asking the caller to wait while they are being connected and call the originate() function to process down the application flow: -```javascript +```javascript linenums="1" function stasisStart(event, channel) { - // ensure the channel is not a dialed channel - var dialed = event.args[0] === 'dialed'; - - if (!dialed) { - channel.answer(function(err) { - if (err) { - throw err; - } - - console.log('Channel %s has entered our application', channel.name); - - var playback = client.Playback(); - channel.play({media: 'sound:pls-wait-connect-call'}, - playback, function(err, playback) { - if (err) { - throw err; - } - }); - - originate(channel); - }); - } + // ensure the channel is not a dialed channel + var dialed = event.args[0] === 'dialed'; + + if (!dialed) { + channel.answer(function(err) { + if (err) { + throw err; + } + + console.log('Channel %s has entered our application', channel.name); + + var playback = client.Playback(); + channel.play({media: 'sound:pls-wait-connect-call'}, + playback, function(err, playback) { + if (err) { + throw err; + } + }); + + originate(channel); + }); + } } ``` We then prepare an object with a locally generate Id for the dialed channel and register event callbacks either channels hanging up and the dialed channel entering into the Stasis application. We then originate a call to the endpoint specified by the first command line argument to the script passing in a Stasis application argument of dialed so we can skip the dialed channel when the original StasisStart event callback fires for it: -```javascript +```javascript linenums="1" function originate(channel) { - var dialed = client.Channel(); - - channel.on('StasisEnd', function(event, channel) { - hangupDialed(channel, dialed); - }); - - dialed.on('ChannelDestroyed', function(event, dialed) { - hangupOriginal(channel, dialed); - }); - - dialed.on('StasisStart', function(event, dialed) { - joinMixingBridge(channel, dialed); - }); - - dialed.originate( - {endpoint: process.argv[2], app: 'bridge-dial', appArgs: 'dialed'}, - function(err, dialed) { - if (err) { - throw err; - } - }); + var dialed = client.Channel(); + + channel.on('StasisEnd', function(event, channel) { + hangupDialed(channel, dialed); + }); + + dialed.on('ChannelDestroyed', function(event, dialed) { + hangupOriginal(channel, dialed); + }); + + dialed.on('StasisStart', function(event, dialed) { + joinMixingBridge(channel, dialed); + }); + + dialed.originate({endpoint: process.argv[2], app: 'bridge-dial', appArgs: 'dialed'}, + function(err, dialed) { + if (err) { + throw err; + } + }); } ``` We then handle either channel hanging up by hanging up the other channel. Note that we skip any errors that occur on hangup since it is possible that the channel we are attempting to hang up is the one that has already left and would result in an HTTP error as it is no longer a Statis channel: -```javascript +```javascript linenums="1" function hangupDialed(channel, dialed) { - console.log( - 'Channel %s left our application, hanging up dialed channel %s', - channel.name, dialed.name); - - // hangup the other end - dialed.hangup(function(err) { - // ignore error since dialed channel could have hung up, causing the - // original channel to exit Stasis - }); + console.log( + 'Channel %s left our application, hanging up dialed channel %s', + channel.name, dialed.name); + + // hangup the other end + dialed.hangup(function(err) { + // ignore error since dialed channel could have hung up, causing the + // original channel to exit Stasis + }); } // handler for the dialed channel hanging up so we can gracefully hangup the // other end function hangupOriginal(channel, dialed) { - console.log('Dialed channel %s has been hung up, hanging up channel %s', - dialed.name, channel.name); - - // hangup the other end - channel.hangup(function(err) { - // ignore error since original channel could have hung up, causing the - // dialed channel to exit Stasis - }); + console.log('Dialed channel %s has been hung up, hanging up channel %s', + dialed.name, channel.name); + + // hangup the other end + channel.hangup(function(err) { + // ignore error since original channel could have hung up, causing the + // dialed channel to exit Stasis + }); } - ``` We then handle the StasisStart event for the dialed channel by registered an event callback for the StasisEnd event on the dialed channel, answer that answer, creating a new mixing bridge, and finally calling a function to add the two channels to the new bridge: -```javascript +```javascript linenums="1" function joinMixingBridge(channel, dialed) { - var bridge = client.Bridge(); - - dialed.on('StasisEnd', function(event, dialed) { - dialedExit(dialed, bridge); - }); - - dialed.answer(function(err) { - if (err) { - throw err; - } - }); - - bridge.create({type: 'mixing'}, function(err, bridge) { - if (err) { - throw err; - } - - console.log('Created bridge %s', bridge.id); - - addChannelsToBridge(channel, dialed, bridge); - }); + var bridge = client.Bridge(); + + dialed.on('StasisEnd', function(event, dialed) { + dialedExit(dialed, bridge); + }); + + dialed.answer(function(err) { + if (err) { + throw err; + } + }); + + bridge.create({type: 'mixing'}, function(err, bridge) { + if (err) { + throw err; + } + console.log('Created bridge %s', bridge.id); + addChannelsToBridge(channel, dialed, bridge); + }); } - ``` We then handle the dialed channel exiting the Stasis application by destroying the mixing bridge: -```javascript +```javascript linenums="1" function dialedExit(dialed, bridge) { - console.log( - 'Dialed channel %s has left our application, destroying bridge %s', - dialed.name, bridge.id); - - bridge.destroy(function(err) { - if (err) { - throw err; - } - }); + console.log( + 'Dialed channel %s has left our application, destroying bridge %s', + dialed.name, bridge.id); + + bridge.destroy(function(err) { + if (err) { + throw err; + } + }); } - ``` Finally, the function that was called earlier by the callback handling the StasisStart event for the dialed channel adds the two channels to the mixing bridge which allows media to flow between the two channels: -```javascript +```javascript linenums="1" function addChannelsToBridge(channel, dialed, bridge) { - console.log('Adding channel %s and dialed channel %s to bridge %s', - channel.name, dialed.name, bridge.id); - - bridge.addChannel({channel: [channel.id, dialed.id]}, function(err) { - if (err) { - throw err; - } - }); + console.log('Adding channel %s and dialed channel %s to bridge %s', + channel.name, dialed.name, bridge.id); + + bridge.addChannel({channel: [channel.id, dialed.id]}, function(err) { + if (err) { + throw err; + } + }); } - ``` -### bridge-dial.js +#### bridge-dial.js The full source code for `bridge-dial.js` is shown below: @@ -463,153 +401,151 @@ var util = require('util'); // ensure endpoint was passed in to script if (!process.argv[2]) { - console.error('usage: node bridge-dial.js endpoint'); - process.exit(1); +console.error('usage: node bridge-dial.js endpoint'); +process.exit(1); } ari.connect('http://localhost:8088', 'asterisk', 'asterisk', clientLoaded); // handler for client being loaded function clientLoaded (err, client) { - if (err) { - throw err; - } - - // handler for StasisStart event - function stasisStart(event, channel) { - // ensure the channel is not a dialed channel - var dialed = event.args[0] === 'dialed'; - - if (!dialed) { - channel.answer(function(err) { - if (err) { - throw err; - } - - console.log('Channel %s has entered our application', channel.name); - - var playback = client.Playback(); - channel.play({media: 'sound:pls-wait-connect-call'}, - playback, function(err, playback) { - if (err) { - throw err; - } - }); - - originate(channel); - }); - } - } - - function originate(channel) { - var dialed = client.Channel(); - - channel.on('StasisEnd', function(event, channel) { - hangupDialed(channel, dialed); - }); - - dialed.on('ChannelDestroyed', function(event, dialed) { - hangupOriginal(channel, dialed); - }); - - dialed.on('StasisStart', function(event, dialed) { - joinMixingBridge(channel, dialed); - }); - - dialed.originate( - {endpoint: process.argv[2], app: 'bridge-dial', appArgs: 'dialed'}, - function(err, dialed) { - if (err) { - throw err; - } - }); - } - - // handler for original channel hanging up so we can gracefully hangup the - // other end - function hangupDialed(channel, dialed) { - console.log( - 'Channel %s left our application, hanging up dialed channel %s', - channel.name, dialed.name); - - // hangup the other end - dialed.hangup(function(err) { - // ignore error since dialed channel could have hung up, causing the - // original channel to exit Stasis - }); - } - - // handler for the dialed channel hanging up so we can gracefully hangup the - // other end - function hangupOriginal(channel, dialed) { - console.log('Dialed channel %s has been hung up, hanging up channel %s', - dialed.name, channel.name); - - // hangup the other end - channel.hangup(function(err) { - // ignore error since original channel could have hung up, causing the - // dialed channel to exit Stasis - }); - } - - // handler for dialed channel entering Stasis - function joinMixingBridge(channel, dialed) { - var bridge = client.Bridge(); - - dialed.on('StasisEnd', function(event, dialed) { - dialedExit(dialed, bridge); - }); - - dialed.answer(function(err) { - if (err) { - throw err; - } - }); - - bridge.create({type: 'mixing'}, function(err, bridge) { - if (err) { - throw err; - } - - console.log('Created bridge %s', bridge.id); - - addChannelsToBridge(channel, dialed, bridge); - }); - } - - // handler for the dialed channel leaving Stasis - function dialedExit(dialed, bridge) { - console.log( - 'Dialed channel %s has left our application, destroying bridge %s', - dialed.name, bridge.id); - - bridge.destroy(function(err) { - if (err) { - throw err; - } - }); - } - - // handler for new mixing bridge ready for channels to be added to it - function addChannelsToBridge(channel, dialed, bridge) { - console.log('Adding channel %s and dialed channel %s to bridge %s', - channel.name, dialed.name, bridge.id); - - bridge.addChannel({channel: [channel.id, dialed.id]}, function(err) { - if (err) { - throw err; - } - }); - } - - client.on('StasisStart', stasisStart); - - client.start('bridge-dial'); + if (err) { + throw err; + } + + // handler for StasisStart event + function stasisStart(event, channel) { + // ensure the channel is not a dialed channel + var dialed = event.args[0] === 'dialed'; + + if (!dialed) { + channel.answer(function(err) { + if (err) { + throw err; + } + + console.log('Channel %s has entered our application', channel.name); + + var playback = client.Playback(); + channel.play({media: 'sound:pls-wait-connect-call'}, + playback, function(err, playback) { + if (err) { + throw err; + } + }); + + originate(channel); + }); + } + } + + function originate(channel) { + var dialed = client.Channel(); + + channel.on('StasisEnd', function(event, channel) { + hangupDialed(channel, dialed); + }); + + dialed.on('ChannelDestroyed', function(event, dialed) { + hangupOriginal(channel, dialed); + }); + + dialed.on('StasisStart', function(event, dialed) { + joinMixingBridge(channel, dialed); + }); + + dialed.originate( + {endpoint: process.argv[2], app: 'bridge-dial', appArgs: 'dialed'}, + function(err, dialed) { + if (err) { + throw err; + } + }); + } + + // handler for original channel hanging up so we can gracefully hangup the + // other end + function hangupDialed(channel, dialed) { + console.log( + 'Channel %s left our application, hanging up dialed channel %s', + channel.name, dialed.name); + + // hangup the other end + dialed.hangup(function(err) { + // ignore error since dialed channel could have hung up, causing the + // original channel to exit Stasis + }); + } + + // handler for the dialed channel hanging up so we can gracefully hangup the + // other end + function hangupOriginal(channel, dialed) { + console.log('Dialed channel %s has been hung up, hanging up channel %s', + dialed.name, channel.name); + + // hangup the other end + channel.hangup(function(err) { + // ignore error since original channel could have hung up, causing the + // dialed channel to exit Stasis + }); + } + + // handler for dialed channel entering Stasis + function joinMixingBridge(channel, dialed) { + var bridge = client.Bridge(); + + dialed.on('StasisEnd', function(event, dialed) { + dialedExit(dialed, bridge); + }); + + dialed.answer(function(err) { + if (err) { + throw err; + } + }); + + bridge.create({type: 'mixing'}, function(err, bridge) { + if (err) { + throw err; + } + console.log('Created bridge %s', bridge.id); + addChannelsToBridge(channel, dialed, bridge); + }); + } + + // handler for the dialed channel leaving Stasis + function dialedExit(dialed, bridge) { + console.log( + 'Dialed channel %s has left our application, destroying bridge %s', + dialed.name, bridge.id); + + bridge.destroy(function(err) { + if (err) { + throw err; + } + }); + } + + // handler for new mixing bridge ready for channels to be added to it + function addChannelsToBridge(channel, dialed, bridge) { + console.log('Adding channel %s and dialed channel %s to bridge %s', + channel.name, dialed.name, bridge.id); + + bridge.addChannel({channel: [channel.id, dialed.id]}, function(err) { + if (err) { + throw err; + } + }); + } + + client.on('StasisStart', stasisStart); + + client.start('bridge-dial'); } ``` -### bridge-dial.js in action +#### bridge-dial.js in action The following shows the output of the `bridge-dial.js` script when a `PJSIP` channel for `alice` enters the application and dials a PJSIP channel for bob: diff --git a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Handling-DTMF.md b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Handling-DTMF.md index 37ebe70b73..c84bf5e2e7 100644 --- a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Handling-DTMF.md +++ b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Handling-DTMF.md @@ -1,17 +1,11 @@ ---- -title: ARI and Channels: Handling DTMF -pageid: 29395612 ---- - -Handling DTMF events -==================== +# Handling DTMF events DTMF events are conveyed via the [`ChannelDtmfReceived`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Asterisk_REST_Data_Models/#channeldtmfreceived) event. The event contains the channel that pressed the DTMF key, the digit that was pressed, and the duration of the digit. While this concept is relatively straight forward, handling DTMF is quite common in applications, as it is the primary mechanism that phones have to inform a server to perform some action. This includes manipulating media, initiating call features, performing transfers, dialling, and just about every thing in between. As such, the examples on this page focus less on simply handling the event and more on using the DTMF in a relatively realistic fashion. -40%On This PageExample: A simple automated attendant -===================================== +## Example: A simple automated attendant + This example mimics the [automated attendant/IVR dialplan example](/Deployment/Basic-PBX-Functionality/Auto-attendant-and-IVR-Menus/Handling-Special-Extensions). It does the following: @@ -20,11 +14,6 @@ This example mimics the [automated attendant/IVR dialplan example](/Deployment/B * If the user presses an invalid digit, a prompt informing the user that the digit was invalid is played to the user and the menu restarted. * If the user fails to press anything within some period of time, a prompt asking the user if they are still present is played to the user and the menu restarted. - - - - - !!! tip For this example, you will need the following: @@ -34,20 +23,11 @@ This example mimics the [automated attendant/IVR dialplan example](/Deployment/B [//]: # (end-tip) - - -Dialplan --------- +### Dialplan As usual, a very simple dialplan is sufficient for this example. The dialplan takes the channel and places it into the Stasis application `channel-aa`. - - - ---- - - -extensions.conf +extensions.conf: ``` exten => 1000,1,NoOp() @@ -56,8 +36,7 @@ exten => 1000,1,NoOp() ``` -Python ------- +### Python As this example is a bit larger, how the code is written and structured is broken up into two phases: @@ -66,7 +45,7 @@ As this example is a bit larger, how the code is written and structured is broke The full source code for this example immediately follows the walk through. -### Playing the menu +#### Playing the menu Unlike Playback, which can chain multiple sounds together and play them back in one continuous operation, ARI treats all sound files being played as separate operations. It will queue each sound file up to be played on the channel, and hand back the caller an object to control the operation of that single sound file. The menu announcement for the attendant has the following requirements: @@ -79,7 +58,7 @@ The second requirement makes this a bit more challenging: when the user presses To start, we'll define in a list at the top of our script the sounds that make up the initial menu prompt: -```python +```python linenums="1" sounds = ['press-1', 'or', 'press-2'] ``` @@ -91,7 +70,7 @@ Since we'll want to maintain some state, we'll create a small object to do that It's useful to have both pieces of data, as we may cancel the menu half-way through and want to take one set of actions, or we may complete the menu and all the sounds and start a different set of actions. -```python +```python linenums="1" class MenuState(object): """A small tracking object for the channel in the menu""" @@ -103,7 +82,7 @@ class MenuState(object): To start, we'll write a function, `play_intro_menu`, that starts the menu on a channel. It will simply initialize the state of the menu, and get the ball rolling on the channel by calling `queue_up_sound`. -```python +```python linenums="1" def play_intro_menu(channel): """Play our intro menu to the specified channel Since we want to interrupt the playback of the menu when the user presses @@ -127,7 +106,7 @@ def play_intro_menu(channel): `queue_up_sound` will be responsible for starting the next sound file on the channel and handling the manipulation of that sound file. Since there's a fair amount of checking that goes into this, we'll put the actual act of starting the sound in `play_next_sound`, which will return the `Playback` object from ARI. We'll prep the `menu_state` object for the next sound file playback, and pass it to the `PlaybackFinished` handler for the current sound being played back to the channel. -```python +```python linenums="1" def queue_up_sound(channel, menu_state): """Start up the next sound and handle whatever happens @@ -151,7 +130,7 @@ def queue_up_sound(channel, menu_state): 1. If we shouldn't play another sound - either because we've run out of sounds to play or because the menu is now "complete", we bail and return None. 2. If we should play back a sound, start it up on the channel and return the `Playback` object. -```python +```python linenums="1" def play_next_sound(menu_state): """Play the next sound, if we should @@ -174,7 +153,7 @@ def play_next_sound(menu_state): Our playback finished handler is very simple: since we've already incremented the state of the menu, we just call `queue_up_sound` again: -```python +```python linenums="1" def on_playback_finished(playback, ev, menu_state): """Callback handler for when a playback is finished Keyword Arguments: @@ -200,7 +179,7 @@ When the user presses a DTMF key, we want to stop the current playback and end t We should also stop the menu when the channel is hung up. Since the `cancel_menu` , so we'll subscribe to the `StasisEnd` event here and call `cancel_menu` from it as well: -```python +```python linenums="1" def queue_up_sound(channel, menu_state): """Start up the next sound and handle whatever happens @@ -238,7 +217,7 @@ def queue_up_sound(channel, menu_state): Now we can cancel the menu, but we also need to restart it if the user doesn't do anything. We can use a Python timer to start a timer if we're finished playing sounds *and* we got to the end of the sound prompt list. We don't want to start the timer if the user pressed a DTMF key - in that case, we would have stopped the menu early and we should be off handling their DTMF key press. The timer will call `menu_timeout`, which will play back a "are you still there?" prompt, then restart the menu. -```python +```python linenums="1" def queue_up_sound(channel, menu_state): """Start up the next sound and handle whatever happens Keywords Arguments: @@ -284,12 +263,12 @@ def queue_up_sound(channel, menu_state): Now that we've introduced timers, we know we're going to need to stop them if the user does something. We'll store the timers in a dictionary indexed by channel ID, so we can get them from various parts of the script: -```python +```python linenums="1" channel_timers = {} ``` -### Handling the DTMF options +#### Handling the DTMF options While we now have code that plays back the menu to the user, we actually have to implement the attendant menu still. This is slightly easier than playing the menu. We can register for the `ChannelDtmfReceived` event in the `StasisStart` event handler. In that callback, we need to do the following: @@ -299,7 +278,7 @@ While we now have code that plays back the menu to the user, we actually have to The following implements these three items, deferring processing of the valid options to separate functions. -```python +```python linenums="1" def on_dtmf_received(channel, ev): """Our main DTMF handler for a channel in the IVR @@ -336,7 +315,7 @@ def stasis_start_cb(channel_obj, ev): Cancelling the timer is done in a fashion similar to other examples. If the channel has a Python timer associated with it, we cancel the timer and remove it from the dictionary. -```python +```python linenums="1" def cancel_timeout(channel): """Cancel the timeout timer for the channel @@ -352,7 +331,7 @@ def cancel_timeout(channel): Finally, we need to actually do *something* when the user presses a 1 or a 2. We could do anything here - but in our case, we're merely going to play back the number that they pressed and restart the menu. -```python +```python linenums="1" def handle_extension_one(channel): """Handler for a channel pressing '1' @@ -376,19 +355,11 @@ def handle_extension_two(channel): ``` -### channel-aa.py +#### channel-aa.py The full source for `channel-aa.py` is shown below: - - - ---- - - -channel-aa.py - -```python +```python title="channel-aa.py" linenums="1" #!/usr/bin/env python import ari @@ -584,7 +555,7 @@ client.run(apps='channel-aa') ``` -### channel-aa.py in action +#### channel-aa.py in action The following shows the output of `channel-aa.py` when a PJSIP channel presses 1, 2, 8, then times out. Finally they hang up. @@ -601,8 +572,7 @@ PJSIP/alice-00000001 has left the application -JavaScript (Node.js) --------------------- +### JavaScript (Node.js) As this example is a bit larger, how the code is written and structured is broken up into two phases: @@ -611,7 +581,7 @@ As this example is a bit larger, how the code is written and structured is broke The full source code for this example immediately follows the walk through. -### Playing the menu +#### Playing the menu Unlike Playback, which can chain multiple sounds together and play them back in one continuous operation, ARI treats all sound files being played as separate operations. It will queue each sound file up to be played on the channel, and hand back the caller an object to control the operation of that single sound file. The menu announcement for the attendant has the following requirements: @@ -624,7 +594,7 @@ The second requirement makes this a bit more challenging: when the user presses To start, we'll define an object to represent the menu at the top of our script that defines sounds that make up the initial menu prompt as well as valid DTMF options for the menu: -```javascript +```javascript linenums="1" var menu = { // valid menu options options: [1, 2], @@ -636,7 +606,7 @@ var menu = { To start with, well register a callback to handle a StasisStart and StasisEnd event on any channel that enters into our application: -```javascript +```javascript linenums="1" function stasisStart(event, channel) { console.log('Channel %s has entered the application', channel.name); @@ -675,7 +645,7 @@ Since we'll want to maintain some state, we'll create a small object to do that It's useful to have this data, as we may cancel the menu half-way through and want to take one set of actions, or we may play all the sounds that make up the menu prompt and start a different set of actions. -```javascript +```javascript linenums="1" var state = { currentSound: menu.sounds[0], currentPlayback: undefined, @@ -686,7 +656,7 @@ var state = { `playIntroMenu will` start the menu on a channel. It will simply initialize the state of the menu, and get the ball rolling on the channel by calling `queueUpSound` which is a nested function within playIntroMenu. -```javascript +```javascript linenums="1" function playIntroMenu(channel) { var state = { currentSound: menu.sounds[0], @@ -703,7 +673,7 @@ function playIntroMenu(channel) { We'll cover cancelMenu shortly, but first let's discuss queueUpSound. `queueUpSound` will be responsible for starting the next sound file on the channel and handling the manipulation of that sound file. queueUpSound is also responsible for starting a timeout once all sounds for the menu prompt have completed to handle reminding the user that they must choose a menu option. We'll cover that part shortly but first, we'll cover handling progerssing through the sounds that make up the menu prompt. We first initiate playback on the current sound in the sequence. We then register a callback to handle that playback finishing, which will trigger queueUpSound to be called again, moving on to the next sound in the sequence. Finally, we update the state object to reflect the next sound to be played in the menu prompt sequence. -```javascript +```javascript linenums="1" function queueUpSound() { if (!state.done) { // have we played all sounds in the menu? @@ -739,7 +709,7 @@ When the user presses a DTMF key, we want to stop the current playback and end t We should also stop the menu when the channel is hung up. To do this we'll subscribe to the `StasisEnd` event as well and register cancelMenu as its callback handler: -```javascript +```javascript linenums="1" function cancelMenu() { state.done = true; if (state.currentPlayback) { @@ -761,7 +731,7 @@ Note that once the cancelMenu callback is invoked, we unregister both the Channe Now we can cancel the menu, but we also need to restart it if the user doesn't do anything. We can use a JavaScript timeout to start a timer if we're finished playing sounds *and* we got to the end of the sound prompt sequence. We don't want to start the timer if the user pressed a DTMF key - in that case, we would have stopped the menu early and we should be off handling their DTMF key press. The timer will call `stillThere`, which will play back a "are you still there?" prompt, then restart the menu. -```javascript +```javascript linenums="1" function stillThere() { console.log('Channel %s stopped paying attention...', channel.name); @@ -778,12 +748,12 @@ function stillThere() { Now that we've introduced timers, we know we're going to need to stop them if the user does something. We'll store the timers in an object indexed by channel ID, so we can get them from various parts of the script: -```javascript +```javascript linenums="1" var timers = {}; ``` -### Handling the DTMF options +#### Handling the DTMF options While we now have code that plays back the menu to the user, we actually have to implement the attendant menu still. Earlier in our example we registered a callback handler for a ChannelDtmfReceived event on a channel that enters into our application. In that callback, we need to do the following: @@ -793,7 +763,7 @@ While we now have code that plays back the menu to the user, we actually have to The following implements these three items, deferring processing of the valid options to a separate function. -```javascript +```javascript linenums="1" function dtmfReceived(event, channel) { cancelTimeout(channel); var digit = parseInt(event.digit); @@ -821,7 +791,7 @@ function dtmfReceived(event, channel) { Cancelling the timer is done in a fashion similar to other examples. If the channel has a JavaScript timeout associated with it, we cancel the timer and remove it from the object. -```javascript +```javascript linenums="1" function cancelTimeout(channel) { var timer = timers[channel.id]; @@ -835,7 +805,7 @@ function cancelTimeout(channel) { Finally, we need to actually do *something* when the user presses a 1 or a 2. We could do anything here - but in our case, we're merely going to play back the number that they pressed and restart the menu. -```javascript +```javascript linenums="1" function handleDtmf(channel, digit) { var parts = ['sound:you-entered', util.format('digits:%s', digit)]; var done = 0; @@ -852,7 +822,7 @@ function handleDtmf(channel, digit) { ``` -### channel-aa.js +#### channel-aa.js The full source for `channel-aa.js` is shown below: @@ -1036,7 +1006,7 @@ function clientLoaded (err, client) { ``` -### channel-aa.js in action +#### channel-aa.js in action The following shows the output of `channel-aa.js` when a PJSIP channel presses 1, 2, 8, then times out. Finally they hang up. @@ -1051,7 +1021,3 @@ PJSIP/alice-00000001 has left the application ``` - - - - diff --git a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Manipulating-Channel-State.md b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Manipulating-Channel-State.md index 24998b7f30..c057d768de 100644 --- a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Manipulating-Channel-State.md +++ b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Manipulating-Channel-State.md @@ -1,10 +1,4 @@ ---- -title: ARI and Channels: Manipulating Channel State -pageid: 29395604 ---- - -Channel State -============= +# Channel State A channel's state reflects the current state of the path of communication between Asterisk and a device. What state a channel is in also affects what operations are allowed on it and/or how certain operations will affect a device. @@ -23,24 +17,17 @@ While there are many states a channel can be in, the following are the most comm [//]: # (end-note) - - -40%On This Page - -Indicating Ringing ------------------- +## Indicating Ringing Asterisk can inform a device that it should start playing a ringing tone back to the caller using the [`POST /channels/{channel_id}/ring`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Channels_REST_API/#ring) operation. Likewise, ringing can be stopped using the [`DELETE /channels/{channel_id}/ring`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Channels_REST_API/#ringstop) operation. Note that indicating ringing typically does not actually transmit media from Asterisk to the device in question - Asterisk merely signals the device to ring. It is up to the device itself to actually play something back for the user. -Answering a Channel -------------------- +## Answering a Channel When a channel isn't answered, Asterisk has typically not yet informed the device how it will communicate with it. Answering a channel will cause Asterisk to complete the path of communication, such that media flows bi-directionally between the device and Asterisk. You can answer a channel using the [`POST /channels/{channel_id}/answer`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Channels_REST_API/#answer) operation. -Hanging up a channel --------------------- +## Hanging up a channel You can hang up a channel using the [`DELETE /channels/{channel_id}`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Channels_REST_API/#hangup) operation. When this occurs, the path of communication between Asterisk and the device is terminated, and the channel will leave the Stasis application. Your application will be notified of this via a [StasisEnd](/Latest_API/API_Documentation/Asterisk_REST_Interface/Asterisk_REST_Data_Models/#stasisend) event. @@ -48,8 +35,7 @@ The same is true if the device initiates the hang up. In the same fashion, the p Generally, once a channel leaves your application, you won't receive any more events about the channel. There are times, however, when you may be subscribed to all events coming from a channel - regardless if that channel is in your application or not. In that case, a [ChannelDestroyed](/Latest_API/API_Documentation/Asterisk_REST_Interface/Asterisk_REST_Data_Models/#channeldestroyed) event will inform you when the channel is well and truly dead. -Example: Manipulating Channel State -=================================== +## Example: Manipulating Channel State For this example, we're going to write an ARI application that will do the following: @@ -59,28 +45,20 @@ For this example, we're going to write an ARI application that will do the follo 4. Once the channel is answered, we'll start silence on the channel so that the user feels a comfortable whishing noise. Then, after a few more seconds, we'll hangup the channel. 5. If at any point in time the phone hangs up first, we'll gracefully handle that. -Dialplan --------- +### Dialplan For this example, we need to just drop the channel into Stasis, specifying our application: - - - ---- - - extensions.conf -``` +```text title="extensions.conf" linenums="1" exten => 1000,1,NoOp() same => n,Stasis(channel-state) same => n,Hangup() ``` -Python ------- +### Python This example will use the [ari-py](https://github.com/asterisk/ari-py) library. The basic structure is very similar to the [channel-dump Python example](/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels) - see that example for more information on the basics of setting up an ARI connection using this library. @@ -92,14 +70,14 @@ To start, once our ARI client has been set up, we will want to register handlers We can store the timers that we've set up for a channel using a dictionary of channel IDs to timer instances: -```python +```python linenums="1" channel_timers = {} ``` And we can register for our three events: -```python +```python linenums="1" client.on_channel_event('StasisStart', stasis_start_cb) client.on_channel_event('ChannelStateChange', channel_state_change_cb) client.on_channel_event('StasisEnd', stasis_end_cb) @@ -112,80 +90,63 @@ The `StasisStart` event is the most interesting part. 1. First, we tell the channel to ring, and after two seconds, to answer the channel: -```python +```python linenums="1" channel.ring() - # Answer the channel after 2 seconds - timer = threading.Timer(2, answer_channel, [channel]) - channel_timers[channel.id] = timer - timer.start() - +# Answer the channel after 2 seconds +timer = threading.Timer(2, answer_channel, [channel]) +channel_timers[channel.id] = timer +timer.start() ``` If we didn't have that there, then the caller would probably just have dead space to listen to! Not very enjoyable. We store the timer in the `channel_timers` dictionary so that our `StasisEnd` event can cancel it for us if the user hangs up the phone. 2. Once we're in the `answer_channel` handler, we answer the channel and start silence on the channel. That (hopefully) gives them a slightly more ambient silence noise. Note that we'll go ahead and declare `answer_channel` as a nested function inside our `StasisStart` handler, `stasis_start_cb`: -```python +```python linenums="1" def stasis_start_cb(channel_obj, ev): - """Handler for StasisStart event""" - - def answer_channel(channel): - """Callback that will actually answer the channel""" - print "Answering channel %s" % channel.json.get('name') - channel.answer() - channel.startSilence() + """Handler for StasisStart event""" +def answer_channel(channel): + """Callback that will actually answer the channel""" + print("Answering channel %s" % channel.json.get('name')) + channel.answer() + channel.startSilence() ``` 3. After we've answered the channel, we kick off another Python timer to hang up the channel in 4 seconds. When that timer fires, it will call `hangup_channel`. This does the final action on the channel by hanging it up. Again, we'll declare `hangup_channel` as a nested function inside our `StasisStart` handler: -```python +```python linenums="1" def hangup_channel(channel): - """Callback that will actually hangup the channel""" - - print "Hanging up channel %s" % channel.json.get('name') - channel.hangup() - + """Callback that will actually hangup the channel""" + print("Hanging up channel %s" % channel.json.get('name')) + channel.hangup() ``` When we create a timer - such as when we started ringing on the channel - we stored it in our `channel_timers` dictionary. In our `StasisEnd` event handler, we'll want to cancel any pending timers. Otherwise, our timers may fire and try to perform an action on channel that has already left our Stasis application, which is a good way to get an HTTP error response code. -```python +```python linenums="1" def stasis_end_cb(channel, ev): - """Handler for StasisEnd event""" - - print "Channel %s just left our application" % channel.json.get('name') - - # Cancel any pending timers - timer = channel_timers.get(channel.id) - if timer: - timer.cancel() - del channel_timers[channel.id] - + """Handler for StasisEnd event""" + print("Channel %s just left our application" % channel.json.get('name')) + + # Cancel any pending timers + timer = channel_timers.get(channel.id) + if timer: + timer.cancel() + del channel_timers[channel.id] ``` - - Finally, we want to print out the state of the channel in the `ChannelStateChanged` handler. This will tell us exactly when our channel has been answered: -```python +```python linenums="1" def channel_state_change_cb(channel, ev): - """Handler for changes in a channel's state""" - print "Channel %s is now: %s" % (channel.json.get('name'), - channel.json.get('state')) - + """Handler for changes in a channel's state""" + print("Channel %s is now: %s" % (channel.json.get('name'), + channel.json.get('state'))) ``` -### channel-state.py +#### channel-state.py The full source code for `channel-state.py` is shown below: - - - ---- - - -channel-state.py - -```python +```python title="channel-state.py" linenums="1" #!/usr/bin/env python import ari @@ -199,59 +160,59 @@ client = ari.connect('http://localhost:8088', 'asterisk', 'asterisk') channel_timers = {} def stasis_end_cb(channel, ev): - """Handler for StasisEnd event""" + """Handler for StasisEnd event""" + print("Channel %s just left our application" % channel.json.get('name')) - print "Channel %s just left our application" % channel.json.get('name') + # Cancel any pending timers + timer = channel_timers.get(channel.id) + if timer: + timer.cancel() + del channel_timers[channel.id] - # Cancel any pending timers - timer = channel_timers.get(channel.id) - if timer: - timer.cancel() - del channel_timers[channel.id] def stasis_start_cb(channel_obj, ev): """Handler for StasisStart event""" - def answer_channel(channel): - """Callback that will actually answer the channel""" - print "Answering channel %s" % channel.json.get('name') - channel.answer() - channel.startSilence() +def answer_channel(channel): + """Callback that will actually answer the channel""" + print("Answering channel %s" % channel.json.get('name')) + channel.answer() + channel.startSilence() - # Hang up the channel in 4 seconds - timer = threading.Timer(4, hangup_channel, [channel]) - channel_timers[channel.id] = timer - timer.start() + # Hang up the channel in 4 seconds + timer = threading.Timer(4, hangup_channel, [channel]) + channel_timers[channel.id] = timer + timer.start() - def hangup_channel(channel): - """Callback that will actually hangup the channel""" +def hangup_channel(channel): + """Callback that will actually hangup the channel""" - print "Hanging up channel %s" % channel.json.get('name') - channel.hangup() + print("Hanging up channel %s" % channel.json.get('name')) + channel.hangup() - channel = channel_obj.get('channel') - print "Channel %s has entered the application" % channel.json.get('name') + channel = channel_obj.get('channel') + print("Channel %s has entered the application" % channel.json.get('name')) - channel.ring() - # Answer the channel after 2 seconds - timer = threading.Timer(2, answer_channel, [channel]) - channel_timers[channel.id] = timer - timer.start() + channel.ring() + # Answer the channel after 2 seconds + timer = threading.Timer(2, answer_channel, [channel]) + channel_timers[channel.id] = timer + timer.start() def channel_state_change_cb(channel, ev): - """Handler for changes in a channel's state""" - print "Channel %s is now: %s" % (channel.json.get('name'), - channel.json.get('state')) + """Handler for changes in a channel's state""" + print("Channel %s is now: %s" % (channel.json.get('name'), + channel.json.get('state'))) -client.on_channel_event('StasisStart', stasis_start_cb) -client.on_channel_event('ChannelStateChange', channel_state_change_cb) -client.on_channel_event('StasisEnd', stasis_end_cb) + client.on_channel_event('StasisStart', stasis_start_cb) + client.on_channel_event('ChannelStateChange', channel_state_change_cb) + client.on_channel_event('StasisEnd', stasis_end_cb) -client.run(apps='channel-state') + client.run(apps='channel-state') ``` -### channel-state.py in action +#### channel-state.py in action Here, we see the output from the `channel-state.py` script when a PJSIP channel for endpoint 'alice' enters into the application: @@ -264,8 +225,7 @@ Channel PJSIP/alice-00000001 just left our application ``` -JavaScript (Node.js) --------------------- +### JavaScript (Node.js) This example will use the [ari-client](https://github.com/asterisk/node-ari-client) library. @@ -277,18 +237,16 @@ To start, once our ARI client has been set up, we will want to register callbakc We can store the timeouts that we've set up for a channel using an object of channel IDs to timer instances: -```javascript +```javascript linenums="1" timers = {} - ``` And we can register for our three events: -```javascript +```javascript linenums="1" client.on_channel_event('StasisStart', stasis_start_cb) client.on_channel_event('ChannelStateChange', channel_state_change_cb) client.on_channel_event('StasisEnd', stasis_end_cb) - ``` @@ -297,88 +255,82 @@ The `StasisStart` event is the most interesting part. 1. First, we tell the channel to ring, and after two seconds, to answer the channel: -```javascript +```javascript linenums="1" channel.ring(function(err) { - if (err) { - throw err; - } + if (err) { + throw err; + } }); // answer the channel after 2 seconds var timer = setTimeout(answer, 2000); timers[channel.id] = timer; - ``` If we didn't have that there, then the caller would probably just have dead space to listen to! Not very enjoyable. We store the timer in the `timers` object so that our `StasisEnd` event can cancel it for us if the user hangs up the phone. 2. Once we're in the `answer` callback, we answer the channel and start silence on the channel. That (hopefully) gives them a slightly more ambient silence noise: -```javascript +```javascript linenums="1" // callback that will answer the channel function answer() { - console.log(util.format('Answering channel %s', channel.name)); - channel.answer(function(err) { - if (err) { - throw err; - } - }); - channel.startSilence(function(err) { - if (err) { - throw err; - } - }); - // hang up the channel in 4 seconds - var timer = setTimeout(hangup, 4000); - timers[channel.id] = timer; + console.log(util.format('Answering channel %s', channel.name)); + channel.answer(function(err) { + if (err) { + throw err; + } + }); + channel.startSilence(function(err) { + if (err) { + throw err; + } + }); + // hang up the channel in 4 seconds + var timer = setTimeout(hangup, 4000); + timers[channel.id] = timer; } ``` 3. After we've answered the channel, we kick off another timer to hang up the channel in 4 seconds. When that timer fires, it will call `the hangup callback`. This does the final action on the channel by hanging it up: -```javascript +```javascript linenums="1" // callback that will hangup the channel function hangup() { - console.log(util.format('Hanging up channel %s', channel.name)); - channel.hangup(function(err) { - if (err) { - throw err; - } - }); + console.log(util.format('Hanging up channel %s', channel.name)); + channel.hangup(function(err) { + if (err) { + throw err; + } + }); } - ``` When we create a timer - such as when we started ringing on the channel - we stored it in our `timers` object. In our `StasisEnd` event handler, we'll want to cancel any pending timers. Otherwise, our timers may fire and try to perform an action on channel that has already left our Stasis application, which is a good way to get an HTTP error response code. -```javascript +```javascript linenums="1" // handler for StasisEnd event function stasisEnd(event, channel) { - console.log(util.format( - 'Channel %s just left our application', channel.name)); - var timer = timers[channel.id]; - if (timer) { - clearTimeout(timer); - delete timers[channel.id]; - } + console.log(util.format( + 'Channel %s just left our application', channel.name)); + var timer = timers[channel.id]; + if (timer) { + clearTimeout(timer); + delete timers[channel.id]; + } } ``` - Finally, we want to print out the state of the channel in the `ChannelStateChanged` callback. This will tell us exactly when our channel has been answered: -```javascript +```javascript linenums="1" // handler for ChannelStateChange event function channelStateChange(event, channel) { - console.log(util.format( - 'Channel %s is now: %s', channel.name, channel.state)); + console.log(util.format( + 'Channel %s is now: %s', channel.name, channel.state)); } ``` -### channel-state.js - - - +#### channel-state.js The full source code for `channel-state.js` is shown below: @@ -394,80 +346,80 @@ ari.connect('http://localhost:8088', 'asterisk', 'asterisk', clientLoaded); // handler for client being loaded function clientLoaded (err, client) { - if (err) { - throw err; - } - - // handler for StasisStart event - function stasisStart(event, channel) { - console.log(util.format( - 'Channel %s has entered the application', channel.name)); - - channel.ring(function(err) { - if (err) { - throw err; - } - }); - // answer the channel after 2 seconds - var timer = setTimeout(answer, 2000); - timers[channel.id] = timer; - - // callback that will answer the channel - function answer() { - console.log(util.format('Answering channel %s', channel.name)); - channel.answer(function(err) { - if (err) { - throw err; - } - }); - channel.startSilence(function(err) { - if (err) { - throw err; - } - }); - // hang up the channel in 4 seconds - var timer = setTimeout(hangup, 4000); - timers[channel.id] = timer; - } - - // callback that will hangup the channel - function hangup() { - console.log(util.format('Hanging up channel %s', channel.name)); - channel.hangup(function(err) { - if (err) { - throw err; - } - }); - } - } - - // handler for StasisEnd event - function stasisEnd(event, channel) { - console.log(util.format( - 'Channel %s just left our application', channel.name)); - var timer = timers[channel.id]; - if (timer) { - clearTimeout(timer); - delete timers[channel.id]; - } - } - - // handler for ChannelStateChange event - function channelStateChange(event, channel) { - console.log(util.format( - 'Channel %s is now: %s', channel.name, channel.state)); - } - - client.on('StasisStart', stasisStart); - client.on('StasisEnd', stasisEnd); - client.on('ChannelStateChange', channelStateChange); - - client.start('channel-state'); + if (err) { + throw err; + } + + // handler for StasisStart event + function stasisStart(event, channel) { + console.log(util.format( + 'Channel %s has entered the application', channel.name)); + + channel.ring(function(err) { + if (err) { + throw err; + } + }); + // answer the channel after 2 seconds + var timer = setTimeout(answer, 2000); + timers[channel.id] = timer; + + // callback that will answer the channel + function answer() { + console.log(util.format('Answering channel %s', channel.name)); + channel.answer(function(err) { + if (err) { + throw err; + } + }); + channel.startSilence(function(err) { + if (err) { + throw err; + } + }); + // hang up the channel in 4 seconds + var timer = setTimeout(hangup, 4000); + timers[channel.id] = timer; + } + + // callback that will hangup the channel + function hangup() { + console.log(util.format('Hanging up channel %s', channel.name)); + channel.hangup(function(err) { + if (err) { + throw err; + } + }); + } + } + + // handler for StasisEnd event + function stasisEnd(event, channel) { + console.log(util.format( + 'Channel %s just left our application', channel.name)); + var timer = timers[channel.id]; + if (timer) { + clearTimeout(timer); + delete timers[channel.id]; + } + } + + // handler for ChannelStateChange event + function channelStateChange(event, channel) { + console.log(util.format( + 'Channel %s is now: %s', channel.name, channel.state)); + } + + client.on('StasisStart', stasisStart); + client.on('StasisEnd', stasisEnd); + client.on('ChannelStateChange', channelStateChange); + + client.start('channel-state'); } ``` -### channel-state.js in action +#### channel-state.js in action Here, we see the output from the `channel-state.js` script when a PJSIP channel for endpoint 'alice' enters into the application: diff --git a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Simple-Media-Manipulation.md b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Simple-Media-Manipulation.md index 64230955cf..69078148bb 100644 --- a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Simple-Media-Manipulation.md +++ b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Simple-Media-Manipulation.md @@ -1,17 +1,9 @@ ---- -title: ARI and Channels: Simple Media Manipulation -pageid: 29395606 ---- - -60%Simple media playback -===================== +# Simple media playback Almost all media is played to a channel using the `POST /channels/{channel_id}/play` operation. This will do the following: -1. Create a new [`Playback`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Asterisk_REST_Data_Models/#playback) object for the channel. If a media operation is currently in progress on the channel, the new `Playback` object will be queued up for the channel. -2. The `media` URI passed to the `play` operation will be inspected, and Asterisk will attempt to find the media requested. Currently, the following media schemes are supported: - - +* Create a new [`Playback`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Asterisk_REST_Data_Models/#playback) object for the channel. If a media operation is currently in progress on the channel, the new `Playback` object will be queued up for the channel. +* The `media` URI passed to the `play` operation will be inspected, and Asterisk will attempt to find the media requested. Currently, the following media schemes are supported: | URI Scheme | Description | | --- | --- | @@ -21,34 +13,22 @@ Almost all media is played to a channel using the `POST /channels/{channel_id}/p | `digits` | Play back the specified digits. This uses the same mechanism as Asterisk's `[Say](/SayDigits-+SayNumber-+SayAlpha-+and+SayPhonetic+Applications?src=search)` family of applications. | | `characters` | Play back the specified characters. This uses the same mechanism as Asterisk's `[Say](/SayDigits-+SayNumber-+SayAlpha-+and+SayPhonetic+Applications?src=search)` family of applications. | | `tone` | Play a particular tone sequence until stopped. This can be used to play locale specific ringing, stutter, busy, congestion, or other tones to a device. | -3. Once the media operation is started or enqueued, the `Playback` object will be returned to the caller in the `HTTP` response to the request. The caller can use that playback object to manipulate the media operation. - - - -On This Page - - - -!!! tip Specify your own ID!** It is **highly - recommended that the `POST /channels/{channel_id}/play/{playback_id}` operation be used instead of the `POST /channels/{channel_id}/play` variant. Asterisk lives in an asynchronous world - which is the same world you and I live in. Sometimes, if things happen *very* quickly, you may get notifications over the WebSocket about things you have started before the HTTP response completes! +* Once the media operation is started or enqueued, the `Playback` object will be returned to the caller in the `HTTP` response to the request. The caller can use that playback object to manipulate the media operation. - When you specify your own ID, you have the ability to tie information coming from events back to whatever operation you initiated - if you so choose to. If you use the non-ID providing variant, Asterisk will happily generate a UUID for your `Playback` object - but then it is up to you to deal with whatever information comes back from the WebSocket. +/// tip | Specify your own ID! +It is **highly recommended** that the `POST /channels/{channel_id}/play/{playback_id}` operation be used instead of the `POST /channels/{channel_id}/play` variant. Asterisk lives in an asynchronous world - which is the same world you and I live in. Sometimes, if things happen *very* quickly, you may get notifications over the WebSocket about things you have started before the HTTP response completes! - -[//]: # (end-tip) +When you specify your own ID, you have the ability to tie information coming from events back to whatever operation you initiated - if you so choose to. If you use the non-ID providing variant, Asterisk will happily generate a UUID for your `Playback` object - but then it is up to you to deal with whatever information comes back from the WebSocket. +/// - - -Early Media ------------ +## Early Media Generally, before a channel has been answered and transitioned to the Up state, media cannot pass between Asterisk and a device. For example, if Asterisk is placing an outbound call to a device, the device may be ringing but no one has picked up a handset yet! In such circumstances, media cannot be successfully played to the ringing device - after all, who could listen to it? However, with inbound calls, Asterisk is the entity that decides when the path of communication between itself and the device is answered - not the user on the other end. This can be useful when answering the channel may trigger billing times or other mechanisms that we don't want to fire yet. This is called "early media". For the channel technologies that support this, ARI and Asterisk will automatically handle sending the correct indications to the ringing phone before sending it media. The same `play` operation can be used both for "regular" playback of media, as well as for "early media" scenarios. -Example: Playing back tones -=========================== +## Example: Playing back tones This example ARI application will do the following: @@ -56,66 +36,45 @@ This example ARI application will do the following: 2. After 8 seconds, the channel will be answered. 3. After 1 second, the channel will be rudely hung up on - we didn't want to talk to them anyway! -Dialplan --------- +### Dialplan For this example, we need to just drop the channel into Stasis, specifying our application: - - - ---- - - -extensions.conf - -```text +```text title="extensions.conf" linenums="1" exten => 1000,1,NoOp() same => n,Stasis(channel-tones) same => n,Hangup() ``` -Python ------- +### Python Instead of performing a `ring` operation in our `StasisStart` handler, we'll instead initiate a playback using the `playWithId` operation on the channel. Note that our URI uses the `tone` scheme, which supports an optional `tonezone` parameter. We specify our `tonezone` as `fr`, so that we get an elegant French ringing tone. Much like the `channel-state.py` example, we then use a Python timer to schedule a callback that will answer the channel. Since we care about both the `channel` and the `playback` initiated on it, we pass both parameters as `*args` parameters to the callback function. -```python +```python linenums="1" playback_id = str(uuid.uuid4()) - playback = channel.playWithId(playbackId=playback_id, - media='tone:ring;tonezone=fr') - timer = threading.Timer(8, answer_channel, [channel, playback]) - +playback = channel.playWithId(playbackId=playback_id, +media='tone:ring;tonezone=fr') +timer = threading.Timer(8, answer_channel, [channel, playback]) ``` Since this is a media operation and not *technically* a ringing indication, when we `answer` the channel, the tone playback will not stop! To stop playing back our French ringing tone, we issue a `stop` operation on the `playback` object. This actually maps to a [`DELETE /playbacks/{playback_id}`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Playbacks_REST_API/#stop) operation. -```python +```python linenums="1" def answer_channel(channel, playback): - """Callback that will actually answer the channel""" - - print "Answering channel %s" % channel.json.get('name') - playback.stop() - channel.answer() - + """Callback that will actually answer the channel""" + print("Answering channel %s" % channel.json.get('name')) + playback.stop() + channel.answer() ``` Once answered, we'll schedule another Python timer that will do the actual hanging up of the channel. -### channel-tones.py +#### channel-tones.py The full source code for `channel-tones.py` is shown below: - - - ---- - - -channel-tones.py - -```python +```python title="channel-tones.py" linenums="1" #!/usr/bin/env python import ari @@ -130,54 +89,48 @@ client = ari.connect('http://localhost:8088', 'asterisk', 'asterisk') channel_timers = {} def stasis_end_cb(channel, ev): - """Handler for StasisEnd event""" - - print "Channel %s just left our application" % channel.json.get('name') - timer = channel_timers.get(channel.id) - if timer: - timer.cancel() - del channel_timers[channel.id] + """Handler for StasisEnd event""" + print("Channel %s just left our application" % channel.json.get('name')) + timer = channel_timers.get(channel.id) + if timer: + timer.cancel() + del channel_timers[channel.id] def stasis_start_cb(channel_obj, ev): - """Handler for StasisStart event""" - - def answer_channel(channel, playback): - """Callback that will actually answer the channel""" - - print "Answering channel %s" % channel.json.get('name') - playback.stop() - channel.answer() - - timer = threading.Timer(1, hangup_channel, [channel]) - channel_timers[channel.id] = timer - timer.start() - - def hangup_channel(channel): - """Callback that will actually hangup the channel""" - - print "Hanging up channel %s" % channel.json.get('name') - channel.hangup() - - channel = channel_obj.get('channel') - print "Channel %s has entered the application" % channel.json.get('name') - - playback_id = str(uuid.uuid4()) - playback = channel.playWithId(playbackId=playback_id, - media='tone:ring;tonezone=fr') - timer = threading.Timer(8, answer_channel, [channel, playback]) - channel_timers[channel.id] = timer - timer.start() + """Handler for StasisStart event""" +def answer_channel(channel, playback): + """Callback that will actually answer the channel""" + print("Answering channel %s" % channel.json.get('name')) + playback.stop() + channel.answer() + + timer = threading.Timer(1, hangup_channel, [channel]) + channel_timers[channel.id] = timer + timer.start() + +def hangup_channel(channel): + """Callback that will actually hangup the channel""" + print("Hanging up channel %s" % channel.json.get('name')) + channel.hangup() + +channel = channel_obj.get('channel') +print("Channel %s has entered the application" % channel.json.get('name')) +playback_id = str(uuid.uuid4()) +playback = channel.playWithId(playbackId=playback_id, +media='tone:ring;tonezone=fr') +timer = threading.Timer(8, answer_channel, [channel, playback]) +channel_timers[channel.id] = timer +timer.start() client.on_channel_event('StasisStart', stasis_start_cb) client.on_channel_event('StasisEnd', stasis_end_cb) - client.run(apps='channel-tones') ``` -### channel-tones.py in action +#### channel-tones.py in action The following shows the output of the `channel-tones.js` script when a `PJSIP` channel for `alice` enters the application: @@ -189,53 +142,46 @@ Channel PJSIP/alice-00000000 just left our application ``` -JavaScript (Node.js) --------------------- +### JavaScript (Node.js) Instead of performing a `ring` operation in our `StasisStart` handler, we'll instead initiate a playback using the `play` operation on the channel. Note that our URI uses the `tone` scheme, which supports an optional `tonezone` parameter. We specify our `tonezone` as `fr`, so that we get an elegant French ringing tone. Much like the `channel-state.js` example, we then use a JavaScript timeout to schedule a callback that will answer the channel. -```javascript +```javascript linenums="1" var playback = client.Playback(); -channel.play({media: 'tone:ring;tonezone=fr'}, - playback, function(err, newPlayback) { - if (err) { - throw err; - } +channel.play({media: 'tone:ring;tonezone=fr'}, playback, function(err, newPlayback) { + if (err) { + throw err; + } }); // answer the channel after 8 seconds var timer = setTimeout(answer, 8000); timers[channel.id] = timer; - ``` Since this is a media operation and not *technically* a ringing indication, when we `answer` the channel, the tone playback will not stop! To stop playing back our French ringing tone, we issue a `stop` operation on the `playback` object. This actually maps to a [`DELETE /playbacks/{playback_id}`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Playbacks_REST_API/#stop) operation. Notice that we use the fact that the answer callback closes on the original channel and playback variables to access them from the callback. -```javascript +```javascript linenums="1" function answer() { - console.log(util.format('Answering channel %s', channel.name)); - playback.stop(function(err) { - if (err) { - throw err; - } - }); - channel.answer(function(err) { - if (err) { - throw err; - } - }); - // hang up the channel in 1 seconds - var timer = setTimeout(hangup, 1000); - timers[channel.id] = timer; + console.log(util.format('Answering channel %s', channel.name)); + playback.stop(function(err) { + if (err) { + throw err; + } + }); + channel.answer(function(err) { + if (err) { + throw err; + } + }); + // hang up the channel in 1 seconds + var timer = setTimeout(hangup, 1000); + timers[channel.id] = timer; } - ``` Once answered, we'll schedule another timeout that will do the actual hanging up of the channel. -### channel-tones.js - - - +#### channel-tones.js The full source code for `channel-tones.js` is shown below: @@ -251,144 +197,130 @@ ari.connect('http://localhost:8088', 'asterisk', 'asterisk', clientLoaded); // handler for client being loaded function clientLoaded (err, client) { - if (err) { - throw err; - } - - // handler for StasisStart event - function stasisStart(event, channel) { - console.log(util.format( - 'Channel %s has entered the application', channel.name)); - - var playback = client.Playback(); - channel.play({media: 'tone:ring;tonezone=fr'}, - playback, function(err, newPlayback) { - if (err) { - throw err; - } - }); - // answer the channel after 8 seconds - var timer = setTimeout(answer, 8000); - timers[channel.id] = timer; - - // callback that will answer the channel - function answer() { - console.log(util.format('Answering channel %s', channel.name)); - playback.stop(function(err) { - if (err) { - throw err; - } - }); - channel.answer(function(err) { - if (err) { - throw err; - } - }); - // hang up the channel in 1 seconds - var timer = setTimeout(hangup, 1000); - timers[channel.id] = timer; - } - - // callback that will hangup the channel - function hangup() { - console.log(util.format('Hanging up channel %s', channel.name)); - channel.hangup(function(err) { - if (err) { - throw err; - } - }); - } - } - - // handler for StasisEnd event - function stasisEnd(event, channel) { - console.log(util.format( - 'Channel %s just left our application', channel.name)); - var timer = timers[channel.id]; - if (timer) { - clearTimeout(timer); - delete timers[channel.id]; - } - } - - client.on('StasisStart', stasisStart); - client.on('StasisEnd', stasisEnd); - - client.start('channel-tones'); + if (err) { + throw err; + } + + // handler for StasisStart event + function stasisStart(event, channel) { + console.log(util.format('Channel %s has entered the application', channel.name)); + + var playback = client.Playback(); + channel.play({media: 'tone:ring;tonezone=fr'},playback, function(err, newPlayback) { + if (err) { + throw err; + } + }); + // answer the channel after 8 seconds + var timer = setTimeout(answer, 8000); + timers[channel.id] = timer; + + // callback that will answer the channel + function answer() { + console.log(util.format('Answering channel %s', channel.name)); + playback.stop(function(err) { + if (err) { + throw err; + } + }); + channel.answer(function(err) { + if (err) { + throw err; + } + }); + // hang up the channel in 1 seconds + var timer = setTimeout(hangup, 1000); + timers[channel.id] = timer; + } + + // callback that will hangup the channel + function hangup() { + console.log(util.format('Hanging up channel %s', channel.name)); + channel.hangup(function(err) { + if (err) { + throw err; + } + }); + } + } + + // handler for StasisEnd event + function stasisEnd(event, channel) { + console.log(util.format('Channel %s just left our application', channel.name)); + var timer = timers[channel.id]; + if (timer) { + clearTimeout(timer); + delete timers[channel.id]; + } + } + + client.on('StasisStart', stasisStart); + client.on('StasisEnd', stasisEnd); + client.start('channel-tones'); } ``` -### channel-tones.js in action +#### channel-tones.js in action The following shows the output of the `channel-tones.js` script when a `PJSIP` channel for `alice` enters the application: -`Channel PJSIP/alice-00000000 has entered the application +``` +Channel PJSIP/alice-00000000 has entered the application Answering channel PJSIP/alice-00000000 Hanging up channel PJSIP/alice-00000000 -Channel PJSIP/alice-00000000 just left our application`Example: Playing back a sound file -================================== +Channel PJSIP/alice-00000000 just left our application +``` + +## Example: Playing back a sound file This example ARI application will do the following: 1. When a channel enters the Stasis application, initiate a playback of howler monkeys on the channel. Fly my pretties, FLY! 2. If the user has not hung up their phone in panic, it will hang up the channel when the howler monkeys return victorious - or rather, when ARI notifies the application that the playback has finished via the [`PlaybackFinished`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Asterisk_REST_Data_Models/#playbackfinished) event. -Dialplan --------- +### Dialplan For this example, we need to just drop the channel into Stasis, specifying our application: - - - ---- - - -extensions.conf - -```text +```text title="extensions.conf" linenums="1" exten => 1000,1,NoOp() same => n,Stasis(channel-playback-monkeys) same => n,Hangup() ``` -Python ------- +### Python -We'll start off by initiating a playback on the channel. Instead of specifying a `tone` scheme, however, we'll specify a scheme of `sound` with a resource of `tt-monkeys`. Unlike the tones, this media *does* have a well defined ending - the end of the sound file! So we'll subscribe for the `PlaybackFinished` event and tell `ari-py` to call `playback_finished` when our monkeys are done attacking. -```python - playback_id = str(uuid.uuid4()) - playback = channel.playWithId(playbackId=playback_id, - media='sound:tt-monkeys') - playback.on_event('PlaybackFinished', playback_finished) +We'll start off by initiating a playback on the channel. Instead of specifying a `tone` scheme, however, we'll specify a scheme of `sound` with a resource of `tt-monkeys`. Unlike the tones, this media *does* have a well defined ending - the end of the sound file! So we'll subscribe for the `PlaybackFinished` event and tell `ari-py` to call `playback_finished` when our monkeys are done attacking. +```python linenums="1" +playback_id = str(uuid.uuid4()) +playback = channel.playWithId(playbackId=playback_id, +media='sound:tt-monkeys') +playback.on_event('PlaybackFinished', playback_finished) ``` Unfortunately, `ari-py` doesn't let us pass arbitrary data to a callback function in the same fashion as a Python timer. Nuts. Luckily, the `Playback` object has a property, `target_uri`, that tells us which object it just finished playing to. Using that, we can get the `channel` object back from Asterisk so we can hang it up. -```python +```python linenums="1" def playback_finished(playback, ev): - """Callback when the monkeys have finished howling""" - - target_uri = playback.json.get('target_uri') - channel_id = target_uri.replace('channel:', '') - channel = client.channels.get(channelId=channel_id) - - print "Monkeys successfully vanquished %s; hanging them up" % channel.json.get('name') - channel.hangup() - + """Callback when the monkeys have finished howling""" + target_uri = playback.json.get('target_uri') + channel_id = target_uri.replace('channel:', '') + channel = client.channels.get(channelId=channel_id) + print("Monkeys successfully vanquished %s; hanging them up" % channel.json.get('name')) + channel.hangup() ``` Note that unlike the `channel-tones.py` example, this application eschews the use of Python timers and simply responds to ARI events as they happen. This means we don't have to do much in our `StasisEnd` event, and we have to track less state. -### channel-playback-monkeys.py +#### channel-playback-monkeys.py The full source code for `channel-playback-monkeys.py` is shown below: -```python +```python title="channel-playback-monkeys.py" linenums="1" #!/usr/bin/env python import ari @@ -400,41 +332,34 @@ logging.basicConfig(level=logging.ERROR) client = ari.connect('http://localhost:8088', 'asterisk', 'asterisk') def stasis_end_cb(channel, ev): - """Handler for StasisEnd event""" - - print "Channel %s just left our application" % channel.json.get('name') + """Handler for StasisEnd event""" + print("Channel %s just left our application" % channel.json.get('name')) def stasis_start_cb(channel_obj, ev): - """Handler for StasisStart event""" - - def playback_finished(playback, ev): - """Callback when the monkeys have finished howling""" - - target_uri = playback.json.get('target_uri') - channel_id = target_uri.replace('channel:', '') - channel = client.channels.get(channelId=channel_id) - - print "Monkeys successfully vanquished %s; hanging them up" % channel.json.get('name') - channel.hangup() - - channel = channel_obj.get('channel') - print "Monkeys! Attack %s!" % channel.json.get('name') - - playback_id = str(uuid.uuid4()) - playback = channel.playWithId(playbackId=playback_id, - media='sound:tt-monkeys') - playback.on_event('PlaybackFinished', playback_finished) + """Handler for StasisStart event""" +def playback_finished(playback, ev): + """Callback when the monkeys have finished howling""" + target_uri = playback.json.get('target_uri') + channel_id = target_uri.replace('channel:', '') + channel = client.channels.get(channelId=channel_id) + + print("Monkeys successfully vanquished %s; hanging them up" % channel.json.get('name')) + channel.hangup() + + channel = channel_obj.get('channel') + print("Monkeys! Attack %s!" % channel.json.get('name')) + + playback_id = str(uuid.uuid4()) + playback = channel.playWithId(playbackId=playback_id, media='sound:tt-monkeys') + playback.on_event('PlaybackFinished', playback_finished) client.on_channel_event('StasisStart', stasis_start_cb) client.on_channel_event('StasisEnd', stasis_end_cb) - - client.run(apps='channel-playback-monkeys') - ``` -### channel-playback-monkeys.py in action +#### channel-playback-monkeys.py in action The following shows the output of the `channel-playback-monkeys`.py script when a `PJSIP` channel for `alice` enters the application: @@ -445,46 +370,41 @@ Channel PJSIP/alice-00000000 just left our application ``` -JavaScript (Node.js) --------------------- +### JavaScript (Node.js) -Much like the `[channel-tones.js](#channel-tones.js)` example, we'll start off by initiating a playback on the channel. Instead of specifying a `tone` scheme, however, we'll specify a scheme of `sound` with a resource of `tt-monkeys`. Unlike the tones, this media *does* have a well defined ending - the end of the sound file! So we'll subscribe for the `PlaybackFinished` event and tell `ari-client` to call `playbackFinished` when our monkeys are done attacking. Notice that we use `client.Playback()` to generate a playback object with a pre-existing Id so we can scope the PlaybackFinished event to the playback we just created. +Much like the `[channel-tones.js](#channel-tones-js)` example, we'll start off by initiating a playback on the channel. Instead of specifying a `tone` scheme, however, we'll specify a scheme of `sound` with a resource of `tt-monkeys`. Unlike the tones, this media *does* have a well defined ending - the end of the sound file! So we'll subscribe for the `PlaybackFinished` event and tell `ari-client` to call `playbackFinished` when our monkeys are done attacking. Notice that we use `client.Playback()` to generate a playback object with a pre-existing Id so we can scope the PlaybackFinished event to the playback we just created. -```javascript +```javascript linenums="1" var playback = client.Playback(); -channel.play({media: 'sound:tt-monkeys'}, - playback, function(err, newPlayback) { - if (err) { - throw err; - } +channel.play({media: 'sound:tt-monkeys'},playback, function(err, newPlayback) { + if (err) { + throw err; + } }); playback.on('PlaybackFinished', playbackFinished); - ``` Notice that we use the fact that the playbackFinished callback closes over the original channel variable to perform a hangup operation using that object directly. -```javascript +```javascript linenums="1" function playbackFinished(event, completedPlayback) { - console.log(util.format( - 'Monkeys successfully vanquished %s; hanging them up', - channel.name)); - channel.hangup(function(err) { - if (err) { - throw err; - } - }); + console.log(util.format('Monkeys successfully vanquished %s; hanging them up', + channel.name)); + channel.hangup(function(err) { + if (err) { + throw err; + } + }); } - ``` Note that unlike the `channel-tones.js` example, this application eschews the use of JavaScript timeouts and simply responds to ARI events as they happen. This means we don't have to do much in our `StasisEnd` event, and we have to track less state. -### channel-playback-monkeys.js +#### channel-playback-monkeys.js The full source code for `channel-playback-monkeys.js` is shown below: -```javascript +```javascript title="channel-playback-monkeys.js" linenums="1" /*jshint node: true */ 'use strict'; @@ -495,51 +415,44 @@ ari.connect('http://localhost:8088', 'asterisk', 'asterisk', clientLoaded); // handler for client being loaded function clientLoaded (err, client) { - if (err) { - throw err; - } - - // handler for StasisStart event - function stasisStart(event, channel) { - console.log(util.format( - 'Monkeys! Attack %s!', channel.name)); - - var playback = client.Playback(); - channel.play({media: 'sound:tt-monkeys'}, - playback, function(err, newPlayback) { - if (err) { - throw err; - } - }); - playback.on('PlaybackFinished', playbackFinished); - - function playbackFinished(event, completedPlayback) { - console.log(util.format( - 'Monkeys successfully vanquished %s; hanging them up', - channel.name)); - channel.hangup(function(err) { - if (err) { - throw err; - } - }); - } - } - - // handler for StasisEnd event - function stasisEnd(event, channel) { - console.log(util.format( - 'Channel %s just left our application', channel.name)); - } - - client.on('StasisStart', stasisStart); - client.on('StasisEnd', stasisEnd); - - client.start('channel-playback-monkeys'); + if (err) { + throw err; + } + + // handler for StasisStart event + function stasisStart(event, channel) { + console.log(util.format('Monkeys! Attack %s!', channel.name)); + var playback = client.Playback(); + channel.play({media: 'sound:tt-monkeys'}, playback, function(err, newPlayback) { + if (err) { + throw err; + } + }); + playback.on('PlaybackFinished', playbackFinished); + + function playbackFinished(event, completedPlayback) { + console.log(util.format('Monkeys successfully vanquished %s; hanging them up', + channel.name)); + channel.hangup(function(err) { + if (err) { + throw err; + } + }); + } + } + + // handler for StasisEnd event + function stasisEnd(event, channel) { + console.log(util.format('Channel %s just left our application', channel.name)); + } + + client.on('StasisStart', stasisStart); + client.on('StasisEnd', stasisEnd); + client.start('channel-playback-monkeys'); } - ``` -### channel-playback-monkeys.js in action +#### channel-playback-monkeys.js in action The following shows the output of the `channel-playback-monkeys`.js script when a `PJSIP` channel for `alice` enters the application: @@ -547,6 +460,5 @@ The following shows the output of the `channel-playback-monkeys`.js script when Monkeys! Attack PJSIP/alice-00000000! Monkeys successfully vanquished PJSIP/alice-00000000; hanging them up Channel PJSIP/alice-00000000 just left our application - ``` diff --git a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-1-Recording.md b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-1-Recording.md index aaa59b467a..16e5f8c4df 100644 --- a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-1-Recording.md +++ b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-1-Recording.md @@ -1,10 +1,4 @@ ---- -title: ARI and Media: Part 1 - Recording -pageid: 30277826 ---- - -The Recording API -================= +# The Recording API Recordings in ARI are divided into two main categories: live and stored. Live recordings are those that are currently being recorded on a channel or bridge, and stored recordings are recordings that have been completed and saved to the file system. The API for the `/recordings` resource can be found [here](/Latest_API/API_Documentation/Asterisk_REST_Interface/Recordings_REST_API). @@ -12,24 +6,12 @@ Live recordings can be manipulated as they are being made, with options to manip Channels can have their audio recorded using the [`/channels/{channelId}/record`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Channels_REST_API/#record) resource, and Bridges can have their audio recorded using the `[/bridges/{bridgeId}/record](/Latest_API/API_Documentation/Asterisk_REST_Interface/Bridges_REST_API/#record)` resource. -Voice Mail Application Skeleton -=============================== +## Voice Mail Application Skeleton Our application to record voice mails will be based on the following skeleton. As we add new features, we will create new states for our state machine, and add a few extra lines to our application skeleton in order to link the states together appropriately. -40%On this Page - - - - - ---- - - -vm-record.py - -``` -pytrue#!/usr/bin/env python +```python title="vm-record.py" linenums="1" +#!/usr/bin/env python import ari import logging @@ -47,37 +29,32 @@ LOGGER = logging.getLogger(__name__) client = ari.connect('http://localhost:8088', 'asterisk', 'asterisk') - class VoiceMailCall(object): - def __init__(self, ari_client, channel, mailbox): - self.client = ari_client - self.channel = channel - self.vm_path = os.path.join('voicemail', mailbox, str(time.time())) - self.setup_state_machine() - - def setup_state_machine(self): - # This is where we will initialize states, create a state machine, add - # state transitions to the state machine, and start the state machine. + def __init__(self, ari_client, channel, mailbox): + self.client = ari_client + self.channel = channel + self.vm_path = os.path.join('voicemail', mailbox, str(time.time())) + self.setup_state_machine() + def setup_state_machine(self): + # This is where we will initialize states, create a state machine, add + # state transitions to the state machine, and start the state machine. def stasis_start_cb(channel_obj, event): - channel = channel_obj['channel'] - channel_name = channel.json.get('name') - mailbox = event.get('args')[0] - - print("Channel {0} recording voicemail for {1}".format( - channel_name, mailbox)) - - channel.answer() - VoiceMailCall(client, channel, mailbox) + channel = channel_obj['channel'] + channel_name = channel.json.get('name') + mailbox = event.get('args')[0] + print("Channel {0} recording voicemail for {1}".format(channel_name, mailbox)) + channel.answer() + VoiceMailCall(client, channel, mailbox) client.on_channel_event('StasisStart', stasis_start_cb) client.run(apps=sys.argv[1]) - ``` + ```javascript title="vm-record.js" linenums="1" -jstrue/*jshint node:true */ +/*jshint node:true */ 'use strict'; var ari = require('ari-client'); @@ -92,55 +69,51 @@ var StateMachine = require('./state_machine'); ari.connect('http://localhost:8088', 'asterisk', 'asterisk', clientLoaded); var VoiceMailCall = function(ari_client, channel, mailbox) { - this.client = ari_client; - this.channel = channel; - this.vm_path = path.join('voicemail', mailbox, Date.now().toString()); + this.client = ari_client; + this.channel = channel; + this.vm_path = path.join('voicemail', mailbox, Date.now().toString()); - this.setup_state_machine = function() { - // This is where we will initialize states, create a state machine, add - // state transitions to the state machine, and start the state machine. - } + this.setup_state_machine = function() { + // This is where we will initialize states, create a state machine, add + // state transitions to the state machine, and start the state machine. + } - this.setup_state_machine(); + this.setup_state_machine(); } - function clientLoaded(err, client) { - if (err) { - throw err; - } - - client.on('StasisStart', stasisStart); - - function stasisStart(event, channel) { - var mailbox = event.args[0] - channel.answer(function(err) { - if (err) { - throw err; - } - new VoiceMailCall(client, channel, mailbox); - }); - } - - client.start(process.argv[2]); + if (err) { + throw err; + } + + client.on('StasisStart', stasisStart); + + function stasisStart(event, channel) { + var mailbox = event.args[0] + channel.answer(function(err) { + if (err) { + throw err; + } + new VoiceMailCall(client, channel, mailbox); + }); + } + + client.start(process.argv[2]); } - ``` With a few modifications, this same application skeleton can be adapted for use with non-voice mail applications. The biggest voice mail-specific thing being done here is the calculation of the path for voice mail recordings based on the application argument. The intended use of this application is something like the following: -``` +```text title="extensions.conf" linenums="1" [default] exten => _3XX,1,NoOp() same => n,Stasis(vm-record, ${EXTEN}) same => n,Hangup() - ``` This way, when calling any three-digit extension that begins with the number '3', the user will call into the application with the mailbox dialled (e.g. dialling "305" will allow the user to leave a message for mailbox "305"). -Basic Voice Mail Recording -========================== +## Basic Voice Mail Recording We've seen a lot of the underlying concepts for our application, so let's actually make something useful now. We'll start with a very simple application that allows callers to record a message upon entering the application. When the caller has completed recording the message, the caller may press the # key or may hang up to accept the recording. Here is a state machine diagram for the application: @@ -150,98 +123,87 @@ Notice that even though DTMF '#' and a caller hangup result in the same end resu For this, we will be defining three states: recording, hungup, and ending. The following is the code for the three states: - - - ---- - - -recording_state.py - -``` -pytruefrom event import Event +```python title="recording_state.py" linenums="1" +from event import Event class RecordingState(object): - state_name = "recording" - - def __init__(self, call): - self.call = call - self.hangup_event = None - self.dtmf_event = None - self.recording = None - - def enter(self): - print "Entering recording state" - self.hangup_event = self.call.channel.on_event('ChannelHangupRequest', - self.on_hangup) - self.dtmf_event = self.call.channel.on_event('ChannelDtmfReceived', - self.on_dtmf) - self.recording = self.call.channel.record(name=self.call.vm_path, - format='wav', - beep=True, - ifExists='overwrite') - print "Recording voicemail at {0}".format(self.call.vm_path) - - def cleanup(self): - print "Cleaning up event handlers" - self.dtmf_event.close() - self.hangup_event.close() - - def on_hangup(self, channel, event): - print "Accepted recording {0} on hangup".format(self.call.vm_path) - self.cleanup() - self.call.state_machine.change_state(Event.HANGUP) - - def on_dtmf(self, channel, event): - digit = event.get('digit') - if digit == '#': - rec_name = self.recording.json.get('name') - print "Accepted recording {0} on DTMF #".format(rec_name) - self.cleanup() - self.recording.stop() - self.call.state_machine.change_state(Event.DTMF_OCTOTHORPE) - + state_name = "recording" + + def __init__(self, call): + self.call = call + self.hangup_event = None + self.dtmf_event = None + self.recording = None + + def enter(self): + print "Entering recording state" + self.hangup_event = self.call.channel.on_event('ChannelHangupRequest',self.on_hangup) + self.dtmf_event = self.call.channel.on_event('ChannelDtmfReceived', self.on_dtmf) + self.recording = self.call.channel.record(name=self.call.vm_path,format='wav', + beep=True, + ifExists='overwrite') + print("Recording voicemail at {0}".format(self.call.vm_path)) + + def cleanup(self): + print "Cleaning up event handlers" + self.dtmf_event.close() + self.hangup_event.close() + + def on_hangup(self, channel, event): + print("Accepted recording {0} on hangup".format(self.call.vm_path)) + self.cleanup() + self.call.state_machine.change_state(Event.HANGUP) + + def on_dtmf(self, channel, event): + digit = event.get('digit') + if digit == '#': + rec_name = self.recording.json.get('name') + print("Accepted recording {0} on DTMF #".format(rec_name)) + self.cleanup() + self.recording.stop() + self.call.state_machine.change_state(Event.DTMF_OCTOTHORPE) ``` + ```javascript title="recording_state.js" linenums="1" -jstruevar Event = require('./event') +var Event = require('./event') function RecordingState(call) { - this.state_name = "recording"; - - this.enter = function() { - var recording = call.client.LiveRecording(call.client, {name: call.vm_path}); - console.log("Entering recording state"); - call.channel.on("ChannelHangupRequest", on_hangup); - call.channel.on("ChannelDtmfReceived", on_dtmf); - call.channel.record({name: recording.name, format: 'wav', beep: true, ifExists: 'overwrite'}, recording); - - function cleanup() { - call.channel.removeListener('ChannelHangupRequest', on_hangup); - call.channel.removeListener('ChannelDtmfReceived', on_dtmf); - } - - function on_hangup(event, channel) { - console.log("Accepted recording %s on hangup", recording.name); - cleanup(); - call.state_machine.change_state(Event.HANGUP); - } - - function on_dtmf(event, channel) { - switch (event.digit) { - case '#': - console.log("Accepted recording", call.vm_path); - cleanup(); - recording.stop(function(err) { - call.state_machine.change_state(Event.DTMF_OCTOTHORPE); - }); - break; - } - } - } + this.state_name = "recording"; + + this.enter = function() { + var recording = call.client.LiveRecording(call.client, {name: call.vm_path}); + console.log("Entering recording state"); + call.channel.on("ChannelHangupRequest", on_hangup); + call.channel.on("ChannelDtmfReceived", on_dtmf); + call.channel.record({name: recording.name, format: 'wav', beep: true, + ifExists: 'overwrite'}, recording); + + function cleanup() { + call.channel.removeListener('ChannelHangupRequest', on_hangup); + call.channel.removeListener('ChannelDtmfReceived', on_dtmf); + } + + function on_hangup(event, channel) { + console.log("Accepted recording %s on hangup", recording.name); + cleanup(); + call.state_machine.change_state(Event.HANGUP); + } + + function on_dtmf(event, channel) { + switch (event.digit) { + case '#': + console.log("Accepted recording", call.vm_path); + cleanup(); + recording.stop(function(err) { + call.state_machine.change_state(Event.DTMF_OCTOTHORPE); + }); + break; + } + } + } } module.exports = RecordingState; - ``` When entered, the state sets up listeners for hangup and DTMF events on the channel, since those are the events that will cause the state to change. In all cases, before a state change occurs, the `cleanup()` function is invoked to remove event listeners. This way, the event listeners set by the recording state will not accidentally still be set up when the next state is entered. This same `cleanup()` method will be used for all states we create that set up ARI event listeners. @@ -250,125 +212,97 @@ The `stop` method causes a live recording to finish and be saved to the file sys The other two states in the state machine are much simpler, since they are terminal states and do not need to watch for any events. +```python title="ending_state.py" linenums="1" +class EndingState(object): + state_name = "ending" + def __init__(self, call): + self.call = call - ---- - - -ending_state.py - + def enter(self): + channel_name = self.call.channel.json.get('name') + print("Ending voice mail call from {0}".format(channel_name)) + self.call.channel.hangup() ``` -pytrueclass EndingState(object): - state_name = "ending" - - def __init__(self, call): - self.call = call - def enter(self): - channel_name = self.call.channel.json.get('name') - print "Ending voice mail call from {0}".format(channel_name) - self.call.channel.hangup() - -``` ```javascript title="ending_state.js" linenums="1" -jstruefunction EndingState(call) { - this.state_name = "ending"; - - this.enter = function() { - channel_name = call.channel.name; - console.log("Ending voice mail call from", channel_name); - call.channel.hangup(); - } +function EndingState(call) { + this.state_name = "ending"; + + this.enter = function() { + channel_name = call.channel.name; + console.log("Ending voice mail call from", channel_name); + call.channel.hangup(); + } } - module.exports = EndingState; - ``` - - ---- - - -hangup_state.py +```python title="hangup_state.py" linenums="1" +class HungUpState(object): + state_name = "hungup" + + def __init__(self, call): + self.call = call + + def enter(self): + channel_name = self.call.channel.json.get('name') + print("Channel {0} hung up".format(channel_name)) ``` -pytrueclass HungUpState(object): - state_name = "hungup" - - def __init__(self, call): - self.call = call - - def enter(self): - channel_name = self.call.channel.json.get('name') - print "Channel {0} hung up".format(channel_name) -``` ```javascript title="hungup_state.js" linenums="1" -jstruefunction HungUpState(call) { - this.state_name = "hungup"; - - this.enter = function() { - channel_name = call.channel.name; - console.log("Channel %s hung up", channel_name); - } +function HungUpState(call) { + this.state_name = "hungup"; + + this.enter = function() { + channel_name = call.channel.name; + console.log("Channel %s hung up", channel_name); + } } - module.exports = HungUpState; - ``` These two states are two sides to the same coin. The `EndingState` is used to end the call by hanging up the channel, and the `HungUpState` is used to terminate the state machine when the caller has hung up. You may find yourself wondering why a `HungUpState` is needed at all. For our application, it does not do much, but it's a great place to perform post-call logic if your application demands it. See the second reader exercise on this page to see an example of that. Using the application skeleton we set up earlier, we can make the following modifications to accommodate our state machine: - - - ---- - - -vm-call.py - -``` -pytrue# At the top of the file +```python title="vm-call.py" linenums="1" +# At the top of the file from recording_state import RecordingState from ending_state import EndingState from hungup_state import HungUpState # Inside our VoiceMailCall class - def setup_state_machine(self): - hungup_state = HungUpState(self) - recording_state = RecordingState(self) - ending_state = EndingState(self) - - self.state_machine = StateMachine() - self.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, - ending_state) - self.state_machine.add_transition(recording_state, Event.HANGUP, - hungup_state) - self.state_machine.start(recording_state) - + def setup_state_machine(self): + hungup_state = HungUpState(self) + recording_state = RecordingState(self) + ending_state = EndingState(self) + + self.state_machine = StateMachine() + self.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, ending_state) + self.state_machine.add_transition(recording_state, Event.HANGUP, hungup_state) + self.state_machine.start(recording_state) ``` + ```javascript title="vm-call.js" linenums="1" -jstrue// At the top of the file +// At the top of the file var RecordingState = require('./recording_state'); var EndingState = require('./ending_state'); var HungUpState = require('./hungup_state'); // Inside our VoiceMailCall function - this.setup_state_machine = function() { - var hungup_state = new HungUpState(self) - var recording_state = new RecordingState(self) - var ending_state = new EndingState(self) - - this.state_machine = new StateMachine() - this.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, ending_state) - this.state_machine.add_transition(recording_state, Event.HANGUP, hungup_state) - this.state_machine.start(recording_state) - } + this.setup_state_machine = function() { + var hungup_state = new HungUpState(self) + var recording_state = new RecordingState(self) + var ending_state = new EndingState(self) + + this.state_machine = new StateMachine() + this.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, ending_state) + this.state_machine.add_transition(recording_state, Event.HANGUP, hungup_state) + this.state_machine.start(recording_state) + } ``` @@ -384,12 +318,18 @@ Ending voice mail call from PJSIP/200-00000003 ``` -silverseagreenReader Exercise 1solidblackCurrently, the voicemails being recorded are all kept in a single "folder" for a specific mailbox. See if you can change the code to record messages in an "INBOX" folder on the mailbox instead.silverseagreenReader Exercise 2solidblack`EndingState` and `HungUpState` don't do much of anything at the moment. States like these can be great in voice mail applications for updating the message-waiting state of mailboxes on a system. If you're feeling industrious, read the API for the `/mailboxes` resource in ARI. Try to change `HungUpState` and `EndingState` to update the message-waiting status of a mailbox when a new message is left. To keep the exercise simple, for now you can assume the following: +### Reader Exercise 1 + +Currently, the voicemails being recorded are all kept in a single "folder" for a specific mailbox. See if you can change the code to record messages in an "INBOX" folder on the mailbox instead. + +### Reader Exercise 2 + +`EndingState` and `HungUpState` don't do much of anything at the moment. States like these can be great in voice mail applications for updating the message-waiting state of mailboxes on a system. If you're feeling industrious, read the API for the `/mailboxes` resource in ARI. Try to change `HungUpState` and `EndingState` to update the message-waiting status of a mailbox when a new message is left. To keep the exercise simple, for now you can assume the following: * The number of "old" messages in a mailbox is always 0 * Since you are more concerned with alerting the mailbox owner that there exist new messages, do not try to count the messages in the mailbox. Instead, just state that there is 1 new message. -Cancelling a Recording -====================== + +## Cancelling a Recording Now we have a simple application set up to record a message, but it's pretty bare at the moment. Let's start expanding some. One feature we can add is the ability to press a DTMF key while recording a voice mail to cancel the current recording and re-start the recording process. We'll use the DTMF * key to accomplish this. The updated state machine diagram looks like the following: @@ -398,94 +338,77 @@ Now we have a simple application set up to record a message, but it's pretty bar All that has changed is that there is a new transition, which means a minimal change to our current code to facilitate the change. In our `recording_state` file, we will rewrite the `on_dtmf` method as follows: - - ---- - - -recording_state.py - +```python title="recording_state.py" linenums="1" +def on_dtmf(self, channel, event): + digit = event.get('digit') + if digit == '#': + rec_name = self.recording.json.get('name') + print "Accepted recording {0} on DTMF #".format(rec_name) + self.cleanup() + self.recording.stop() + self.call.state_machine.change_state(Event.DTMF_OCTOTHORPE) + # NEW CONTENT + elif digit == '\*': + rec_name = self.recording.json.get('name') + print "Canceling recording {0} on DTMF \*".format(rec_name) + self.cleanup() + self.recording.cancel() + self.call.state_machine.change_state(Event.DTMF_STAR) ``` -pytrue def on_dtmf(self, channel, event): - digit = event.get('digit') - if digit == '#': - rec_name = self.recording.json.get('name') - print "Accepted recording {0} on DTMF #".format(rec_name) - self.cleanup() - self.recording.stop() - self.call.state_machine.change_state(Event.DTMF_OCTOTHORPE) - # NEW CONTENT - elif digit == '\*': - rec_name = self.recording.json.get('name') - print "Canceling recording {0} on DTMF \*".format(rec_name) - self.cleanup() - self.recording.cancel() - self.call.state_machine.change_state(Event.DTMF_STAR) -``` ```javascript title="recording_state.js" linenums="1" -jstrue function on_dtmf(event, channel) { - switch (event.digit) { - case '#': - console.log("Accepted recording", call.vm_path); - cleanup(); - recording.stop(function(err) { - call.state_machine.change_state(Event.DTMF_OCTOTHORPE); - }); - break; - // NEW CONTENT - case '\*': - console.log("Canceling recording", call.vm_path); - cleanup(); - recording.cancel(function(err) { - call.state_machine.change_state(Event.DTMF_STAR); - }); - break; - } - } - +function on_dtmf(event, channel) { + switch (event.digit) { + case '#': + console.log("Accepted recording", call.vm_path); + cleanup(); + recording.stop(function(err) { + call.state_machine.change_state(Event.DTMF_OCTOTHORPE); + }); + break; + // NEW CONTENT + case '\*': + console.log("Canceling recording", call.vm_path); + cleanup(); + recording.cancel(function(err) { + call.state_machine.change_state(Event.DTMF_STAR); + }); + break; + } +} ``` The first part of the method is the same as it was before, but we have added extra handling for when the user presses the * key. The `cancel()` method for live recordings causes the live recording to be stopped and for it not to be stored on the file system. We also need to add our new transition while setting up our state machine. Our `VoiceMailCall::setup_state_machine()` method now looks like: - - - ---- - - -vm-call.py - +```python title="vm-call.py" linenums="1" +def setup_state_machine(self): + hungup_state = HungUpState(self) + recording_state = RecordingState(self) + ending_state = EndingState(self) + self.state_machine = StateMachine() + self.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, + ending_state) + self.state_machine.add_transition(recording_state, Event.HANGUP, + hungup_state) + self.state_machine.add_transition(recording_state, Event.DTMF_STAR, + recording_state) + self.state_machine.start(recording_state) ``` -pytrue def setup_state_machine(self): - hungup_state = HungUpState(self) - recording_state = RecordingState(self) - ending_state = EndingState(self) - self.state_machine = StateMachine() - self.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, - ending_state) - self.state_machine.add_transition(recording_state, Event.HANGUP, - hungup_state) - self.state_machine.add_transition(recording_state, Event.DTMF_STAR, - recording_state) - self.state_machine.start(recording_state) -``` ```javascript title="vm-call.js" linenums="1" -jstruethis.setup_state_machine = function() { - var hungup_state = new HungUpState(this); - var recording_state = new RecordingState(this); - var ending_state = new EndingState(this); - - this.state_machine = new StateMachine(); - this.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, ending_state); - this.state_machine.add_transition(recording_state, Event.HANGUP, hungup_state); - this.state_machine.add_transition(recording_state, Event.DTMF_STAR, recording_state); - this.state_machine.start(recording_state); +this.setup_state_machine = function() { + var hungup_state = new HungUpState(this); + var recording_state = new RecordingState(this); + var ending_state = new EndingState(this); + + this.state_machine = new StateMachine(); + this.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, ending_state); + this.state_machine.add_transition(recording_state, Event.HANGUP, hungup_state); + this.state_machine.add_transition(recording_state, Event.DTMF_STAR, recording_state); + this.state_machine.start(recording_state); } - ``` This is exactly the same as it was, except for the penultimate line adding the ``Event.DTMF_STAR`` transition. Here is sample output for when a user calls in, presses * twice, and then presses # to complete the call @@ -505,19 +428,19 @@ Recording voicemail at voicemail/305/1411498790.65 Accepted recording voicemail/305/1411498790.65 on DTMF # Cleaning up event handlers Ending voice mail call from PJSIP/200-00000007 - ``` -silverseagreenReader Exercise 3solidblackWe have covered the `stop()` and `cancel()` methods, but live recordings provide other methods as well. In particular, there are `pause()`, which causes the live recording to temporarily stop recording audio, and `unpause()`, which causes the live recording to resume recording audio. +### Reader Exercise 3 +We have covered the `stop()` and `cancel()` methods, but live recordings provide other methods as well. In particular, there are `pause()`, which causes the live recording to temporarily stop recording audio, and `unpause()`, which causes the live recording to resume recording audio. Modify the `RecordingState` to allow a DTMF digit of your choice to toggle pausing and unpausing the live recording. -silverseagreenReader Exercise 4solidblackOur application provides the ability to cancel recordings and re-record them, but it gives no ability to cancel the recording and end the call. +### Reader Exercise 4 +Our application provides the ability to cancel recordings and re-record them, but it gives no ability to cancel the recording and end the call. Modify the `RecordingState` to allow for a DTMF digit of your choice to cancel the recording and end the call. -Operating on Stored Recordings -============================== +## Operating on Stored Recordings So far, we've recorded a channel, stopped a live recording, and cancelled a live recording. Now let's turn our attention to operations that can be performed on stored recordings. An obvious operation to start with is to play back the stored recording. We're going to make another modification to our voice mail recording application that adds a "reviewing" state after a voicemail is recorded. In this state, a user that has recorded a voice mail will hear the recorded message played back to him/her. The user may press the # key or hang up in order to accept the recorded message, or the user may press * to erase the stored recording and record a new message in its place. Below is the updated state diagram with the new "reviewing" state added. @@ -525,128 +448,118 @@ So far, we've recorded a channel, stopped a live recording, and cancelled a live To realize this, here is the code for our new "reviewing" state: - - - ---- - - -reviewing_state.py - -``` -pytrueimport uuid +```python title="reviewing_state.py" +import uuid class ReviewingState(object): - state_name = "reviewing" - - def __init__(self, call): - self.call = call - self.playback_id = None - self.hangup_event = None - self.playback_finished = None - self.dtmf_event = None - self.playback = None - - def enter(self): - self.playback_id = str(uuid.uuid4()) - print "Entering reviewing state" - self.hangup_event = self.call.channel.on_event("ChannelHangupRequest", - self.on_hangup) - self.playback_finished = self.call.client.on_event( - 'PlaybackFinished', self.on_playback_finished) - self.dtmf_event = self.call.channel.on_event('ChannelDtmfReceived', - self.on_dtmf) - self.playback = self.call.channel.playWithId( - playbackId=self.playback_id, media="recording:{0}".format( - self.call.vm_path)) - - def cleanup(self): - self.playback_finished.close() - if self.playback: - self.playback.stop() - self.dtmf_event.close() - self.hangup_event.close() - - def on_hangup(self, channel, event): - print "Accepted recording {0} on hangup".format(self.call.vm_path) - self.cleanup() - self.call.state_machine.change_state(Event.HANGUP) - - def on_playback_finished(self, event): - if self.playback_id == event.get('playback').get('id'): - self.playback = None - - def on_dtmf(self, channel, event): - digit = event.get('digit') - if digit == '#': - print "Accepted recording {0} on DTMF #".format(self.call.vm_path) - self.cleanup() - self.call.state_machine.change_state(Event.DTMF_OCTOTHORPE) - elif digit == '\*': - print "Discarding stored recording {0} on DTMF \*".format(self.call.vm_path) - self.cleanup() - self.call.client.recordings.deleteStored( - recordingName=self.call.vm_path) - self.call.state_machine.change_state(Event.DTMF_STAR) - + state_name = "reviewing" + + def __init__(self, call): + self.call = call + self.playback_id = None + self.hangup_event = None + self.playback_finished = None + self.dtmf_event = None + self.playback = None + + def enter(self): + self.playback_id = str(uuid.uuid4()) + print("Entering reviewing state") + self.hangup_event = self.call.channel.on_event("ChannelHangupRequest", + self.on_hangup) + self.playback_finished = self.call.client.on_event( + 'PlaybackFinished', self.on_playback_finished) + self.dtmf_event = self.call.channel.on_event('ChannelDtmfReceived', + self.on_dtmf) + self.playback = self.call.channel.playWithId( + playbackId=self.playback_id, media="recording:{0}".format( + self.call.vm_path)) + + def cleanup(self): + self.playback_finished.close() + if self.playback: + self.playback.stop() + self.dtmf_event.close() + self.hangup_event.close() + + def on_hangup(self, channel, event): + print("Accepted recording {0} on hangup".format(self.call.vm_path)) + self.cleanup() + self.call.state_machine.change_state(Event.HANGUP) + + def on_playback_finished(self, event): + if self.playback_id == event.get('playback').get('id'): + self.playback = None + + def on_dtmf(self, channel, event): + digit = event.get('digit') + if digit == '#': + print("Accepted recording {0} on DTMF #".format(self.call.vm_path)) + self.cleanup() + self.call.state_machine.change_state(Event.DTMF_OCTOTHORPE) + elif digit == '\*': + print("Discarding stored recording {0} on DTMF \*".format(self.call.vm_path)) + self.cleanup() + self.call.client.recordings.deleteStored( + recordingName=self.call.vm_path) + self.call.state_machine.change_state(Event.DTMF_STAR) ``` + ```javascript title="reviewing_state.js" linenums="1" -jstruevar Event = require('./event'); +var Event = require('./event'); function ReviewingState(call) { - this.state_name = "reviewing"; - - this.enter = function() { - var playback = call.client.Playback(); - var url = "recording:" + call.vm_path; - console.log("Entering reviewing state"); - call.channel.on("ChannelHangupRequest", on_hangup); - call.channel.on("ChannelDtmfReceived", on_dtmf); - call.client.on("PlaybackFinished", on_playback_finished); - call.channel.play({media: url}, playback); - - function cleanup() { - call.channel.removeListener('ChannelHangupRequest', on_hangup); - call.channel.removeListener('ChannelDtmfReceived', on_dtmf); - call.client.removeListener('PlaybackFinished', on_playback_finished); - if (playback) { - playback.stop(); - } - } - - function on_hangup(event, channel) { - console.log("Accepted recording %s on hangup", call.vm_path); - playback = null; - cleanup(); - call.state_machine.change_state(Event.HANGUP); - } - - function on_playback_finished(event) { - if (playback && (playback.id === event.playback.id)) { - playback = null; - } - } - - function on_dtmf(event, channel) { - switch (event.digit) { - case '#': - console.log("Accepted recording", call.vm_path); - cleanup(); - call.state_machine.change_state(Event.DTMF_OCTOTHORPE); - break; - case '\*': - console.log("Canceling recording", call.vm_path); - cleanup(); - call.client.recordings.deleteStored({recordingName: call.vm_path}); - call.state_machine.change_state(Event.DTMF_STAR); - break; - } - } - } + this.state_name = "reviewing"; + + this.enter = function() { + var playback = call.client.Playback(); + var url = "recording:" + call.vm_path; + console.log("Entering reviewing state"); + call.channel.on("ChannelHangupRequest", on_hangup); + call.channel.on("ChannelDtmfReceived", on_dtmf); + call.client.on("PlaybackFinished", on_playback_finished); + call.channel.play({media: url}, playback); + + function cleanup() { + call.channel.removeListener('ChannelHangupRequest', on_hangup); + call.channel.removeListener('ChannelDtmfReceived', on_dtmf); + call.client.removeListener('PlaybackFinished', on_playback_finished); + if (playback) { + playback.stop(); + } + } + + function on_hangup(event, channel) { + console.log("Accepted recording %s on hangup", call.vm_path); + playback = null; + cleanup(); + call.state_machine.change_state(Event.HANGUP); + } + + function on_playback_finished(event) { + if (playback && (playback.id === event.playback.id)) { + playback = null; + } + } + + function on_dtmf(event, channel) { + switch (event.digit) { + case '#': + console.log("Accepted recording", call.vm_path); + cleanup(); + call.state_machine.change_state(Event.DTMF_OCTOTHORPE); + break; + case '\*': + console.log("Canceling recording", call.vm_path); + cleanup(); + call.client.recordings.deleteStored({recordingName: call.vm_path}); + call.state_machine.change_state(Event.DTMF_STAR); + break; + } + } + } } - module.exports = ReviewingState; - ``` The code for this state is similar to the code from `RecordingState`. The big difference is that instead of recording a message, it is playing back a stored recording. Stored recordings can be played using the channel's [`play()`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Channels_REST_API/#play) method (or as we have used in the python code, `playWithId()`). If the URI of the media to be played is prefixed with the "recording:" scheme, then Asterisk knows to search for the specified file where recordings are stored. More information on playing back files on channels, as well as a detailed list of media URI schemes can be found [here](/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Channels/ARI-and-Channels-Simple-Media-Manipulation). Note the method that is called when a DTMF '\*' is received. The `deleteStored()` method can be used on the `/recordings` resource of the ARI client to delete a stored recording from the file system on which Asterisk is running. @@ -655,59 +568,52 @@ One more thing to point out is the code that runs in `on_playback_finished()`. W We need to get this new state added into our state machine, so we make the following modifications to our code to allow for the new state to be added: - - - ---- - - -vm-call.py - -``` -pytrue#At the top of the file +```python title="vm-call.py" linenums="1" +#At the top of the file from reviewing_state import ReviewingState #In VoiceMailCall::setup_state_machine - def setup_state_machine(self): - hungup_state = HungUpState(self) - recording_state = RecordingState(self) - ending_state = EndingState(self) - reviewing_state = ReviewingState(self) - self.state_machine = StateMachine() - self.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, - reviewing_state) - self.state_machine.add_transition(recording_state, Event.HANGUP, - hungup_state) - self.state_machine.add_transition(recording_state, Event.DTMF_STAR, - recording_state) - self.state_machine.add_transition(reviewing_state, Event.HANGUP, - hungup_state) - self.state_machine.add_transition(reviewing_state, Event.DTMF_OCTOTHORPE, - ending_state) - self.state_machine.add_transition(reviewing_state, Event.DTMF_STAR, - recording_state) - self.state_machine.start(recording_state) +def setup_state_machine(self): + hungup_state = HungUpState(self) + recording_state = RecordingState(self) + ending_state = EndingState(self) + reviewing_state = ReviewingState(self) + self.state_machine = StateMachine() + self.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, + reviewing_state) + self.state_machine.add_transition(recording_state, Event.HANGUP, + hungup_state) + self.state_machine.add_transition(recording_state, Event.DTMF_STAR, + recording_state) + self.state_machine.add_transition(reviewing_state, Event.HANGUP, + hungup_state) + self.state_machine.add_transition(reviewing_state, Event.DTMF_OCTOTHORPE, + ending_state) + self.state_machine.add_transition(reviewing_state, Event.DTMF_STAR, + recording_state) + self.state_machine.start(recording_state) ``` + ```javascript title="vm-call.js" linenums="1" -jstrue// At the top of the file +// At the top of the file var ReviewingState = require('./reviewing_state'); // In VoicemailCall::setup_state_machine this.setup_state_machine = function() { - var hungup_state = new HungUpState(this); - var recording_state = new RecordingState(this); - var ending_state = new EndingState(this); - var reviewing_state = new ReviewingState(this); - - this.state_machine = new StateMachine(); - this.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, reviewing_state); - this.state_machine.add_transition(recording_state, Event.HANGUP, hungup_state); - this.state_machine.add_transition(recording_state, Event.DTMF_STAR, recording_state); - this.state_machine.add_transition(reviewing_state, Event.DTMF_OCTOTHORPE, ending_state); - this.state_machine.add_transition(reviewing_state, Event.HANGUP, hungup_state); - this.state_machine.add_transition(reviewing_state, Event.DTMF_STAR, recording_state); - this.state_machine.start(recording_state); + var hungup_state = new HungUpState(this); + var recording_state = new RecordingState(this); + var ending_state = new EndingState(this); + var reviewing_state = new ReviewingState(this); + + this.state_machine = new StateMachine(); + this.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, reviewing_state); + this.state_machine.add_transition(recording_state, Event.HANGUP, hungup_state); + this.state_machine.add_transition(recording_state, Event.DTMF_STAR, recording_state); + this.state_machine.add_transition(reviewing_state, Event.DTMF_OCTOTHORPE, ending_state); + this.state_machine.add_transition(reviewing_state, Event.HANGUP, hungup_state); + this.state_machine.add_transition(reviewing_state, Event.DTMF_STAR, recording_state); + this.state_machine.start(recording_state); } ``` @@ -732,14 +638,14 @@ Ending voice mail call from PJSIP/200-00000009 ``` -silverseagreenReader Exercise 5solidblackIn the previous section we introduced the ability to delete a stored recording. Stored recordings have a second operation available to them: [copying](/Latest_API/API_Documentation/Asterisk_REST_Interface/Recordings_REST_API/#copystored). The `copy()` method of a stored recording can be used to copy the stored recording from one location to another. +### Reader Exercise 5 +In the previous section we introduced the ability to delete a stored recording. Stored recordings have a second operation available to them: [copying](/Latest_API/API_Documentation/Asterisk_REST_Interface/Recordings_REST_API/#copystored). The `copy()` method of a stored recording can be used to copy the stored recording from one location to another. For this exercise modify `ReviewingState` to let a DTMF key of your choice copy the message to a different mailbox on the system. When a user presses this DTMF key, the state machine should transition into a new state called "copying." The "copying" state should gather DTMF from the user to determine which mailbox the message should be copied to. If # is entered, then the message is sent to the mailbox the user has typed in. If * is entered, then the copying operation is cancelled. Both a # and a * should cause the state machine to transition back into `ReviewingState`. As an example, let's say that you have set DTMF 0 to be the key that the user presses in `ReviewingState` to copy the message. The user presses 0. The user then presses 3 2 0 #. The message should be copied to mailbox "320", and the user should start hearing the message played back again. Now let's say the user presses 0 to copy the message again. The user then presses 3 2 1 0 *. The message should not be copied to any mailbox, and the user should start hearing the message played back again. -Recording Bridges -================= +## Recording Bridges This discussion of recordings has focused on recording channel audio. It's important to note that bridges also have an option to be recorded. What's the difference? Recording a channel's audio records only the audio coming **from** a channel. Recording a bridge records the mixed audio coming from all channels into the bridge. This means that if you are attempting to do something like record a conversation between participants in a phone call, you would want to record the audio in the bridge rather than on either of the channels involved. diff --git a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-2-Playbacks.md b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-2-Playbacks.md index 187e26980e..2fef767d49 100644 --- a/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-2-Playbacks.md +++ b/docs/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Introduction-to-ARI-and-Media-Manipulation/ARI-and-Media-Part-2-Playbacks.md @@ -1,143 +1,126 @@ ---- -title: ARI and Media: Part 2 - Playbacks -pageid: 30277828 ---- +# Playbacks -Querying for sounds -=================== +## Querying for sounds In our voice mail application we have been creating, we have learned the ins and outs of creating and manipulating live and stored recordings. Let's make the voice mail application more user-friendly now by adding some playbacks of installed sounds. The voice mail application has some nice capabilities, but it is not very user-friendly yet. Let's modify the current application to play a greeting to the user when they call into the application. This is the updated state machine: ![](vm-full.png) -40%On this Page - - To make the new "greeting" state more interesting, we are going to add some safety to this state by ensuring that the sound we want to play is installed on the system. The [`/sounds`](/Latest_API/API_Documentation/Asterisk_REST_Interface/Sounds_REST_API) resource in ARI provides methods to list the sounds installed on the system, as well as the ability to get specific sound files. Asterisk searches for sounds in the `/sounds/` subdirectory of the configured `astdatadir` option in `asterisk.conf`. By default, Asterisk will search for sounds in `/var/lib/asterisk/sounds`. When Asterisk starts up, it indexes the installed sounds and keeps an in-data representation of those sound files. When an ARI application asks Asterisk for details about a specific sound or for a list of sounds on the system, Asterisk consults its in-memory index instead of searching the file system directly. This has some trade-offs. When querying for sound information, this in-memory indexing makes the operations much faster. On the other hand, it also means that Asterisk has to be "poked" to re-index the sounds if new sounds are added to the file system after Asterisk is running. The Asterisk CLI command "module reload sounds" provides a means of having Asterisk re-index the sounds on the system so that they are available to ARI. For our greeting, we will play the built-in sound "vm-intro". Here is the code for our new state: - - - ---- - - -greeting_state.py - -``` -pytruefrom event import Event +```python title="greeting_state.py" linenums="1" +from event import Event def sounds_installed(client): - try: - client.sounds.get(soundId='vm-intro') - except: - print "Required sound 'vm-intro' not installed. Aborting" - raise - + try: + client.sounds.get(soundId='vm-intro') + except: + print("Required sound 'vm-intro' not installed. Aborting") + raise class GreetingState(object): - state_name = "greeting" - - def __init__(self, call): - self.call = call - self.hangup_event = None - self.playback_finished = None - self.dtmf_event = None - self.playback = None - sounds_installed(call.client) - - def enter(self): - print "Entering greeting state" - self.hangup_event = self.call.channel.on_event('ChannelHangupRequest', - self.on_hangup) - self.playback_finished = self.call.client.on_event( - 'PlaybackFinished', self.on_playback_finished) - self.dtmf_event = self.call.channel.on_event('ChannelDtmfReceived', - self.on_dtmf) - self.playback = self.call.channel.play(media="sound:vm-intro") - - def cleanup(self): - self.playback_finished.close() - self.dtmf_event.close() - self.hangup_event.close() - - def on_hangup(self, channel, event): - print "Abandoning voicemail recording on hangup" - self.cleanup() - self.call.state_machine.change_state(Event.HANGUP) - - def on_playback_finished(self, playback): - self.cleanup() - self.call.state_machine.change_state(Event.PLAYBACK_COMPLETE) - - def on_dtmf(self, channel, event): - digit = event.get('digit') - if digit == '#': - print "Cutting off greeting on DTMF #" - # Let on_playback_finished take care of state change - self.playback.stop() - + state_name = "greeting" + + def __init__(self, call): + self.call = call + self.hangup_event = None + self.playback_finished = None + self.dtmf_event = None + self.playback = None + sounds_installed(call.client) + + def enter(self): + print("Entering greeting state") + self.hangup_event = self.call.channel.on_event('ChannelHangupRequest', + self.on_hangup) + self.playback_finished = self.call.client.on_event( + 'PlaybackFinished', self.on_playback_finished) + self.dtmf_event = self.call.channel.on_event('ChannelDtmfReceived', + self.on_dtmf) + self.playback = self.call.channel.play(media="sound:vm-intro") + + def cleanup(self): + self.playback_finished.close() + self.dtmf_event.close() + self.hangup_event.close() + + def on_hangup(self, channel, event): + print("Abandoning voicemail recording on hangup") + self.cleanup() + self.call.state_machine.change_state(Event.HANGUP) + + def on_playback_finished(self, playback): + self.cleanup() + self.call.state_machine.change_state(Event.PLAYBACK_COMPLETE) + + def on_dtmf(self, channel, event): + digit = event.get('digit') + if digit == '#': + print("Cutting off greeting on DTMF #") + # Let on_playback_finished take care of state change + self.playback.stop() ``` ```javascript title="greeting_state.js" linenums="1" -jstruevar Event = require('./event'); +var Event = require('./event'); function sounds_installed(client) { - client.sounds.get({soundId: 'vm-intro'}, function(err) { - if (err) { - console.log("Required sound 'vm-intro' not installed. Aborting"); - throw err; - } - }); + client.sounds.get({soundId: 'vm-intro'}, function(err) { + if (err) { + console.log("Required sound 'vm-intro' not installed. Aborting"); + throw err; + } + }); } function GreetingState(call) { - this.state_name = "greeting"; - sounds_installed(call.client); - - this.enter = function() { - var playback = call.client.Playback(); - console.log("Entering greeting state"); - call.channel.on("ChannelHangupRequest", on_hangup); - call.channel.on("ChannelDtmfReceived", on_dtmf); - call.client.on("PlaybackFinished", on_playback_finished); - call.channel.play({media: 'sound:vm-intro'}, playback); - - function cleanup() { - call.channel.removeListener('ChannelHangupRequest', on_hangup); - call.channel.removeListener('ChannelDtmfReceived', on_dtmf); - call.client.removeListener('PlaybackFinished', on_playback_finished); - if (playback) { - playback.stop(); - } - } - - function on_hangup(event, channel) { - console.log("Abandoning voicemail recording on hangup"); - cleanup(); - call.state_machine.change_state(Event.HANGUP); - } - - function on_playback_finished(event) { - if (playback && playback.id === event.playback.id) { - cleanup(); - call.state_machine.change_state(Event.PLAYBACK_COMPLETE); - } - } - - function on_dtmf(event, channel) { - switch (event.digit) { - case '#': - console.log("Skipping greeting"); - cleanup(); - call.state_machine.change_state(Event.DTMF_OCTOTHORPE); - } - } - } + this.state_name = "greeting"; + sounds_installed(call.client); + + this.enter = function() { + var playback = call.client.Playback(); + console.log("Entering greeting state"); + call.channel.on("ChannelHangupRequest", on_hangup); + call.channel.on("ChannelDtmfReceived", on_dtmf); + call.client.on("PlaybackFinished", on_playback_finished); + call.channel.play({media: 'sound:vm-intro'}, playback); + + function cleanup() { + call.channel.removeListener('ChannelHangupRequest', on_hangup); + call.channel.removeListener('ChannelDtmfReceived', on_dtmf); + call.client.removeListener('PlaybackFinished', on_playback_finished); + if (playback) { + playback.stop(); + } + } + + function on_hangup(event, channel) { + console.log("Abandoning voicemail recording on hangup"); + cleanup(); + call.state_machine.change_state(Event.HANGUP); + } + + function on_playback_finished(event) { + if (playback && playback.id === event.playback.id) { + cleanup(); + call.state_machine.change_state(Event.PLAYBACK_COMPLETE); + } + } + + function on_dtmf(event, channel) { + switch (event.digit) { + case '#': + console.log("Skipping greeting"); + cleanup(); + call.state_machine.change_state(Event.DTMF_OCTOTHORPE); + } + } + } } - module.exports = GreetingState; +module.exports = GreetingState; ``` @@ -145,67 +128,58 @@ The `sounds.get()` method employed here allows for a single sound to be retrieve And here is our updated state machine: - - - ---- - - -vm-call.py - -``` -pytrue#At the top of the file +```python title="vm-call.py" linenumbers="1" +#At the top of the file from greeting_state import GreetingState #In VoiceMailCall::setup_state_machine() - def setup_state_machine(self): - hungup_state = HungUpState(self) - recording_state = RecordingState(self) - ending_state = EndingState(self) - reviewing_state = ReviewingState(self) - greeting_state = GreetingState(self) - self.state_machine = StateMachine() - self.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, - reviewing_state) - self.state_machine.add_transition(recording_state, Event.HANGUP, - hungup_state) - self.state_machine.add_transition(recording_state, Event.DTMF_STAR, - recording_state) - self.state_machine.add_transition(reviewing_state, Event.HANGUP, - hungup_state) - self.state_machine.add_transition(reviewing_state, Event.DTMF_OCTOTHORPE, - ending_state) - self.state_machine.add_transition(reviewing_state, Event.DTMF_STAR, - recording_state) - self.state_machine.add_transition(greeting_state, Event.HANGUP, - hungup_state) - self.state_machine.add_transition(greeting_state, - Event.PLAYBACK_COMPLETE, - recording_state) - self.state_machine.start(greeting_state) - +def setup_state_machine(self): + hungup_state = HungUpState(self) + recording_state = RecordingState(self) + ending_state = EndingState(self) + reviewing_state = ReviewingState(self) + greeting_state = GreetingState(self) + self.state_machine = StateMachine() + self.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, + reviewing_state) + self.state_machine.add_transition(recording_state, Event.HANGUP, + hungup_state) + self.state_machine.add_transition(recording_state, Event.DTMF_STAR, + recording_state) + self.state_machine.add_transition(reviewing_state, Event.HANGUP, + hungup_state) + self.state_machine.add_transition(reviewing_state, Event.DTMF_OCTOTHORPE, + ending_state) + self.state_machine.add_transition(reviewing_state, Event.DTMF_STAR, + recording_state) + self.state_machine.add_transition(greeting_state, Event.HANGUP, + hungup_state) + self.state_machine.add_transition(greeting_state, + Event.PLAYBACK_COMPLETE, recording_state) + self.state_machine.start(greeting_state) ``` + ```javascript title="vm-call.js" linenums="1" -jstrue//At the top of the file +//At the top of the file var GreetingState = require('./greeting_state'); //In VoicemailCall::setup_state_machine() this.setup_state_machine = function() { - var hungup_state = new HungUpState(this); - var recording_state = new RecordingState(this); - var ending_state = new EndingState(this); - var reviewing_state = new ReviewingState(this); - var greeting_state = new GreetingState(this); - this.state_machine = new StateMachine(); - this.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, reviewing_state); - this.state_machine.add_transition(recording_state, Event.HANGUP, hungup_state); - this.state_machine.add_transition(recording_state, Event.DTMF_STAR, recording_state); - this.state_machine.add_transition(reviewing_state, Event.DTMF_OCTOTHORPE, ending_state); - this.state_machine.add_transition(reviewing_state, Event.HANGUP, hungup_state); - this.state_machine.add_transition(reviewing_state, Event.DTMF_STAR, recording_state); - this.state_machine.add_transition(greeting_state, Event.HANGUP, hungup_state); - this.state_machine.add_transition(greeting_state, Event.PLAYBACK_COMPLETE, recording_state); - this.state_machine.start(greeting_state); + var hungup_state = new HungUpState(this); + var recording_state = new RecordingState(this); + var ending_state = new EndingState(this); + var reviewing_state = new ReviewingState(this); + var greeting_state = new GreetingState(this); + this.state_machine = new StateMachine(); + this.state_machine.add_transition(recording_state, Event.DTMF_OCTOTHORPE, reviewing_state); + this.state_machine.add_transition(recording_state, Event.HANGUP, hungup_state); + this.state_machine.add_transition(recording_state, Event.DTMF_STAR, recording_state); + this.state_machine.add_transition(reviewing_state, Event.DTMF_OCTOTHORPE, ending_state); + this.state_machine.add_transition(reviewing_state, Event.HANGUP, hungup_state); + this.state_machine.add_transition(reviewing_state, Event.DTMF_STAR, recording_state); + this.state_machine.add_transition(greeting_state, Event.HANGUP, hungup_state); + this.state_machine.add_transition(greeting_state, Event.PLAYBACK_COMPLETE, recording_state); + this.state_machine.start(greeting_state); } ``` @@ -226,12 +200,12 @@ Ending voice mail call from PJSIP/200-0000000b ``` -silverseagreenReader Exercise 1solidblackOur current implementation of `GreetingState` does not take language into consideration. The `sounds_installed` method checks for the existence of the sound file, but it does not ensure that we have the sound file in the language of the channel that is in our application. +### Reader Exercise 1 +Our current implementation of `GreetingState` does not take language into consideration. The `sounds_installed` method checks for the existence of the sound file, but it does not ensure that we have the sound file in the language of the channel that is in our application. For this exercise, modify `sounds_installed()` to also check if the retrieved sound exists in the language of the calling channel. The channel's language can be retrieved using the `getChannelVar()` method on a channel to retrieve the value of variable "CHANNEL(language)". The sound returned by `sounds.get()` contains an array of `FormatLang` objects that are a pair of format and language strings. If the sound exists, but not in the channel's language, then throw an exception. -Controlling playbacks -===================== +## Controlling playbacks So far in our voice mail application, we have stopped playbacks, but there are a lot more interesting operations that can be done on them, such as reversing and fast-forwarding them. Within the context of recording a voicemail, these operations are pretty useless, so we will shift our focus now to the other side of voicemail: listening to recorded voicemails. @@ -256,16 +230,8 @@ Notice that while in the listening state, DMTF '4', '6', and '\*' all change the Here is the implementation of the application. - - - ---- - - -vm-playback.py - -``` -pytrue#!/usr/bin/env python +```python title="vm-playback.py" linenums="1" +#!/usr/bin/env python import ari import logging @@ -284,97 +250,91 @@ LOGGER = logging.getLogger(__name__) client = ari.connect('http://localhost:8088', 'asterisk', 'asterisk') - class VoiceMailCall(object): - def __init__(self, ari_client, channel, mailbox): - self.client = ari_client - self.channel = channel - - self.voicemails = [] - recordings = ari_client.recordings.listStored() - vm_number = 1 - for rec in recordings: - if rec.json['name'].startswith('voicemail/{0}'.format(mailbox)): - self.voicemails.append((vm_number, rec.json['name'])) - vm_number += 1 - - self.current_voicemail = 0 - self.setup_state_machine() - - def setup_state_machine(self): - hungup_state = HungUpState(self) - ending_state = EndingState(self) - listening_state = ListeningState(self) - preamble_state = PreambleState(self) - empty_state = EmptyState(self) - self.state_machine = StateMachine() - self.state_machine.add_transition(listening_state, Event.DTMF_4, - preamble_state) - self.state_machine.add_transition(listening_state, Event.DTMF_6, - preamble_state) - self.state_machine.add_transition(listening_state, Event.HANGUP, - hungup_state) - self.state_machine.add_transition(listening_state, Event.DTMF_OCTOTHORPE, - ending_state) - self.state_machine.add_transition(listening_state, Event.DTMF_STAR, - preamble_state) - self.state_machine.add_transition(preamble_state, Event.DTMF_OCTOTHORPE, - listening_state) - self.state_machine.add_transition(preamble_state, - Event.PLAYBACK_COMPLETE, - listening_state) - self.state_machine.add_transition(preamble_state, Event.MAILBOX_EMPTY, - empty_state) - self.state_machine.add_transition(preamble_state, Event.HANGUP, - hungup_state) - self.state_machine.add_transition(empty_state, Event.HANGUP, - hungup_state) - self.state_machine.add_transition(empty_state, - Event.PLAYBACK_COMPLETE, - ending_state) - self.state_machine.start(preamble_state) - - def next_message(self): - self.current_voicemail += 1 - if self.current_voicemail == len(self.voicemails): - self.current_voicemail = 0 - - def previous_message(self): - self.current_voicemail -= 1 - if self.current_voicemail < 0: - self.current_voicemail = len(self.voicemails) - 1 - - def delete_message(self): - del self.voicemails[self.current_voicemail] - if self.current_voicemail == len(self.voicemails): - self.current_voicemail = 0 - - def get_current_voicemail_number(self): - return self.voicemails[self.current_voicemail][0] - - def get_current_voicemail_file(self): - return self.voicemails[self.current_voicemail][1] - - def mailbox_empty(self): - return len(self.voicemails) == 0 - + def __init__(self, ari_client, channel, mailbox): + self.client = ari_client + self.channel = channel + + self.voicemails = [] + recordings = ari_client.recordings.listStored() + vm_number = 1 + for rec in recordings: + if rec.json['name'].startswith('voicemail/{0}'.format(mailbox)): + self.voicemails.append((vm_number, rec.json['name'])) + vm_number += 1 + + self.current_voicemail = 0 + self.setup_state_machine() + + def setup_state_machine(self): + hungup_state = HungUpState(self) + ending_state = EndingState(self) + listening_state = ListeningState(self) + preamble_state = PreambleState(self) + empty_state = EmptyState(self) + self.state_machine = StateMachine() + self.state_machine.add_transition(listening_state, Event.DTMF_4, + preamble_state) + self.state_machine.add_transition(listening_state, Event.DTMF_6, + preamble_state) + self.state_machine.add_transition(listening_state, Event.HANGUP, + hungup_state) + self.state_machine.add_transition(listening_state, Event.DTMF_OCTOTHORPE, + ending_state) + self.state_machine.add_transition(listening_state, Event.DTMF_STAR, + preamble_state) + self.state_machine.add_transition(preamble_state, Event.DTMF_OCTOTHORPE, + listening_state) + self.state_machine.add_transition(preamble_state, + Event.PLAYBACK_COMPLETE, listening_state) + self.state_machine.add_transition(preamble_state, Event.MAILBOX_EMPTY, + empty_state) + self.state_machine.add_transition(preamble_state, Event.HANGUP, + hungup_state) + self.state_machine.add_transition(empty_state, Event.HANGUP, + hungup_state) + self.state_machine.add_transition(empty_state, + Event.PLAYBACK_COMPLETE, ending_state) + self.state_machine.start(preamble_state) + + def next_message(self): + self.current_voicemail += 1 + if self.current_voicemail == len(self.voicemails): + self.current_voicemail = 0 + + def previous_message(self): + self.current_voicemail -= 1 + if self.current_voicemail < 0: + self.current_voicemail = len(self.voicemails) - 1 + + def delete_message(self): + del self.voicemails[self.current_voicemail] + if self.current_voicemail == len(self.voicemails): + self.current_voicemail = 0 + + def get_current_voicemail_number(self): + return self.voicemails[self.current_voicemail][0] + + def get_current_voicemail_file(self): + return self.voicemails[self.current_voicemail][1] + + def mailbox_empty(self): + return len(self.voicemails) == 0 def stasis_start_cb(channel_obj, event): - channel = channel_obj['channel'] - channel_name = channel.json.get('name') - mailbox = event.get('args')[0] - print("Channel {0} recording voicemail for {1}".format( - channel_name, mailbox)) - channel.answer() - VoiceMailCall(client, channel, mailbox) - + channel = channel_obj['channel'] + channel_name = channel.json.get('name') + mailbox = event.get('args')[0] + print("Channel {0} recording voicemail for {1}".format(channel_name, mailbox)) + channel.answer() + VoiceMailCall(client, channel, mailbox) client.on_channel_event('StasisStart', stasis_start_cb) client.run(apps=sys.argv[1]) - ``` + ```javascript title="vm-playback.js" linenums="1" -jstrue/*jshint node:true */ +/*jshint node:true */ 'use strict'; var ari = require('ari-client'); @@ -392,94 +352,93 @@ var ListeningState = require('./listening_state'); ari.connect('http://localhost:8088', 'asterisk', 'asterisk', clientLoaded); var VoiceMailCall = function(ari_client, channel, mailbox) { - this.client = ari_client; - this.channel = channel; - var current_voicemail = 0; - var voicemails = []; - - this.setup_state_machine = function() { - var hungup_state = new HungUpState(this); - var ending_state = new EndingState(this); - var listening_state = new ListeningState(this); - var preamble_state = new PreambleState(this); - var empty_state = new EmptyState(this); - this.state_machine = new StateMachine(this); - this.state_machine.add_transition(listening_state, Event.DTMF_4, preamble_state); - this.state_machine.add_transition(listening_state, Event.DTMF_6, preamble_state); - this.state_machine.add_transition(listening_state, Event.HANGUP, hungup_state); - this.state_machine.add_transition(listening_state, Event.DTMF_OCTOTHORPE, ending_state); - this.state_machine.add_transition(listening_state, Event.DTMF_STAR, preamble_state); - this.state_machine.add_transition(preamble_state, Event.DTMF_OCTOTHORPE, listening_state); - this.state_machine.add_transition(preamble_state, Event.PLAYBACK_COMPLETE, listening_state); - this.state_machine.add_transition(preamble_state, Event.MAILBOX_EMPTY, empty_state); - this.state_machine.add_transition(preamble_state, Event.HANGUP, hungup_state); - this.state_machine.add_transition(empty_state, Event.HANGUP, hungup_state); - this.state_machine.add_transition(empty_state, Event.PLAYBACK_COMPLETE, ending_state); - this.state_machine.start(preamble_state); - } - - this.next_message = function() { - current_voicemail++; - if (current_voicemail === voicemails.length) { - current_voicemail = 0; - } - } - - this.previous_message = function() { - current_voicemail--; - if (current_voicemail < 0) { - current_voicemail = voicemails.length - 1; - } - } - - this.delete_message = function() { - voicemails.splice(current_voicemail, 1); - if (current_voicemail === voicemails.length) { - current_voicemail = 0; - } - } - - this.get_current_voicemail_file = function() { - return voicemails[current_voicemail]['file']; - } - - this.mailbox_empty = function() { - return voicemails.length === 0; - } - - var self = this; - ari_client.recordings.listStored(function (err, recordings) { - var vm_number = 1; - var regex = new RegExp('^voicemail/' + mailbox); - for (var i = 0; i < recordings.length; i++) { - var rec_name = recordings[i].name; - if (rec_name.search(regex) != -1) { - console.log("Found voicemail", rec_name); - voicemails.push({'number': vm_number, 'file': rec_name}); - vm_number++; - } - } - self.setup_state_machine(); - }); + this.client = ari_client; + this.channel = channel; + var current_voicemail = 0; + var voicemails = []; + + this.setup_state_machine = function() { + var hungup_state = new HungUpState(this); + var ending_state = new EndingState(this); + var listening_state = new ListeningState(this); + var preamble_state = new PreambleState(this); + var empty_state = new EmptyState(this); + this.state_machine = new StateMachine(this); + this.state_machine.add_transition(listening_state, Event.DTMF_4, preamble_state); + this.state_machine.add_transition(listening_state, Event.DTMF_6, preamble_state); + this.state_machine.add_transition(listening_state, Event.HANGUP, hungup_state); + this.state_machine.add_transition(listening_state, Event.DTMF_OCTOTHORPE, ending_state); + this.state_machine.add_transition(listening_state, Event.DTMF_STAR, preamble_state); + this.state_machine.add_transition(preamble_state, Event.DTMF_OCTOTHORPE, listening_state); + this.state_machine.add_transition(preamble_state, Event.PLAYBACK_COMPLETE, listening_state); + this.state_machine.add_transition(preamble_state, Event.MAILBOX_EMPTY, empty_state); + this.state_machine.add_transition(preamble_state, Event.HANGUP, hungup_state); + this.state_machine.add_transition(empty_state, Event.HANGUP, hungup_state); + this.state_machine.add_transition(empty_state, Event.PLAYBACK_COMPLETE, ending_state); + this.state_machine.start(preamble_state); + } + + this.next_message = function() { + current_voicemail++; + if (current_voicemail === voicemails.length) { + current_voicemail = 0; + } + } + + this.previous_message = function() { + current_voicemail--; + if (current_voicemail < 0) { + current_voicemail = voicemails.length - 1; + } + } + + this.delete_message = function() { + voicemails.splice(current_voicemail, 1); + if (current_voicemail === voicemails.length) { + current_voicemail = 0; + } + } + + this.get_current_voicemail_file = function() { + return voicemails[current_voicemail]['file']; + } + + this.mailbox_empty = function() { + return voicemails.length === 0; + } + + var self = this; + ari_client.recordings.listStored(function (err, recordings) { + var vm_number = 1; + var regex = new RegExp('^voicemail/' + mailbox); + for (var i = 0; i < recordings.length; i++) { + var rec_name = recordings[i].name; + if (rec_name.search(regex) != -1) { + console.log("Found voicemail", rec_name); + voicemails.push({'number': vm_number, 'file': rec_name}); + vm_number++; + } + } + self.setup_state_machine(); + }); } function clientLoaded(err, client) { - if (err) { - throw err; - } - client.on('StasisStart', stasisStart); - function stasisStart(event, channel) { - var mailbox = event.args[0] - channel.answer(function(err) { - if (err) { - throw err; - } - new VoiceMailCall(client, channel, mailbox); - }); - } - client.start(process.argv[2]); + if (err) { + throw err; + } + client.on('StasisStart', stasisStart); + function stasisStart(event, channel) { + var mailbox = event.args[0] + channel.answer(function(err) { + if (err) { + throw err; + } + new VoiceMailCall(client, channel, mailbox); + }); + } + client.start(process.argv[2]); } - ``` Quite a bit of this is similar to what we were using for our voice mail recording application. The biggest difference here is that the call has many more methods defined since playing back voice mails is more complicated than recording a single one. @@ -487,521 +446,492 @@ Quite a bit of this is similar to what we were using for our voice mail recordin Now that we have the state machine defined and the application written, let's actually write the required new states. First of the new states is the "preamble" state. - - ---- - - -preamble_state.py - -``` -pytruefrom event import Event +```python title="preamble_state.py" linenums="1" +from event import Event import uuid def sounds_installed(client): - try: - client.sounds.get(soundId='vm-message') - except: - print "Required sound 'vm-message' not installed. Aborting" - raise + try: + client.sounds.get(soundId='vm-message') + except: + print "Required sound 'vm-message' not installed. Aborting" + raise class PreambleState(object): - state_name = "preamble" - - def __init__(self, call): - self.call = call - self.hangup_event = None - self.playback_finished = None - self.dtmf_event = None - self.playback = None - sounds_installed(call.client) - - def enter(self): - print "Entering preamble state" - if self.call.mailbox_empty(): - self.call.state_machine.change_state(Event.MAILBOX_EMPTY) - return - self.hangup_event = self.call.channel.on_event("ChannelHangupRequest", - self.on_hangup) - self.playback_finished = self.call.client.on_event( - 'PlaybackFinished', self.on_playback_finished) - self.dtmf_event = self.call.channel.on_event('ChannelDtmfReceived', - self.on_dtmf) - self.initialize_playbacks() - - def initialize_playbacks(self): - self.current_playback = 0 - current_voicemail = self.call.get_current_voicemail_number() - self.sounds_to_play = [ - { - 'id': str(uuid.uuid4()), - 'media': 'sound:vm-message' - }, - { - 'id': str(uuid.uuid4()), - 'media': 'number:{0}'.format(current_voicemail) - } - ] - self.start_playback() - - def start_playback(self): - current_sound = self.sounds_to_play[self.current_playback] - self.playback = self.call.channel.playWithId( - playbackId=current_sound['id'], - media=current_sound['media'] - ) - - def cleanup(self): - self.playback_finished.close() - if self.playback: - self.playback.stop() - self.dtmf_event.close() - self.hangup_event.close() - - def on_hangup(self, channel, event): - self.playback = None - self.cleanup() - self.call.state_machine.change_state(Event.HANGUP) - - def on_playback_finished(self, event): - current_sound = self.sounds_to_play[self.current_playback] - if current_sound['id'] == event.get('playback').get('id'): - self.playback = None - self.current_playback += 1 - if self.current_playback == len(self.sounds_to_play): - self.cleanup() - self.call.state_machine.change_state(Event.PLAYBACK_COMPLETE) - else: - self.start_playback() - - def on_dtmf(self, channel, event): - digit = event.get('digit') - if digit == '#': - self.cleanup() - self.call.state_machine.change_state(Event.DTMF_OCTOTHORPE) + state_name = "preamble" + + def __init__(self, call): + self.call = call + self.hangup_event = None + self.playback_finished = None + self.dtmf_event = None + self.playback = None + sounds_installed(call.client) + + def enter(self): + print("Entering preamble state") + if self.call.mailbox_empty(): + self.call.state_machine.change_state(Event.MAILBOX_EMPTY) + return + self.hangup_event = self.call.channel.on_event("ChannelHangupRequest", + self.on_hangup) + self.playback_finished = self.call.client.on_event( + 'PlaybackFinished', self.on_playback_finished) + self.dtmf_event = self.call.channel.on_event('ChannelDtmfReceived', + self.on_dtmf) + self.initialize_playbacks() + + def initialize_playbacks(self): + self.current_playback = 0 + current_voicemail = self.call.get_current_voicemail_number() + self.sounds_to_play = [ + { + 'id': str(uuid.uuid4()), + 'media': 'sound:vm-message' + }, + { + 'id': str(uuid.uuid4()), + 'media': 'number:{0}'.format(current_voicemail) + } + ] + self.start_playback() + + def start_playback(self): + current_sound = self.sounds_to_play[self.current_playback] + self.playback = self.call.channel.playWithId( + playbackId=current_sound['id'], + media=current_sound['media'] + ) + + def cleanup(self): + self.playback_finished.close() + if self.playback: + self.playback.stop() + self.dtmf_event.close() + self.hangup_event.close() + + def on_hangup(self, channel, event): + self.playback = None + self.cleanup() + self.call.state_machine.change_state(Event.HANGUP) + + def on_playback_finished(self, event): + current_sound = self.sounds_to_play[self.current_playback] + if current_sound['id'] == event.get('playback').get('id'): + self.playback = None + self.current_playback += 1 + if self.current_playback == len(self.sounds_to_play): + self.cleanup() + self.call.state_machine.change_state(Event.PLAYBACK_COMPLETE) + else: + self.start_playback() + + def on_dtmf(self, channel, event): + digit = event.get('digit') + if digit == '#': + self.cleanup() + self.call.state_machine.change_state(Event.DTMF_OCTOTHORPE) ``` + ```javascript title="preamble_state.js" linenums="1" -jstruevar Event = require('./event'); +var Event = require('./event'); function sounds_installed(client) { - client.sounds.get({soundId: 'vm-message'}, function(err) { - if (err) { - console.log("Required sound 'vm-message' not installed. Aborting"); - throw err; - } - }); + client.sounds.get({soundId: 'vm-message'}, function(err) { + if (err) { + console.log("Required sound 'vm-message' not installed. Aborting"); + throw err; + } + }); } function PreambleState(call) { - this.state_name = "preamble"; - this.enter = function() { - var current_playback; - var sounds_to_play; - var playback; - console.log("Entering preamble state"); - if (call.mailbox_empty()) { - call.state_machine.change_state(Event.MAILBOX_EMPTY); - return; - } - call.channel.on("ChannelHangupRequest", on_hangup); - call.client.on("PlaybackFinished", on_playback_finished); - call.channel.on("ChannelDtmfReceived", on_dtmf); - initialize_playbacks(); - - function initialize_playbacks() { - current_playback = 0; - sounds_to_play = [ - { - 'playback': call.client.Playback(), - 'media': 'sound:vm-message' - }, - { - 'playback': call.client.Playback(), - 'media': 'number:' + call.get_current_voicemail_number() - } - ]; - start_playback(); - } - - function start_playback() { - current_sound = sounds_to_play[current_playback]; - playback = current_sound['playback']; - call.channel.play({media: current_sound['media']}, playback); - } - - function cleanup() { - call.channel.removeListener('ChannelHangupRequest', on_hangup); - call.channel.removeListener('ChannelDtmfReceived', on_dtmf); - call.client.removeListener('PlaybackFinished', on_playback_finished); - if (playback) { - playback.stop(); - } - } - - function on_hangup(event, channel) { - playback = null; - cleanup(); - call.state_machine.change_state(Event.HANGUP); - } - - function on_playback_finished(event) { - var current_sound = sounds_to_play[current_playback]; - if (playback && (playback.id === event.playback.id)) { - playback = null; - current_playback++; - if (current_playback === sounds_to_play.length) { - cleanup(); - call.state_machine.change_state(Event.PLAYBACK_COMPLETE); - } else { - start_playback(); - } - } - } - - function on_dtmf(event, channel) { - switch(event.digit) { - case '#': - cleanup(); - call.state_machine.change_state(Event.DTMF_OCTOTHORPE); - } - } - } + this.state_name = "preamble"; + this.enter = function() { + var current_playback; + var sounds_to_play; + var playback; + console.log("Entering preamble state"); + if (call.mailbox_empty()) { + call.state_machine.change_state(Event.MAILBOX_EMPTY); + return; + } + call.channel.on("ChannelHangupRequest", on_hangup); + call.client.on("PlaybackFinished", on_playback_finished); + call.channel.on("ChannelDtmfReceived", on_dtmf); + initialize_playbacks(); + + function initialize_playbacks() { + current_playback = 0; + sounds_to_play = [ + { + 'playback': call.client.Playback(), + 'media': 'sound:vm-message' + }, + { + 'playback': call.client.Playback(), + 'media': 'number:' + call.get_current_voicemail_number() + } + ]; + start_playback(); + } + + function start_playback() { + current_sound = sounds_to_play[current_playback]; + playback = current_sound['playback']; + call.channel.play({media: current_sound['media']}, playback); + } + + function cleanup() { + call.channel.removeListener('ChannelHangupRequest', on_hangup); + call.channel.removeListener('ChannelDtmfReceived', on_dtmf); + call.client.removeListener('PlaybackFinished', on_playback_finished); + if (playback) { + playback.stop(); + } + } + + function on_hangup(event, channel) { + playback = null; + cleanup(); + call.state_machine.change_state(Event.HANGUP); + } + + function on_playback_finished(event) { + var current_sound = sounds_to_play[current_playback]; + if (playback && (playback.id === event.playback.id)) { + playback = null; + current_playback++; + if (current_playback === sounds_to_play.length) { + cleanup(); + call.state_machine.change_state(Event.PLAYBACK_COMPLETE); + } else { + start_playback(); + } + } + } + + function on_dtmf(event, channel) { + switch(event.digit) { + case '#': + cleanup(); + call.state_machine.change_state(Event.DTMF_OCTOTHORPE); + } + } + } } - - - module.exports = PreambleState; - ``` `PreambleState` should look similar to the `GreetingState` introduced previously on this page. The biggest difference is that the code is structured to play multiple sound files instead of just a single one. Note that it is acceptable to call `channel.play()` while a playback is playing on a channel in order to queue a second playback. For our application though, we have elected to play the second sound only after the first has completed. The reason for this is that if there is only a single active playback at any given time, then it becomes easier to clean up the current state when an event occurs that causes a state change. Next, here is the "empty" state code: - - - ---- - - -empty_state.py - -``` -pytruefrom event import Event +```python title="empty_state.py" linenums="1" +from event import Event import uuid def sounds_installed(client): - try: - client.sounds.get(soundId='vm-nomore') - except: - print "Required sound 'vm-nomore' not installed. Aborting" - raise + try: + client.sounds.get(soundId='vm-nomore') + except: + print "Required sound 'vm-nomore' not installed. Aborting" + raise class EmptyState(object): - state_name = "empty" - - def __init__(self, call): - self.call = call - self.playback_id = None - self.hangup_event = None - self.playback_finished = None - self.playback = None - sounds_installed(call.client) - - def enter(self): - self.playback_id = str(uuid.uuid4()) - print "Entering empty state" - self.hangup_event = self.call.channel.on_event("ChannelHangupRequest", - self.on_hangup) - self.playback_finished = self.call.client.on_event( - 'PlaybackFinished', self.on_playback_finished) - self.playback = self.call.channel.playWithId( - playbackId=self.playback_id, media="sound:vm-nomore") - - def cleanup(self): - self.playback_finished.close() - if self.playback: - self.playback.stop() - self.hangup_event.close() - - def on_hangup(self, channel, event): - # Setting playback to None stops cleanup() from trying to stop the - # playback. - self.playback = None - self.cleanup() - self.call.state_machine.change_state(Event.HANGUP) - - def on_playback_finished(self, event): - if self.playback_id == event.get('playback').get('id'): - self.playback = None - self.cleanup() - self.call.state_machine.change_state(Event.PLAYBACK_COMPLETE) - + state_name = "empty" + + def __init__(self, call): + self.call = call + self.playback_id = None + self.hangup_event = None + self.playback_finished = None + self.playback = None + sounds_installed(call.client) + + def enter(self): + self.playback_id = str(uuid.uuid4()) + print("Entering empty state") + self.hangup_event = self.call.channel.on_event("ChannelHangupRequest", + self.on_hangup) + self.playback_finished = self.call.client.on_event( + 'PlaybackFinished', self.on_playback_finished) + self.playback = self.call.channel.playWithId( + playbackId=self.playback_id, media="sound:vm-nomore") + + def cleanup(self): + self.playback_finished.close() + if self.playback: + self.playback.stop() + self.hangup_event.close() + + def on_hangup(self, channel, event): + # Setting playback to None stops cleanup() from trying to stop the + # playback. + self.playback = None + self.cleanup() + self.call.state_machine.change_state(Event.HANGUP) + + def on_playback_finished(self, event): + if self.playback_id == event.get('playback').get('id'): + self.playback = None + self.cleanup() + self.call.state_machine.change_state(Event.PLAYBACK_COMPLETE) ``` + ```javascript title="empty_state.js" linenums="1" -jstruevar Event = require('./event'); +evar Event = require('./event'); function sounds_installed(client) { - client.sounds.get({soundId: 'vm-nomore'}, function(err) { - if (err) { - console.log("Required sound 'vm-nomore' not installed. Aborting"); - throw err; - } - }); + client.sounds.get({soundId: 'vm-nomore'}, function(err) { + if (err) { + console.log("Required sound 'vm-nomore' not installed. Aborting"); + throw err; + } + }); } function EmptyState(call) { - this.state_name = "empty"; - - this.enter = function() { - console.log("Entering empty state"); - playback = call.client.Playback(); - call.channel.on("ChannelHangup", on_hangup); - call.client.on("PlaybackFinished", on_playback_finished); - call.channel.play({media: 'sound:vm-nomore'}, playback); - - function cleanup() { - call.channel.removeListener('ChannelHangupRequest', on_hangup); - call.channel.removeListener('PlaybackFinished', on_playback_finished); - if (playback) { - playback.stop(); - } - } - - function on_hangup(event, channel) { - playback = null; - cleanup(); - call.state_machine.change_state(Event.HANGUP); - } - - function on_playback_finished(event) { - if (playback && playback.id === event.playback.id) { - playback = null; - cleanup(); - call.state_machine.change_state(Event.PLAYBACK_COMPLETE); - } - } - } + this.state_name = "empty"; + + this.enter = function() { + console.log("Entering empty state"); + playback = call.client.Playback(); + call.channel.on("ChannelHangup", on_hangup); + call.client.on("PlaybackFinished", on_playback_finished); + call.channel.play({media: 'sound:vm-nomore'}, playback); + + function cleanup() { + call.channel.removeListener('ChannelHangupRequest', on_hangup); + call.channel.removeListener('PlaybackFinished', on_playback_finished); + if (playback) { + playback.stop(); + } + } + + function on_hangup(event, channel) { + playback = null; + cleanup(); + call.state_machine.change_state(Event.HANGUP); + } + + function on_playback_finished(event) { + if (playback && playback.id === event.playback.id) { + playback = null; + cleanup(); + call.state_machine.change_state(Event.PLAYBACK_COMPLETE); + } + } + } } - module.exports = EmptyState; - ``` This state does not introduce anything we haven't seen already, so let's move on to the "listening" state code: - - - ---- - - -listening_state.py - -``` -pytruefrom event import Event +```python title="listening_state.py" linenums="1" +from event import Event import uuid class ListeningState(object): - state_name = "listening" - - def __init__(self, call): - self.call = call - self.playback_id = None - self.hangup_event = None - self.playback_finished = None - self.dtmf_event = None - self.playback = None - - def enter(self): - self.paused = False - self.playback_id = str(uuid.uuid4()) - print "Entering listening state" - self.hangup_event = self.call.channel.on_event("ChannelHangupRequest", - self.on_hangup) - self.playback_finished = self.call.client.on_event( - 'PlaybackFinished', self.on_playback_finished) - self.dtmf_event = self.call.channel.on_event('ChannelDtmfReceived', - self.on_dtmf) - self.playback = self.call.channel.playWithId( - playbackId=self.playback_id, media="recording:{0}".format( - self.call.get_current_voicemail_file())) - - def cleanup(self): - self.playback_finished.close() - if self.playback: - self.playback.stop() - self.dtmf_event.close() - self.hangup_event.close() - - def on_hangup(self, channel, event): - self.cleanup() - self.call.state_machine.change_state(Event.HANGUP) - - def on_playback_finished(self, event): - if self.playback_id == event.get('playback').get('id'): - self.playback = None - - def on_dtmf(self, channel, event): - digit = event.get('digit') - if digit == '1': - if self.playback: - self.playback.control(operation='reverse') - elif digit == '2': - if not self.playback: - return - if self.paused: - self.playback.control(operation='unpause') - self.paused = False - else: - self.playback.control(operation='pause') - self.paused = True - elif digit == '3': - if self.playback: - self.playback.control(operation='forward') - elif digit == '4': - self.cleanup() - self.call.previous_message() - self.call.state_machine.change_state(Event.DTMF_4) - elif digit == '5': - if self.playback: - self.playback.control(operation='restart') - elif digit == '6': - self.cleanup() - self.call.next_message() - self.call.state_machine.change_state(Event.DTMF_6) - elif digit == '#': - self.cleanup() - self.call.state_machine.change_state(Event.DTMF_OCTOTHORPE) - elif digit == '\*': - print ("Deleting stored recording {0}".format( - self.call.get_current_voicemail_file())) - self.cleanup() - self.call.client.recordings.deleteStored( - recordingName=self.call.get_current_voicemail_file()) - self.call.delete_message() - self.call.state_machine.change_state(Event.DTMF_STAR) - + state_name = "listening" + + def __init__(self, call): + self.call = call + self.playback_id = None + self.hangup_event = None + self.playback_finished = None + self.dtmf_event = None + self.playback = None + + def enter(self): + self.paused = False + self.playback_id = str(uuid.uuid4()) + print("Entering listening state") + self.hangup_event = self.call.channel.on_event("ChannelHangupRequest", + self.on_hangup) + self.playback_finished = self.call.client.on_event( + 'PlaybackFinished', self.on_playback_finished) + self.dtmf_event = self.call.channel.on_event('ChannelDtmfReceived', + self.on_dtmf) + self.playback = self.call.channel.playWithId( + playbackId=self.playback_id, media="recording:{0}".format( + self.call.get_current_voicemail_file())) + + def cleanup(self): + self.playback_finished.close() + if self.playback: + self.playback.stop() + self.dtmf_event.close() + self.hangup_event.close() + + def on_hangup(self, channel, event): + self.cleanup() + self.call.state_machine.change_state(Event.HANGUP) + + def on_playback_finished(self, event): + if self.playback_id == event.get('playback').get('id'): + self.playback = None + + def on_dtmf(self, channel, event): + digit = event.get('digit') + if digit == '1': + if self.playback: + self.playback.control(operation='reverse') + elif digit == '2': + if not self.playback: + return + if self.paused: + self.playback.control(operation='unpause') + self.paused = False + else: + self.playback.control(operation='pause') + self.paused = True + elif digit == '3': + if self.playback: + self.playback.control(operation='forward') + elif digit == '4': + self.cleanup() + self.call.previous_message() + self.call.state_machine.change_state(Event.DTMF_4) + elif digit == '5': + if self.playback: + self.playback.control(operation='restart') + elif digit == '6': + self.cleanup() + self.call.next_message() + self.call.state_machine.change_state(Event.DTMF_6) + elif digit == '#': + self.cleanup() + self.call.state_machine.change_state(Event.DTMF_OCTOTHORPE) + elif digit == '\*': + print("Deleting stored recording {0}".format( + self.call.get_current_voicemail_file())) + self.cleanup() + self.call.client.recordings.deleteStored( + recordingName=self.call.get_current_voicemail_file()) + self.call.delete_message() + self.call.state_machine.change_state(Event.DTMF_STAR) ``` + ```javascript title="listening_state.js" linenums="1" -jstruevar Event = require('./event'); +var Event = require('./event'); var ListeningState = function(call) { - this.state_name = "listening"; - this.call = call; + this.state_name = "listening"; + this.call = call; } function ListeningState(call) { - this.state_name = "listening"; - this.enter = function() { - var playback = call.client.Playback(); - var url = "recording:" + call.get_current_voicemail_file(); - - console.log("Entering Listening state"); - call.channel.on("ChannelHangupRequest", on_hangup); - call.channel.on("ChannelDtmfReceived", on_dtmf); - call.client.on("PlaybackFinished", on_playback_finished); - console.log("Playing file %s", url); - call.channel.play({media: url}, playback, function(err) { - if (err) { - console.error(err); - } - }); - - function cleanup() { - call.channel.removeListener('ChannelHangupRequest', on_hangup); - call.channel.removeListener('ChannelDtmfReceived', on_dtmf); - call.client.removeListener('PlaybackFinished', on_playback_finished); - if (playback) { - playback.stop(); - } - } - - function on_hangup(event, channel) { - playback = null; - cleanup(); - call.state_machine.change_state(Event.HANGUP); - } - - function on_playback_finished(event) { - if (playback && (playback.id === event.playback.id)) { - playback = null; - } - } - - function on_dtmf(event, channel) { - switch (event.digit) { - case '1': - if (playback) { - playback.control({operation: 'reverse'}); - } - break; - case '2': - if (!playback) { - break; - } - if (paused) { - playback.control({operation: 'unpause'}); - paused = false; - } else { - playback.control({operation: 'pause'}); - paused = true; - } - break; - case '3': - if (playback) { - playback.control({operation: 'forward'}); - } - break; - case '4': - cleanup(); - call.previous_message(); - call.state_machine.change_state(Event.DTMF_4); - break; - case '5': - if (playback) { - playback.control({operation: 'restart'}); - } - break; - case '6': - cleanup(); - call.next_message(); - call.state_machine.change_state(Event.DTMF_6); - break; - case '#': - cleanup(); - call.state_machine.change_state(Event.DTMF_OCTOTHORPE); - break; - case '\*': - console.log("Deleting stored recording", call.get_current_voicemail_file()); - cleanup(); - call.client.recordings.deleteStored({recordingName:call.get_current_voicemail_file()}); - call.delete_message(); - call.state_machine.change_state(Event.DTMF_STAR); - } - } - } + this.state_name = "listening"; + this.enter = function() { + var playback = call.client.Playback(); + var url = "recording:" + call.get_current_voicemail_file(); + + console.log("Entering Listening state"); + call.channel.on("ChannelHangupRequest", on_hangup); + call.channel.on("ChannelDtmfReceived", on_dtmf); + call.client.on("PlaybackFinished", on_playback_finished); + console.log("Playing file %s", url); + call.channel.play({media: url}, playback, function(err) { + if (err) { + console.error(err); + } + }); + + function cleanup() { + call.channel.removeListener('ChannelHangupRequest', on_hangup); + call.channel.removeListener('ChannelDtmfReceived', on_dtmf); + call.client.removeListener('PlaybackFinished', on_playback_finished); + if (playback) { + playback.stop(); + } + } + + function on_hangup(event, channel) { + playback = null; + cleanup(); + call.state_machine.change_state(Event.HANGUP); + } + + function on_playback_finished(event) { + if (playback && (playback.id === event.playback.id)) { + playback = null; + } + } + + function on_dtmf(event, channel) { + switch (event.digit) { + case '1': + if (playback) { + playback.control({operation: 'reverse'}); + } + break; + case '2': + if (!playback) { + break; + } + if (paused) { + playback.control({operation: 'unpause'}); + paused = false; + } else { + playback.control({operation: 'pause'}); + paused = true; + } + break; + case '3': + if (playback) { + playback.control({operation: 'forward'}); + } + break; + case '4': + cleanup(); + call.previous_message(); + call.state_machine.change_state(Event.DTMF_4); + break; + case '5': + if (playback) { + playback.control({operation: 'restart'}); + } + break; + case '6': + cleanup(); + call.next_message(); + call.state_machine.change_state(Event.DTMF_6); + break; + case '#': + cleanup(); + call.state_machine.change_state(Event.DTMF_OCTOTHORPE); + break; + case '\*': + console.log("Deleting stored recording", call.get_current_voicemail_file()); + cleanup(); + call.client.recordings.deleteStored({recordingName:call.get_current_voicemail_file()}); + call.delete_message(); + call.state_machine.change_state(Event.DTMF_STAR); + } + } + } } - module.exports = ListeningState; - ``` `ListeningState` is where we introduce new playback control concepts. Playbacks have their controlling operations wrapped in a single method, `control()`, rather than having lots of separate operations. All control operations (reverse, pause, unpause, forward, and restart) are demonstrated by this state. -silverseagreenReader Exercise 2solidblackYou may have noticed while exploring the playbacks API that the `control()` method takes no parameters other than the operation. This means that certain properties of operations are determined when the playback is started on the channel. +### Reader Exercise 2 +You may have noticed while exploring the playbacks API that the `control()` method takes no parameters other than the operation. This means that certain properties of operations are determined when the playback is started on the channel. For this exercise, modify the `ListeningState` so that DTMF '1' and '3' reverse or forward the playback by 5000 milliseconds instead of the default 3000 milliseconds. -Playbacks on bridges -==================== +## Playbacks on bridges Just as channels allow for playbacks to be performed on them, bridges also have the capacity to have sounds, recordings, tones, numbers, etc. played back on them. The difference is is that all participants in the bridge will hear the playback instead of just a single channel. In bridging situations, it can be useful to play certain sounds to an entire bridge (e.g. Telling participants the call is being recorded), but it can also be useful to play sounds to specific participants (e.g. Telling a caller he has joined a conference bridge). A playback on a bridge can be stopped or controlled exactly the same as a playback on a channel. -silverseagreenReader Exercise 3solidblackIf you've read through the Recording and Playbacks pages, then you should have a good grasp on the operations available, as well as a decent state machine implementation. For our final exercise, instead of adding onto the existing voice mail applications, create a new application that uses some of the recording and playback operations that you have learned about. +### Reader Exercise 3 +If you've read through the Recording and Playbacks pages, then you should have a good grasp on the operations available, as well as a decent state machine implementation. For our final exercise, instead of adding onto the existing voice mail applications, create a new application that uses some of the recording and playback operations that you have learned about. You will be creating a rudimentary call queue application. The queue application will have two types of participants: agents and callers. Agents and callers call into the same Stasis application and are distinguished based on arguments to the Stasis application (e.g. A caller might call Stasis(queue,caller) and an agent might call Stasis(queue,agent) from the dialplan). From d920607b215d340dafe3b6292c7ac08bc9bff948 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Tue, 3 Sep 2024 12:11:20 -0600 Subject: [PATCH 19/99] Add mkdocs-redirect module and add redirect for Code-of-Conduct --- mkdocs.yml | 7 +++++-- requirements.txt | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index de1b4ced1b..95e14b986a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -52,9 +52,12 @@ extra_css: - material-override.css plugins: + - redirects: + redirect_maps: + Asterisk-Community-Code-of-Conduct.md: Asterisk-Community/Asterisk-Community-Code-of-Conduct.md - search - - awesome-pages -# filename: .pages + - awesome-pages: + filename: .pages # collapse_single_pages: true # strict: false # order: asc diff --git a/requirements.txt b/requirements.txt index 4943b07d32..64060c52cc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,3 +7,4 @@ mkdocs-minify-plugin==0.8.0 mkdocs-table-reader-plugin==2.1.0 lxml==5.1.0 pymdown-extensions==10.4 +mkdocs-redirects==1.2.1 \ No newline at end of file From 3e28f785ab22bbf656115f3512a2da97c2e50f7e Mon Sep 17 00:00:00 2001 From: George Joseph Date: Fri, 6 Sep 2024 07:19:27 -0600 Subject: [PATCH 20/99] Mailing-Lists: Fix links and have them open in a new tab Resolves: #107 --- docs/Asterisk-Community/Mailing-Lists.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/Asterisk-Community/Mailing-Lists.md b/docs/Asterisk-Community/Mailing-Lists.md index a482ffd41b..8c6d894a07 100644 --- a/docs/Asterisk-Community/Mailing-Lists.md +++ b/docs/Asterisk-Community/Mailing-Lists.md @@ -5,22 +5,24 @@ pageid: 22088306 ### Community Forums -For end-user support and commercial postings the [community forums](https://community.asterisk.org/) should be used. +For end-user support and commercial postings the [community forums](https://community.asterisk.org/){:target="_blank"} should be used. ### Development Mailing List -A [development mailing list](https://groups.io/g/asterisk-dev) is present for discussion regarding the development of Asterisk itself. +A [development mailing list](https://groups.io/g/asterisk-dev){:target="_blank"} is present for discussion regarding the development of Asterisk itself. ### Read-Only Mailing Lists -The Asterisk project previously maintained an independent mailing list server for many different purposes. This has been decommissioned and archived, with the community forums and new development mailing list taking their place. Links to the old mailing lists remain below in case archive access is required. +The Asterisk project previously maintained an independent mailing list server for many different purposes. This has been decommissioned and archived, with the community forums and new development mailing list taking their place. Links to the old mailing lists remain below in case archive access is required. The main archive page is at [https://lists.digium.com](https://lists.digium.com){:target="_blank"}. + +Direct links to old lists: | List | Description | | --- | --- | -| [asterisk-announce](http://lists.digium.com/mailman/listinfo/asterisk-announce) | Asterisk releases and community service announcements | -| [asterisk-biz](http://lists.digium.com/mailman/listinfo/asterisk-biz) | Commercial and Business-Oriented Asterisk Discussion | -| [asterisk-dev](http://lists.digium.com/mailman/listinfo/asterisk-dev) | Discussions about the development of Asterisk. | -| [asterisk-app-dev](http://lists.digium.com/cgi-bin/mailman/listinfo/asterisk-app-dev) | Discussions about the development of applications that use Asterisk. | -| [asterisk-security](http://lists.digium.com/mailman/listinfo/asterisk-security) | Asterisk Security Discussion | -| [asterisk-users](http://lists.digium.com/mailman/listinfo/asterisk-users) | Discussions about the use and configuration of Asterisk. | +| [asterisk-announce](https://lists.digium.com/mailman/listinfo/asterisk-announce.html){:target="_blank"} | Asterisk releases and community service announcements | +| [asterisk-biz](https://lists.digium.com/mailman/listinfo/asterisk-biz.html){:target="_blank"} | Commercial and Business-Oriented Asterisk Discussion | +| [asterisk-dev](https://lists.digium.com/mailman/listinfo/asterisk-dev.html){:target="_blank"} | Discussions about the development of Asterisk. | +| [asterisk-app-dev](https://lists.digium.com/cgi-bin/mailman/listinfo/asterisk-app-dev.html){:target="_blank"} | Discussions about the development of applications that use Asterisk. | +| [asterisk-security](https://lists.digium.com/mailman/listinfo/asterisk-security.html){:target="_blank"} | Asterisk Security Discussion | +| [asterisk-users](https://lists.digium.com/mailman/listinfo/asterisk-users.html){:target="_blank"} | Discussions about the use and configuration of Asterisk. | From df3b48e004c7c71cade4deb13df4e274c7232167 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Fri, 6 Sep 2024 07:40:22 -0600 Subject: [PATCH 21/99] publish.yml: Update actions versions to latest --- .github/workflows/publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c52a6683a7..ee47da838c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,10 +12,10 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: 3.x cache: 'pip' @@ -23,7 +23,7 @@ jobs: - name: Get Token needed to push updates id: get_workflow_token - uses: peter-murray/workflow-application-token-action@v2 + uses: peter-murray/workflow-application-token-action@v3 with: application_id: ${{secrets.ASTERISK_ORG_ACCESS_APP_ID}} application_private_key: ${{secrets.ASTERISK_ORG_ACCESS_APP_PRIV_KEY}} From 927cdeac2cd884cce5d41c9c2f2e2cb9489d7e47 Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Mon, 23 Sep 2024 17:21:40 -0400 Subject: [PATCH 22/99] Coding-Guidelines.md: Fix some code formatting --- docs/Development/Policies-and-Procedures/Coding-Guidelines.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Development/Policies-and-Procedures/Coding-Guidelines.md b/docs/Development/Policies-and-Procedures/Coding-Guidelines.md index 031d7f10ab..45a3dce303 100644 --- a/docs/Development/Policies-and-Procedures/Coding-Guidelines.md +++ b/docs/Development/Policies-and-Procedures/Coding-Guidelines.md @@ -165,13 +165,13 @@ int foo(int a, char \*s) ``` #### If statements: -{newcode:C} +```C if (foo) { bar(); } else { blah(); } -{newcode} +``` #### Case statements: ```C From 98fc2f9a8497cf8ef7e0ba593e048c303a2528fe Mon Sep 17 00:00:00 2001 From: George Joseph Date: Mon, 30 Sep 2024 08:03:23 -0600 Subject: [PATCH 23/99] Add redirect for Building-and-Installing-Asterisk --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 95e14b986a..55c996d7c1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -55,6 +55,7 @@ plugins: - redirects: redirect_maps: Asterisk-Community-Code-of-Conduct.md: Asterisk-Community/Asterisk-Community-Code-of-Conduct.md + Building+and+Installing+Asterisk.md: Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Building-and-Installing-Asterisk.md - search - awesome-pages: filename: .pages From 6fd38bbd562451a57e697b5c30ce77a3e5263942 Mon Sep 17 00:00:00 2001 From: stolen data Date: Sat, 5 Oct 2024 16:09:14 +0200 Subject: [PATCH 24/99] Add links to Perl and Lua AGI modules ...and a small typo fix --- .../Interfaces/Asterisk-Gateway-Interface-AGI.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/Configuration/Interfaces/Asterisk-Gateway-Interface-AGI.md b/docs/Configuration/Interfaces/Asterisk-Gateway-Interface-AGI.md index 21f94d0dcd..dac7fa8ed7 100644 --- a/docs/Configuration/Interfaces/Asterisk-Gateway-Interface-AGI.md +++ b/docs/Configuration/Interfaces/Asterisk-Gateway-Interface-AGI.md @@ -19,7 +19,7 @@ Overview AGI is analogous to CGI in Apache. AGI provides an interface between the Asterisk dialplan and an external program that wants to manipulate a channel in the dialplan. In general, the interface is synchronous - actions taken on a channel from an AGI block and do not return until the action is completed. -On This PageAGI Libraries and Frameworks +AGI Libraries and Frameworks ============================ @@ -39,6 +39,8 @@ On This PageAGI Libraries and Frameworks | astive | Java | | FastAGI | | FastAGI-Go | Go | | FastAGI | | astgo | Go | | AMI/AGI/FastAGI | +| Asterisk::AGI | Perl | | AGI | +| lua-agi | Lua | | AGI | From 31898db9f9033d6e5113332f72820952b4aade78 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Thu, 3 Oct 2024 09:45:38 -0600 Subject: [PATCH 25/99] Add redirect for Secure-Calling-Tutorial --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 55c996d7c1..07585c90fd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -56,6 +56,7 @@ plugins: redirect_maps: Asterisk-Community-Code-of-Conduct.md: Asterisk-Community/Asterisk-Community-Code-of-Conduct.md Building+and+Installing+Asterisk.md: Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Building-and-Installing-Asterisk.md + Secure+Calling+Tutorial.md: Deployment/Secure-Calling/Secure-Calling-Tutorial/index.md - search - awesome-pages: filename: .pages From dd48ee6bde30be413d2f0329dcd0047f21478f04 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Wed, 9 Oct 2024 08:06:20 -0600 Subject: [PATCH 26/99] Commit-Messages: Updated formatting rules --- .../Commit-Messages.md | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/Development/Policies-and-Procedures/Commit-Messages.md b/docs/Development/Policies-and-Procedures/Commit-Messages.md index e245a6ef7b..31704cf5eb 100644 --- a/docs/Development/Policies-and-Procedures/Commit-Messages.md +++ b/docs/Development/Policies-and-Procedures/Commit-Messages.md @@ -1,12 +1,13 @@ # Commit Messages -A commit message serves to notify others of the changes made to the Asterisk source code, both in a historical sense and in the present. Commit messages are **incredibly** important to the continued success of the Asterisk project. Developers maintaining the Asterisk project in the future will often only have your commit message to guide them in why a particular change was made. For non-developers, archives containing commit messages may be used when searching for fixes to a particular bug. Be sure that the information contained in your message will help them out. +This page describes the expected format for commit messages used when submitting code to the Asterisk project. See [Code Contribution](/Development/Policies-and-Procedures/Code-Contribution) for more information about pushing your commit for review. + +A commit message serves to notify others of the changes made to the Asterisk source code, both in a historical sense and as part of teh code review process. Commit messages are **incredibly** important to the continued success of the Asterisk project. Developers maintaining the Asterisk project in the future will often only have your commit message to guide them in why a particular change was made. For non-developers, archives containing commit messages may be used when searching for fixes to a particular bug. Be sure that the information contained in your message will help them out. -/// warning | Follow These Guidelines -Commit messages are part of your code change. Committing code with a poorly written commit message creates a maintenance problem for everyone in the Asterisk project. +/// warning | Follow These Rules! +Commit messages are part of your code change. Committing code with a poorly written commit message creates a maintenance problem for everyone in the Asterisk project. Pull Requests can and will be rejected if the commit message doesn't follow these rules! /// -This page describes the expected format for commit messages used when submitting code to the Asterisk project. See [Code Contribution](/Development/Policies-and-Procedures/Code-Contribution) for more information about pushing your commit for review. ## Commit Message Body @@ -20,17 +21,17 @@ The following illustrates the basic outline for commit messages: - ``` Your summary should, if possible, be preceded by the subsystem(s) affected by the change: ``` app_foo: Fix crash caused by invalid widget frobbing. - ``` -Most commit history viewers treat the first line of commit messages as the summary for the commit. In addition, the Asterisk project uses many scripts that parse commit messages for a variety of purposes. So, an effort should be made to format our commit messages in this fashion. The verbose description may contain multiple paragraphs, itemized lists, etc. *Always end the first sentence (and any subsequent sentences) with punctuation.* +GitHub will automatically use the one-line summary as the title for pull requests created from the commit. The rest of the commit message will then be placed in the first PR comment. + +The verbose description may contain multiple paragraphs, itemized lists, etc. *Always end the first sentence (and any subsequent sentences) with punctuation.* Commit messages should be wrapped at 72 columns. @@ -42,7 +43,7 @@ Since we've moved to a complete GitHub SCM solution, commit messages will automa ### Special Trailers for Commit Messages -GitHub and our release process support several commit message trailers that are used by the change log generation process. The trailer name MUST start on a new line, be followed by a colin (`:`) and each should be separated by a blank line. If specified at all, the trailers listed below MUST be the last items in the commit message. +GitHub and the Asterisk release process support several commit message trailers that are used to automatically close related issues and to create the release change logs. The trailer name MUST start on a new line, be followed by a colon (`:`) and each should be separated by a blank line. If specified at all, the trailers listed below MUST be the last items in the commit message. /// warning | Unofficial Trailers If you specify any other trailers, including ones that were formerly acceptable, they will become part of the official trailer they follow. So, if you insist on adding trailers like `ASTERISK-nnnnn`, `Signed-Off-By` or `Reported-By` they MUST come BEFORE the first of the official trailers. @@ -50,13 +51,17 @@ If you specify any other trailers, including ones that were formerly acceptable, Current official trailers: -* **Resolves**: To reference a GitHub issue, use a `Resolves: #` trailer. This causes GitHub to automatically close the isse when the PR is merged, and it adds the commit to the list of issues closed in the release change log. +* **Resolves**: To reference a GitHub issue, use a `Resolves: #` trailer. This causes GitHub to automatically close the issue when the PR is merged, and it adds the commit to the list of issues closed in the release change log. * **Fixes**: Synonym for Resolves. You can use either. * **UpgradeNote**: To make users aware of possible breaking changes on update, use an `UpgradeNote: ` trailer. * **UserNote**: To make users aware of a new feature or significant fix, use a `UserNote: ` trailer. Any user-affecting change (new feature, change to CLI commands, etc) must be documented with a `UserNote:` trailer. Any breaking change (change to dialplan application or function arguments, API change, etc.) must be documented with an `UpgradeNote:` trailer. Those trailers cause special notes to be output in the change log in addition to the full commit message. +/// warning | Updating Commit Messages +GitHub only looks in the PR comments for the `Resolves` or `Fixes` trailers not the commit message, however the Asterisk release process only looks in the commit message for the trailers so it's important that they match. Be aware though, if you subsequently force push the commit after the PR is created, GitHub will NOT automatically update the PR title or the description/first comment from the updated commit so if you've added or changed the `Resolves:` or `Fixes:` trailers in the commit message and forced pushed, you MUST manually edit the PR description/first comment or GitHub won't be able to automatically close any related issues. +/// + ## Example complete commit message: ``` From a247ff0e6ab182dbc1c9ab2661d06e69a39de277 Mon Sep 17 00:00:00 2001 From: Mike Bradeen Date: Thu, 17 Oct 2024 10:44:47 -0600 Subject: [PATCH 27/99] Moving 18.x to "Security Fix Only" and 22.x to "Fully Supported" --- docs/About-the-Project/Asterisk-Versions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/About-the-Project/Asterisk-Versions.md b/docs/About-the-Project/Asterisk-Versions.md index fb2eae3ac2..f4b2372298 100644 --- a/docs/About-the-Project/Asterisk-Versions.md +++ b/docs/About-the-Project/Asterisk-Versions.md @@ -27,11 +27,11 @@ The following table shows the release time lines for all releases of Asterisk, i | 15.x | Standard | [2017-10-03](http://lists.digium.com/pipermail/asterisk-announce/2017-October/000684.html) | 2018-10-03 | 2019-10-03 | EOL | | 16.x | LTS | [2018-10-09](http://lists.digium.com/pipermail/asterisk-announce/2018-October/000727.html) | 2022-10-09 | 2023-10-09 | EOL | | 17.x | Standard | [2019-10-28](http://lists.digium.com/pipermail/asterisk-announce/2019-October/000757.html) | 2020-10-28 | 2021-10-28 | EOL | -| 18.x | LTS | [2020-10-20](http://lists.digium.com/pipermail/asterisk-announce/2020-October/000791.html) | 2024-10-20 | 2025-10-20 | Fully Supported | +| 18.x | LTS | [2020-10-20](http://lists.digium.com/pipermail/asterisk-announce/2020-October/000791.html) | 2024-10-20 | 2025-10-20 | Security Fix Only | | 19.x | Standard | 2021-11-02 | 2022-11-02 | 2023-11-02 | EOL | | 20.x | LTS | 2022-10-19 | 2026-10-19 | 2027-10-19 | Fully Supported | | 21.x | Standard | 2023-10-18 | 2025-10-18 | 2026-10-18 | Fully Supported | -| 22.x | LTS | 2024-10-16 | 2028-10-16 | 2029-10-16 | Pre-Release | +| 22.x | LTS | 2024-10-16 | 2028-10-16 | 2029-10-16 | Fully Supported | New releases of Asterisk will be made roughly once a year, alternating between standard and LTS releases. Within a given release series that is fully supported, bug fix updates are provided roughly every 4 to 6 weeks. For a release series that is receiving only maintenance for security fixes, updates are made on an as needed basis. From 0887a7528391ca5ca5d4a69d799cff063c3ddb93 Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Thu, 17 Oct 2024 15:43:35 -0400 Subject: [PATCH 28/99] Upgrading.md: Fix Asterisk 22 Upgrading page. --- docs/Asterisk_22_Documentation/Upgrading.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Asterisk_22_Documentation/Upgrading.md b/docs/Asterisk_22_Documentation/Upgrading.md index 91bd5f9b54..600bc7a90d 100644 --- a/docs/Asterisk_22_Documentation/Upgrading.md +++ b/docs/Asterisk_22_Documentation/Upgrading.md @@ -1,4 +1,4 @@ --- title: Upgrading to Asterisk 22 --- -For a complete list upgrade information in Asterisk 22 please see the [UPGRADE.txt document](https://raw.githubusercontent.com/asterisk/asterisk/22/UPGRADE.txt) included with Asterisk 22. +For a complete list upgrade information in Asterisk 22 please see the [ChangeLog-22.0.0.md document](https://raw.githubusercontent.com/asterisk/asterisk/releases/22/ChangeLogs/ChangeLog-22.0.0.md) included with Asterisk 22. From 085e553f7ce59cbebbf395c5a8d78bf7a8d86d01 Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Fri, 18 Oct 2024 15:02:45 -0400 Subject: [PATCH 29/99] Latest_API: Update to point to Asterisk 22. Also fix Asterisk 22's "What's New" page to link to an existing file. --- docs/Asterisk_22_Documentation/WhatsNew.md | 2 +- docs/Latest_API | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Asterisk_22_Documentation/WhatsNew.md b/docs/Asterisk_22_Documentation/WhatsNew.md index 56527373e5..f5be817cfa 100644 --- a/docs/Asterisk_22_Documentation/WhatsNew.md +++ b/docs/Asterisk_22_Documentation/WhatsNew.md @@ -2,4 +2,4 @@ title: New in 22 --- # What's New in Asterisk 22 -For a complete list of changes and new things in Asterisk 22 please see the [CHANGES document](https://raw.githubusercontent.com/asterisk/asterisk/22/CHANGES) included with Asterisk 22. +For a complete list of changes and new things in Asterisk 22 please see the [ChangeLog-22.0.0.md document](https://raw.githubusercontent.com/asterisk/asterisk/releases/22/ChangeLogs/ChangeLog-22.0.0.md) included with Asterisk 22. diff --git a/docs/Latest_API b/docs/Latest_API index aed721202f..1566375d27 120000 --- a/docs/Latest_API +++ b/docs/Latest_API @@ -1 +1 @@ -Asterisk_21_Documentation \ No newline at end of file +Asterisk_22_Documentation \ No newline at end of file From 73608abb3c5c682747e37630c3cf249c6de1f6ba Mon Sep 17 00:00:00 2001 From: George Joseph Date: Sat, 19 Oct 2024 09:25:09 -0600 Subject: [PATCH 30/99] README.md: Update with info for PyMdown plugin extensions --- README.md | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b41494dc93..88beac6534 100644 --- a/README.md +++ b/README.md @@ -13,12 +13,60 @@ The static documentation contained in the ./docs/ directory is written directly All contributions are subject to the [Creative Commons Attribution-ShareAlike 3.0 United States](LICENSE.md) license. -# Markdown Flavor +## Markdown Flavor The docs are written in standard markdown, not GitHub Flavored markdown. There are lots of extensions available though. Most of the extensions provided by [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/reference/) are enabled except those only available to paying sponsors and a few that don't make sense in this environment. > [!NOTE] > The conversion process that moved the documentation from the Confluence Wiki used equals signs `=====` and dashes `----` to denote headers. The new infrastructure renders those correctly but they do not get added to the page's table of contents. Going forward, you should always use hash signs `#`, `##`, `###`, etc to denote headers. +### PyMdown Extensions + +Many extensions from the [PyMdown](https://facelessuser.github.io/pymdown-extensions/) plugin are also available. The `admonition` extension is particularly useful as a replacement for the legacy `!!! note` admonition style because it uses a trailer to mark the end of the admonition instead of just a blank line. This allows you to add things like code blocks and quotes inside admonitions. + +Admonition Example: + +``` +/// warning | Don't Do This +Don't do this in your code!!! +''' + free(NULL); +''' +/// +``` + +You couldn't do that with the legacy `!!!` style admonition. + +If you decide to use any of the extensions from this plugin (and you should use them where possible), don't use the legacy version in the same page. For instance, don't mix `///` admonitions with `!!!` admonitions in the same page. There's a good chance they won't render correctly. + +At some point, we'll try and convert all of the existing legacy admonitions to the new style. + +[PyMdown Documentation](https://facelessuser.github.io/pymdown-extensions/extensions/arithmatex/) + +Enabled extensions: + +``` +betterem +blocks.admonition +blocks.definition +caret +critic +details +emoji +highlight +inlinehilite +keys +mark +saneheaders +smartsymbols +snippets +superfences +tabbed +tilde +``` + +See `markdown_extensions` in the [mkdocs.yml](mkdocs.yml) file for the current list. + + # Dynamic Documentation The dynamic documentation includes the pages generated from Asterisk itself and includes: From cf3fa6cd50dcb92963d69ce2a292bd9c71beb6ec Mon Sep 17 00:00:00 2001 From: "Joshua C. Colp" Date: Thu, 31 Oct 2024 05:24:34 -0300 Subject: [PATCH 31/99] AstriDevCon: Update for December virtual event. --- docs/Development/Roadmap/AstriDevCon.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/Development/Roadmap/AstriDevCon.md b/docs/Development/Roadmap/AstriDevCon.md index 55b357cee4..fbe484df2b 100644 --- a/docs/Development/Roadmap/AstriDevCon.md +++ b/docs/Development/Roadmap/AstriDevCon.md @@ -10,7 +10,6 @@ Sangoma invites developers who are interested in the future of Asterisk to join ### Event day schedule - AstriDevCon is a mix of open and focused discussion all on topics within the realm of Asterisk development, primarily regarding current concerns that Asterisk faces and how to improve Asterisk for the future. **Starting at [10AM EST](https://www.timeanddate.com/worldclock/fixedtime.html?msg=AstriDevCon+2024&iso=20240214T10&p1=820&ah=6).** @@ -21,7 +20,7 @@ Lunch 12:10 EST Break 2:30 EST -**Event ends at 4PM EST or until completion.** +**Event ends at 4PM EST or at completion.** We'll build a rough agenda together in the morning. @@ -29,12 +28,12 @@ We'll build a rough agenda together in the morning. ### Location -AstriDevCon will be held physically in Fort Lauderdale, Florida on February 14th, 2024 as part of ITEXPO. It will also be available virtually with participation details to be sent by email to registered participants. +AstriDevCon will be held virtually on December 2nd, 2024. Virtual participation details will be sent to those who register. Registering for AstriDevCon --------------------------- -**[Fill out the registration form!](https://forms.gle/nbNYiXHgiT5FZMfj9)** +**[Fill out the registration form!](https://forms.gle/P9kGB9VEd5psS2JQ6)** Registration will be required for participation. If you don't register you will not be able to receive the participation details. From 56c68e791a2ac7693faf85e8a1ed99d9504fc862 Mon Sep 17 00:00:00 2001 From: "Joshua C. Colp" Date: Mon, 2 Dec 2024 10:17:50 -0400 Subject: [PATCH 32/99] AstriDevCon: Update timezone link. --- docs/Development/Roadmap/AstriDevCon.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Development/Roadmap/AstriDevCon.md b/docs/Development/Roadmap/AstriDevCon.md index fbe484df2b..6bbe31c795 100644 --- a/docs/Development/Roadmap/AstriDevCon.md +++ b/docs/Development/Roadmap/AstriDevCon.md @@ -12,7 +12,7 @@ Sangoma invites developers who are interested in the future of Asterisk to join AstriDevCon is a mix of open and focused discussion all on topics within the realm of Asterisk development, primarily regarding current concerns that Asterisk faces and how to improve Asterisk for the future. -**Starting at [10AM EST](https://www.timeanddate.com/worldclock/fixedtime.html?msg=AstriDevCon+2024&iso=20240214T10&p1=820&ah=6).** +**Starting at [10AM EST](https://www.timeanddate.com/worldclock/fixedtime.html?msg=AstriDevCon+2024+December&iso=20241202T10&p1=250&ah=6).** Break 11:30 EST From 8013ac89a07e236e4a0d8f0056c717af3ca616b9 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Mon, 9 Dec 2024 11:19:23 -0700 Subject: [PATCH 33/99] requirements.txt: Update lxml to 5.3.0 --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 64060c52cc..537dbf236f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,6 @@ mkdocs-material==9.5.6 mkdocs-material-extensions==1.3.1 mkdocs-minify-plugin==0.8.0 mkdocs-table-reader-plugin==2.1.0 -lxml==5.1.0 +lxml==5.3.0 pymdown-extensions==10.4 -mkdocs-redirects==1.2.1 \ No newline at end of file +mkdocs-redirects==1.2.1 From e81c0b9bdf616bcfc1f96e23e2f56ab087f65831 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Mon, 9 Dec 2024 11:20:05 -0700 Subject: [PATCH 34/99] mkdocs.yml: Add redirect for PJSIP+Configuration+Wizard.md --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 07585c90fd..93d5c6bccd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -57,6 +57,7 @@ plugins: Asterisk-Community-Code-of-Conduct.md: Asterisk-Community/Asterisk-Community-Code-of-Conduct.md Building+and+Installing+Asterisk.md: Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Building-and-Installing-Asterisk.md Secure+Calling+Tutorial.md: Deployment/Secure-Calling/Secure-Calling-Tutorial/index.md + PJSIP+Configuration+Wizard.md: Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/PJSIP-Configuration-Wizard.md - search - awesome-pages: filename: .pages From 4cec2ba69c8303790243c9f9d315ec86f5fc998a Mon Sep 17 00:00:00 2001 From: Ben Ford Date: Wed, 11 Dec 2024 15:58:20 -0600 Subject: [PATCH 35/99] Added AstriDevCon-2024-December page. --- .../AstriDevCon-2024-December-Screenshot.png | Bin 0 -> 1025456 bytes .../Roadmap/AstriDevCon-2024-December.md | 101 ++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 docs/Development/Roadmap/AstriDevCon-2024-December-Screenshot.png create mode 100644 docs/Development/Roadmap/AstriDevCon-2024-December.md diff --git a/docs/Development/Roadmap/AstriDevCon-2024-December-Screenshot.png b/docs/Development/Roadmap/AstriDevCon-2024-December-Screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a0dd0d3a8fe9122f27bc7b1d41f1bba9bc5c9951 GIT binary patch literal 1025456 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ċ_7!n~#bdm@e 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 NF)sm=UAAj0y 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 z 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�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 z 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