Cisco Voice Portal
CVP FTP
Allow Anonymous Read & Write Access
Configure FTP to only allow login from VXML Servers
Configure the Upload Folder Security to have Full access for the User “IUSR”
- Open IIS
- Select Server Home (root level)
- Select FTP IP Address and Domain Restrictions
- Edit Feature - Deny for unspecificed users
- Add the following:
- 127.0.0.1
- A side VXML Server IP
- B side VXML Server IP
CVP FTP Firewall Config
netsh advfirewall firewall add rule name="FTP (non-SSL)" action=allow protocol=TCP dir=in localport=21 netsh advfirewall set global StatefulFtp enable
Sip Normalization Rules
http://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cucm/sip_tn/9_1_1/sip_t_n/preface.html
M = {} function M.inbound_ANY(msg) -- Remove the display name from the Remote Party ID Header Inbound local rpid = msg:getHeader("Remote-Party-ID") local uri = string.match(rpid, "(<.+>.+)") msg:modifyHeader("Remote-Party-ID",uri) end function M.inbound_ANY_ANY(msg) -- Remove the display name from the Remote Party ID Header Outbound local rpid = msg:getHeader("Remote-Party-ID") local uri = string.match(rpid, "(<.+>.+)") msg:modifyHeader("Remote-Party-ID",uri) end return M
CVP TLS 1.2
You need to add the following to the VXML Server Tomcat Parameters via the registry and restart:
-Dhttps.client.protocol=TLSv1.2
Registry Options Location:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\VXMLServer\Parameters\Java\Options]
Local value Examples
Use Local vars (Set value) and use the below JavaScript
Retrieving the Length of a Session Variable in Call Studio
var str = {Data.Session.pin}; eval(str.length);
Converting a double to a Integer
var str = {Data.Session.MyDoubleValue} eval(parseInt(str, 10));
var str = {Data.Session.MyDoubleValue} eval(str | 0);
var str = {Data.Session.MyDoubleValue}; myint = ~~str; eval (myint);
var a = 5; var b = 3; var c = a+b; eval (c);
removing first character from a string
var str = {Data.Session.var1}; eval(str.substring(1));
Removing leading digit of phone number and adding +353
var enteredNum = {Data.Element.Digits_EnterPhoneNum.value}; var e164Num = '+353' + enteredNum.slice(1); eval(e164Num);
Be careful how strings are returns - I found you had to quote as follows - but not sure why above works - which is also a string i.e. using eval(mybanana); doesn't work.
var mybanana = 'banana'; eval("mybanana");
user.microapp.error_code
WSM
WSM URL
Updating CVP Routes Manually
If you don't have access to CVP Ops console or CCE12 PCCE Admin Inventory does not have B side and you need to update CVP B side routing. This should not be used in Production. After making a change the srv.xml and sip.properties file - you will need to restart CVP Call Server
SRV Records
File: C:\Cisco\CVP\conf\srv.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <locater> <host name="cucmlabcluster.mydomain.com"> <record destination="10.0.0.101" port="5060" securePort=" " priority="10" weight="10"/> </host> <host name="voicebrowser.mydomain.com"> <record destination="CUCMA.mydomain.com" port="5060" securePort=" " priority="10" weight="10"/> <record destination="CUCMB.mydomain.com" port="5060" securePort=" " priority="10" weight="10"/> </host> </locater> </xml>
Route Setting
File: C:\Cisco\CVP\conf\sip.properties This includes the number to SIP SRV Group mapping and a RONA settings - see below for an example
# System configuration static routes for local routing without an outbound proxy. SIP.System.Proxy.Route = 777!,voicebrowser.mydomain.com;91!,voicebrowser.mydomain.com;92!,voicebrowser.mydomain.com;XXXXX,cucmlabcluster.mydomain.com;0!,cucmlabcluster.mydomain.com; # System configuration DN patterns to match for setting call specific Expires header (RONA) on outbound invites from sip b2bua. SIP.System.OutboundInviteTimeout = XXXXX,15;0!,60;
CVP Shadow Queue & Agent Gadget for Specific Customer
- Use above approach to log the call, including policy / account number and router call keys.
The above approach captures if a call is in queue or not, it does not capture if the call was answered or not. So to get this info:
- Use a Finesse Workflow on the Agent PC which updates the record as Call answered which updates the Database (very simple to do) - just need a Simple Webservice to front the Database.
- A update once an hour / day can also update the database using the TCD records which can correct / records if necessary.
CVP Certs
VAV - Virtual Agent/Assistant Voice
Smart Licensing 401 Error
Error Occurred Internal Server Error. Try again later or contact your system administrator.
The Browser Developer tools Network tab show a RC (Response Code) of 401 in the JSON response from the Call Server as per below (the second line)
ucce-lab-cvp-ops.example.com - - [16/Jun/2022:12:40:14 +0100] "GET /cvp-orm/rest/i18n/bundle?time=1655379615935 HTTP/1.1" 200 11318 ucce-lab-cvp-ops.example.com - - [16/Jun/2022:12:40:15 +0100] "GET /cvp-orm/rest/smartlicense/licensetype?time=1655379616150 HTTP/1.1" 401
- When trying to select the license type, we get error “Internal Server Error. Try again later or contact your system administrator”.
- Checked the browser console logs and see if we get 401 error and also from the Tomcat logs
- Checked the Password mentioned in the webservicescredentials.xml are same on OAMP and CVP box for which you are getting the above error
- Role specified in webservicescredentials.xml is WSM.USER_ROLE_Serviceability_Administrationny - Both are the identical
- NOAMP will check the webservicescredentials.xml file when orm.oamp.id is updated correctly in “orm.properties” file.
FIX
- open orm.properties file on the OAMP and copy the orm.oamp.id line and replace the same line in the callserver orm.properties files.
- Restart WSM on the Call Servers